diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 10f61393c..000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,211 +0,0 @@ -# http://www.appveyor.com/docs/appveyor-yml -# mostly copied from nan appveyor.yml -## AppVeyor is used to build: -## - Electron (Win64, Win32) -## - Node.js (Win64, Win32) - -os: Visual Studio 2022 - -# Set build version format here instead of in the admin panel. -version: '{build}' - -environment: - DEBUG: 'node-libcurl' - NODE_LIBCURL_POSTINSTALL_SKIP_CLEANUP: 'true' - matrix: - # node.js - - nodejs_version: '18' - - nodejs_version: '20' - - nodejs_version: '21' - - nodejs_version: '22' - # https://github.com/nodejs/nan/pull/979 - # - nodejs_version: '23' - - nodejs_version: '22' - ELECTRON_VERSION: '33.2.1' - - nodejs_version: '22' - ELECTRON_VERSION: '32.2.6' - - nodejs_version: '22' - ELECTRON_VERSION: '31.7.5' - - nodejs_version: '20' - ELECTRON_VERSION: '28.3.3' - - nodejs_version: '20' - ELECTRON_VERSION: '27.1.3' - - nodejs_version: '20' - ELECTRON_VERSION: '26.6.2' - # disabled until nwjs supports newer node-gyp versions + python 3 - # - nodejs_version: '12' - # NWJS_VERSION: '0.44.5' - # - nodejs_version: '12' - # NWJS_VERSION: '0.43.6' - # - nodejs_version: '12' - # NWJS_VERSION: '0.42.6' - -matrix: - allow_failures: - - nodejs_version: '21' - # exclude: - # - nodejs_version: '23' - # platform: x86 - -skip_branch_with_pr: true - -platform: - - x86 - - x64 - -# git clone depth -clone_depth: 5 - -cache: - - build -> binding.gyp, LIBCURL_VERSION_WIN_DEPS - - '%USERPROFILE%\.node-gyp' - - '%USERPROFILE%\.nw-gyp' - - '%USERPROFILE%\.nw' - - '%LOCALAPPDATA%\Yarn\cache' - - '%LOCALAPPDATA%\electron\Cache' - -# Install scripts. (runs after repo cloning) -install: - # We need this because we are building libcurl with c-ares - # instead of the system DNS resolver, and on Windows, this - # means that localhost is not handled by default - - echo 127.0.0.1 localhost >> C:\Windows\System32\drivers\etc\hosts - - echo ::1 localhost >> C:\Windows\System32\drivers\etc\hosts - # Get nasm - - choco install nasm -y - - set PATH=%PROGRAMFILES%\NASM;%PATH% - # in case above does not work - # - curl -L -o nasminst.exe http://libgd.blob.core.windows.net/nasm/nasm-2.07-installer.exe - # - start /wait nasminst.exe /S - # - ps: $env:path="C:\Program Files (x86)\nasm;$($env:path)" - - - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) $env:Platform - - SET PATH=%cd%\node_modules\.bin\;%PATH% - # Output useful info for debugging. - - node --version - - npm --version - - yarn --version - # Check if we need to publish the package - - SET PUBLISH_BINARY=false - # we are creating a empty file named publish - - ps: if ( $env:APPVEYOR_REPO_COMMIT_MESSAGE.ToLower().Contains('[publish binary]') -OR $(git describe --tags --always HEAD) -eq $env:APPVEYOR_REPO_BRANCH ) { echo $null >> publish } - - IF EXIST "publish" SET PUBLISH_BINARY=true - # Install the curl-for-windows dependencies. - - git submodule update --init --recursive - - ps: | - python -m pip install --upgrade pip - if (-not (python -c "import distutils")) { - pip install setuptools - } - - python deps\curl-for-windows\configure.py - - ps: | - # $ErrorActionPreference = "Stop" - - $runtime = "" - $dist_url = "" - $target = "" - - if ($null -ne $env:ELECTRON_VERSION) { - $runtime = "electron" - $dist_url = "https://electronjs.org/headers" - $target = $env:ELECTRON_VERSION - - yarn global add electron@${env:ELECTRON_VERSION} - - } elseif ($null -ne $env:NWJS_VERSION) { - $runtime = "node-webkit" - $target = $env:NWJS_VERSION - - yarn global add nw-gyp@3.6.5 - yarn global add nw@$target - # We had this issue on nw-gyp 3.6.4 - # https://github.com/nwjs/nw-gyp/issues/116 - # patch tool for Windows - # https://stackoverflow.com/a/9485089/710693 - pip install patch - # apply patch to nw-gyp fixing issue - python -m patch -d "$(yarn global dir)/node_modules/nw-gyp/src" ./scripts/ci/patches/win_delay_load_hook.cc.patch - - $arch = if ($env:PLATFORM -eq "x86") { "ia32" } else { "x64" } - - $rootFolder = "$env:USERPROFILE/.nw" - mkdir -Force $rootFolder - - $nwName = "nwjs-v$target-win-$arch" - $outputFolder = "$env:USERPROFILE/.nw/$nwName" - - if (![System.IO.File]::Exists("$outputFolder/nw.exe")) { - Write-Host "nw.exe not found on $outputFolder - Downloading it" - - $url = "https://dl.nwjs.io/v$target/$nwName.zip" - $output = "$rootFolder/$nwName.zip" - - # https://blog.jourdant.me/post/3-ways-to-download-files-with-powershell - Import-Module BitsTransfer - Start-BitsTransfer -Source $url -Destination $output - - Expand-Archive $output -DestinationPath $rootFolder - - Remove-Item –path $output - } - - $env:PATH = "$outputFolder;$env:PATH" - } - - $env:npm_config_msvs_version = "2022" - $env:npm_config_build_from_source = "true" - $env:npm_config_runtime = $runtime - $env:npm_config_dist_url = $dist_url - $env:npm_config_target = $target - - Write-Host $env:npm_config_msvs_version - Write-Host $env:npm_config_build_from_source - Write-Host $env:npm_config_runtime - Write-Host $env:npm_config_dist_url - Write-Host $env:npm_config_target - -build_script: - - yarn install --frozen-lockfile - - dir . - -# Post-install test scripts. -test_script: - # run tests - - ps: | - if ($null -ne $env:ELECTRON_VERSION) { - Write-Host "No tests available for Electron, skipping tests..." - } else { - if ($null -ne $env:NWJS_VERSION) { - Write-Host "No tests available for nw.js, skipping tests..." - } else { - yarn ts-node -e "console.log(require('./lib').Curl.getVersionInfoString())" - yarn test - } - } - - # This is needed because powershell treats - # output to stderr as errors - # See: - # https://stackoverflow.com/q/2095088/710693 - # https://stackoverflow.com/a/12866669/710693 - # https://stackoverflow.com/a/31451481/710693 - if ($LASTEXITCODE -eq 0) { - $host.SetShouldExit(0) - } - -after_test: - - IF "%PUBLISH_BINARY%" == "true" (node-pre-gyp package testpackage --verbose) - - IF "%PUBLISH_BINARY%" == "true" (for /f "usebackq delims=" %%x in (`node-pre-gyp reveal staged_tarball --silent`) do node scripts\module-packaging.js --publish %%x) - -on_success: - - SET INSTALL_RESULT=0 - - set npm_config_fallback_to_build=false - - IF "%PUBLISH_BINARY%" == "true" (yarn install --frozen-lockfile) - - IF "%PUBLISH_BINARY%" == "true" (SET INSTALL_RESULT=%ERRORLEVEL%) - - IF NOT %INSTALL_RESULT% == 0 (for /f "usebackq delims=" %%x in (`node-pre-gyp reveal hosted_tarball --silent`) do node scripts\module-packaging.js --unpublish %%x) - - IF NOT %INSTALL_RESULT% == 0 (echo "Package unpublished since we got an error while installing it.") - - dir . - # - node-pre-gyp clean - -# Don't actually deploy. -deploy: off diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index baf26b015..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,420 +0,0 @@ -## CircleCI is used to build: -## - Electron (linux) -## - Nwjs (linux) -## - Node.js (alpine) - -version: 2.1 - -# aliases: -# # add deps on ubuntu img -# - &install-deps -# # update automake -# - run: | -# wget ftp://ftp.gnu.org/gnu/automake/automake-1.16.1.tar.gz &> /dev/null -# tar -xzf automake-1.16.1.tar.gz && cd automake-1.16.1 -# ./configure && make && sudo make install -# # add missing packages -# - run: sudo apt-get install texinfo gperf ruby-ronn cmake - -executors: - debian: - docker: - - image: jonathancardoso/debian-ci - environment: - RECONFIGURE_NGHTTP2: 'true' - BASH_ENV: '/home/circleci/.bashrc' - LATEST_LIBCURL_RELEASE: '7.86.0' - alpine: - docker: - - image: jonathancardoso/alpine-ci - environment: - LATEST_LIBCURL_RELEASE: '7.86.0' - -orbs: - build-addon-unix-and-publish: - jobs: - build-addon: - # https://circleci.com/docs/2.0/reusing-config/#parameter-syntax - parameters: - node-version: - description: Version of Node.js - default: '22' - type: string - electron-version: - description: Version of Node.js - default: '' - type: string - nwjs-version: - description: Version of Nw.js - default: '' - type: string - e: - type: executor - node-libcurl-cpp-std: - type: string - default: 'c++17' - cares-version: - type: string - default: '1.18.1' - brotli-version: - type: string - default: '1.0.9' - libcurl-version: - type: string - default: '7.86.0' - libidn2-version: - type: string - default: '2.1.1' - libssh2-version: - type: string - default: '1.10.0' - libunistring-version: - type: string - default: '0.9.10' - ncurses-version: - type: string - default: '6.1' - nghttp2-version: - type: string - default: '1.47.0' - openldap-version: - type: string - default: '2.5.19' - openssl-version: - type: string - default: '3.0.7' - zlib-version: - type: string - default: '1.2.13' - before-build: - description: 'Steps that will be executed before the build' - type: steps - default: [] - after-build: - description: 'Steps that will be executed before the build' - type: steps - default: [] - executor: << parameters.e >> - steps: - - checkout - # temporary fix to solve certificates issues - main docker image must be updated instead - - when: - condition: - equal: ['debian', << parameters.e >>] - steps: - - run: sudo apt-get update && sudo apt-get upgrade - - when: - condition: <> - steps: - - run: | - if [[ -n "$(command -v nvm)" ]]; then - nvm use <> - else - [[ -f /usr/local/bin/node<> ]] && ln -s /usr/local/bin/node<> /usr/local/bin/node || true - fi - - run: - name: Setup Environment Variables - command: | - echo 'export ELECTRON_VERSION="<>"' >> $BASH_ENV - echo 'export NWJS_VERSION="<>"' >> $BASH_ENV - echo 'export CARES_RELEASE="<>"' >> $BASH_ENV - echo 'export BROTLI_RELEASE="<>"' >> $BASH_ENV - echo 'export LIBCURL_RELEASE="<>"' >> $BASH_ENV - echo 'export LIBIDN2_RELEASE="<>"' >> $BASH_ENV - echo 'export LIBSSH2_RELEASE="<>"' >> $BASH_ENV - echo 'export LIBUNISTRING_RELEASE="<>"' >> $BASH_ENV - echo 'export NCURSES_RELEASE="<>"' >> $BASH_ENV - echo 'export NGHTTP2_RELEASE="<>"' >> $BASH_ENV - echo 'export OPENLDAP_RELEASE="<>"' >> $BASH_ENV - echo 'export OPENSSL_RELEASE="<>"' >> $BASH_ENV - echo 'export ZLIB_RELEASE="<>"' >> $BASH_ENV - echo 'export NODE_LIBCURL_CPP_STD="<>"' >> $BASH_ENV - #### - # Restore caches - ### - - run: - name: Create cache key file - command: | - echo "$CARES_RELEASE" >> _libs_versions - echo "$BROTLI_RELEASE" >> _libs_versions - echo "$LIBCURL_RELEASE" >> _libs_versions - echo "$LIBIDN2_RELEASE" >> _libs_versions - echo "$LIBSSH2_RELEASE" >> _libs_versions - echo "$LIBUNISTRING_RELEASE" >> _libs_versions - echo "$NCURSES_RELEASE" >> _libs_versions - echo "$NGHTTP2_RELEASE" >> _libs_versions - echo "$OPENLDAP_RELEASE" >> _libs_versions - echo "$OPENSSL_RELEASE" >> _libs_versions - echo "$ZLIB_RELEASE" >> _libs_versions - - restore_cache: - keys: - - v4-nodeV<>-electronV<>-nwjsV<>-deps-libs-{{ checksum "_libs_versions" }}-{{ checksum "yarn.lock" }} - - v4-nodeV<>-electronV<>-nwjsV<>-deps-libs-{{ checksum "_libs_versions" }}- - - - steps: <> - #### - # Build - #### - - run: - command: GIT_TAG=$CIRCLE_TAG GIT_COMMIT=$CIRCLE_SHA1 ./scripts/ci/build.sh - no_output_timeout: 40m - - steps: <> - #### - # Cache - #### - - save_cache: - key: v4-nodeV<>-electronV<>-nwjsV<>-deps-libs-{{ checksum "_libs_versions" }}-{{ checksum "yarn.lock" }} - paths: - - ~/.electron - - ~/.cache/electron - - ~/.cache/yarn - - ~/.node-gyp - - ~/.nw-gyp - - ~/deps/cares/build/<> - - ~/deps/brotli/build/<> - - ~/deps/libcurl/build/<> - - ~/deps/libssh2/build/<> - - ~/deps/libidn2/build/<> - - ~/deps/libunistring/build/<> - - ~/deps/ncurses/build/<> - - ~/deps/nghttp2/build/<> - - ~/deps/openldap/build/<> - - ~/deps/openssl/build/<> - - ~/deps/zlib/build/<> - - store_artifacts: - path: ./logs/ -# Great docs -# https://circleci.com/docs/2.0/reusing-config/#getting-started-with-config-reuse - -workflows: - build-test-deploy: - jobs: - #### - # Node v22 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-node-v22-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - node-version: '22' - cares-version: '1.33.1' - nghttp2-version: '1.63.0' - openssl-version: '3.0.15' - e: - name: alpine - #### - # Node v21 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-node-v21-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - node-version: '21' - cares-version: '1.20.1' - nghttp2-version: '1.58.0' - openssl-version: '3.0.12' - e: - name: alpine - #### - # Node v20 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-node-v20-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - node-version: '20' - cares-version: '1.19.1' - nghttp2-version: '1.57.0' - openssl-version: '3.0.10' - e: - name: alpine - #### - # Node v18 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-node-v18-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - node-version: '18' - cares-version: '1.18.1' - nghttp2-version: '1.47.0' - openssl-version: '3.0.7' - e: - name: alpine - - build-addon-unix-and-publish/build-addon: - name: build-addon-node-v18-libcurl-old - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - node-version: '18' - libcurl-version: '7.50.0' - cares-version: '1.18.1' - nghttp2-version: '1.47.0' - openssl-version: '3.0.7' - # https://github.com/curl/curl/issues/7004 - openldap-version: '2.4.59' - e: - name: alpine - #### - # Electron v33 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-electron-v33-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - electron-version: '33.2.1' - node-libcurl-cpp-std: 'c++20' - e: - name: debian - #### - # Electron v32 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-electron-v32-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - electron-version: '32.2.6' - node-libcurl-cpp-std: 'c++20' - e: - name: debian - #### - # Electron v31 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-electron-v31-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - electron-version: '31.7.5' - e: - name: debian - #### - # Electron v28 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-electron-v28-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - electron-version: '28.3.3' - e: - name: debian - #### - # Electron v27 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-electron-v27-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - electron-version: '27.1.3' - e: - name: debian - #### - # Electron v26 - #### - - build-addon-unix-and-publish/build-addon: - name: build-addon-electron-v26-libcurl-latest - context: general - filters: - branches: - ignore: - - gh-pages - tags: - only: /^v.*/ - electron-version: '26.6.2' - e: - name: debian - - # disabled until nwjs supports newer node-gyp versions + python 3 - # #### - # # Nwjs v0.69 - # #### - # - build-addon-unix-and-publish/build-addon: - # name: build-addon-nwjs-v0.69-libcurl-latest - # context: general - # filters: - # branches: - # ignore: - # - gh-pages - # tags: - # only: /^v.*/ - # nwjs-version: '0.69.1' - # e: - # name: debian - # #### - # # Nwjs v0.68 - # #### - # - build-addon-unix-and-publish/build-addon: - # name: build-addon-nwjs-v0.68-libcurl-latest - # context: general - # filters: - # branches: - # ignore: - # - gh-pages - # tags: - # only: /^v.*/ - # nwjs-version: '0.68.1' - # e: - # name: debian - # #### - # # Nwjs v0.67 - # #### - # - build-addon-unix-and-publish/build-addon: - # name: build-addon-nwjs-v0.67-libcurl-latest - # context: general - # filters: - # branches: - # ignore: - # - gh-pages - # tags: - # only: /^v.*/ - # nwjs-version: '0.67.1' - # e: - # name: debian diff --git a/.clangd b/.clangd new file mode 100644 index 000000000..4c0825deb --- /dev/null +++ b/.clangd @@ -0,0 +1,4 @@ +CompileFlags: # Tweak the parse settings + Add: [-xc++, -Wall, -std=c++17] # treat all files as C++, enable more warnings, use C++17 + Remove: [-W*] # strip all other warning-related flags + Compiler: clang++ # Change argv[0] of compile flags to `clang++` diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..8130e8622 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,38 @@ +{ + "permissions": { + "allow": [ + "WebFetch(domain:github.com)", + "Bash(test:*)", + "Bash(pnpm pregyp:*)", + "Bash(node:*)", + "Read(//f/open-source/vcpkg/**)", + "WebSearch", + "WebFetch(domain:curl.se)", + "Bash(chmod:*)", + "Bash(pnpm test:*)", + "Bash(timeout 30 node:*)", + "Bash(addr2line:*)", + "WebFetch(domain:man7.org)", + "WebFetch(domain:eissing.org)", + "Bash(export npm_config_curl_config_bin=\"/Users/jcm/deps/libcurl/build/8.17.0/bin/curl-config\")", + "Bash(export npm_config_curl_static_build=\"true\")", + "Bash(export npm_config_node_libcurl_cpp_std=\"c++20\")", + "Bash(export npm_config_build_from_source=\"true\")", + "Bash(export npm_config_macos_universal_build=\"true\")", + "Bash(export npm_config_target_arch=\"arm64\")", + "Bash(pnpm run:*)", + "Bash(cat:*)", + "Bash(/Users/jcm/deps/libcurl/build/8.17.0/bin/curl-config --static-libs)", + "Bash(grep:*)", + "mcp__firecrawl-mcp__firecrawl_scrape", + "Bash(ls:*)", + "Bash(find:*)", + "Bash(git log:*)", + "mcp__zen__codereview" + ] + }, + "enableAllProjectMcpServers": true, + "enabledMcpjsonServers": [ + "fast-markdown" + ] +} diff --git a/.codeclimate.yml b/.codeclimate.yml deleted file mode 100644 index fd3a09665..000000000 --- a/.codeclimate.yml +++ /dev/null @@ -1,9 +0,0 @@ -engines: - tslint: - enabled: true -ratings: - paths: - - "**.ts" -exclude_paths: -- test/**/* -- node_modules/**/* diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 2cfdcf4cf..000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -debug/ -deps/ -website/ -docs/ diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index a49aa1848..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,69 +0,0 @@ -const noUnusedVarsSetting = { varsIgnorePattern: '^_', argsIgnorePattern: '^_' } - -module.exports = { - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module', - }, - env: { - node: true, - es6: true, - }, - overrides: [ - { - files: ['*.js'], - extends: ['eslint:recommended', 'plugin:prettier/recommended'], - plugins: ['prettier'], - rules: { - 'no-unused-vars': ['error', noUnusedVarsSetting], - }, - }, - { - files: ['*.ts'], - parser: '@typescript-eslint/parser', - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - 'prettier', - ], - plugins: ['@typescript-eslint', 'prettier'], - rules: { - 'prettier/prettier': 1, - '@typescript-eslint/indent': 0, - '@typescript-eslint/explicit-function-return-type': 0, - '@typescript-eslint/explicit-module-boundary-types': 0, - '@typescript-eslint/no-explicit-any': 0, - '@typescript-eslint/no-non-null-assertion': 0, - '@typescript-eslint/ban-ts-ignore': 0, - '@typescript-eslint/no-duplicate-enum-values': 0, - '@typescript-eslint/no-unsafe-declaration-merging': 0, - '@typescript-eslint/ban-ts-comment': 0, - '@typescript-eslint/member-ordering': [ - 2, - { - default: [ - 'public-static-field', - 'protected-static-field', - 'private-static-field', - 'public-instance-field', - 'protected-instance-field', - 'private-instance-field', - 'public-constructor', - 'protected-constructor', - 'private-constructor', - 'public-instance-method', - 'protected-instance-method', - 'private-instance-method', - 'public-static-method', - 'protected-static-method', - 'private-static-method', - ], - }, - ], - '@typescript-eslint/no-parameter-properties': 0, - '@typescript-eslint/no-unused-vars': ['error', noUnusedVarsSetting], - }, - }, - ], -} diff --git a/.github/actions/force-ipv4/force-ipv4.sh b/.github/actions/force-ipv4/force-ipv4.sh index 0c78044c0..e8c20b5e5 100755 --- a/.github/actions/force-ipv4/force-ipv4.sh +++ b/.github/actions/force-ipv4/force-ipv4.sh @@ -56,7 +56,9 @@ configure_warp_doh_and_exclude_ipv6() { install_warp_on_debian() { curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg - echo "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list + # Infer the architecture dynamically (e.g., amd64, arm64, etc.) + ARCH="$(dpkg --print-architecture)" + echo "deb [arch=${ARCH} signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list sudo apt-get update sudo apt-get install -y cloudflare-warp } diff --git a/.github/actions/install-system-packages/action.yaml b/.github/actions/install-system-packages/action.yaml new file mode 100644 index 000000000..f89929f90 --- /dev/null +++ b/.github/actions/install-system-packages/action.yaml @@ -0,0 +1,39 @@ +name: Install System Packages +description: Installs required system packages on macOS and Linux (incl. Alpine) + +runs: + using: composite + steps: + - name: Detect alpine + id: detect-alpine + shell: bash + run: | + if [ -f /etc/alpine-release ]; then + echo "result=true" >> "$GITHUB_OUTPUT" + else + echo "result=false" >> "$GITHUB_OUTPUT" + fi + - name: Install Needed packages on macOS + if: runner.os == 'macOS' + shell: bash + run: | + brew install coreutils wget automake libtool cmake gnu-sed m4 groff + + - name: Install Needed packages on Linux + if: runner.os == 'Linux' && steps.detect-alpine.outputs.result == 'false' + shell: bash + run: | + sudo apt-get update && sudo apt-get install -y cmake groff libtsan0 + + - name: Install Needed packages on Alpine + if: steps.detect-alpine.outputs.result == 'true' + shell: sh + run: | + apk --no-cache add --virtual .rundeps \ + bash ca-certificates cmake curl docker git \ + gnupg openssh-client openssl parallel pkgconfig \ + coreutils \ + python3 py3-pip make g++ \ + perl linux-headers \ + autoconf automake libtool \ + texinfo flex bison build-base libedit-dev mandoc-soelim zlib zlib-dev zlib-static diff --git a/.github/actions/setup-libcurl-cache/action.yaml b/.github/actions/setup-libcurl-cache/action.yaml new file mode 100644 index 000000000..6537b1d79 --- /dev/null +++ b/.github/actions/setup-libcurl-cache/action.yaml @@ -0,0 +1,82 @@ +name: Setup Libcurl Cache +description: Sets up caching for libcurl dependencies and Electron + +inputs: + libcurl-release: + description: 'Libcurl release version' + required: true + node-version: + description: 'Node.js version' + required: true + electron-version: + description: 'Electron version (if building for Electron)' + required: false + default: '' + cache-key-prefix: + description: 'Prefix for cache key (e.g., "v4-tsan-" for thread sanitizer)' + required: false + default: 'v4-' + electron-config-cache: + description: 'Electron cache directory path' + required: false + default: '~/.cache/electron' + mode: + description: 'Cache mode: "restore-only", "save-only", or "restore-and-save"' + required: false + default: 'restore-and-save' + +outputs: + cache-hit: + description: 'Whether the cache was hit' + value: ${{ steps.libcurl-deps-cache-restore.outputs.cache-hit || steps.libcurl-deps-cache.outputs.cache-hit }} + +runs: + using: composite + steps: + - name: Cache Key + id: cache-key + shell: sh + run: | + echo "cache-key=${{ inputs.cache-key-prefix }}${{ runner.os }}${{ runner.arch == 'ARM64' && '-arm64' || '' }}-libcurl-${{ inputs.libcurl-release }}-deps-cache-${{ inputs.electron-version && 'electron' || 'node' }}-${{ inputs.electron-version || inputs.node-version }}" >> $GITHUB_OUTPUT + # Restore-only mode (for workflows that save separately) + - name: Restore libcurl deps cache + if: inputs.mode == 'restore-only' + uses: actions/cache/restore@v4 + id: libcurl-deps-cache-restore + with: + path: | + ~/.node-gyp + ~/deps + key: ${{ steps.cache-key.outputs.cache-key }} + + # Restore and save mode (for most workflows) + - name: Restore and save libcurl deps cache + if: inputs.mode == 'restore-and-save' + uses: actions/cache@v4 + id: libcurl-deps-cache + with: + path: | + ~/.node-gyp + ~/deps + key: ${{ steps.cache-key.outputs.cache-key }} + + # Save-only mode (for workflows that restore separately) + - name: Save libcurl deps cache + if: inputs.mode == 'save-only' + uses: actions/cache/save@v4 + with: + path: | + ~/.node-gyp + ~/deps + key: ${{ steps.cache-key.outputs.cache-key }} + + # Electron cache (conditional) + - name: Restore Electron Cache + uses: actions/cache@v4 + if: inputs.electron-version != '' && runner.os != 'Windows' + with: + path: ${{ inputs.electron-config-cache }} + key: v1-${{ runner.os }}${{ runner.arch == 'ARM64' && '-arm64' || '' }}-electron-cache-${{ inputs.electron-version }} + restore-keys: | + v1-${{ runner.os }}${{ runner.arch == 'ARM64' && '-arm64' || '' }}-electron-cache-${{ inputs.electron-version }} + v1-${{ runner.os }}${{ runner.arch == 'ARM64' && '-arm64' || '' }}-electron-cache- diff --git a/.github/actions/setup-node-pnpm/action.yaml b/.github/actions/setup-node-pnpm/action.yaml new file mode 100644 index 000000000..8bdd0d250 --- /dev/null +++ b/.github/actions/setup-node-pnpm/action.yaml @@ -0,0 +1,24 @@ +name: Setup Node and PNPM +description: Sets up pnpm and Node.js with caching + +inputs: + node-version: + description: 'Node.js version to install' + required: true + skip-node-setup: + description: 'Skip Node.js setup (useful for Alpine)' + required: false + default: 'false' + +runs: + using: composite + steps: + - uses: pnpm/action-setup@v4 + + - name: Set up Node ${{ inputs.node-version }} + if: inputs.skip-node-setup != 'true' + uses: actions/setup-node@v5 + with: + node-version: '${{ inputs.node-version }}' + cache: 'pnpm' + package-manager-cache: 'pnpm' diff --git a/.github/actions/setup-vcpkg-windows/action.yaml b/.github/actions/setup-vcpkg-windows/action.yaml new file mode 100644 index 000000000..4122a7f97 --- /dev/null +++ b/.github/actions/setup-vcpkg-windows/action.yaml @@ -0,0 +1,43 @@ +name: Setup vcpkg for Windows +description: Sets up vcpkg with caching for Windows builds + +outputs: + cache-hit: + description: 'Whether the vcpkg cache was hit' + value: ${{ steps.vcpkg-cache.outputs.cache-hit }} + +runs: + using: composite + steps: + - name: Enable vcpkg binary caching + shell: pwsh + run: | + echo "VCPKG_FEATURE_FLAGS=manifests,binarycaching" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "VCPKG_DEFAULT_BINARY_CACHE=${{ runner.temp }}\vcpkg-cache" | Out-File -FilePath $env:GITHUB_ENV -Append + + - name: Cache vcpkg + id: vcpkg-cache + uses: actions/cache@v4 + with: + path: | + C:\vcpkg\installed + ${{ runner.temp }}\vcpkg-cache + key: vcpkg-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json', 'overlays/**') }} + restore-keys: vcpkg-${{ runner.os }}-${{ runner.arch }}- + + - name: Create vcpkg cache folder + if: steps.vcpkg-cache.outputs.cache-hit != 'true' + shell: pwsh + run: | + New-Item -ItemType Directory -Force -Path "${{ runner.temp }}\vcpkg-cache" + + - name: Setup vcpkg + shell: pwsh + env: + VCPKG_DISABLE_METRICS: false + run: | + cd vcpkg + .\bootstrap-vcpkg.bat + echo "VCPKG_ROOT=${{ github.workspace }}\vcpkg" | Out-File -FilePath $env:GITHUB_ENV -Append + cd .. + node scripts/vcpkg-setup.js diff --git a/.github/actions/upload-build-logs/action.yaml b/.github/actions/upload-build-logs/action.yaml new file mode 100644 index 000000000..0fa4a66eb --- /dev/null +++ b/.github/actions/upload-build-logs/action.yaml @@ -0,0 +1,31 @@ +name: Upload Build Logs +description: Uploads build logs and test results as artifacts + +inputs: + artifact-name: + description: 'Name for the artifact' + required: true + retention-days: + description: 'Number of days to retain the artifact' + required: false + default: '3' + include-test-results: + description: 'Whether to include test-results directory' + required: false + default: 'false' + logs-path: + description: 'Path to logs directory' + required: false + default: './logs/' + +runs: + using: composite + steps: + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.artifact-name }} + path: | + ${{ inputs.logs-path }} + ${{ inputs.include-test-results == 'true' && './test-results/' || '' }} + retention-days: ${{ inputs.retention-days }} diff --git a/.github/workflows/build-and-release.yaml b/.github/workflows/build-and-release.yaml index abed6a1cb..faeba4291 100644 --- a/.github/workflows/build-and-release.yaml +++ b/.github/workflows/build-and-release.yaml @@ -1,10 +1,9 @@ -## GitHub Actions is used to build: -## - Electron (macOs) -## - Nwjs (macOs) -## - Node.js (macOs, linux) - name: build-and-release +defaults: + run: + shell: bash + on: push: tags: @@ -17,313 +16,202 @@ on: publish-binary: type: boolean default: false - description: Publish binary? + description: Force publish binary? required: true env: NODE_LIBCURL_GITHUB_TOKEN: ${{ secrets.NODE_LIBCURL_GITHUB_TOKEN }} - PUBLISH_BINARY: ${{ github.event.inputs.publish-binary }} - NODE_LIBCURL_CPP_STD: c++17 -# all jobs here must have a matrix identical to the ones inside build-lint-test.yaml +concurrency: + group: build-and-release-${{ github.ref_name }} + cancel-in-progress: true + +# all jobs here must have a matrix identical to the ones inside build-and-release.yaml jobs: - build-and-release-nodejs: - runs-on: ${{ matrix.os }} - container: ${{ matrix.os == 'ubuntu-18.04' && 'ubuntu:xenial' || '' }} + config: + uses: ./.github/workflows/reusable-config.yaml + + lint-and-tsc: + uses: ./.github/workflows/reusable-lint-tsc.yaml + + build-and-release: + permissions: + id-token: write + attestations: write + contents: write + packages: write + runs-on: ${{ matrix.os == 'alpine' && 'ubuntu-22.04' || matrix.os }} + container: ${{ matrix.os == 'alpine' && format('node:{0}-alpine3.21', matrix.node) || '' }} + needs: + - config + - lint-and-tsc + strategy: fail-fast: false matrix: + electron-version: + - '' os: - - macos-14 - - ubuntu-20.04 + - macos-15 + - ubuntu-22.04 + - ubuntu-24.04-arm + - alpine + - windows-2025 libcurl-release: - - 7.86.0 + - ${{ needs.config.outputs.latest-libcurl-release }} node: - - 18 - - 20 - - 21 + - 25 + - 24 - 22 + include: + - electron-version: 38.6.0 + os: macos-15 + node: 24 + - electron-version: 38.6.0 + os: ubuntu-22.04 + node: 24 + - electron-version: 38.6.0 + os: windows-2025 + node: 24 + - electron-version: 39.1.1 + os: macos-15 + node: 24 + - electron-version: 39.1.1 + os: ubuntu-22.04 + node: 24 + - electron-version: 39.1.1 + os: windows-2025 + node: 24 env: LIBCURL_RELEASE: ${{ matrix.libcurl-release }} LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }} + ELECTRON_VERSION: ${{ matrix.electron-version }} + # this is false because we publish as a separate step + PUBLISH_BINARY: false + GIT_COMMIT: ${{ github.sha }} + GIT_REF_NAME: ${{ github.ref_name }} steps: - - id: timestamp - run: echo "::set-output name=timestamp::$(timestamp +%s)" - - name: Restore the previous run result - uses: actions/cache@v4 + - name: Install initial deps (Alpine) + if: matrix.os == 'alpine' + shell: sh + run: | + apk add --no-cache git bash + + - name: Checkout + uses: actions/checkout@v5 with: - path: | - run_result - key: v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.node }}-${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }} - restore-keys: | - v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.node }}-${{ github.run_id }}-${{ github.job }}- - - id: run_result - run: cat run_result 2>/dev/null || echo 'default' - - if: runner.os == 'Linux' - name: Install Needed packages on Linux + submodules: true + + - name: Install System Packages + uses: ./.github/actions/install-system-packages + + - name: Should publish binary? + id: should-publish run: | - if ! command -v sudo; then - apt-get update && apt-get install -y sudo + if [ "${{ inputs.publish-binary }}" = "true" ] || [[ "${GITHUB_REF}" == refs/tags/* ]]; then + echo "result=true" >> "$GITHUB_OUTPUT" else - sudo apt-get update - fi - - if ! command -v cmake; then - sudo apt-get install -y cmake + echo "result=false" >> "$GITHUB_OUTPUT" fi - if ! command -v curl; then - # we will assume a lot of other ones are missing - sudo apt-get install -y software-properties-common - sudo apt-add-repository ppa:git-core/ppa && sudo apt-get update && sudo apt-get install -y git curl wget python autoconf libtool-bin m4 groff groff-base pkg-config automake bzip2 apt-transport-https ca-certificates - fi + - name: Export Electron npm_config envs + if: matrix.electron-version + run: | + echo "npm_config_runtime=electron" >> $GITHUB_ENV + echo "npm_config_dist_url=https://electronjs.org/headers" >> $GITHUB_ENV + echo "npm_config_target=${{ matrix.electron-version }}" >> $GITHUB_ENV - if ! command -v yarn; then - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - - sudo apt-get update && sudo apt-get install -y yarn - fi - - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV - if: matrix.node-libcurl-cpp-std - - if: runner.os == 'macOS' - name: Install Needed packages on macOS - run: brew install coreutils wget automake libtool cmake gnu-sed m4 autoconf groff - - name: Checkout - uses: actions/checkout@v3 # see https://github.com/nodejs/node/issues/40537 - name: Enforce IPv4 Connectivity + if: matrix.os != 'alpine' uses: ./.github/actions/force-ipv4 - - name: Setup Node.js ${{ matrix.node }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - - name: Output yarn cache dir - id: yarn-cache-dir - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore Yarn Cache - uses: actions/cache@v4 - id: yarn-cache + + # PNPM / Node.js + - name: Setup Node and PNPM + uses: ./.github/actions/setup-node-pnpm with: - path: ${{ steps.yarn-cache-dir.outputs.dir }} - key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - v1-${{ runner.os }}-yarn-cache-${{ github.ref }}- - v1-${{ runner.os }}-yarn-cache- - - name: Restore libcurl deps cache - uses: actions/cache@v4 + node-version: '${{ matrix.node }}' + skip-node-setup: ${{ matrix.os == 'alpine' && 'true' || 'false' }} + + - name: Setup Libcurl Cache (Restore, Non-Windows) + if: runner.os != 'Windows' id: libcurl-deps-cache + uses: ./.github/actions/setup-libcurl-cache with: - path: | - ~/.node-gyp - ~/deps - key: v4-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }} - restore-keys: | - v4-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }} - - name: 'Set GIT_TAG' - if: startsWith(github.ref, 'refs/tags') - run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - name: 'Publish Binary' - if: steps.run_result.outputs.run_result != 'success' + libcurl-release: ${{ matrix.libcurl-release }} + node-version: ${{ matrix.node }} + electron-version: ${{ matrix.electron-version }} + electron-config-cache: ${{ needs.config.outputs.electron-config-cache }} + mode: 'restore-only' + + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: matrix.enable-debugging + + - name: 'Build and Package Binary (Non-Windows)' + if: runner.os != 'Windows' + run: ./scripts/ci/build.sh + + - name: 'Check if fully installed and built (Non-Windows)' + id: built-and-installed + if: runner.os != 'Windows' run: | - GIT_COMMIT=${{ github.sha }} GIT_TAG=$GIT_TAG ./scripts/ci/build.sh - - name: Upload artifacts - if: always() && steps.run_result.outputs.run_result != 'success' - uses: actions/upload-artifact@v4 - with: - name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.node }} - path: ./logs/ - retention-days: 5 - - run: echo "::set-output name=run_result::success" > run_result + if [[ -f built-and-installed.hidden.txt ]]; then + echo "built-and-installed.hidden.txt exists" + echo "status=true" >> $GITHUB_OUTPUT + else + echo "built-and-installed.hidden.txt does not exist" + echo "status=false" >> $GITHUB_OUTPUT + fi - build-and-release-electron: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - # we use CircleCI for linux binaries - os: - - macos-14 - libcurl-release: - - 7.86.0 - node: - - 20 - electron-version: - - 33.2.1 - - 32.2.6 - - 31.7.5 - - 28.3.3 - - 27.1.3 - - 26.6.2 - include: - - electron-version: 33.2.1 - node-libcurl-cpp-std: c++20 - - electron-version: 32.2.6 - node-libcurl-cpp-std: c++20 - env: - LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - ELECTRON_VERSION: ${{ matrix.electron-version }} - steps: - - id: timestamp - run: echo "::set-output name=timestamp::$(timestamp +%s)" - - name: Restore the previous run result - uses: actions/cache@v4 - with: - path: | - run_result - key: v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version }}-${{ github.run_id }}-${{ runner.os }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }} - restore-keys: | - v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version }}-${{ github.run_id }}-${{ runner.os }}-${{ github.job }}- - - id: run_result - run: cat run_result 2>/dev/null || echo 'default' - - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV - if: matrix.node-libcurl-cpp-std - - name: Install Needed packages - run: brew install coreutils wget automake libtool cmake gnu-sed m4 groff - - name: Checkout - uses: actions/checkout@main - # see https://github.com/nodejs/node/issues/40537 - - name: Enforce IPv4 Connectivity - uses: ./.github/actions/force-ipv4 - - name: Setup Node.js - uses: actions/setup-node@v1 + - name: Setup Libcurl Cache (Save, Non-Windows) + if: runner.os != 'Windows' && steps.libcurl-deps-cache.outputs.cache-hit != 'true' && steps.built-and-installed.outputs.status == 'true' + uses: ./.github/actions/setup-libcurl-cache with: + libcurl-release: ${{ matrix.libcurl-release }} node-version: ${{ matrix.node }} - - name: Output yarn cache dir - id: yarn-cache-dir - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore Yarn Cache - uses: actions/cache@v4 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir.outputs.dir }} - key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - v1-${{ runner.os }}-yarn-cache-${{ github.ref }}- - v1-${{ runner.os }}-yarn-cache- - - name: Restore Electron Cache - uses: actions/cache@v4 - with: - path: ~/Library/Caches/electron - key: v1-${{ runner.os }}-electron-cache-${{ matrix.electron-version }} - restore-keys: | - v1-${{ runner.os }}-electron-cache-${{ matrix.electron-version }} - v1-${{ runner.os }}-electron-cache- - - name: Restore libcurl deps cache - uses: actions/cache@v4 - id: libcurl-deps-cache + electron-version: ${{ matrix.electron-version }} + electron-config-cache: ${{ needs.config.outputs.electron-config-cache }} + mode: 'save-only' + + - name: Setup vcpkg (Windows) + if: runner.os == 'Windows' + uses: ./.github/actions/setup-vcpkg-windows + + - name: 'Build and Package Binary (Windows)' + if: runner.os == 'Windows' + shell: pwsh + run: ./scripts/ci/windows/build.ps1 + + - name: Create attestations + uses: actions/attest-build-provenance@v3 + if: steps.should-publish.outputs.result == 'true' with: - path: | - ~/.node-gyp - ~/deps - key: v4-${{ runner.os }}-libcurl-deps-cache-electron-${{ matrix.electron-version }} - restore-keys: | - v4-${{ runner.os }}-libcurl-deps-cache-electron-${{ matrix.electron-version }} - - name: 'Set GIT_TAG' - if: startsWith(github.ref, 'refs/tags') - run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - name: 'Publish Binary' - if: steps.run_result.outputs.run_result != 'success' + subject-path: 'build/**/node_libcurl-*.tar.gz' + + - name: 'Publish Binary [macos arm64]' + if: runner.os == 'macOS' && steps.should-publish.outputs.result == 'true' + env: + npm_config_target_arch: arm64 run: | - GIT_COMMIT=${{ github.sha }} GIT_TAG=$GIT_TAG ./scripts/ci/build.sh - - name: Upload artifacts - if: always() && steps.run_result.outputs.run_result != 'success' - uses: actions/upload-artifact@v4 - with: - name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version }} - path: ./logs/ - retention-days: 5 - - run: echo "::set-output name=run_result::success" > run_result + node scripts/module-packaging.js --publish "$(pnpm --silent pregyp reveal staged_tarball --silent)" + + - name: 'Publish Binary [macos x64]' + if: runner.os == 'macOS' && steps.should-publish.outputs.result == 'true' + env: + npm_config_target_arch: x64 + run: | + node scripts/module-packaging.js --publish "$(pnpm --silent pregyp reveal staged_tarball --silent)" - # disabled until nwjs supports newer node-gyp versions + python 3 - # build-and-release-nwjs: - # runs-on: ${{ matrix.os }} - # strategy: - # fail-fast: false - # matrix: - # # we use CircleCI for linux binaries - # os: - # - macos-14 - # libcurl-release: - # - 7.86.0 - # node: - # - 18 - # nwjs-version: - # - 0.69.1 - # - 0.68.1 - # - 0.67.1 - # env: - # LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - # LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - # NWJS_VERSION: ${{ matrix.nwjs-version }} - # steps: - # - id: timestamp - # run: echo "::set-output name=timestamp::$(timestamp +%s)" - # - name: Restore the previous run result - # uses: actions/cache@v4 - # with: - # path: | - # run_result - # key: v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.nwjs-version }}-${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }} - # restore-keys: | - # v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.nwjs-version }}-${{ github.run_id }}-${{ github.job }}- - # - id: run_result - # run: cat run_result 2>/dev/null || echo 'default' - # - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV - # - name: Checkout - # uses: actions/checkout@main - # - name: Setup Node.js - # uses: actions/setup-node@v1 - # with: - # node-version: ${{ matrix.node }} - # - name: Install Needed packages - # run: brew install coreutils wget automake libtool cmake gnu-sed m4 - # # not using brew for that one as we need 2.69 - # - name: Install autoconf - # run: | - # curl -O -L http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz - # tar -xzf autoconf-2.69.tar.gz - # cd autoconf-* - # ./configure - # make - # make install - # autoconf --version - # ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize - # - name: Output yarn cache dir - # id: yarn-cache-dir - # run: echo "::set-output name=dir::$(yarn cache dir)" - # - name: Restore Yarn Cache - # uses: actions/cache@v4 - # id: yarn-cache - # with: - # path: ${{ steps.yarn-cache-dir.outputs.dir }} - # key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }} - # restore-keys: | - # v1-${{ runner.os }}-yarn-cache-${{ github.ref }}- - # v1-${{ runner.os }}-yarn-cache- - # - name: Restore libcurl deps cache - # uses: actions/cache@v4 - # id: libcurl-deps-cache - # with: - # path: | - # ~/.node-gyp - # ~/deps - # key: v4-${{ runner.os }}-libcurl-deps-cache-nwjs-${{ matrix.nwjs-version }} - # restore-keys: | - # v4-${{ runner.os }}-libcurl-deps-cache-nwjs-${{ matrix.nwjs-version }} - # - name: 'Set GIT_TAG' - # if: startsWith(github.ref, 'refs/tags') - # run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - # - name: 'Publish Binary' - # if: steps.run_result.outputs.run_result != 'success' - # run: | - # GIT_COMMIT=${{ github.sha }} GIT_TAG=$GIT_TAG ./scripts/ci/build.sh - # - name: Upload artifacts - # if: always() && steps.run_result.outputs.run_result != 'success' - # uses: actions/upload-artifact@v4 - # with: - # name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.nwjs-version }} - # path: ./logs/ - # retention-days: 5 - # - run: echo "::set-output name=run_result::success" > run_result + - name: 'Publish Binary [non macos]' + if: runner.os != 'macOS' && steps.should-publish.outputs.result == 'true' + run: | + node scripts/module-packaging.js --publish "$(pnpm --silent pregyp reveal staged_tarball --silent)" + + - name: Upload Build Logs + if: always() && runner.os != 'Windows' + uses: ./.github/actions/upload-build-logs + with: + artifact-name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version && 'electron' || 'node' }}-${{ matrix.electron-version || matrix.node }} + retention-days: '3' diff --git a/.github/workflows/build-lint-test.yaml b/.github/workflows/build-lint-test.yaml index 1003f8342..504252e0b 100644 --- a/.github/workflows/build-lint-test.yaml +++ b/.github/workflows/build-lint-test.yaml @@ -1,319 +1,160 @@ name: build-lint-test +defaults: + run: + shell: bash + on: pull_request: -env: - LIBCURL_RELEASE: 'LATEST' - NODE_LIBCURL_CPP_STD: c++17 concurrency: - group: ${{ github.head_ref }} + group: build-lint-test-${{ github.head_ref }} cancel-in-progress: true # all jobs here must have a matrix identical to the ones inside build-and-release.yaml jobs: - build-and-test-nodejs: - runs-on: ${{ matrix.os }} + config: + uses: ./.github/workflows/reusable-config.yaml + + lint-and-tsc: + uses: ./.github/workflows/reusable-lint-tsc.yaml + + build-and-test: + runs-on: ${{ matrix.os == 'alpine' && 'ubuntu-22.04' || matrix.os }} + container: ${{ matrix.os == 'alpine' && format('node:{0}-alpine3.21', matrix.node) || '' }} + needs: config strategy: fail-fast: false matrix: + electron-version: + - '' os: - - macos-14 - # removed as we enabled CircleCI to run on PRs - # - ubuntu-20.04 + - macos-15 + - ubuntu-22.04 + - ubuntu-24.04-arm + - alpine + - windows-2025 libcurl-release: - - 7.86.0 + - ${{ needs.config.outputs.latest-libcurl-release }} node: - - 18 - - 20 - - 21 + - 25 + - 24 - 22 include: - # we only want to run lint in one of the jobs, in this case, the one for the latest stable Node.js version - - os: macos-14 - libcurl-release: 7.86.0 - node: 18 - run-lint-and-tsc: true + # we only want to record coverage in one of the jobs, in this case, the one for the latest stable Node.js version + - os: ubuntu-22.04 + libcurl-release: ${{ needs.config.outputs.latest-libcurl-release }} + node: 24 + record-coverage: true # we also want to build a job for old libcurl versions - - os: macos-14 - libcurl-release: 7.50.0 - node: 18 + - os: ubuntu-22.04 + libcurl-release: ${{ needs.config.outputs.oldest-libcurl-release }} + node: 24 env: LIBCURL_RELEASE: ${{ matrix.libcurl-release }} LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }} + ELECTRON_VERSION: ${{ matrix.electron-version }} + # these are false because we run tests separately + PUBLISH_BINARY: false + RUN_TESTS: false + RUN_PREGYP_CLEAN: false + GIT_COMMIT: ${{ github.sha }} + GIT_REF_NAME: ${{ github.ref_name }} steps: - - id: timestamp - run: echo "::set-output name=timestamp::$(timestamp +%s)" - - name: Restore the previous run result - uses: actions/cache@v4 - with: - path: | - run_result - key: ${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }} - restore-keys: | - ${{ github.run_id }}-${{ github.job }}- - - id: run_result - run: cat run_result 2>/dev/null || echo 'default' - - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV - if: matrix.node-libcurl-cpp-std - - if: runner.os == 'macOS' - name: Install Needed packages on macOS - run: brew install coreutils wget automake libtool cmake gnu-sed m4 - - if: runner.os == 'Linux' - name: Install Needed packages on Linux - run: sudo apt-get install -y cmake + - name: Install updated git (Alpine) + if: matrix.os == 'alpine' + shell: sh + run: | + apk add --no-cache git bash + - name: Checkout - uses: actions/checkout@main - - name: Setup Node.js - uses: actions/setup-node@v1 + uses: actions/checkout@v5 with: - node-version: ${{ matrix.node }} - - name: Output yarn cache dir - id: yarn-cache-dir - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore Yarn Cache - uses: actions/cache@v4 - id: yarn-cache + submodules: true + + - name: Install System Packages + uses: ./.github/actions/install-system-packages + + # see https://github.com/nodejs/node/issues/40537 + - name: Enforce IPv4 Connectivity + if: matrix.os != 'alpine' + uses: ./.github/actions/force-ipv4 + + # PNPM / Node.js + - name: Setup Node and PNPM + uses: ./.github/actions/setup-node-pnpm with: - path: ${{ steps.yarn-cache-dir.outputs.dir }} - key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - v1-${{ runner.os }}-yarn-cache-${{ github.ref }}- - v1-${{ runner.os }}-yarn-cache- - - name: Restore libcurl deps cache - uses: actions/cache@v4 + node-version: '${{ matrix.node }}' + skip-node-setup: ${{ matrix.os == 'alpine' && 'true' || 'false' }} + + - name: Setup Libcurl Cache (Restore, Non-Windows) + if: runner.os != 'Windows' id: libcurl-deps-cache + uses: ./.github/actions/setup-libcurl-cache with: - path: | - ~/.node-gyp - ~/deps - key: v4-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }} - restore-keys: | - v4-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }} - # - name: Setup tmate session - # uses: mxschmitt/action-tmate@v3 - - name: 'Build node-libcurl' - if: steps.run_result.outputs.run_result != 'success' + libcurl-release: ${{ matrix.libcurl-release }} + node-version: ${{ matrix.node }} + electron-version: ${{ matrix.electron-version }} + electron-config-cache: ${{ needs.config.outputs.electron-config-cache }} + mode: 'restore-only' + + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: matrix.enable-debugging + + - name: 'Build and Package Binary (Non-Windows)' + if: runner.os != 'Windows' + run: ./scripts/ci/build.sh + + - name: 'Check if fully installed and built (Non-Windows)' + id: built-and-installed + if: runner.os != 'Windows' run: | - RUN_TESTS=false \ - RUN_PREGYP_CLEAN=false \ - PUBLISH_BINARY=false \ - ./scripts/ci/build.sh - - name: 'Run lint' - if: matrix.run-lint-and-tsc && steps.run_result.outputs.run_result != 'success' - run: yarn lint - - name: 'Run tsc' - if: matrix.run-lint-and-tsc && steps.run_result.outputs.run_result != 'success' - run: yarn build:dist - # we do run tests in all matrix jobs + if [[ -f built-and-installed.hidden.txt ]]; then + echo "built-and-installed.hidden.txt exists" + echo "status=true" >> $GITHUB_OUTPUT + else + echo "built-and-installed.hidden.txt does not exist" + echo "status=false" >> $GITHUB_OUTPUT + fi + + - name: Setup Libcurl Cache (Save, Non-Windows) + if: runner.os != 'Windows' && steps.libcurl-deps-cache.outputs.cache-hit != 'true' && steps.built-and-installed.outputs.status == 'true' + uses: ./.github/actions/setup-libcurl-cache + with: + libcurl-release: ${{ matrix.libcurl-release }} + node-version: ${{ matrix.node }} + electron-version: ${{ matrix.electron-version }} + electron-config-cache: ${{ needs.config.outputs.electron-config-cache }} + mode: 'save-only' + + - name: Setup vcpkg (Windows) + if: runner.os == 'Windows' + uses: ./.github/actions/setup-vcpkg-windows + + - name: 'Build and Package Binary (Windows)' + if: runner.os == 'Windows' + shell: pwsh + run: ./scripts/ci/windows/build.ps1 + - name: 'Run tests' - if: steps.run_result.outputs.run_result != 'success' - run: yarn test:coverage - # but coverage is only sent for the run-lint-and-tsc job + # no way to run vitest tests using electron's main process, so no point doing this here + if: matrix.electron-version == '' + run: pnpm test:coverage + - name: Upload coverage to Codecov - if: matrix.run-lint-and-tsc && steps.run_result.outputs.run_result != 'success' + if: matrix.record-coverage && matrix.electron-version != '' uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} file: ./coverage/** fail_ci_if_error: false - - name: Upload artifacts - if: always() && steps.run_result.outputs.run_result != 'success' - uses: actions/upload-artifact@v4 - with: - name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.node }} - path: ./logs/ - retention-days: 3 - - run: echo "::set-output name=run_result::success" > run_result - - build-and-test-electron: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - # we use CircleCI for linux binaries - os: - - macos-14 - libcurl-release: - - 7.86.0 - node: - - 22 - electron-version: - - 21.0.1 - - 20.0.3 - - 19.1.1 - - 18.3.15 - - 17.4.11 - env: - LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - ELECTRON_VERSION: ${{ matrix.electron-version }} - steps: - - id: timestamp - run: echo "::set-output name=timestamp::$(timestamp +%s)" - - name: Restore the previous run result - uses: actions/cache@v4 - with: - path: | - run_result - key: ${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }} - restore-keys: | - ${{ github.run_id }}-${{ github.job }}- - - id: run_result - run: cat run_result 2>/dev/null || echo 'default' - - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV - if: matrix.node-libcurl-cpp-std - - name: Install Needed packages - run: brew install coreutils wget automake libtool cmake gnu-sed m4 - - name: Checkout - uses: actions/checkout@main - - name: Setup Node.js - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node }} - - name: Output yarn cache dir - id: yarn-cache-dir - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore Yarn Cache - uses: actions/cache@v4 - id: yarn-cache + + - name: Upload Build Logs + if: always() && runner.os != 'Windows' + uses: ./.github/actions/upload-build-logs with: - path: ${{ steps.yarn-cache-dir.outputs.dir }} - key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - v1-${{ runner.os }}-yarn-cache-${{ github.ref }}- - v1-${{ runner.os }}-yarn-cache- - - name: Restore Electron Cache - uses: actions/cache@v4 - with: - path: ~/Library/Caches/electron - key: v1-${{ runner.os }}-electron-cache-${{ matrix.electron-version }} - restore-keys: | - v1-${{ runner.os }}-electron-cache-${{ matrix.electron-version }} - v1-${{ runner.os }}-electron-cache- - - name: Restore libcurl deps cache - uses: actions/cache@v4 - id: libcurl-deps-cache - with: - path: | - ~/.node-gyp - ~/deps - key: v4-${{ runner.os }}-libcurl-deps-cache-electron-${{ matrix.electron-version }} - restore-keys: | - v4-${{ runner.os }}-libcurl-deps-cache-electron-${{ matrix.electron-version }} - - name: 'Set GIT_TAG' - if: startsWith(github.ref, 'refs/tags') - run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - name: 'Build node-libcurl' - if: steps.run_result.outputs.run_result != 'success' - run: | - RUN_TESTS=true \ - RUN_PREGYP_CLEAN=false \ - PUBLISH_BINARY=false \ - ./scripts/ci/build.sh - - name: Upload artifacts - if: always() && steps.run_result.outputs.run_result != 'success' - uses: actions/upload-artifact@v4 - with: - name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version }} - path: ./logs/ - retention-days: 5 - - run: echo "::set-output name=run_result::success" > run_result - - # disabled until nwjs supports newer node-gyp versions + python 3 - # build-and-test-nwjs: - # runs-on: ${{ matrix.os }} - # strategy: - # fail-fast: false - # matrix: - # # we use CircleCI for linux binaries - # os: - # - macos-14 - # libcurl-release: - # - 7.86.0 - # node: - # - 18 - # nwjs-version: - # - 0.69.1 - # - 0.68.1 - # - 0.67.1 - # env: - # LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - # LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }} - # NWJS_VERSION: ${{ matrix.nwjs-version }} - # steps: - # - id: timestamp - # run: echo "::set-output name=timestamp::$(timestamp +%s)" - # - name: Restore the previous run result - # uses: actions/cache@v4 - # with: - # path: | - # run_result - # key: ${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }} - # restore-keys: | - # ${{ github.run_id }}-${{ github.job }}- - # - id: run_result - # run: cat run_result 2>/dev/null || echo 'default' - # - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV - # if: matrix.node-libcurl-cpp - # - name: Checkout - # uses: actions/checkout@main - # - name: Setup Node.js - # uses: actions/setup-node@v1 - # with: - # node-version: ${{ matrix.node }} - # - name: Install Needed packages - # run: brew install coreutils wget automake libtool cmake gnu-sed m4 - # # not using brew for that one as we need 2.69 - # - name: Install autoconf - # run: | - # curl -O -L http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz - # tar -xzf autoconf-2.69.tar.gz - # cd autoconf-* - # ./configure - # make - # make install - # autoconf --version - # ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize - # - name: Output yarn cache dir - # id: yarn-cache-dir - # run: echo "::set-output name=dir::$(yarn cache dir)" - # - name: Restore Yarn Cache - # uses: actions/cache@v4 - # id: yarn-cache - # with: - # path: ${{ steps.yarn-cache-dir.outputs.dir }} - # key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }} - # restore-keys: | - # v1-${{ runner.os }}-yarn-cache-${{ github.ref }}- - # v1-${{ runner.os }}-yarn-cache- - # - name: Restore libcurl deps cache - # uses: actions/cache@v4 - # id: libcurl-deps-cache - # with: - # path: | - # ~/.node-gyp - # ~/deps - # key: v4-${{ runner.os }}-libcurl-deps-cache-nwjs-${{ matrix.nwjs-version }} - # restore-keys: | - # v4-${{ runner.os }}-libcurl-deps-cache-nwjs-${{ matrix.nwjs-version }} - # - name: 'Set GIT_TAG' - # if: startsWith(github.ref, 'refs/tags') - # run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - # - name: 'Build node-libcurl' - # if: steps.run_result.outputs.run_result != 'success' - # run: | - # RUN_TESTS=false \ - # RUN_PREGYP_CLEAN=false \ - # PUBLISH_BINARY=false \ - # ./scripts/ci/build.sh - # - name: Upload artifacts - # if: always() && steps.run_result.outputs.run_result != 'success' - # uses: actions/upload-artifact@v2 - # with: - # name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.nwjs-version }} - # path: ./logs/ - # retention-days: 5 - # - run: echo "::set-output name=run_result::success" > run_result + artifact-name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version && 'electron' || 'node' }}-${{ matrix.electron-version || matrix.node }} + retention-days: '3' diff --git a/.github/workflows/codeql-analysis.yaml b/.github/workflows/codeql-analysis.yaml index f19ae2bd1..be581f578 100644 --- a/.github/workflows/codeql-analysis.yaml +++ b/.github/workflows/codeql-analysis.yaml @@ -1,5 +1,9 @@ name: 'Code scanning - action' +defaults: + run: + shell: bash + on: # push: # branches: [develop, ] @@ -10,61 +14,80 @@ on: - cron: '0 6 * * 5' jobs: + config: + uses: ./.github/workflows/reusable-config.yaml + CodeQL-Build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 + needs: config + env: + LIBCURL_RELEASE: ${{ needs.config.outputs.latest-libcurl-release }} + LATEST_LIBCURL_RELEASE: ${{ needs.config.outputs.latest-libcurl-release }} + ELECTRON_VERSION: '' + PUBLISH_BINARY: false + RUN_TESTS: false + RUN_PREGYP_CLEAN: false + GIT_COMMIT: ${{ github.sha }} + GIT_REF_NAME: ${{ github.ref_name }} steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v5 with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 + submodules: true - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} + - name: Install System Packages + uses: ./.github/actions/install-system-packages + + # see https://github.com/nodejs/node/issues/40537 + - name: Enforce IPv4 Connectivity + uses: ./.github/actions/force-ipv4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - # Override language selection by uncommenting this and choosing your languages + uses: github/codeql-action/init@v4 with: languages: javascript, cpp - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - # - name: Autobuild - # uses: github/codeql-action/autobuild@v1 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # PNPM / Node.js + - name: Setup Node and PNPM + uses: ./.github/actions/setup-node-pnpm + with: + node-version: '24' - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - # - uses: actions/setup-node@v1 - # with: - # node-version: '12' - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v4 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + - name: Setup Libcurl Cache (Restore) + id: libcurl-deps-cache + uses: ./.github/actions/setup-libcurl-cache with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - uses: actions/cache@v4 - id: deps-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + libcurl-release: ${{ needs.config.outputs.latest-libcurl-release }} + node-version: '24' + electron-version: '' + electron-config-cache: ${{ needs.config.outputs.electron-config-cache }} + mode: 'restore-only' + + - name: 'Build and Package Binary' + run: ./scripts/ci/build.sh + + - name: 'Check if fully installed and built' + id: built-and-installed + run: | + if [[ -f built-and-installed.hidden.txt ]]; then + echo "built-and-installed.hidden.txt exists" + echo "status=true" >> $GITHUB_OUTPUT + else + echo "built-and-installed.hidden.txt does not exist" + echo "status=false" >> $GITHUB_OUTPUT + fi + + - name: Setup Libcurl Cache (Save) + if: steps.libcurl-deps-cache.outputs.cache-hit != 'true' && steps.built-and-installed.outputs.status == 'true' + uses: ./.github/actions/setup-libcurl-cache with: - path: ~/deps - key: ${{ runner.os }}-build-deps - restore-keys: | - ${{ runner.os }}-build-deps - - run: | - RUN_PREGYP_CLEAN=false PUBLISH_BINARY=false ./scripts/ci/build.sh + libcurl-release: ${{ needs.config.outputs.latest-libcurl-release }} + node-version: '24' + electron-version: '' + electron-config-cache: ${{ needs.config.outputs.electron-config-cache }} + mode: 'save-only' + - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bc8ef78de..fcfd4a7f3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,4 @@ -name: build-and-release +name: publish defaults: run: @@ -48,17 +48,33 @@ jobs: contents: write packages: write steps: + - uses: actions/create-github-app-token@v2 + id: app-token + with: + app-id: ${{ vars.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + - name: Checkout uses: actions/checkout@v5 + with: + fetch-depth: 0 + token: ${{ steps.app-token.outputs.token }} + - name: Get GitHub App User ID + id: get-user-id + run: echo "user-id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id)" >> "$GITHUB_OUTPUT" + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + + - run: | + git config --global user.name '${{ steps.app-token.outputs.app-slug }}[bot]' + git config --global user.email '${{ steps.get-user-id.outputs.user-id }}+${{ steps.app-token.outputs.app-slug }}[bot]@users.noreply.github.com' + # Node.js / PNPM - - uses: pnpm/action-setup@v4 - - name: Set up Node ${{ env.NODE_VERSION }} - uses: actions/setup-node@v5 + - name: Setup Node and PNPM + uses: ./.github/actions/setup-node-pnpm with: node-version: '${{ env.NODE_VERSION }}' - cache: 'pnpm' - package-manager-cache: 'pnpm' - name: Setup tmate session uses: mxschmitt/action-tmate@v3 @@ -112,9 +128,6 @@ jobs: - name: Bump version (and run hooks) and create commit run: pnpm version ${{ fromJson(steps.version-check.outputs.result).version }} - - name: Sleep for 1 minute - run: sleep 60 - - name: Push Commit and Tags run: git push origin --follow-tags @@ -126,21 +139,24 @@ jobs: VERSION=${{ fromJson(steps.version-check.outputs.result).version }} IS_PRE_RELEASE=${{ fromJson(steps.version-check.outputs.result).isPreRelease }} IS_LATEST=${{ fromJson(steps.version-check.outputs.result).isPreRelease == false }} - gh release create $VERSION \ + gh release create v$VERSION \ --fail-on-no-commits \ --verify-tag \ --prerelease=$IS_PRE_RELEASE \ --latest=$IS_LATEST \ - --draft + --title=v$VERSION - name: Ensure clean git state run: git diff --exit-code + - name: Sleep for 1 minute + run: sleep 60 + - name: Publish to NPM env: NPM_CONFIG_PROVENANCE: true run: | pnpm publish \ - --dry-run --access public \ + --access public \ --no-git-checks \ --tag ${{ fromJson(steps.version-check.outputs.result).isPreRelease && 'next' || 'latest' }} diff --git a/.github/workflows/reusable-config.yaml b/.github/workflows/reusable-config.yaml new file mode 100644 index 000000000..8f1022a9e --- /dev/null +++ b/.github/workflows/reusable-config.yaml @@ -0,0 +1,33 @@ +name: Reusable Configuration + +on: + workflow_call: + outputs: + latest-libcurl-release: + description: "Latest libcurl release version" + value: ${{ jobs.config.outputs.latest-libcurl-release }} + oldest-libcurl-release: + description: "Oldest libcurl release version" + value: ${{ jobs.config.outputs.oldest-libcurl-release }} + node-libcurl-cpp-std: + description: "C++ standard version" + value: ${{ jobs.config.outputs.node-libcurl-cpp-std }} + electron-config-cache: + description: "Electron cache path" + value: ${{ jobs.config.outputs.electron-config-cache }} + +jobs: + config: + runs-on: ubuntu-22.04 + outputs: + latest-libcurl-release: ${{ env.LATEST_LIBCURL_RELEASE }} + oldest-libcurl-release: ${{ env.OLDEST_LIBCURL_RELEASE }} + node-libcurl-cpp-std: ${{ env.NODE_LIBCURL_CPP_STD }} + electron-config-cache: ${{ env.electron_config_cache }} + env: + LATEST_LIBCURL_RELEASE: 8.17.0 + OLDEST_LIBCURL_RELEASE: 7.81.0 + NODE_LIBCURL_CPP_STD: c++20 + electron_config_cache: ~/.cache/electron + steps: + - run: exit 0 diff --git a/.github/workflows/reusable-lint-tsc.yaml b/.github/workflows/reusable-lint-tsc.yaml new file mode 100644 index 000000000..d16d5c5b2 --- /dev/null +++ b/.github/workflows/reusable-lint-tsc.yaml @@ -0,0 +1,35 @@ +name: Reusable Lint and TypeScript Check + +on: + workflow_call: + inputs: + node-version: + description: 'Node.js version to use' + type: string + required: false + default: '24' + +defaults: + run: + shell: bash + +jobs: + lint-and-tsc: + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node and PNPM + uses: ./.github/actions/setup-node-pnpm + with: + node-version: ${{ inputs.node-version }} + + - name: Install node dependencies + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Run lint + run: pnpm lint + + - name: Run tsc + run: pnpm build:dist diff --git a/.github/workflows/thread-sanitizer.yaml b/.github/workflows/thread-sanitizer.yaml new file mode 100644 index 000000000..2480c5a57 --- /dev/null +++ b/.github/workflows/thread-sanitizer.yaml @@ -0,0 +1,112 @@ +name: thread-sanitizer + +defaults: + run: + shell: bash + +on: + pull_request: + paths: + - 'src/**' + - 'lib/**' + - 'test/**' + - 'examples/**' + - 'tsan-suppressions.txt' + - '.github/workflows/thread-sanitizer.yaml' + workflow_dispatch: + +jobs: + thread-sanitizer-test: + runs-on: ubuntu-24.04 + strategy: + fail-fast: true + matrix: + node: + - 24 + libcurl-release: + - '8.17.0' + env: + LIBCURL_RELEASE: ${{ matrix.libcurl-release }} + LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }} + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + submodules: true + + - name: Install System Packages + uses: ./.github/actions/install-system-packages + + # See https://github.com/nodejs/node/issues/40537 + - name: Enforce IPv4 Connectivity + uses: ./.github/actions/force-ipv4 + + # PNPM / Node.js + - name: Setup Node and PNPM + uses: ./.github/actions/setup-node-pnpm + with: + node-version: '${{ matrix.node }}' + + - name: Setup Libcurl Cache + uses: ./.github/actions/setup-libcurl-cache + with: + libcurl-release: ${{ matrix.libcurl-release }} + node-version: ${{ matrix.node }} + cache-key-prefix: 'v4-tsan-' + + - name: 'Build node-libcurl deps' + run: | + RUN_TESTS=false \ + RUN_PREGYP_CLEAN=true \ + ONLY_BUILD_DEPS=true \ + PUBLISH_BINARY=false \ + ./scripts/ci/build.sh + + - name: 'Rebuild node-libcurl with ThreadSanitizer' + env: + CFLAGS: '-fsanitize=thread -g -O1' + CXXFLAGS: '-fsanitize=thread -g -O1' + LDFLAGS: '-fsanitize=thread' + npm_config_curl_static_build: 'true' + npm_config_build_from_source: 'true' + run: | + export npm_config_curl_config_bin=~/deps/libcurl/build/$LIBCURL_RELEASE/bin/curl-config + pnpm install --frozen-lockfile --force --fetch-timeout 300000 + + - name: 'Find TSan library path' + id: tsan-lib + run: | + TSAN_LIB=$(find /usr/lib -name "libtsan.so.0" 2>/dev/null | head -1) + if [ -z "$TSAN_LIB" ]; then + echo "Error: libtsan.so.0 not found" + exit 1 + fi + echo "tsan_lib=$TSAN_LIB" >> $GITHUB_OUTPUT + echo "Found TSan library at: $TSAN_LIB" + # echo "tsan_lib=/usr/lib/x86_64-linux-gnu/libtsan.so.0" >> $GITHUB_OUTPUT + + # - name: Debugging Tmate + # uses: mxschmitt/action-tmate@v3 + + - name: 'Build dist' + run: | + pnpm build:dist + + - name: 'Run worker thread test' + # skipped - somehow this is returning error 139 (SIGSEGV) on the CI + if: false + env: + LD_PRELOAD: ${{ steps.tsan-lib.outputs.tsan_lib }} + TSAN_OPTIONS: 'verbosity=1 second_deadlock_stack=1 history_size=7 halt_on_error=1 suppressions=${{ github.workspace }}/tsan-suppressions.txt' + run: | + echo "Running worker thread test with ThreadSanitizer" + echo "This test exercises multi-threaded scenarios to detect race conditions" + node examples/22-worker-threads.js + + - name: Upload TSan Logs + if: always() + uses: ./.github/actions/upload-build-logs + with: + artifact-name: tsan-logs-${{ matrix.node }}-${{ matrix.libcurl-release }} + retention-days: '3' + include-test-results: 'true' diff --git a/.gitignore b/.gitignore index 299c7bd96..5d3853976 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,18 @@ api/ yarn-error.log -.cache/ +.cache compile_commands.json + +*.hidden.* +docs/ + +# vcpkg +/deps/vcpkg/ +/vcpkg_installed/ + +# ignore main vcpkg config, as we use a template file +vcpkg.json +# Keep other vcpkg config +!/vcpkg-configuration.json +!/overlays/ diff --git a/.gitmodules b/.gitmodules index a7d2fba75..98f0869b6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,5 +1,4 @@ -[submodule "deps/curl-for-windows"] - path = deps/curl-for-windows - url = https://github.com/JCMais/curl-for-windows.git +[submodule "vcpkg"] + path = vcpkg ignore = dirty - branch = master + url = https://github.com/microsoft/vcpkg.git diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 000000000..cdc788db0 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,29 @@ +{ + "mcpServers": { + "fast-markdown": { + "command": "docker", + "args": [ + "exec", + "-i", + "devdocs-mcp", + "python", + "-m", + "fast_markdown_mcp.server", + "/app/storage/markdown" + ], + "env": {}, + "disabled": false, + "alwaysAllow": [ + "sync_file", + "get_status", + "list_files", + "read_file", + "search_files", + "search_by_tag", + "get_stats", + "get_section", + "get_table_of_contents" + ] + } + } +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f7012ef1e..000000000 --- a/.travis.yml +++ /dev/null @@ -1,90 +0,0 @@ -os: - - linux - - osx -# macos version - this is the current -osx_image: xcode9.4 -# linux dist -dist: trusty -language: node_js -node_js: - - '15' - - '14' - - '12' -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - # Those are the defaults for trusty release on TravisCI - - gcc-4.8 - - g++-4.8 -matrix: - fast_finish: true - # allow_failures: - # - node_js: "11" - include: - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 ELECTRON_VERSION=12.0.0 - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 ELECTRON_VERSION=11.2.3 - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 ELECTRON_VERSION=10.1.0 - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 ELECTRON_VERSION=9.3.3 - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 ELECTRON_VERSION=8.5.3 - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 NWJS_VERSION=0.52.0 - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 NWJS_VERSION=0.51.2 - - os: osx - env: LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 NWJS_VERSION=0.49.2 -env: - global: - - GCC_VERSION=4.8 - - secure: d64E8XbVGHuQ0kls1oVUF1y6pnj3iqZB34roKBHAFTyWBXReC1FWLb+qEShCJicUDkeK2At7vQUz7ohMn2mL/hVXiRbuSaYuDKFx8iDeei9mTgE+iy258mSovnNvXfG72EP5+LB+UOhgmTGe0qyTALOQ6ceCgjdscul3IGWE8lw= - matrix: - - LIBCURL_RELEASE=7.73.0 LATEST_LIBCURL_RELEASE=7.73.0 - - LIBCURL_RELEASE=7.50.0 - -cache: - directories: - - $HOME/.node-gyp - - $HOME/.nw-gyp - - $HOME/.npm - - $HOME/.cache/electron - - $HOME/.cache/yarn - - $HOME/deps - # macOS Electron cache - - $HOME/Library/Caches/electron - -git: - depth: 10 - submodules: false - -# disable redundancy when building PRs -branches: - only: - - master - - develop - - /^v\d+\.\d+(\.\d+)?(-\S*)?$/ - -before_install: - # Use latest yarn - - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.15.2 - - export PATH=$HOME/.yarn/bin:$PATH - - if [[ $TRAVIS_OS_NAME == "linux" ]]; then - export CC="gcc-${GCC_VERSION}"; - export CXX="g++-${GCC_VERSION}"; - export LINK="gcc-${GCC_VERSION}"; - export LINKXX="g++-${GCC_VERSION}"; - fi - - if [[ $TRAVIS_PULL_REQUEST != "false" ]]; then - export PUBLISH_BINARY="false"; - fi - - export PATH=$HOME/bin:$PATH - - yarn --version - - node --version -install: - - GIT_TAG=$TRAVIS_TAG GIT_COMMIT=$TRAVIS_COMMIT ./scripts/ci/build.sh -script: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 5259d8ee6..994737d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,89 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] ### Breaking Change +- The prebuilt binary is now built with libcurl 8.17.0. Every breaking change introduced by libcurl 8 is also a breaking change for this version. + ``` + Version: libcurl/8.17.0 OpenSSL/3.5.2 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.1.1 libssh2/1.10.0 nghttp2/1.66.0 ngtcp2/1.17.0 nghttp3/1.12.0 OpenLDAP/2.6.9 + Protocols: dict, file, ftp, ftps, gopher, gophers, http, https, imap, imaps, ldap, ldaps, mqtt, pop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp, ws, wss + Features: AsynchDNS, IDN, IPv6, Largefile, NTLM, SSL, libz, brotli, TLS-SRP, HTTP2, UnixSockets, HTTPS-proxy, alt-svc + ``` +- Minimum supported Electron version is now Electron v38.0.0 (moving forward prebuilt binaries will only be available for the latest 2 versions of Electron). +- Mininum supported libcurl version is now libcurl 7.81.0. +- Windows 32-bit support is now dropped. +- Minimum supported versions: + - Node.js >= v22.20.0 (which bundles OpenSSL 3.5.2). + - Electron >= v38.0.0. + - libcurl >= v7.81.0. + - Ubuntu >= v22.04. + - Alpine >= 3.21 + - C++ compilers supporting c++20 +- Errors thrown by the addon are now instances of one of the following classes: + - `CurlEasyError` + - `CurlMultiError` + - `CurlSharedError` + These classes extends the `CurlError` class. Previously the addon used to throw only native Javascript errors, such as `Error`, `TypeError`, etc. + The curly related errors also inherit from the `CurlError` class, and do not have a `isCurlError` property anymore. +- Every Easy handle is now initialized with default CA certificates from Node.js's tls module, by using the result of the `getCACertificates` function. This is done using `CURLOPT_CAINFO_BLOB`. This is a breaking change if you were passing custom CA certificates before using `CAINFO`, as `CURLOPT_CAINFO_BLOB` takes priority over it. If that is the case, you can avoid the default behavior by calling `setOpt("CAINFO_BLOB", null)` on the Easy handle. The TLS certificate is loaded into memory once for each JavaScript context. +- `HSTSREADFUNCTION` callback now receives an object with the `maxHostLengthBytes` property, which is the maximum length of the host name that can be returned by the callback. +- The minimum macOS version is now Sonoma (13) +- `Curl.globalCleanup` is a no-op now. The addon will automatically call `curl_global_cleanup` when the process exits. This method will be removed in a future major version. +- `Curl.globalInit` is a no-op now. The addon will automatically call `curl_global_init` when the process starts. This method will be removed in a future major version. + ### Fixed +- `CurlHttpVersion.V3` not being set to the proper value (was not set to `30`) + ### Added +- Prebuilt binaries have HTTP/3 support enabled across all platforms. This is supported by licurl when building with OpenSSL >= 3.5 and nghttp3 [>= 1.66](https://nghttp2.org/blog/2025/06/17/nghttp2-v1-66-0/). To use OpenSSL >= 3.5 a Node.js version >= 22.20.0 is required. +- Added native WebSocket support (requires libcurl >= 7.86.0): + - `Easy.wsRecv(buffer)` - Receive WebSocket frames with metadata + - `Easy.wsSend(buffer, flags, fragsize?)` - Send WebSocket frames (text, binary, ping, pong, close) + - `Easy.wsMeta()` - Get WebSocket frame metadata + - `CurlWs` enum for WebSocket frame flags (Text, Binary, Close, Ping, Pong, Cont, Offset) + - `CurlWsOptions` enum for WebSocket options (RawMode, NoAutoPong) + - `CurlWsFrame` interface for frame metadata (age, flags, offset, bytesleft, len) + - Support for CONNECT_ONLY mode with value 2 for WebSocket connections + - See `examples/21-websockets-native.js` for usage example +- Added new `Multi.perform` method for adding `Easy` instances to a `Multi` instance. This will eventually replace the `Multi.addHandle` and `Multi.onMessage` methods, which are now deprecated. +- Added the following new enums: + - `CurlFollow` + - `CurlMultiNetworkChanged` + - `CurlWs` + - `CurlWsOptions` +- Added following enum members: + - `CurlWriteFunc.Abort` + - `CurlShareLock.DataShare` + - `CurlHttpVersion.V3Only` + - `CurlProxy.Https2` + - `CurlCode.CURLE_UNRECOVERABLE_POLL` + - `CurlCode.CURLE_TOO_LARGE` + - `CurlCode.CURLE_ECH_REQUIRED` + - `CurlSslOpt.Earlydata` +- Added support for the following easy options: + - https://curl.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html + - https://curl.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html + - https://curl.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html + - https://curl.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html + - https://curl.se/libcurl/c/CURLOPT_ECH.html + - https://curl.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html + - https://curl.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html + - https://curl.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html +- Added following info options: + - https://curl.se/libcurl/c/CURLINFO_CONN_ID.html + - https://curl.se/libcurl/c/CURLINFO_XFER_ID.html + - https://curl.se/libcurl/c/CURLINFO_QUEUE_TIME_T.html + - https://curl.se/libcurl/c/CURLINFO_USED_PROXY.html + - https://curl.se/libcurl/c/CURLINFO_POSTTRANSFER_TIME_T.html + - https://curl.se/libcurl/c/CURLINFO_EARLYDATA_SENT_T.html + - https://curl.se/libcurl/c/CURLINFO_PROXYAUTH_USED.html + - https://curl.se/libcurl/c/CURLINFO_HTTPAUTH_USED.html +- Added the following multi options: + - https://curl.se/libcurl/c/CURLMOPT_NETWORK_CHANGED.html +- Added `Curl.id`, `Easy.id`, `Multi.id`, and `Share.id` properties, which return the unique ID of each instance. The value is unique across threads. + ### Changed -### Removed +- `CurlGlobalInit` enum is deprecated and should not be used. +- Closing a Curl instance is now a no-op if the handle is already closed. +- `Multi.onMessage` and `Multi.addHandle` are now deprecated and will be removed in a future major version. Use `Multi.perform` instead. ## [4.1.0] - 2024-12-26 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..6eeb3dae1 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,42 @@ +# Project: node-libcurl + +## Overview +Node.js bindings for libcurl - a powerful HTTP/HTTPS client library. + +## Development Commands + +### Install Dependencies +```bash +pnpm install +``` + +### Build +```bash +npm run build +``` + +### Test +```bash +npm test +``` + +### Lint +```bash +npm run lint +``` + +### Type Check +```bash +npm run typecheck +``` + +## Project Structure +- Native C++ bindings for libcurl +- TypeScript/JavaScript interface +- Cross-platform support (Windows, macOS, Linux) + +## Important Notes +- Uses Node.js native addons +- Requires libcurl to be installed on the system +- Main branch for PRs: `develop` +- Always use pnpm pregyp build to build the addon, do not use pnpm run build. \ No newline at end of file diff --git a/COMMON_ISSUES.md b/COMMON_ISSUES.md index eeee63873..2fa17a1bf 100644 --- a/COMMON_ISSUES.md +++ b/COMMON_ISSUES.md @@ -1,46 +1,10 @@ ## Error: SSL peer certificate or SSH remote key was not Ok -You need to set either [`CAINFO`](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) or [`CAPATH`](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) options, or disable SSL verification with [`SSL_VERIFYPEER`](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) (not recommended). +The proper fix to this, is to set one of these options: +- [`CAINFO`](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) +- [`CAPATH`](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) +- [`CAINFO_BLOB`](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) -The certificate file can be obtained in multiple ways: +Or you can disable SSL verification with [`SSL_VERIFYPEER`](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html), but this is not recommended. -1. Extracted directly from your system/browser -2. Downloaded from https://curl.haxx.se/docs/caextract.html, which is based on the one from Firefox -3. Creating a file with the contents of `tls.rootCertificates`, which was added with Node.js `v12.3.0`, example: -```javascript -const fs = require('fs') -const path = require('path') -const tls = require('tls') - -const { curly } = require('node-libcurl') - -// important steps -const certFilePath = path.join(__dirname, 'cert.pem') -const tlsData = tls.rootCertificates.join('\n') -fs.writeFileSync(certFilePath, tlsData) - -async function run() { - return curly.post('https://httpbin.org/anything', { - postFields: JSON.stringify({ a: 'b' }), - httpHeader: ['Content-type: application/json'], - caInfo: certFilePath, - verbose: true, - }) -} - -run() - .then(({ data, statusCode, headers }) => - console.log( - require('util').inspect( - { - data: JSON.parse(data), - statusCode, - headers, - }, - null, - 4, - ), - ), - ) - .catch((error) => console.error(`Something went wrong`, { error })) -``` +Starting with `node-libcurl` v5.0.0, every instance is initialized with default CA certificates from Node.js's tls module, by using the result of the "getCACertificates" function. This is done using `CURLOPT_CAINFO_BLOB`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0df11dd65..6d49780a5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,7 +13,8 @@ - [Changing libcurl Version Used on Prebuilt Binaries for Windows](#changing-libcurl-version-used-on-prebuilt-binaries-for-windows) - [Building Electron](#building-electron) - [Debugging with lldb](#debugging-with-lldb) - - [Publishing New Releases](#publishing-new-releases) +- [Publishing New Releases](#publishing-new-releases) + - [Manual Publishing](#manual-publishing) - [Semver Major / Minor / Patch](#semver-major--minor--patch) - [Prereleases](#prereleases) - [Build Matrix](#build-matrix) @@ -25,14 +26,14 @@ Before opening an issue try to search the existing ones for the same problem. Make sure to include on your issue the following information: * Node.js Version -* yarn / npm version +* package manager version * Operational System (name and version) * Package version * Logs of the installation ## Contributing with Code -The package manager used on this project is [`yarn`](https://yarnpkg.com/) +The package manager used on this project is [`pnpm`](https://pnpm.io/) The addon lib code is written in Typescript, while the addon itself is written in C++. @@ -61,17 +62,17 @@ $ node scripts/update-deps.js Install the dependencies, this will also build the addon: ```sh -$ yarn install +$ pnpm install ``` If you made some change to the C++ code, you can just build the addon again: ```sh -$ yarn pregyp build +$ pnpm pregyp build ``` In case you need to rebuild: ```sh -$ yarn pregyp rebuild +$ pnpm pregyp rebuild ``` If on unix and using the build.sh scripts, you also need to provide the path to the curl config file: @@ -79,7 +80,7 @@ If on unix and using the build.sh scripts, you also need to provide the path to ```bash npm_config_macos_universal_build=true \ npm_config_curl_config_bin=~/deps/libcurl/build/x.y.z/bin/curl-config \ -yarn pregyp build --debug +pnpm pregyp build --debug ``` If you have any issues with the build process, please refer to a [readme build troubleshooting section](https://github.com/JCMais/node-libcurl#important-notes-on-prebuilt-binaries--direct-installation). @@ -96,36 +97,34 @@ If you want to include a new libcurl option on the addon, those are the basic st - Added the `CURLOPT_AWS_SIGV4` constant as the `AwsSigV4` member in the `CurlAuth` enum. To get the value we looked at the libcurl source code. - Added the `CURLOPT_AWS_SIGV4` as a string option. [Full commit with the above changes is available here](https://github.com/JCMais/node-libcurl/commit/a38dd73db6f47a11197b7e1550111cc8ffd9ec2b). -4. Run `node ./scripts/build-constants.js`, this will generate an updated list of options on [`./lib/generated/`](./lib/generated), and also update the files [`./lib/Curl.ts`] and [`./lib/EasyNativeBinding.ts`] with overloads for the `setOpt` method. Make sure the options added are correct. +4. Run `node ./scripts/build-constants.js`, this will generate an updated list of options on [`./lib/generated/`](./lib/generated), and also update the files [`./lib/Curl.ts`] and [`./lib/Easy.ts`] with overloads for the `setOpt` method. Make sure the options added are correct. 5. If running the above adds extra options that you do not want to add / are not related to the options you are adding, please feel free to remove them manually from the generated output. We will try to improve this experience later, but for now you have to manually remove them. ### Changing libcurl Version Used on Prebuilt Binaries for Windows -You will need to open a PR against the repository [`JCMais/curl-for-windows`](https://github.com/JCMais/curl-for-windows/) upgrading libcurl there. - -After that a new tag will be created on this repo, which we can them use on the file [`LIBCURL_VERSION_WIN_DEPS`](./LIBCURL_VERSION_WIN_DEPS). +We use vcpkg for this. Simply change the version on the file [`vcpkg.template.json`](./vcpkg.template.json) ### Building Electron Sample command you could use from the root of this repository: ```sh -LIBCURL_RELEASE=7.78.0 PUBLISH_BINARY="false" ./scripts/ci/build.sh +LIBCURL_RELEASE=8.17.0 PUBLISH_BINARY="false" ./scripts/ci/build.sh -npm_config_curl_config_bin=~/deps/libcurl/build/7.78.0/bin/curl-config \ +npm_config_curl_config_bin=~/deps/libcurl/build/8.17.0/bin/curl-config \ npm_config_curl_static_build=true \ npm_config_runtime=electron \ npm_config_target=21.2.0 \ npm_config_disturl=https://www.electronjs.org/headers \ - yarn pregyp rebuild --debug + pnpm pregyp rebuild --debug ``` You can also use `electron-rebuild`, e.g for macOS: ```sh npm_config_curl_static_build=true \ npm_config_macos_universal_build=true \ -npm_config_curl_config_bin=~/deps/libcurl/build/7.86.0/bin/curl-config \ -yarn exec electron-rebuild +npm_config_curl_config_bin=~/deps/libcurl/build/8.17.0/bin/curl-config \ +pnpm exec electron-rebuild ``` ### Debugging with lldb @@ -137,7 +136,13 @@ sudo apt-get install lldb 2. Install Node.js lldb plugin: ``` -npm i -g llnode +pnpm i -g llnode +``` + +or: +``` +brew install llnode +# then follow instructions ``` 3. Run script that causes core dump @@ -150,7 +155,12 @@ llnode -- /path/to/bin/node --abort_on_uncaught_exception script.js More information go to https://github.com/nodejs/llnode -### Publishing New Releases +## Publishing New Releases + +For publishing there is a GitHub action workflow to publish new releases at: https://github.com/JCMais/node-libcurl/actions/workflows/publish.yml + + +### Manual Publishing We are using [`np`](https://github.com/sindresorhus/np) for releases. @@ -173,10 +183,10 @@ npx np [major|minor|patch] or if you are having trouble with `np`: ```bash -yarn publish +pnpm publish ``` -or even if you are having trouble with `yarn`: +or even if you are having trouble with `pnpm`: ```bash npm version [major|minor|patch] npm publish @@ -194,12 +204,12 @@ git push For prereleases, use something like this from the `develop` branch: ```shell -$ yarn np prerelease --any-branch --tag next +$ pnpm exec np prerelease --any-branch --tag next ``` -If for some reason np fails to run with Yarn, you can use this command to skip cleaning up and use npm to publish: +If for some reason np fails to run, you can use this command to skip cleaning up and use npm to publish: ```shell -$ yarn np prerelease --no-yarn --no-cleanup --any-branch --tag next +$ pnpm exec np prerelease --no-cleanup --any-branch --tag next ``` #### Build Matrix diff --git a/DEBUGGING.md b/DEBUGGING.md new file mode 100644 index 000000000..3fb0c003c --- /dev/null +++ b/DEBUGGING.md @@ -0,0 +1,100 @@ +# Debugging + +This guide provides information on how to debug the addon using LLDB (and potentially llnode). + +## Quick Start + +### 1. Build Debug Version + +The first step, is building a debug version of the addon. If you are building from static libraries, you can provide the same flags here. +```bash +pnpm pregyp rebuild --debug +# You can also enable extra debug logging +pnpm pregyp rebuild --debug --node_libcurl_debug=true +# Or build with AddressSanitizer for memory error detection +pnpm pregyp rebuild --debug --node_libcurl_asan_debug=true +# If building statically +npm_config_node_libcurl_debug=true npm_config_curl_config_bin=~/deps/libcurl/build/8.17.0/bin/curl-config npm_config_curl_static_build="true" pnpm pregyp rebuild +``` + +### 2. Create a Test File +Create a file named `debug-test.hidden.js` with the following content: + +```js +#!/usr/bin/env node +const path = require('path') + +const nodeLibcurl = require( + path.join(__dirname, '..', 'lib', 'binding', 'node_libcurl.node'), +) + +const log = (message) => { + console.log( + `[nodejs main] [thread: ${nodeLibcurl.Curl.THREAD_ID}] ${message}`, + ) +} + +async function main() { + try { + log('🚀 Starting Debug Test\n') + + const easy = new nodeLibcurl.Easy() + const multi = new nodeLibcurl.Multi() + easy.setOpt('URL', 'https://httpbin.org/get') + multi.addHandle(easy) + + let resolve + const promise = new Promise((res) => { + resolve = res + }) + + multi.onMessage((...args) => { + console.log('Message callback called', args) + resolve() + }) + + easy.perform() + + await promise + + console.log('\n✅ Test completed successfully!') + } catch (error) { + console.error('\n❌ Test failed:', error.message) + process.exit(1) + } +} + +main() +``` + +### 3. Run Under LLDB +```bash +lldb -- node debug-test.hidden.js +``` + +### 4. Debug +```lldb +run +``` + +## Building Node.js from Source + +This assumes MacOS, but similar commands will work elsewhere. + +```sh +NODE_VERSION=20.18.1 +git clone --depth 1 --branch v${NODEVERSION} https://github.com/nodejs/node +./configure --prefix ~/node-from-source/${NODEVERSION} --v8-non-optimized-debug --v8-with-dchecks --debug --debug-node +make -j$(sysctl -n hw.logicalcpu) +make install +``` + +After building, you can rebuild the addon so it uses that version of Node.js: +```bash +pnpm pregyp rebuild --debug --nodedir=~/node-from-source/$NODEVERSION +``` + +## Thread Sanitizer +```bash +CFLAGS="-fsanitize=thread -g -O1" CXXFLAGS="-fsanitize=thread -g -O1" LDFLAGS="-fsanitize=thread" npm_config_curl_config_bin=/home/jcm/deps/libcurl/build/$LIBCURL_RELEASE/bin/curl-config npm_config_curl_static_build=true pnpm pregyp build && TSAN_OPTIONS="second_deadlock_stack=1 history_size=7 halt_on_error=1 suppressions=$(pwd)/tsan-suppressions.txt" LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtsan.so.0 node examples/22-worker-threads.js +``` diff --git a/LIBCURL_VERSION_WIN_DEPS b/LIBCURL_VERSION_WIN_DEPS deleted file mode 100644 index 47a8b3f66..000000000 --- a/LIBCURL_VERSION_WIN_DEPS +++ /dev/null @@ -1 +0,0 @@ -curl-7_86_0-0 diff --git a/README.md b/README.md index b34d60031..26d64807a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ [license-image]:https://img.shields.io/npm/l/node-libcurl?style=flat-square [license-url]:https://raw.githubusercontent.com/JCMais/node-libcurl/develop/LICENSE -> The [fastest](#benchmarks) URL transfer library for Node.js. +> The [fastest](#benchmarks) feature-rich URL transfer library for Node.js. [libcurl](https://github.com/bagder/curl) bindings for Node.js. libcurl official description: > libcurl is a free and easy-to-use client-side URL transfer library, supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP. libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, Kerberos), file transfer resume, http proxy tunneling and more! @@ -39,6 +39,7 @@ - [Form Submission (Content-Type: application/x-www-form-urlencoded)](#form-submission-content-type-applicationx-www-form-urlencoded) - [MultiPart Upload / HttpPost libcurl Option (Content-Type: multipart/form-data)](#multipart-upload--httppost-libcurl-option-content-type-multipartform-data) - [Binary Data](#binary-data) +- [SSL](#ssl) - [API](#api) - [Special Notes](#special-notes) - [`READFUNCTION` option](#readfunction-option) @@ -57,6 +58,7 @@ - [Building on macOS](#building-on-macos) - [Xcode \>= 10 | macOS \>= Mojave](#xcode--10--macos--mojave) - [Building on Windows](#building-on-windows) + - [Note on outdated node-gyp version](#note-on-outdated-node-gyp-version) - [Getting Help](#getting-help) - [Contributing](#contributing) - [Donations / Patreon](#donations--patreon) @@ -65,14 +67,18 @@ > **Note**: > - This library cannot be used in a browser, it depends on native code. -> - There is no worker threads support at the moment. See [#169](https://github.com/JCMais/node-libcurl/issues/169) ### Install + ```shell npm i node-libcurl --save ``` or ```shell +pnpm i node-libcurl --save +``` +or +```shell yarn add node-libcurl ``` ### Simple Request - Async / Await using curly @@ -81,7 +87,7 @@ yarn add node-libcurl ```javascript const { curly } = require('node-libcurl'); -const { statusCode, data, headers } = await curly.get('http://www.google.com') +const { statusCode, data, headers } = await curly.get('https://www.google.com') ``` Any option can be passed using their `FULLNAME` or a `lowerPascalCase` format: @@ -89,7 +95,7 @@ Any option can be passed using their `FULLNAME` or a `lowerPascalCase` format: const querystring = require('querystring'); const { curly } = require('node-libcurl'); -const { statusCode, data, headers } = await curly.post('http://httpbin.com/post', { +const { statusCode, data, headers } = await curly.post('https://httpbin.com/post', { postFields: querystring.stringify({ field: 'value', }), @@ -100,7 +106,7 @@ const { statusCode, data, headers } = await curly.post('http://httpbin.com/post' JSON POST example: ```javascript const { curly } = require('node-libcurl') -const { data } = await curly.post('http://httpbin.com/post', { +const { data } = await curly.post('https://httpbin.com/post', { postFields: JSON.stringify({ field: 'value' }), httpHeader: [ 'Content-Type: application/json', @@ -198,6 +204,8 @@ The reasoning behind this is that by default, the `Curl` instance will try to de For more examples check the [examples folder](./examples). +## SSL + ## API API documentation for the latest stable version is available at [https://node-libcurl-docs.netlify.app/modules/_lib_index_.html](https://node-libcurl-docs.netlify.app/modules/_lib_index_.html). @@ -232,9 +240,11 @@ See [SECURITY.md](./SECURITY.md) ## Supported Libcurl Versions -The addon is only tested against libcurl version `7.50.0` and the latest one available. +The addon is only tested against libcurl version `7.81.0` and the latest one available. -The code itself is made to compile with any version greater than `7.32.0`, any libcurl version lower than that is **not** supported. +The code itself is only made to compile with versions greater than or equal to `7.81.0`, any libcurl version lower than that is **not** supported. + +The 7.81.0 version was released on Jan 5 2022, and it is the version shipped with Ubuntu 22.04. There has been more than 5541 bug fixes on libcurl since then. ## For Enterprise @@ -246,22 +256,21 @@ The maintainers of node-libcurl and thousands of other packages are working with The latest version of this package has prebuilt binaries (thanks to [node-pre-gyp](https://github.com/mapbox/node-pre-gyp/)) available for: -* Node.js: Latest two versions on active LTS (see https://github.com/nodejs/Release) -* Electron: Latest 3 major versions -* NW.js (node-webkit): Latest 3 major (minor for nw.js case) versions +* Node.js: Latest two versions on active LTS + Current version (see https://github.com/nodejs/Release) +* Electron: Latest 2 major versions And on the following platforms: -* Linux 64 bits -* macOS Intel & ARM64 (M1+) -* Windows 32 and 64 bits +* Linux 64 bits & ARM64 & Alpine (musl, 64 bits) +* macOS 64 bits (Intel) & ARM64 (M1+) +* Windows 64 bits Installing with `yarn add node-libcurl` or `npm install node-libcurl` should download a prebuilt binary and no compilation will be needed. However if you are trying to install on `nw.js` or `electron` additional steps will be required, check their corresponding section below. The prebuilt binary is statically built with the following library versions, features and protocols (library versions may change between Node.js versions): ``` -Version: libcurl/7.73.0 OpenSSL/1.1.1g zlib/1.2.11 brotli/1.0.7 zstd/1.4.9 c-ares/1.16.1 libidn2/2.1.1 libssh2/1.9.0 nghttp2/1.41.0 -Protocols: dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, mqtt, pop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp -Features: AsynchDNS, IDN, IPv6, Largefile, NTLM, NTLM_WB, SSL, libz, brotli, TLS-SRP, HTTP2, UnixSockets, HTTPS-proxy +Version: libcurl/8.17.0 OpenSSL/3.5.2 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.1.1 libssh2/1.10.0 nghttp2/1.66.0 ngtcp2/1.17.0 nghttp3/1.12.0 OpenLDAP/2.6.9 +Protocols: dict, file, ftp, ftps, gopher, gophers, http, https, imap, imaps, ldap, ldaps, mqtt, pop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp, ws, wss +Features: AsynchDNS, IDN, IPv6, Largefile, NTLM, SSL, libz, brotli, TLS-SRP, HTTP2, UnixSockets, HTTPS-proxy, alt-svc ``` If there is no prebuilt binary available that matches your system, or if the installation fails, then you will need an environment capable of compiling Node.js addons, which means: @@ -294,9 +303,9 @@ If you want to build a statically linked version of the addon yourself, you need ```sh npm install node-libcurl --build-from-source --curl_static_build=true ``` -> If using `yarn`: +> If using `yarn` or `pnpm`: ```sh -npm_config_build_from_source=true npm_config_curl_static_build=true yarn add node-libcurl +npm_config_build_from_source=true npm_config_curl_static_build=true yarn/pnpm add node-libcurl ``` The build process will use `curl-config` available on path, if you want to overwrite it to your own libcurl installation one, you can set the `curl_config_bin` variable, like mentioned above for `curl_static_build`. @@ -323,7 +332,7 @@ If you do not want to use the prebuilt binary, pass the `npm_config_build_from_s #### NW.js (aka node-webkit) For building from source on NW.js you first need to make sure you have nw-gyp installed globally: -`yarn global add nw-gyp` or `npm i -g nw-gyp` +`yarn global add nw-gyp` or `npm i -g nw-gyp` or `pnpm i -g nw-gyp` > If on Windows, you also need addition steps, currently the available win_delay_load_hook.cc on `nw-gyp` is not working with this addon, so it's necessary to apply a patch to it. The patch can be found on `./scripts/ci/patches/win_delay_load_hook.cc.patch`, and should be applied to the file on `/src/win_delay_load_hook.cc`. @@ -382,7 +391,7 @@ In case you want some examples check the CI configuration files ([`.travis.yml`] ### Building on macOS On macOS you must have: -- macOS >= 11.6 (Big Sur) +- macOS >= 13 (Sonoma) - Xcode Command Line Tools You can check if you have Xcode Command Line Tools be running: @@ -415,7 +424,8 @@ If installing using a prebuilt binary you only need to have the [visual c++ 2017 If building from source, you must have: - Python 3.x -- [Visual Studio >= 2017](https://visualstudio.microsoft.com/downloads/) +- [Visual Studio >= 2019](https://visualstudio.microsoft.com/downloads/) (with Clang/LLVM support enabled, see the next item) +- [Clang/LLVM support on Visual Studio](https://learn.microsoft.com/en-us/cpp/build/clang-support-msbuild?view=msvc-170) - [nasm](https://www.nasm.us/) Python 3.x and the Visual Studio compiler can be installed by running: @@ -432,6 +442,50 @@ Currently there is no support to use other libcurl version than the one provided An important note about building the addon on Windows is that we have to do some "hacks" with the header files included by `node-gyp`/`nw-gyp`. The reason for that is because as we are using a standalone version of OpenSSL, we don't want to use the OpenSSL headers provided by Node.js, which are by default added to `/include/node/openssl`, so what we do is that before compilation that folder is renamed to `openssl.disabled`. After a successful installation the folder is renamed back to their original name, **however** if any error happens during compilation the folder will stay renamed until the addon is compiled successfully. More info on why that was needed and some context can be found on issue [#164](https://github.com/JCMais/node-libcurl/issues/164). +#### Note on outdated node-gyp version + +NPM has its own internal version of `node-gyp`, which may not be the most up-to-date version. If you see an output like this: +``` +[info] it worked if it ends with ok +[info] using node-pre-gyp@2.0.0 +[info] using node@24.9.0 | win32 | x64 +gyp info it worked if it ends with ok +gyp info using node-gyp@10.1.0 +gyp info using node@24.9.0 | win32 | x64 +gyp info ok +gyp info it worked if it ends with ok +gyp info using node-gyp@10.1.0 +gyp info using node@24.9.0 | win32 | x64 +``` + +Where the node-gyp version is `10.1.0`, you will probably face issues related to ClangCL like this: +``` +C:\Users\internal\AppData\Local\node\corepack\v1\pnpm\9.9.0\dist\node_modules\node-gyp\src\win_delay_load_hook.cc(37,9): warning : unknown pragma ignored [-Wunknown-pragmas] [F:\jc\node-libcurl\build\deps\ +curl-for-windows\libcurl.vcxproj] + /LTCG:INCREMENTAL: no such file or directory +D:\Software\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(1522,5): error MSB6006: "llvm-lib.exe" exited with code 1. [F:\jc\node-libcurl\build\deps\curl-fo +r-windows\libcurl.vcxproj] +C:\Users\internal\AppData\Local\node\corepack\v1\pnpm\9.9.0\dist\node_modules\node-gyp\src\win_delay_load_hook.cc(12,9): warning : unknown pragma ignored [-Wunknown-pragmas] [F:\jc\node-libcurl\build\deps\ +curl-for-windows\brotli\brotli.vcxproj] +C:\Users\internal\AppData\Local\node\corepack\v1\pnpm\9.9.0\dist\node_modules\node-gyp\src\win_delay_load_hook.cc(37,9): warning : unknown pragma ignored [-Wunknown-pragmas] [F:\jc\node-libcurl\build\deps\ +curl-for-windows\brotli\brotli.vcxproj] + /LTCG:INCREMENTAL: no such file or directory +D:\Software\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(1522,5): error MSB6006: "llvm-lib.exe" exited with code 1. [F:\jc\node-libcurl\build\deps\curl-fo +r-windows\brotli\brotli.vcxproj] +``` + +The only solution to this is to install a globally available node-gyp version: +```powershell +npm install --global node-gyp@latest +``` + +and then use it in the install command by setting the `npm_config_node_gyp` environment variable (this assumes powershell): +```powershell +$globalNodeGypPath = Join-Path (npm prefix -g) "node_modules\node-gyp\bin\node-gyp.js" +$env:npm_config_node_gyp=$globalNodeGypPath +pnpm install node-libcurl +``` + ## Getting Help If your question is directly related to the addon or their usage, you can get help the following ways: diff --git a/benchmark/README.md b/benchmark/README.md index b383ac60f..d0255c673 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -1,113 +1,221 @@ -## Benchmarks -> Disclaimer: Those benchmarks are probably far from real world usage scenarios and should not be taken too seriously before doing tests with your use-case in mind first. +# Benchmarks + +> Disclaimer: These benchmarks may not reflect real-world usage scenarios and should not be taken too seriously without first conducting tests tailored to your specific use case. If you feel any of the code available is wrong, please open a PR with a suggested fix. -The idea is just to hit some webpage doing a GET request to `/` and receiving the result body back. +The idea is just to hit some webpage doing a GET request to `/` and receiving the result body back. For libraries that do not return the data as string, code to do that should be added, as is the case with Node.js `http.request`, `node-fetch` and `node-libcurl.Easy`. -A local server can be started with `yarn start-server`. +## Setup + +```bash +pnpm --ignore-workspace install +``` + +## Benchmarks + +### 1. Standard Benchmark (`index.js`) +Tests raw HTTP client performance with continuous requests. -Benchmark can be started with `yarn start`. +### 2. Context Switching Benchmark (`context-switching.js`) +Tests realistic scenarios where applications perform CPU-intensive work between requests. -### Results -#### Win64 i7-7700HQ 3.4GHz -##### local server +## Start + +For the local server, you can use any HTTP server, such as [`simple-http-server`](https://crates.io/crates/simple-http-server): +```bash +cargo install simple-http-server ``` -node.js http.request - GET x 395 ops/sec ±3.92% (68 runs sampled) -axios - GET x 328 ops/sec ±5.84% (64 runs sampled) -superagent - GET x 410 ops/sec ±2.31% (75 runs sampled) -request - GET x 405 ops/sec ±2.85% (75 runs sampled) -fetch - GET x 392 ops/sec ±3.66% (70 runs sampled) -node-libcurl curly - GET x 657 ops/sec ±1.78% (77 runs sampled) -node-libcurl Curl - GET x 696 ops/sec ±1.66% (79 runs sampled) -node-libcurl Curl - reusing instance - GET x 673 ops/sec ±2.17% (78 runs sampled) -node-libcurl Easy - GET x 173 ops/sec ±12.30% (55 runs sampled) -node-libcurl Easy - reusing instance - GET x 532 ops/sec ±5.42% (63 runs sampled) -Fastest is node-libcurl Curl - GET -Done in 61.27s +then: +```bash +simple-http-server -p 8080 . ``` -##### example.com + +The results below were obtained using the [`server.js`](./server.js) Node.js server, which can be started with `pnpm start-server`. + +## Running Benchmarks + +**Standard benchmark:** +```bash +pnpm start +# or +node benchmark/index.js ``` -node.js http.request - GET x 3.62 ops/sec ±1.87% (22 runs sampled) -axios - GET x 3.65 ops/sec ±2.60% (22 runs sampled) -superagent - GET x 3.68 ops/sec ±1.20% (22 runs sampled) -request - GET x 3.64 ops/sec ±1.73% (22 runs sampled) -fetch - GET x 3.67 ops/sec ±1.26% (22 runs sampled) -node-libcurl curly - GET x 7.16 ops/sec ±5.35% (39 runs sampled) -node-libcurl Curl - GET x 7.30 ops/sec ±1.51% (39 runs sampled) -node-libcurl Curl - reusing instance - GET x 7.25 ops/sec ±2.16% (38 runs sampled) -node-libcurl Easy - GET x 3.60 ops/sec ±2.50% (13 runs sampled) -node-libcurl Easy - reusing instance - GET x 3.62 ops/sec ±1.25% (22 runs sampled) -Fastest is node-libcurl Curl - GET,node-libcurl Curl - reusing instance - GET,node-libcurl curly - GET -Done in 64.24s. + +**Context switching benchmark:** +```bash +pnpm context-switching +# or +node benchmark/context-switching.js ``` -#### macOS i7-7820HQ 2.9GHz -##### local server + +You can customize the work simulation by setting these environment variables: +- `HOST`: Server hostname (default: 127.0.0.1) +- `PORT`: Server port (default: 8080) +- `URL`: Full URL to benchmark (overrides HOST/PORT) + +## Results + +> Format is: +> ``` +> #### - +> ##### +> (results) +> ``` + +### *Scenario* `Continuous Requests` (index.js) + +#### Ubuntu WSL 22.04 - AMD Ryzen 7 5700X3D 16 vCPUs +##### node server.js +```bash +libcurl/8.16.0 OpenSSL/3.5.2 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.1.1 libssh2/1.10.0 nghttp2/1.66.0 ngtcp2/1.17.0 nghttp3/1.12.0 OpenLDAP/2.6.9 +Node.js version: v24.8.0 +Platform: linux x64 +CPU Cores: 16 vCPUs | 47.0GB Mem + +node.js http.request - GET | ██████████████████████─── | 4,852 ops/sec | 21 samples +axios - GET | █████████████──────────── | 2,928 ops/sec | 20 samples +superagent - GET | █████████████▌─────────── | 2,995 ops/sec | 21 samples +request - GET | ███████████████▌───────── | 3,499 ops/sec | 21 samples +fetch - GET | █████████████████──────── | 3,744 ops/sec | 21 samples +got - GET | █████████████▌─────────── | 2,979 ops/sec | 20 samples +ky - GET | ████████████████───────── | 3,541 ops/sec | 21 samples +node-libcurl curly - GET | █████████████████▌─────── | 3,924 ops/sec | 19 samples +node-libcurl curly with object pool - GET | ██████████████████▌────── | 4,147 ops/sec | 20 samples +node-libcurl Curl - GET | ██████████████████─────── | 3,987 ops/sec | 18 samples +node-libcurl Curl - reusing instance - GET | ████████████████████▌──── | 4,512 ops/sec | 21 samples +node-libcurl Easy - GET | ████████████████───────── | 3,594 ops/sec | 19 samples +node-libcurl Easy - reusing instance - GET | █████████████████████████ | 5,470 ops/sec | 21 samples ``` -node.js http.request - GET x 851 ops/sec ±6.15% (64 runs sampled) -axios - GET x 709 ops/sec ±17.13% (66 runs sampled) -superagent - GET x 687 ops/sec ±37.44% (66 runs sampled) -request - GET x 814 ops/sec ±5.18% (71 runs sampled) -fetch - GET x 31.91 ops/sec ±206.96% (14 runs sampled) -node-libcurl curly - GET x 956 ops/sec ±14.76% (60 runs sampled) -node-libcurl Curl - GET x 1,155 ops/sec ±10.47% (67 runs sampled) -node-libcurl Curl - reusing instance - GET x 1,178 ops/sec ±5.78% (74 runs sampled) -node-libcurl Easy - GET x 875 ops/sec ±6.66% (77 runs sampled) -node-libcurl Easy - reusing instance - GET x 1,333 ops/sec ±3.19% (76 runs sampled) -Fastest is node-libcurl Easy - reusing instance - GET -✨ Done in 77.74s +```bash +libcurl/8.17.0 OpenSSL/3.5.2 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.1.1 libssh2/1.10.0 nghttp2/1.66.0 ngtcp2/1.17.0 nghttp3/1.12.0 OpenLDAP/2.6.9 +Node.js version: v24.8.0 +Platform: linux x64 +CPU Cores: 16 vCPUs | 47.0GB Mem + +node.js http.request - GET | █████████████████──────── | 4,418 ops/sec | 19 samples +axios - GET | ███████████────────────── | 2,867 ops/sec | 21 samples +superagent - GET | ███████████────────────── | 2,960 ops/sec | 21 samples +request - GET | ████████████▌──────────── | 3,232 ops/sec | 19 samples +fetch - GET | ███████████████▌───────── | 4,022 ops/sec | 21 samples +got - GET | ███████████────────────── | 2,877 ops/sec | 21 samples +ky - GET | ████████████▌──────────── | 3,326 ops/sec | 21 samples +node-libcurl curly - GET | █████████████████▌─────── | 4,592 ops/sec | 19 samples +node-libcurl curly with object pool - GET | ███████████████████▌───── | 5,079 ops/sec | 20 samples +node-libcurl Curl - GET | ██████████████████─────── | 4,729 ops/sec | 20 samples +node-libcurl Curl - reusing instance - GET | █████████████████████──── | 5,530 ops/sec | 19 samples +node-libcurl Easy - GET | ███████████████────────── | 3,985 ops/sec | 20 samples +node-libcurl Easy - reusing instance - GET | █████████████████████████ | 6,444 ops/sec | 20 samples ``` -##### example.com + +#### Windows 11 - AMD Ryzen 7 5700X3D 16 vCPUs +##### node server.js +```bash +libcurl/8.16.0-DEV OpenSSL/3.5.3 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 c-ares/1.34.5 WinIDN libssh2/1.11.1_DEV nghttp2/1.67.1 ngtcp2/1.16.0 nghttp3/1.12.0 libgsasl/2.2.2 +Node.js version: v24.9.0 +Platform: win32 x64 +CPU Cores: 16 vCPUs | 127.9GB Mem + +node.js http.request - GET | ██████████████████─────── | 5,820 ops/sec | 21 samples +axios - GET | █████████──────────────── | 2,987 ops/sec | 19 samples +superagent - GET | ██████─────────────────── | 1,960 ops/sec | 21 samples +request - GET | ███████████▌───────────── | 3,729 ops/sec | 21 samples +fetch - GET | ███████████████────────── | 4,853 ops/sec | 20 samples +got - GET | ███████████▌───────────── | 3,696 ops/sec | 21 samples +ky - GET | █████████████──────────── | 4,249 ops/sec | 20 samples +node-libcurl curly - GET | █████████████████──────── | 5,510 ops/sec | 19 samples +node-libcurl curly with object pool - GET | ██████████████████▌────── | 5,950 ops/sec | 19 samples +node-libcurl Curl - GET | ██████████████████─────── | 5,759 ops/sec | 21 samples +node-libcurl Curl - reusing instance - GET | █████████████████████──── | 6,688 ops/sec | 21 samples +node-libcurl Easy - GET | ███████────────────────── | 2,267 ops/sec | 20 samples +node-libcurl Easy - reusing instance - GET | █████████████████████████ | 7,961 ops/sec | 20 samples ``` -node.js http.request - GET x 3.55 ops/sec ±6.69% (22 runs sampled) -axios - GET x 3.69 ops/sec ±1.05% (22 runs sampled) -superagent - GET x 3.62 ops/sec ±1.79% (22 runs sampled) -request - GET x 3.65 ops/sec ±1.92% (22 runs sampled) -fetch - GET x 3.60 ops/sec ±1.74% (22 runs sampled) -node-libcurl curly - GET x 6.79 ops/sec ±7.51% (38 runs sampled) -node-libcurl Curl - GET x 5.90 ops/sec ±11.24% (34 runs sampled) -node-libcurl Curl - reusing instance - GET x 7.22 ops/sec ±1.61% (38 runs sampled) -node-libcurl Easy - GET x 3.66 ops/sec ±1.65% (14 runs sampled) -node-libcurl Easy - reusing instance - GET x 3.62 ops/sec ±3.02% (22 runs sampled) -Fastest is node-libcurl Curl - reusing instance - GET,node-libcurl curly - GET -✨ Done in 67.36s. +```bash +libcurl/8.17.0-DEV OpenSSL/3.5.3 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 c-ares/1.34.5 WinIDN libssh2/1.11.1_DEV nghttp2/1.67.1 ngtcp2/1.16.0 nghttp3/1.12.0 libgsasl/2.2.2 +Node.js version: v24.9.0 +Platform: win32 x64 +CPU Cores: 16 vCPUs | 127.9GB Mem + +node.js http.request - GET | ███████████████████▌───── | 5,271 ops/sec | 20 samples +axios - GET | ██████████▌────────────── | 2,807 ops/sec | 21 samples +superagent - GET | ███████────────────────── | 1,880 ops/sec | 20 samples +request - GET | █████████████──────────── | 3,506 ops/sec | 21 samples +fetch - GET | ████████████████▌──────── | 4,430 ops/sec | 21 samples +got - GET | ████████████▌──────────── | 3,401 ops/sec | 19 samples +ky - GET | ███████████████────────── | 4,109 ops/sec | 21 samples +node-libcurl curly - GET | ████████████████████▌──── | 5,514 ops/sec | 20 samples +node-libcurl curly with object pool - GET | ██████████████████████─── | 5,870 ops/sec | 20 samples +node-libcurl Curl - GET | █████████████████████──── | 5,626 ops/sec | 20 samples +node-libcurl Curl - reusing instance - GET | █████████████████████████ | 6,662 ops/sec | 21 samples +node-libcurl Easy - GET | ████████───────────────── | 2,213 ops/sec | 20 samples +node-libcurl Easy - reusing instance - GET | ███████████████████────── | 5,116 ops/sec | 19 samples ``` +#### macOS 16 - m1 +##### node server.js +```bash +libcurl/8.16.0 OpenSSL/3.5.2 zlib/1.2.12 brotli/1.1.0 zstd/1.4.9 libidn2/2.1.1 libssh2/1.10.0 nghttp2/1.66.0 ngtcp2/1.17.0 nghttp3/1.12.0 OpenLDAP/2.6.9 +Node.js version: v24.8.0 +Platform: darwin arm64 +CPU Cores: 10 vCPUs | 32.0GB Mem -#### Ubuntu 19.10 i7-5500U 2.4GHz - Linux 5.3.0-42 - Node v12.16.2 -##### local server -```node.js http.request - GET x 720 ops/sec ±2.65% (74 runs sampled) -axios - GET x 611 ops/sec ±2.14% (78 runs sampled) -superagent - GET x 681 ops/sec ±1.80% (77 runs sampled) -request - GET x 671 ops/sec ±2.14% (76 runs sampled) -fetch - GET x 686 ops/sec ±2.17% (77 runs sampled) -node-libcurl curly - GET x 857 ops/sec ±1.95% (76 runs sampled) -node-libcurl Curl - GET x 885 ops/sec ±2.00% (78 runs sampled) -node-libcurl Curl - reusing instance - GET x 887 ops/sec ±2.36% (77 runs sampled) -node-libcurl Easy - GET x 887 ops/sec ±1.61% (81 runs sampled) -node-libcurl Easy - reusing instance - GET x 1,007 ops/sec ±1.62% (78 runs sampled) -Fastest is node-libcurl Easy - reusing instance - GET - -real 0m59,502s -user 0m19,020s -sys 0m3,756s +node.js http.request - GET | ███████████████████████▌─ | 11,678 ops/sec | 20 samples +axios - GET | ███████████────────────── | 5,577 ops/sec | 20 samples +superagent - GET | ███████████────────────── | 5,506 ops/sec | 21 samples +request - GET | ████████████████───────── | 7,906 ops/sec | 21 samples +fetch - GET | ██████████████████▌────── | 9,210 ops/sec | 20 samples +got - GET | █████████████▌─────────── | 6,847 ops/sec | 21 samples +ky - GET | ████████████████▌──────── | 8,184 ops/sec | 21 samples +node-libcurl curly - GET | ████████████████████▌──── | 10,262 ops/sec | 21 samples +node-libcurl curly with object pool - GET | ████████████████████▌──── | 10,068 ops/sec | 21 samples +node-libcurl Curl - GET | ██████████████████████▌── | 11,141 ops/sec | 21 samples +node-libcurl Curl - reusing instance - GET | ████████████████████████▌ | 12,124 ops/sec | 20 samples +node-libcurl Easy - GET | ██████████▌────────────── | 5,300 ops/sec | 19 samples +node-libcurl Easy - reusing instance - GET | █████████████████████████ | 12,250 ops/sec | 20 samples ``` -##### example.com +```bash +libcurl/8.17.0 OpenSSL/3.5.2 zlib/1.2.12 brotli/1.1.0 zstd/1.4.9 libidn2/2.1.1 libssh2/1.10.0 nghttp2/1.66.0 ngtcp2/1.17.0 nghttp3/1.12.0 OpenLDAP/2.6.9 +Node.js version: v24.8.0 +Platform: darwin arm64 +CPU Cores: 10 vCPUs | 32.0GB Mem + +node.js http.request - GET | █████████████████████████ | 14,874 ops/sec | 20 samples +axios - GET | ████████████▌──────────── | 7,552 ops/sec | 21 samples +superagent - GET | ██████████▌────────────── | 6,442 ops/sec | 20 samples +request - GET | ███████████████────────── | 8,953 ops/sec | 20 samples +fetch - GET | ███████████████────────── | 9,158 ops/sec | 21 samples +got - GET | ████████████▌──────────── | 7,654 ops/sec | 20 samples +ky - GET | █████████████──────────── | 7,781 ops/sec | 21 samples +node-libcurl curly - GET | ██████████████████─────── | 10,822 ops/sec | 21 samples +node-libcurl curly with object pool - GET | ███████████████████▌───── | 11,896 ops/sec | 20 samples +node-libcurl Curl - GET | ███████████████████────── | 11,466 ops/sec | 20 samples +node-libcurl Curl - reusing instance - GET | █████████████████████──── | 12,758 ops/sec | 20 samples +node-libcurl Easy - GET | ████████▌──────────────── | 5,269 ops/sec | 19 samples +node-libcurl Easy - reusing instance - GET | ████████████████████───── | 12,171 ops/sec | 20 samples ``` -node.js http.request - GET x 3.42 ops/sec ±0.95% (21 runs sampled) -axios - GET x 3.44 ops/sec ±1.16% (21 runs sampled) -superagent - GET x 3.41 ops/sec ±1.31% (21 runs sampled) -request - GET x 3.43 ops/sec ±1.37% (21 runs sampled) -fetch - GET x 3.38 ops/sec ±0.83% (21 runs sampled) -node-libcurl curly - GET x 6.61 ops/sec ±5.47% (36 runs sampled) -node-libcurl Curl - GET x 6.82 ops/sec ±0.09% (36 runs sampled) -node-libcurl Curl - reusing instance - GET x 6.80 ops/sec ±0.10% (36 runs sampled) -node-libcurl Easy - GET x 3.46 ops/sec ±1.18% (13 runs sampled) -node-libcurl Easy - reusing instance - GET x 3.44 ops/sec ±1.02% (21 runs sampled) -Fastest is node-libcurl Curl - GET - -real 1m5,417s -user 0m3,469s -sys 0m0,229s + +### *Scenario* `Context Switching` (context-switching.js) + +#### Ubuntu WSL 22.04 - AMD Ryzen 7 5700X3D 16 vCPUs +##### node server.js +```bash +libcurl/8.17.0 OpenSSL/3.5.2 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.1.1 libssh2/1.10.0 nghttp2/1.66.0 ngtcp2/1.17.0 nghttp3/1.12.0 OpenLDAP/2.6.9 +Node.js version: v24.8.0 +Platform: linux x64 +CPU Cores: 16 vCPUs | 47.0GB Mem + +node.js http.request - GET | ███████████████████████── | 932 ops/sec | 20 samples +axios - GET | ████████████████████▌──── | 830 ops/sec | 20 samples +superagent - GET | ███████████████████────── | 786 ops/sec | 19 samples +request - GET | █████████████████████▌─── | 872 ops/sec | 21 samples +fetch - GET | █████████████████████▌─── | 883 ops/sec | 21 samples +got - GET | █████████████████████──── | 850 ops/sec | 21 samples +ky - GET | ██████████████████▌────── | 750 ops/sec | 19 samples +node-libcurl curly - GET | ███████████████████████▌─ | 950 ops/sec | 19 samples +node-libcurl curly with object pool - GET | ███████████████████████▌─ | 964 ops/sec | 17 samples +node-libcurl Curl - GET | ████████████████████████▌ | 992 ops/sec | 19 samples +node-libcurl Curl - reusing instance - GET | █████████████████████████ | 1,008 ops/sec | 18 samples +node-libcurl Easy - GET | ████████████████▌──────── | 676 ops/sec | 21 samples +node-libcurl Easy - reusing instance - GET | █████████████████──────── | 688 ops/sec | 19 samples ``` diff --git a/benchmark/context-switching.js b/benchmark/context-switching.js new file mode 100644 index 000000000..7e9259a44 --- /dev/null +++ b/benchmark/context-switching.js @@ -0,0 +1,237 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import crypto from 'crypto' +import http from 'http' +import axios from 'axios' +import { Suite, chartReport } from 'bench-node' +import { createRequire } from 'module' +// import { curly, Curl, Easy } from 'node-libcurl' +import superagent from 'superagent' +import request from 'request' +import got from 'got' +import ky from 'ky' + +const require = createRequire(import.meta.url) +const { curly, Curl, Easy } = require('../dist') + +console.log(Curl.getVersion()) + +const HOST = process.env.HOST || '127.0.0.1' +const PORT = process.env.PORT || '8080' +const FULL_URL = process.env.URL || `http://${HOST}:${PORT}/index.html` + +const HASH_ITERATIONS = 1000 +const HASH_ALGORITHM = 'sha256' +const DATA_TO_HASH = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(10) + +/** + * Simulates CPU-intensive work between requests + * This represents real-world processing like: + * - Data transformation + * - Validation + * - Business logic computation + * - Serialization/deserialization + */ +function simulateWork() { + let hash = DATA_TO_HASH + for (let i = 0; i < HASH_ITERATIONS; i++) { + hash = crypto.createHash(HASH_ALGORITHM).update(hash).digest('hex') + } + return hash +} + +const suite = new Suite({ + name: 'Context Switching', + minSamples: 20, + benchmarkMode: 'ops', + reporter: chartReport, +}) + +suite.add('node.js http.request - GET', async () => + new Promise((resolve, reject) => { + http + .request(FULL_URL, (res) => { + res.setEncoding('utf8') + let rawData = '' + res.on('data', (chunk) => { + rawData += chunk + }) + res.on('end', () => { + resolve() + }) + res.on('error', (error) => { + reject(error) + }) + }) + .end() + }).finally(simulateWork), +) + +suite.add('axios - GET', async () => { + await axios.get(FULL_URL) + simulateWork() +}) + +suite.add( + 'superagent - GET', + async () => + new Promise((resolve, reject) => { + superagent.get(FULL_URL).end((err) => { + simulateWork() + if (err) { + reject(err) + } else { + resolve() + } + }) + }), +) + +suite.add('request - GET', async () => + new Promise((resolve, reject) => { + request(FULL_URL, (err) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }).finally(simulateWork), +) + +suite.add('fetch - GET', async () => { + await fetch(FULL_URL).then((res) => res.text()) + simulateWork() +}) + +suite.add('got - GET', async () => { + await got(FULL_URL).text() + simulateWork() +}) + +suite.add('ky - GET', async () => { + await ky.get(FULL_URL).text() + simulateWork() +}) + +suite.add('node-libcurl curly - GET', async () => { + await curly.get(FULL_URL, { + curlyResponseBodyParser(buffer) { + return buffer.toString('utf8') + }, + }) + simulateWork() +}) + +if ('setObjectPoolLimit' in curly) { + const curlyWithPool = curly.create({ + curlyResponseBodyParser(buffer) { + return buffer.toString('utf8') + }, + }) + + curlyWithPool.setObjectPoolLimit(100) + + suite.add('node-libcurl curly with object pool - GET', async () => { + await curlyWithPool.get(FULL_URL, { + curlyResponseBodyParser(buffer) { + return buffer.toString('utf8') + }, + }) + simulateWork() + }) +} + +suite.add('node-libcurl Curl - GET', async () => + new Promise((resolve, reject) => { + const curl = new Curl() + curl.setOpt('URL', FULL_URL) + curl.on('end', () => { + curl.close() + resolve() + }) + curl.on('error', (error) => { + curl.close() + reject(error) + }) + curl.perform() + }).finally(simulateWork), +) + +let curlReuse = null +suite.add('node-libcurl Curl - reusing instance - GET', async (timer) => { + if (!curlReuse) { + curlReuse = new Curl() + } + curlReuse.setOpt('URL', FULL_URL) + timer.start() + for (let i = 0; i < timer.count; i++) { + await new Promise((resolve, reject) => { + const onEnd = () => { + curlReuse.off('end', onEnd) + curlReuse.off('error', onError) + resolve() + } + const onError = (error) => { + curlReuse.off('end', onEnd) + curlReuse.off('error', onError) + curlReuse.close() + reject(error) + } + curlReuse.on('end', onEnd) + curlReuse.on('error', onError) + curlReuse.perform() + }) + + simulateWork() + } + + timer.end(timer.count) +}) + +suite.add('node-libcurl Easy - GET', () => { + const easy = new Easy() + let headers = '' + let body = '' + + easy.setOpt('URL', FULL_URL) + easy.setOpt('HEADERFUNCTION', (data, size, nmemb) => { + headers += data.toString('utf8') + return size * nmemb + }) + easy.setOpt('WRITEFUNCTION', (data, size, nmemb) => { + body += data.toString('utf8') + return size * nmemb + }) + + easy.perform() + easy.close() + simulateWork() +}) + +let easyReuse = null +suite.add('node-libcurl Easy - reusing instance - GET', (timer) => { + if (!easyReuse) { + easyReuse = new Easy() + } + timer.start() + for (let i = 0; i < timer.count; i++) { + let headers = '' + let body = '' + easyReuse.setOpt('URL', FULL_URL) + easyReuse.setOpt('HEADERFUNCTION', (data, size, nmemb) => { + headers += data.toString('utf8') + return size * nmemb + }) + easyReuse.setOpt('WRITEFUNCTION', (data, size, nmemb) => { + body += data.toString('utf8') + return size * nmemb + }) + easyReuse.perform() + simulateWork() + } + timer.end(timer.count) +}) + +suite.run() diff --git a/benchmark/index.js b/benchmark/index.js index 04df0f51b..1977f5a34 100644 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -1,194 +1,209 @@ -const http = require('http') -const { curly, Curl, Easy } = require('node-libcurl') -const axios = require('axios') -const superagent = require('superagent') -const request = require('request') -const fetch = require('node-fetch') +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import http from 'http' +// import { curly, Curl, Easy } from 'node-libcurl' +import axios from 'axios' +import superagent from 'superagent' +import request from 'request' +import { Suite, chartReport } from 'bench-node' +import got from 'got' +import ky from 'ky' + +import { createRequire } from 'module' +const require = createRequire(import.meta.url) +const { curly, Curl, Easy } = require('../dist') + +console.log(Curl.getVersion()) const HOST = process.env.HOST || '127.0.0.1' const PORT = process.env.PORT || '8080' -const URL = `http://${HOST}:${PORT}` +const FULL_URL = process.env.URL || `http://${HOST}:${PORT}/index.html` -axios.defaults.baseURL = URL - -const Benchmark = require('benchmark') -const suite = new Benchmark.Suite('node.js http request libraries', { - initCount: 5, +const suite = new Suite({ + minSamples: 20, + benchmarkMode: 'ops', + reporter: chartReport, }) -suite.add('node.js http.request - GET', { - defer: true, - fn: (defer) => { - http - .request({ host: HOST, port: PORT, path: '/' }, (res) => { - res.setEncoding('utf8') - let rawData = '' - res.on('data', (chunk) => { - // eslint-disable-next-line no-unused-vars - rawData += chunk - }) - res.on('end', () => { - defer.resolve() +suite.add( + 'node.js http.request - GET', + async () => + new Promise((resolve, reject) => { + http + .request(FULL_URL, (res) => { + res.setEncoding('utf8') + let rawData = '' + res.on('data', (chunk) => { + rawData += chunk + }) + res.on('end', () => { + resolve() + }) + res.on('error', (error) => { + reject(error) + }) }) - }) - .end() - }, -}) + .end() + }), +) -suite.add('axios - GET', { - defer: true, - fn: (defer) => { - axios.get('/').then(() => defer.resolve()) - }, +suite.add('axios - GET', async () => { + await axios.get(FULL_URL) }) -suite.add('superagent - GET', { - defer: true, - fn: (defer) => { - superagent.get(URL).end(() => { - defer.resolve() - }) - }, -}) +suite.add( + 'superagent - GET', + async () => + new Promise((resolve, reject) => { + superagent.get(FULL_URL).end((err) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }), +) + +suite.add( + 'request - GET', + async () => + new Promise((resolve, reject) => { + request(FULL_URL, (err) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }), +) -suite.add('request - GET', { - defer: true, - fn: (defer) => { - request(URL, () => defer.resolve()) - }, +suite.add('fetch - GET', async () => { + await fetch(FULL_URL).then((res) => res.text()) }) -suite.add('fetch - GET', { - defer: true, - fn: (defer) => { - fetch(URL) - .then((res) => res.text()) - .then((_body) => defer.resolve()) - }, +suite.add('got - GET', async () => { + await got(FULL_URL).text() }) -suite.add('node-libcurl curly - GET', { - defer: true, - fn: (defer) => { - curly - .get(URL, { - curlyResponseBodyParser(buffer) { - return buffer.toString('utf8') - }, - }) - .then((_result) => defer.resolve()) - }, +suite.add('ky - GET', async () => { + await ky.get(FULL_URL).text() }) -suite.add('node-libcurl Curl - GET', { - defer: true, - fn: (defer) => { - const curl = new Curl() - curl.setOpt('URL', URL) - const onEnd = () => { - curl.close() - defer.resolve() - } - const onError = (error) => { - curl.close() - throw error - } - curl.on('end', onEnd) - curl.on('error', onError) - curl.perform() - }, +suite.add('node-libcurl curly - GET', async () => { + await curly.get(FULL_URL, { + curlyResponseBodyParser(buffer) { + return buffer.toString('utf8') + }, + }) }) -let curlReuse = null -suite.add('node-libcurl Curl - reusing instance - GET', { - defer: true, - setup: () => { - curlReuse = new Curl() - curlReuse.setOpt('URL', URL) - }, - fn: (defer) => { - const onEnd = () => { - curlReuse.off('end', onEnd) - curlReuse.off('error', onError) - defer.resolve() - } - const onError = (error) => { - curlReuse.off('end', onEnd) - curlReuse.off('error', onError) - curlReuse.close() - throw error - } - curlReuse.on('end', onEnd) - curlReuse.on('error', onError) - curlReuse.perform() - }, - teardown: () => { - curlReuse.close() - }, -}) +if ('setObjectPoolLimit' in curly) { + const curlyWithPool = curly.create({ + curlyResponseBodyParser(buffer) { + return buffer.toString('utf8') + }, + }) -suite.add('node-libcurl Easy - GET', { - fn: () => { - const easy = new Easy() - let headers = '' - let body = '' + curlyWithPool.setObjectPoolLimit(100) - easy.setOpt('URL', URL) - easy.setOpt('HEADERFUNCTION', (data, size, nmemb) => { - // eslint-disable-next-line no-unused-vars - headers += data.toString('utf8') - return size * nmemb + suite.add('node-libcurl curly with object pool - GET', async () => { + await curlyWithPool.get(FULL_URL, { + curlyResponseBodyParser(buffer) { + return buffer.toString('utf8') + }, }) - easy.setOpt('WRITEFUNCTION', (data, size, nmemb) => { - // eslint-disable-next-line no-unused-vars - body += data.toString('utf8') - return size * nmemb + }) +} + +suite.add( + 'node-libcurl Curl - GET', + async () => + new Promise((resolve, reject) => { + const curl = new Curl() + curl.setOpt('URL', FULL_URL) + curl.on('end', () => { + curl.close() + resolve() + }) + curl.on('error', (error) => { + curl.close() + reject(error) + }) + curl.perform() + }), +) + +let curlReuse = null +suite.add('node-libcurl Curl - reusing instance - GET', async (timer) => { + if (!curlReuse) { + curlReuse = new Curl() + } + curlReuse.setOpt('URL', FULL_URL) + timer.start() + for (let i = 0; i < timer.count; i++) { + await new Promise((resolve, reject) => { + const onEnd = () => { + curlReuse.off('end', onEnd) + curlReuse.off('error', onError) + resolve() + } + const onError = (error) => { + curlReuse.off('end', onEnd) + curlReuse.off('error', onError) + curlReuse.close() + reject(error) + } + curlReuse.on('end', onEnd) + curlReuse.on('error', onError) + curlReuse.perform() }) + } - easy.perform() - easy.close() - }, + timer.end(timer.count) +}) + +suite.add('node-libcurl Easy - GET', () => { + const easy = new Easy() + let headers = '' + let body = '' + + easy.setOpt('URL', FULL_URL) + easy.setOpt('HEADERFUNCTION', (data, size, nmemb) => { + headers += data.toString('utf8') + return size * nmemb + }) + easy.setOpt('WRITEFUNCTION', (data, size, nmemb) => { + body += data.toString('utf8') + return size * nmemb + }) + + easy.perform() + easy.close() }) let easyReuse = null -suite.add('node-libcurl Easy - reusing instance - GET', { - defer: true, - setup: () => { +suite.add('node-libcurl Easy - reusing instance - GET', (timer) => { + if (!easyReuse) { easyReuse = new Easy() - easyReuse.setOpt('URL', URL) - }, - fn: (defer) => { + } + timer.start() + for (let i = 0; i < timer.count; i++) { let headers = '' let body = '' - easyReuse.setOpt('URL', URL) + easyReuse.setOpt('URL', FULL_URL) easyReuse.setOpt('HEADERFUNCTION', (data, size, nmemb) => { - // eslint-disable-next-line no-unused-vars headers += data.toString('utf8') return size * nmemb }) easyReuse.setOpt('WRITEFUNCTION', (data, size, nmemb) => { - // eslint-disable-next-line no-unused-vars body += data.toString('utf8') return size * nmemb }) easyReuse.perform() - defer.resolve() - }, - teardown: () => { - easyReuse.close() - }, -}) - -suite.on('complete', function () { - console.log('Fastest is ' + this.filter('fastest').map('name')) -}) - -suite.on('cycle', function (event) { - console.log(String(event.target)) -}) - -suite.on('error', function (error) { - console.error(error) + } + timer.end(timer.count) }) -suite.run({ async: true }) +suite.run() diff --git a/benchmark/package.json b/benchmark/package.json index d1ae8b119..df27636a4 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -11,20 +11,23 @@ ], "license": "MIT", "author": "Jonathan Cardoso Machado", + "type": "module", "main": "index.js", "scripts": { - "start": "node index.js", - "start-server": "http-server . -p 8080 -s", + "context-switching": "node --allow-natives-syntax context-switching.js", + "start": "node --allow-natives-syntax index.js", + "start-server": "PORT=8080 node server.js", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { - "axios": "^0.21.1", - "benchmark": "^2.1.4", - "benny": "^3.6.14", - "http-server": "^0.12.1", - "node-fetch": "^2.6.1", - "node-libcurl": "^2.3.1", - "request": "^2.88.2", - "superagent": "^5.2.2" + "axios": "1.13.1", + "bench-node": "0.12.0", + "benchmark": "2.1.4", + "benny": "3.7.1", + "got": "14.6.1", + "ky": "1.13.0", + "node-libcurl": "4.1.0", + "request": "2.88.2", + "superagent": "10.2.3" } } diff --git a/benchmark/pnpm-lock.yaml b/benchmark/pnpm-lock.yaml new file mode 100644 index 000000000..33ee5dd8c --- /dev/null +++ b/benchmark/pnpm-lock.yaml @@ -0,0 +1,2348 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + axios: + specifier: 1.13.1 + version: 1.13.1 + bench-node: + specifier: 0.12.0 + version: 0.12.0 + benchmark: + specifier: 2.1.4 + version: 2.1.4 + benny: + specifier: 3.7.1 + version: 3.7.1 + got: + specifier: 14.6.1 + version: 14.6.1 + ky: + specifier: 1.13.0 + version: 1.13.0 + node-libcurl: + specifier: 4.1.0 + version: 4.1.0(encoding@0.1.13) + request: + specifier: 2.88.2 + version: 2.88.2 + superagent: + specifier: 10.2.3 + version: 10.2.3 + +packages: + + '@arrows/array@1.4.1': + resolution: {integrity: sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g==} + + '@arrows/composition@1.2.2': + resolution: {integrity: sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ==} + + '@arrows/dispatch@1.0.3': + resolution: {integrity: sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw==} + + '@arrows/error@1.0.2': + resolution: {integrity: sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA==} + + '@arrows/multimethod@1.4.1': + resolution: {integrity: sha512-AZnAay0dgPnCJxn3We5uKiB88VL+1ZIF2SjZohLj6vqY2UyvB/sKdDnFP+LZNVsTC5lcnGPmLlRRkAh4sXkXsQ==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} + engines: {node: '>= 10'} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@paralleldrive/cuid2@2.3.1': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/is@7.1.0': + resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} + engines: {node: '>=18'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + are-we-there-yet@4.0.2: + resolution: {integrity: sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + axios@1.13.1: + resolution: {integrity: sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + bench-node@0.12.0: + resolution: {integrity: sha512-3ffKOqnW0qMo50TKNfyPaKtNTs3m0YoncDyXzyeWTctrNPajpgk3p7iW4rufgI7V2YhQMypFbyolNSxfgSmy1A==} + + benchmark@2.1.4: + resolution: {integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==} + + benny@3.7.1: + resolution: {integrity: sha512-USzYxODdVfOS7JuQq/L0naxB788dWCiUgUTxvN+WLPt/JfcDURNNj8kN/N+uK6PDvuR67/9/55cVKGPleFQINA==} + engines: {node: '>=12'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + cacache@18.0.4: + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@13.0.12: + resolution: {integrity: sha512-qqK/etGeI/9DV5yRkO50ApDTjip9UXPml1NHYJksUAw15yMLOf8VUO1/8bu4P8birOCqR+hYQ/nh1Lezc8sZrA==} + engines: {node: '>=18'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@10.0.0: + resolution: {integrity: sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==} + engines: {node: '>=20'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + env-paths@2.2.0: + resolution: {integrity: sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + gauge@5.0.2: + resolution: {integrity: sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@14.6.1: + resolution: {integrity: sha512-56lZOw904LHKr6KdKN0Zbgz9Lw6cpEAAqZcS+0iY4D27caHoLiFT0EGCbrX9ZKYvt+I2lGl3a8eeDNSbmhyjkQ==} + engines: {node: '>=20'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + engines: {node: '>= 12'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json2csv@5.0.7: + resolution: {integrity: sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==} + engines: {node: '>= 10', npm: '>= 6.13.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + keyv@5.5.3: + resolution: {integrity: sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + ky@1.13.0: + resolution: {integrity: sha512-JeNNGs44hVUp2XxO3FY9WV28ymG7LgO4wju4HL/dCq1A8eKDcFgVrdCn1ssn+3Q/5OQilv5aYsL0DMt5mmAV9w==} + engines: {node: '>=18'} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-fetch-happen@13.0.1: + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nan@https://codeload.github.com/JCMais/nan/tar.gz/0ec2eca8b2fd7518affb3945d087e393ad839b7e: + resolution: {tarball: https://codeload.github.com/JCMais/nan/tar.gz/0ec2eca8b2fd7518affb3945d087e393ad839b7e} + version: 2.22.0 + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp@10.2.0: + resolution: {integrity: sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + node-libcurl@4.1.0: + resolution: {integrity: sha512-cwJ4pEqFmzUivMl0CtS2yYjBmZJ3/63Fl1WJCGzw45jXTCL04Ygbqvl+I5blMZm4ZOQChbATmQ6H4lxAnlIU+g==} + engines: {node: '>=16.14'} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} + engines: {node: '>=14.16'} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + npmlog@7.0.1: + resolution: {integrity: sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + p-cancelable@4.0.1: + resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} + engines: {node: '>=14.16'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + piscina@4.9.2: + resolution: {integrity: sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==} + + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + responselike@4.0.2: + resolution: {integrity: sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==} + engines: {node: '>=20'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + superagent@10.2.3: + resolution: {integrity: sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==} + engines: {node: '>=14.18.0'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@3.4.0: + resolution: {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. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + +snapshots: + + '@arrows/array@1.4.1': + dependencies: + '@arrows/composition': 1.2.2 + + '@arrows/composition@1.2.2': {} + + '@arrows/dispatch@1.0.3': + dependencies: + '@arrows/composition': 1.2.2 + + '@arrows/error@1.0.2': {} + + '@arrows/multimethod@1.4.1': + dependencies: + '@arrows/array': 1.4.1 + '@arrows/composition': 1.2.2 + '@arrows/error': 1.0.2 + fast-deep-equal: 3.1.3 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@keyv/serialize@1.1.1': {} + + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': + dependencies: + detect-libc: 2.1.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.7.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true + + '@napi-rs/nice-android-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.1.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.1.1': + optional: true + + '@napi-rs/nice-openharmony-arm64@1.1.1': + optional: true + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true + + '@napi-rs/nice@1.1.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 + optional: true + + '@noble/hashes@1.8.0': {} + + '@npmcli/agent@2.2.2': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@3.1.1': + dependencies: + semver: 7.7.3 + + '@paralleldrive/cuid2@2.3.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/is@7.1.0': {} + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@types/http-cache-semantics@4.0.4': {} + + abbrev@1.1.1: {} + + abbrev@2.0.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + aproba@2.1.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + are-we-there-yet@4.0.2: {} + + asap@2.0.6: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + astral-regex@2.0.0: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + axios@1.13.1: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + bench-node@0.12.0: + dependencies: + piscina: 4.9.2 + + benchmark@2.1.4: + dependencies: + lodash: 4.17.21 + platform: 1.3.6 + + benny@3.7.1: + dependencies: + '@arrows/composition': 1.2.2 + '@arrows/dispatch': 1.0.3 + '@arrows/multimethod': 1.4.1 + benchmark: 2.1.4 + common-tags: 1.8.2 + fs-extra: 10.1.0 + json2csv: 5.0.7 + kleur: 4.1.5 + log-update: 4.0.0 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + cacache@18.0.4: + dependencies: + '@npmcli/fs': 3.1.1 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 + + cacheable-lookup@7.0.0: {} + + cacheable-request@13.0.12: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 9.0.1 + http-cache-semantics: 4.2.0 + keyv: 5.5.3 + mimic-response: 4.0.0 + normalize-url: 8.1.0 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caseless@0.12.0: {} + + chownr@2.0.0: {} + + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@6.2.1: {} + + common-tags@1.8.2: {} + + component-emitter@1.3.1: {} + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: {} + + cookiejar@2.1.4: {} + + core-util-is@1.0.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@10.0.0: + dependencies: + mimic-response: 4.0.0 + + defer-to-connect@2.0.1: {} + + delayed-stream@1.0.0: {} + + delegates@1.0.0: {} + + detect-libc@2.1.2: {} + + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + env-paths@2.2.0: {} + + err-code@2.0.3: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + exponential-backoff@3.1.3: {} + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-safe-stringify@2.1.1: {} + + follow-redirects@1.15.11: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data-encoder@4.1.0: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.3.1 + dezalgo: 1.0.4 + once: 1.4.0 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + + fs.realpath@1.0.0: {} + + function-bind@1.1.2: {} + + gauge@3.0.2: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + gauge@5.0.2: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 4.1.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + got@14.6.1: + dependencies: + '@sindresorhus/is': 7.1.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 13.0.12 + decompress-response: 10.0.0 + form-data-encoder: 4.1.0 + http2-wrapper: 2.2.1 + keyv: 5.5.3 + lowercase-keys: 3.0.0 + p-cancelable: 4.0.1 + responselike: 4.0.2 + type-fest: 4.41.0 + + graceful-fs@4.2.11: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-unicode@2.0.1: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@10.0.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-lambda@1.0.1: {} + + is-stream@4.0.1: {} + + is-typedarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jsbn@0.1.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + json2csv@5.0.7: + dependencies: + commander: 6.2.1 + jsonparse: 1.3.1 + lodash.get: 4.4.2 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + keyv@5.5.3: + dependencies: + '@keyv/serialize': 1.1.1 + + kleur@4.1.5: {} + + ky@1.13.0: {} + + lodash.get@4.4.2: {} + + lodash@4.17.21: {} + + log-update@4.0.0: + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-fetch-happen@13.0.1: + dependencies: + '@npmcli/agent': 2.2.2 + cacache: 18.0.4 + http-cache-semantics: 4.2.0 + is-lambda: 1.0.1 + minipass: 7.1.2 + minipass-fetch: 3.0.5 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.4 + proc-log: 4.2.0 + promise-retry: 2.0.1 + ssri: 10.0.6 + transitivePeerDependencies: + - supports-color + + math-intrinsics@1.1.0: {} + + methods@1.1.2: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@3.0.5: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.1.3: {} + + nan@https://codeload.github.com/JCMais/nan/tar.gz/0ec2eca8b2fd7518affb3945d087e393ad839b7e: {} + + negotiator@0.6.4: {} + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-gyp@10.2.0: + dependencies: + env-paths: 2.2.0 + exponential-backoff: 3.1.3 + glob: 10.4.5 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.1 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.7.3 + tar: 6.2.1 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + + node-libcurl@4.1.0(encoding@0.1.13): + dependencies: + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) + env-paths: 2.2.0 + nan: https://codeload.github.com/JCMais/nan/tar.gz/0ec2eca8b2fd7518affb3945d087e393ad839b7e + node-gyp: 10.2.0 + npmlog: 7.0.1 + rimraf: 5.0.5 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-url@8.1.0: {} + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + npmlog@7.0.1: + dependencies: + are-we-there-yet: 4.0.2 + console-control-strings: 1.1.0 + gauge: 5.0.2 + set-blocking: 2.0.0 + + oauth-sign@0.9.0: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + p-cancelable@4.0.1: {} + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + package-json-from-dist@1.0.1: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + performance-now@2.1.0: {} + + piscina@4.9.2: + optionalDependencies: + '@napi-rs/nice': 1.1.1 + + platform@1.3.6: {} + + proc-log@4.2.0: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + proxy-from-env@1.1.0: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + qs@6.5.3: {} + + quick-lru@5.1.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + resolve-alpn@1.2.1: {} + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + responselike@4.0.2: + dependencies: + lowercase-keys: 3.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retry@0.12.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@5.0.5: + dependencies: + glob: 10.4.5 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + set-blocking@2.0.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.0.1 + smart-buffer: 4.2.0 + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + ssri@10.0.6: + dependencies: + minipass: 7.1.2 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + superagent@10.2.3: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.4.3 + fast-safe-stringify: 2.1.1 + form-data: 4.0.4 + formidable: 3.5.4 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.14.0 + transitivePeerDependencies: + - supports-color + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@0.0.3: {} + + tslib@2.6.2: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-fest@0.21.3: {} + + type-fest@4.41.0: {} + + unique-filename@3.0.0: + dependencies: + unique-slug: 4.0.0 + + unique-slug@4.0.0: + dependencies: + imurmurhash: 0.1.4 + + universalify@2.0.1: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.1 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + yallist@4.0.0: {} diff --git a/benchmark/pnpm-workspace.yaml b/benchmark/pnpm-workspace.yaml new file mode 100644 index 000000000..a6a639edc --- /dev/null +++ b/benchmark/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +onlyBuiltDependencies: + - node-libcurl diff --git a/benchmark/server.js b/benchmark/server.js new file mode 100644 index 000000000..fbd3fe394 --- /dev/null +++ b/benchmark/server.js @@ -0,0 +1,26 @@ +import http from 'http' +import fs from 'fs' +import path from 'path' +import { fileURLToPath } from 'url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +// Load index.html into memory +const indexHtml = fs.readFileSync(path.join(__dirname, 'index.html')) +const contentLength = Buffer.byteLength(indexHtml) + +const HOST = process.env.HOST || '127.0.0.1' +const PORT = process.env.PORT || '8080' + +const server = http.createServer((req, res) => { + res.writeHead(200, { + 'Content-Type': 'text/html', + 'Content-Length': contentLength, + }) + res.end(indexHtml) +}) + +server.listen(PORT, HOST, () => { + console.log(`Server running at http://${HOST}:${PORT}/`) +}) diff --git a/benchmark/yarn.lock b/benchmark/yarn.lock deleted file mode 100644 index 4a577fa2c..000000000 --- a/benchmark/yarn.lock +++ /dev/null @@ -1,1364 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@arrows/array@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@arrows/array/-/array-1.4.0.tgz#4d0180b531da57e5de01f181d7f8abe6aea9b70f" - integrity sha512-kzd9z63lqqvyqkQ4kONGMTor3jl/zf4H7RvX4hoyG6mF7Ii01wx1JSHpDU5zhQIM+bqY7m4uaeqc+XADgKZLmA== - dependencies: - "@arrows/composition" "^1.0.0" - -"@arrows/composition@^1.0.0", "@arrows/composition@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@arrows/composition/-/composition-1.2.2.tgz#d0a213cac8f8c36c1c75856a1e6ed940c27e9169" - integrity sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ== - -"@arrows/dispatch@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/@arrows/dispatch/-/dispatch-1.0.3.tgz#c4c06260f89e9dd4ce280df3712980aa2f3de976" - integrity sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw== - dependencies: - "@arrows/composition" "^1.2.2" - -"@arrows/error@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@arrows/error/-/error-1.0.2.tgz#4e68036f901118ba6f1de88656ef6be49e650414" - integrity sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA== - -"@arrows/multimethod@^1.1.6": - version "1.1.7" - resolved "https://registry.npmjs.org/@arrows/multimethod/-/multimethod-1.1.7.tgz#bc7c26c3aa7703fc967e65da4f00718b1428eb4a" - integrity sha512-EjHD3XuGAV4G28rm7mu8k7zQJh/EOizh104/p9i2ofGcnL5mgKONFH/Bq6H3SJjM+WDAlKcR9WBpNhaAKCnH2g== - dependencies: - "@arrows/array" "^1.4.0" - "@arrows/composition" "^1.2.2" - "@arrows/error" "^1.0.2" - fast-deep-equal "^3.1.1" - -abbrev@1: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -async@^2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -basic-auth@^1.0.3: - version "1.1.0" - resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" - integrity sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -benchmark@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" - integrity sha1-CfPeMckWQl1JjMLuVloOvzwqVik= - dependencies: - lodash "^4.17.4" - platform "^1.3.3" - -benny@^3.6.14: - version "3.6.14" - resolved "https://registry.npmjs.org/benny/-/benny-3.6.14.tgz#961e9cfce2eae69585ad8a8aeeaff13fe6eff458" - integrity sha512-Y9O44pD4Woes+K6OQtIVh9FvghtAPr/CdncdYnc+p1bpQuRahU4GbtCGGwVQwxAbgR2CBpVJtf79cWv1ePcLWQ== - dependencies: - "@arrows/composition" "^1.0.0" - "@arrows/dispatch" "^1.0.2" - "@arrows/multimethod" "^1.1.6" - benchmark "^2.1.4" - fs-extra "^8.1.0" - json2csv "^4.5.3" - kleur "^3.0.3" - log-update "^3.3.0" - prettier "^1.18.2" - stats-median "^1.0.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -colors@^1.3.3: - version "1.4.0" - resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.15.1: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -cookiejar@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -corser@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" - integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c= - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -debug@^3.1.1, debug@^3.2.6: - version "3.2.6" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ecstatic@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz#6d1dd49814d00594682c652adb66076a69d46c48" - integrity sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog== - dependencies: - he "^1.1.1" - mime "^1.6.0" - minimist "^1.1.0" - url-join "^2.0.5" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -env-paths@2.2.0, env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== - -eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-safe-stringify@^2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - -follow-redirects@^1.0.0, follow-redirects@^1.10.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" - integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" - integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -formidable@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" - integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - 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" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -graceful-fs@^4.2.3: - version "4.2.4" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -he@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-server@^0.12.1: - version "0.12.1" - resolved "https://registry.npmjs.org/http-server/-/http-server-0.12.1.tgz#629ae9a8c786587ee21b0ff087b670f69b809d8c" - integrity sha512-T0jB+7J7GJ2Vo+a4/T7P7SbQ3x2GPDnqRqQXdfEuPuUOmES/9NBxPnDm7dh1HGEeUWqUmLUNtGV63ZC5Uy3tGA== - dependencies: - basic-auth "^1.0.3" - colors "^1.3.3" - corser "^2.0.1" - ecstatic "^3.3.2" - http-proxy "^1.17.0" - opener "^1.5.1" - optimist "~0.6.1" - portfinder "^1.0.20" - secure-compare "3.0.1" - union "~0.5.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json2csv@^4.5.3: - version "4.5.4" - resolved "https://registry.npmjs.org/json2csv/-/json2csv-4.5.4.tgz#2b59c2869a137ec48cd2e243e0180466155f773f" - integrity sha512-YxBhY4Lmn8IvVZ36nqg5omxneLy9JlorkqW1j/EDCeqvmi+CQ4uM+wsvXlcIqvGDewIPXMC/O/oF8DX9EH5aoA== - dependencies: - commander "^2.15.1" - jsonparse "^1.3.1" - lodash.get "^4.4.2" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash@^4.17.14, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-update@^3.3.0: - version "3.4.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz#3b9a71e00ac5b1185cc193a36d654581c48f97b9" - integrity sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg== - dependencies: - ansi-escapes "^3.2.0" - cli-cursor "^2.1.0" - wrap-ansi "^5.0.0" - -methods@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -mime@^1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.4: - version "2.4.4" - resolved "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^3.0.0: - version "3.1.3" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nan@2.14.1: - version "2.14.1" - resolved "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== - -needle@^2.5.0: - version "2.5.2" - resolved "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a" - integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-gyp@7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.0.tgz#cb8aed7ab772e73ad592ae0c71b0e3741099fe39" - integrity sha512-rjlHQlnl1dqiDZxZYiKqQdrjias7V+81OVR5PTzZioCBtWkNdrKy06M05HLKxy/pcKikKRCabeDRoZaEc6nIjw== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^4.0.3" - npmlog "^4.1.2" - request "^2.88.2" - rimraf "^2.6.3" - semver "^7.3.2" - tar "^6.0.1" - which "^2.0.2" - -node-libcurl@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/node-libcurl/-/node-libcurl-2.3.1.tgz#f7bdaeb3d70fd2c0ed985761942da4379303ca80" - integrity sha512-YUdCdDXky+XSfYSbKi4lMMtPBBkszqZ0DwAedQ9OgW10zBgjmtRnW4RyGfmyrpSTYza3hVy7JQYCHEVuxpNm9A== - dependencies: - env-paths "2.2.0" - nan "2.14.1" - node-gyp "7.1.0" - node-pre-gyp "0.15.0" - npmlog "4.1.2" - rimraf "^3.0.2" - tslib "2.0.1" - -node-pre-gyp@0.15.0: - version "0.15.0" - resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz#c2fc383276b74c7ffa842925241553e8b40f1087" - integrity sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.3" - needle "^2.5.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - -nopt@^4.0.1, nopt@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - -npmlog@4.1.2, npmlog@^4.0.2, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -opener@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== - -optimist@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -platform@^1.3.3: - version "1.3.5" - resolved "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" - integrity sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q== - -portfinder@^1.0.20: - version "1.0.25" - resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.1" - -prettier@^1.18.2: - version "1.19.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@^6.4.0, qs@^6.9.1: - version "6.9.3" - resolved "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" - integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - 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" - -readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - 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" - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -secure-compare@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" - integrity sha1-8aAymzCLIh+uN7mXTz1XjQypmeM= - -semver@^5.3.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2: - version "7.3.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - 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" - -stats-median@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz#ca8497cb1014d23d145db4d6fc93c8e815eed3ef" - integrity sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -superagent@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/superagent/-/superagent-5.2.2.tgz#6ff726c5642795b2c27009e92687c8e69a6bb07d" - integrity sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.2" - debug "^4.1.1" - fast-safe-stringify "^2.0.7" - form-data "^3.0.0" - formidable "^1.2.1" - methods "^1.1.2" - mime "^2.4.4" - qs "^6.9.1" - readable-stream "^3.4.0" - semver "^6.3.0" - -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -tar@^6.0.1: - version "6.0.5" - resolved "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" - integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tslib@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" - integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -union@~0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" - integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== - dependencies: - qs "^6.4.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== - dependencies: - punycode "^2.1.0" - -url-join@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" - integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg= - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -which@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wrap-ansi@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/binding.gyp b/binding.gyp index f2bffd0fa..0fa18f909 100644 --- a/binding.gyp +++ b/binding.gyp @@ -1,8 +1,8 @@ { # Those variables can be overwritten when installing the package, like: # npm install --curl-extra_link_args=true - # or if using yarn: - # npm_config_curl_extra_link_args=true yarn install + # or if using pnpm: + # npm_config_curl_extra_link_args=true pnpm install # 'variables': { # Comma separated list @@ -11,32 +11,49 @@ 'curl_static_build%': 'false', 'curl_config_bin%': 'node <(module_root_dir)/scripts/curl-config.js', 'node_libcurl_no_setlocale%': 'false', - 'node_libcurl_cpp_std%': ' Unknown pragma (mostly GCC pragmas being used) # 4996 -> Declared wrongly Nan::Callback::Call # 4309 -> 'static_cast': truncation of constant value on v8 header - 'DisableSpecificWarnings': ['4244', '4506', '4068', '4838', '4996', '4309'], + # 28251 -> Inconsistent annotation for 'NTSTATUS': this instance has no annotations. This is coming from libuv headers. + 'DisableSpecificWarnings': ['4244', '4506', '4068', '4838', '4996', '4309', '28251'], 'AdditionalOptions': [ '/std:<(node_libcurl_cpp_std)', '/MP', #compile across multiple CPUs ], + "ExceptionHandling": 1, }, 'VCLinkerTool': { - 'GenerateDebugInformation': 'true', + 'AdditionalOptions': [ + '/FORCE:MULTIPLE', + # Symbol already defined. Impossible to avoid given Node.js exposes OpenSSL symbols from their own build. + '/IGNORE:4006' + ], }, }, - 'configurations' : { + 'configurations': { 'Release': { 'msvs_settings': { 'VCCLCompilerTool': { @@ -76,29 +99,48 @@ 'EnableFunctionLevelLinking': 'true', 'EnableIntrinsicFunctions': 'true', 'WarnAsError': 'true', + 'RuntimeLibrary': 2, } } }, 'Debug': { 'msvs_settings': { 'VCCLCompilerTool': { - 'WarnAsError': 'false' + 'WarnAsError': 'false', + 'RuntimeLibrary': 3, + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', } } } }, 'dependencies': [ - '= 2.1.2 < 3.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isexe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" - integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -keyv@^4.0.0: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^10.0.1, lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^7.7.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-fetch-happen@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" - 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 "^9.0.0" - -make-fetch-happen@^13.0.0: - version "13.0.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" - integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== - dependencies: - "@npmcli/agent" "^2.0.0" - cacache "^18.0.0" - http-cache-semantics "^4.1.1" - is-lambda "^1.0.1" - minipass "^7.0.2" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - proc-log "^4.2.0" - promise-retry "^2.0.1" - ssri "^10.0.0" - -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-collect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" - integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== - dependencies: - minipass "^7.0.3" - -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== - dependencies: - minipass "^3.1.6" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-fetch@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" - integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== - dependencies: - minipass "^7.0.3" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@^2.0.0, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -"nan@github:JCMais/nan#fix/electron-failures": - version "2.22.0" - resolved "https://codeload.github.com/JCMais/nan/tar.gz/0ec2eca8b2fd7518affb3945d087e393ad839b7e" - -negotiator@^0.6.3: - version "0.6.4" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - -node-abi@^3.45.0: - version "3.71.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038" - integrity sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw== - dependencies: - semver "^7.3.5" - -node-api-version@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.0.tgz#5177441da2b1046a4d4547ab9e0972eed7b1ac1d" - integrity sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg== - dependencies: - semver "^7.3.5" - -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-gyp@10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86" - integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw== - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^10.3.10" - graceful-fs "^4.2.6" - make-fetch-happen "^13.0.0" - nopt "^7.0.0" - proc-log "^4.1.0" - semver "^7.3.5" - tar "^6.2.1" - which "^4.0.0" - -"node-libcurl@link:../..": - version "0.0.0" - uid "" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - -nopt@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" - integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== - dependencies: - abbrev "^2.0.0" - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npmlog@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" - integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== - dependencies: - are-we-there-yet "^4.0.0" - console-control-strings "^1.1.0" - gauge "^5.0.0" - set-blocking "^2.0.0" - -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -ora@^5.1.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== - -proc-log@^4.1.0, proc-log@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" - integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -read-binary-file-arch@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz#959c4637daa932280a9b911b1a6766a7e44288fc" - integrity sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg== - dependencies: - debug "^4.3.4" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -rimraf@5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" - integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== - dependencies: - glob "^10.3.7" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -roarr@^2.15.3: - version "2.15.4" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" - integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== - dependencies: - boolean "^3.0.1" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== - -semver@^6.0.0, semver@^6.2.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.5: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks-proxy-agent@^8.0.3: - version "8.0.5" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" - integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== - dependencies: - agent-base "^7.1.2" - debug "^4.3.4" - socks "^2.8.3" - -socks@^2.6.2, socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - -sprintf-js@^1.1.2, sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - -ssri@^10.0.0: - version "10.0.6" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" - integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== - dependencies: - minipass "^7.0.3" - -ssri@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== - dependencies: - minipass "^3.1.1" - -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -sumchecker@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" - integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== - dependencies: - debug "^4.1.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tar@^6.0.5, tar@^6.1.11, tar@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tslib@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== - dependencies: - unique-slug "^3.0.0" - -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== - dependencies: - imurmurhash "^0.1.4" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" - integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== - dependencies: - isexe "^3.1.1" - -wide-align@^1.1.2, wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.0.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..242f05e47 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,79 @@ +const { defineConfig } = require('eslint/config') + +const globals = require('globals') +const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended') +const js = require('@eslint/js') + +const tsEslint = require('typescript-eslint') + +const noUnusedVarsSetting = { + varsIgnorePattern: '^(_|Easy|Share|Multi|Curl)', + argsIgnorePattern: '^_', +} + +module.exports = defineConfig([ + { + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module', + parserOptions: {}, + + globals: { + ...globals.node, + }, + }, + }, + { + files: ['**/*.js'], + plugins: { + js, + }, + extends: ['js/recommended'], + rules: { + 'no-unused-vars': ['error', noUnusedVarsSetting], + }, + }, + tsEslint.configs.recommended, + eslintPluginPrettierRecommended, + { + files: ['**/*.{js,ts}'], + rules: { + '@typescript-eslint/no-require-imports': 0, + '@typescript-eslint/indent': 0, + '@typescript-eslint/explicit-function-return-type': 0, + '@typescript-eslint/explicit-module-boundary-types': 0, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/no-non-null-assertion': 0, + '@typescript-eslint/ban-ts-ignore': 0, + '@typescript-eslint/no-duplicate-enum-values': 0, + '@typescript-eslint/no-unsafe-declaration-merging': 0, + '@typescript-eslint/ban-ts-comment': 0, + + '@typescript-eslint/member-ordering': [ + 2, + { + default: [ + 'public-static-field', + 'protected-static-field', + 'private-static-field', + 'public-instance-field', + 'protected-instance-field', + 'private-instance-field', + 'public-constructor', + 'protected-constructor', + 'private-constructor', + 'public-instance-method', + 'protected-instance-method', + 'private-instance-method', + 'public-static-method', + 'protected-static-method', + 'private-static-method', + ], + }, + ], + + '@typescript-eslint/no-parameter-properties': 0, + '@typescript-eslint/no-unused-vars': ['error', noUnusedVarsSetting], + }, + }, +]) diff --git a/examples/.eslintrc b/examples/.eslintrc deleted file mode 100644 index b6cce5287..000000000 --- a/examples/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "rules": { - // console is valid on examples folder! - "no-console": 0 - } -} diff --git a/examples/01-curl.js b/examples/01-curl.js index ac1603d4b..437e97d03 100644 --- a/examples/01-curl.js +++ b/examples/01-curl.js @@ -22,6 +22,8 @@ Curl.defaultUserAgent = null const curl = new Curl() +console.log(Curl.getVersion()) + // if you want to change the user agent for an already created instance you will need // to use their respective libcurl option, USERAGENT diff --git a/examples/16-ftp-full-upload.js b/examples/16-ftp-full-upload.js index 5b634bde1..232879d58 100644 --- a/examples/16-ftp-full-upload.js +++ b/examples/16-ftp-full-upload.js @@ -49,7 +49,7 @@ curl.setOpt(Curl.option.VERBOSE, true) curl.setOpt(Curl.option.URL, url + uploadFileWithName) curl.setOpt(Curl.option.USERNAME, username) // only set password if one was provided -password && curl.setOpt(Curl.option.PASSWORD, password) +if (password) curl.setOpt(Curl.option.PASSWORD, password) // enable uploading curl.setOpt(Curl.option.UPLOAD, true) // pass in that last of FTP commands to run after the transfer diff --git a/examples/19-binary-data-protobuf/README.md b/examples/19-binary-data-protobuf/README.md index 1c8b7c86d..188c0b6ed 100644 --- a/examples/19-binary-data-protobuf/README.md +++ b/examples/19-binary-data-protobuf/README.md @@ -3,6 +3,6 @@ This is a simple mock server that can be used to run the example [`19-binary-data-protobuf`](../19-binary-data-protobuf.js). ``` -yarn +pnpm i node server.js ``` diff --git a/examples/19-binary-data-protobuf/package.json b/examples/19-binary-data-protobuf/package.json index 9565c8be1..4fdfb8d52 100644 --- a/examples/19-binary-data-protobuf/package.json +++ b/examples/19-binary-data-protobuf/package.json @@ -1,10 +1,10 @@ { "dependencies": { - "koa": "^2.12.1", - "@koa/router": "^9.0.1", - "stoppable": "1.1.0", - "es6-promisify": "6.1.1", - "protobufjs": "6.9.0", - "raw-body": "2.4.1" + "@koa/router": "^14.0.0", + "es6-promisify": "7.0.0", + "koa": "^3.0.1", + "protobufjs": "7.5.4", + "raw-body": "3.0.1", + "stoppable": "1.1.0" } } diff --git a/examples/19-binary-data-protobuf/pnpm-lock.yaml b/examples/19-binary-data-protobuf/pnpm-lock.yaml new file mode 100644 index 000000000..b76b18553 --- /dev/null +++ b/examples/19-binary-data-protobuf/pnpm-lock.yaml @@ -0,0 +1,473 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@koa/router': + specifier: ^14.0.0 + version: 14.0.0 + es6-promisify: + specifier: 7.0.0 + version: 7.0.0 + koa: + specifier: ^3.0.1 + version: 3.0.1 + protobufjs: + specifier: 7.5.4 + version: 7.5.4 + raw-body: + specifier: 3.0.1 + version: 3.0.1 + stoppable: + specifier: 1.1.0 + version: 1.1.0 + +packages: + + '@koa/router@14.0.0': + resolution: {integrity: sha512-LBSu5K0qAaaQcXX/0WIB9PGDevyCxxpnc1uq13vV/CgObaVxuis5hKl3Eboq/8gcb6ebnkAStW9NB/Em2eYyFA==} + engines: {node: '>= 20'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@types/node@24.5.2': + resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es6-promisify@7.0.0: + resolution: {integrity: sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa@3.0.1: + resolution: {integrity: sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==} + engines: {node: '>= 18'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + undici-types@7.12.0: + resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + +snapshots: + + '@koa/router@14.0.0': + dependencies: + debug: 4.4.3 + http-errors: 2.0.0 + koa-compose: 4.1.0 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@types/node@24.5.2': + dependencies: + undici-types: 7.12.0 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + bytes@3.1.2: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookies@0.9.1: + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-equal@1.0.1: {} + + delegates@1.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + ee-first@1.1.1: {} + + encodeurl@2.0.0: {} + + es6-promisify@7.0.0: {} + + escape-html@1.0.3: {} + + fresh@0.5.2: {} + + http-assert@1.5.0: + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + inherits@2.0.4: {} + + keygrip@1.1.0: + dependencies: + tsscmp: 1.0.6 + + koa-compose@4.1.0: {} + + koa@3.0.1: + dependencies: + accepts: 1.3.8 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + delegates: 1.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 2.0.0 + koa-compose: 4.1.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + + long@5.3.2: {} + + media-typer@1.1.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + ms@2.1.3: {} + + negotiator@0.6.3: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + parseurl@1.3.3: {} + + path-to-regexp@8.3.0: {} + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 24.5.2 + long: 5.3.2 + + raw-body@3.0.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + setprototypeof@1.2.0: {} + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + stoppable@1.1.0: {} + + toidentifier@1.0.1: {} + + tsscmp@1.0.6: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + undici-types@7.12.0: {} + + unpipe@1.0.0: {} + + vary@1.1.2: {} diff --git a/examples/21-websockets-client.js b/examples/21-websockets-client.js index bbc5124bf..9194a73ec 100644 --- a/examples/21-websockets-client.js +++ b/examples/21-websockets-client.js @@ -5,17 +5,33 @@ * LICENSE file in the root directory of this source tree. */ -// This code is pretty big, but shows how to use node-libcurl -// as a VERY simple websockets client. There are many scenarios -// that are not currently handled, so keep that in mind :) -// How to run this example: -// 1. start the server (install the deps in there first) -// node examples/21-websockets-server/index.js -// 2. start the client -// node examples/21-websockets-client.js -// type "connect" in the terminal running the client and hit enter -// There are more commands available, in both server and client. -// Take a look at the respective stdin on data handlers. +/** + * Interactive WebSocket client using manual frame handling + * + * Note: This example was created before libcurl had better WebSocket support. + * Check out the 21-websockets-native.js example for a newer approach using + * libcurl's native WebSocket API (wsRecv/wsSend/wsMeta). + * + * This code shows how to use node-libcurl as a VERY simple websockets client + * by manually handling WebSocket frame packing/unpacking according to RFC 6455. + * There are many scenarios that are not currently handled, so keep that in mind. + * + * How to run this example: + * 1. start the server (install the deps in there first) + * node examples/21-websockets-server/index.js + * 2. start the client + * node examples/21-websockets-client.js + * + * Type commands in the terminal: + * - connect: establish WebSocket connection + * - close: send close frame + * - big:N: send large message (N repeats of alphabet) + * - multiple: send multiple messages + * - ping:msg: send ping frame + * - binary: send binary frame + * - quit/exit: close connection and exit + * - anything else: send as text message + */ // The following source-code/article was very useful when writing this: // https://blog.pusher.com/websockets-from-scratch/ @@ -33,7 +49,9 @@ const os = require('os') const { CurlCode, Easy, Multi, SocketState } = require('node-libcurl') const { packCloseFrame, + packFrame, packMessageFrame, + packPingFrame, packPongFrame, readFrame, WEBSOCKET_FRAME_OPCODE, @@ -56,6 +74,10 @@ let state = getCleanState() const closeHandle = (easyHandle) => { state = getCleanState() + if (easyHandle.isMonitoringSockets) { + easyHandle.unmonitorSocketEvents() + } + if (easyHandle.private.multi) { easyHandle.private.multi.removeHandle(easyHandle) } @@ -135,6 +157,16 @@ const onConnected = (easyHandle) => { // mark the connection as upgraded, we are ready! state.hasRequestBeenUpgraded = true + console.log('✓ Connected! WebSocket ready.\n') + console.log('Commands:') + console.log(' close - close connection') + console.log(' big:N - send large message (N repeats)') + console.log(' multiple - send multiple messages') + console.log(' ping:msg - send ping frame') + console.log(' binary - send binary frame') + console.log(' quit/exit - close and exit') + console.log(' - send text message\n') + // the message may already include some // ws frames, let's handle them receivedData = receivedData.slice(headersEnd + 4) @@ -144,6 +176,7 @@ const onConnected = (easyHandle) => { Buffer.from('hello :)', 'utf8'), ) sendData(easyHandle, packedFrame) + console.log('-> sent initial greeting: hello :)') } // no ws data was received - we are done here. @@ -154,31 +187,31 @@ const onConnected = (easyHandle) => { // if we are here, it means we got a frame! // remember, a single message can include multiple frames. - console.log('-> received ws frame(s) =', receivedData) + console.log('<- received ws frame(s) =', receivedData) try { const frames = [] let frame do { frame = readFrame(frame ? frame.remaining : receivedData) - console.log('-> frame =', frame) + console.log('<- frame =', frame) if (frame) { switch (frame.opc) { case WEBSOCKET_FRAME_OPCODE.CONT: console.log( - '-> frame is a continuation frame from the previous data', + '<- frame is a continuation frame from the previous data', ) break case WEBSOCKET_FRAME_OPCODE.NON_CONTROL_TEXT: console.log( - '-> frame is a text frame - payload =', + '<- frame is a text frame - payload =', frame.payload && frame.payload.toString(), ) break case WEBSOCKET_FRAME_OPCODE.NON_CONTROL_BINARY: console.log( - '-> frame is a binary frame - payload =', + '<- frame is a binary frame - payload =', frame.payload, ) break @@ -199,6 +232,7 @@ const onConnected = (easyHandle) => { (f) => f.opc === WEBSOCKET_FRAME_OPCODE.CONTROL_CLOSE, ) if (closeFrame) { + console.log('<- received close frame') // send close frame if the connection close was not requested by us if (!state.closeRequestedByUs) { // TODO: use code from req @@ -215,6 +249,7 @@ const onConnected = (easyHandle) => { (f) => f.opc === WEBSOCKET_FRAME_OPCODE.CONTROL_PING, ) if (pingFrame) { + console.log('<- received ping frame - sending pong') sendData( easyHandle, packPongFrame( @@ -222,6 +257,16 @@ const onConnected = (easyHandle) => { ), ) } + + /////////////////////// + // Handle pong opcode + /////////////////////// + const pongFrame = frames.find( + (f) => f.opc === WEBSOCKET_FRAME_OPCODE.CONTROL_PONG, + ) + if (pongFrame) { + console.log('<- received pong frame') + } } catch (error) { if (error instanceof WebSocketError) { console.error('We got a WebSocketError: ', error, error.code) @@ -323,31 +368,61 @@ process.stdin.on( // two special handlers switch (dataStr) { case 'connect': + if (state.connectionOpen) { + console.log('Already connected!') + return + } easyHandle = connect() return + case 'quit': case 'exit': - process.exit(0) + process.stdin.pause() + console.log('Closing connection...') + if (easyHandle && state.connectionOpen) { + try { + state.closeRequestedByUs = true + sendData(easyHandle, packCloseFrame()) + } catch { + // ignore + } + closeHandle(easyHandle) + } + if (multi) { + multi.close() + } + console.log('Goodbye!') return } - if (state.hasRequestBeenUpgraded && state.connectionOpen) { + if (!easyHandle || !state.connectionOpen) { + console.log('Not connected. Type "connect" first.') + return + } + + if (!state.hasRequestBeenUpgraded) { + console.log('Connection not yet upgraded. Please wait...') + return + } + + try { switch (dataStr) { - case 'big': - sendData( - easyHandle, - packMessageFrame( - Buffer.from( - 'abcdefghijklmnopqrstuvwxyz'.repeat(args[0] || 100), - 'utf8', - ), - ), + case 'big': { + const repeats = parseInt(args[0]) || 100 + const message = Buffer.from( + 'abcdefghijklmnopqrstuvwxyz'.repeat(repeats), + 'utf8', ) + sendData(easyHandle, packMessageFrame(message)) + console.log(`-> sent big message: ${message.length} bytes`) break + } case 'close': state.closeRequestedByUs = true sendData(easyHandle, packCloseFrame()) + console.log('-> sent close frame') break case 'multiple': + console.log('-> sending multiple messages') sendData( easyHandle, packMessageFrame(Buffer.from('double1!', 'utf8')), @@ -365,14 +440,38 @@ process.stdin.on( packMessageFrame(Buffer.from('double2!', 'utf8')), ) break - default: - sendData(easyHandle, packMessageFrame(Buffer.from(dataStr, 'utf8'))) + case 'ping': { + const payload = Buffer.from(args[0] || 'ping', 'utf8') + sendData(easyHandle, packPingFrame(payload)) + console.log('-> sent ping frame') + break + } + case 'binary': { + const binaryData = Buffer.from([0x00, 0x01, 0x02, 0x03, 0xff]) + const binaryFrame = packFrame( + binaryData, + 0b10000010, // FIN=1, opcode=2 (binary) + ) + sendData(easyHandle, binaryFrame) + console.log('-> sent binary frame:', binaryData) + break + } + default: { + const message = Buffer.from(dataStr, 'utf8') + sendData(easyHandle, packMessageFrame(message)) + console.log(`-> sent: "${dataStr}" (${message.length} bytes)`) + } } + } catch (error) { + console.error('Error sending:', error) } } })(), ) +console.log('WebSocket Client Ready') +console.log('Type "connect" to start\n') + ////////////////////// // Helpers Functions ///////////////////// @@ -420,7 +519,6 @@ function sendData(handle, buffer) { function receiveData(handle, bufferSize = 32 * 1024) { const buffers = [] - // eslint-disable-next-line no-constant-condition while (true) { const data = Buffer.alloc(bufferSize) const { code, bytesReceived } = handle.recv(data) diff --git a/examples/21-websockets-native.js b/examples/21-websockets-native.js new file mode 100644 index 000000000..aa267bc5e --- /dev/null +++ b/examples/21-websockets-native.js @@ -0,0 +1,359 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Interactive WebSocket client using native libcurl WebSocket support + * + * This is similar to 21-websockets-client.js but uses the native + * WebSocket API (wsRecv/wsSend/wsMeta) instead of manual frame handling. + * + * Requires libcurl >= 7.86.0 + * + * How to run this example: + * 1. start the server (install the deps in there first) + * node examples/21-websockets-server/index.js + * 2. start the client + * node examples/21-websockets-native.js + * + * Type commands in the terminal: + * - connect: establish WebSocket connection + * - close: send close frame + * - big:N: send large message (N repeats of alphabet) + * - multiple: send multiple messages + * - quit/exit: close connection and exit + * - anything else: send as text message + */ + +const os = require('os') +const { Curl, CurlCode, Easy, Multi, CurlWs, SocketState } = require('../dist') + +// Check libcurl version +if (!Curl.isVersionGreaterOrEqualThan(7, 86, 0)) { + console.error('This example requires libcurl >= 7.86.0') + console.error('Your version:', Curl.getVersion()) + process.exit(1) +} + +const getCleanState = () => ({ + connectionOpen: false, + closeRequestedByUs: false, +}) + +let state = getCleanState() + +const closeHandle = (easyHandle) => { + state = getCleanState() + + if (easyHandle.isMonitoringSockets) { + easyHandle.unmonitorSocketEvents() + } + + if (easyHandle.private.multi) { + easyHandle.private.multi.removeHandle(easyHandle) + } + + easyHandle.close() +} + +// This is the function that is called when we +// have connected to the server +const onConnected = (easyHandle) => { + try { + state.connectionOpen = true + console.log('✓ Connected! WebSocket ready.\n') + console.log('Commands:') + console.log(' close - close connection') + console.log(' big:N - send large message (N repeats)') + console.log(' multiple - send multiple messages') + console.log(' ping:msg - send ping frame') + console.log(' binary - send binary frame') + console.log(' quit/exit - close and exit') + console.log(' - send text message\n') + + // We are using this callback to listen for changes in the socket. + easyHandle.onSocketEvent((error, events) => { + // oops, something went wrong with the socket polling itself + if (error) { + console.error('Socket error:', error) + closeHandle(easyHandle) + return + } + + const isReadable = events & SocketState.Readable + + // if it's readable, let's try to get some data + if (isReadable) { + try { + // Receive WebSocket frames using native API + const buffer = Buffer.alloc(64 * 1024) + const { code, bytesReceived, meta } = easyHandle.wsRecv(buffer) + + if (code === CurlCode.CURLE_AGAIN) { + // No data available yet + return + } + + if (code === CurlCode.CURLE_GOT_NOTHING) { + console.log('Connection closed by server') + closeHandle(easyHandle) + return + } + + if (code !== CurlCode.CURLE_OK) { + console.error('Receive error:', Easy.strError(code)) + closeHandle(easyHandle) + return + } + + if (!meta) { + return + } + + // Handle different frame types + const isText = (meta.flags & CurlWs.Text) !== 0 + const isBinary = (meta.flags & CurlWs.Binary) !== 0 + const isClose = (meta.flags & CurlWs.Close) !== 0 + const isPing = (meta.flags & CurlWs.Ping) !== 0 + const isPong = (meta.flags & CurlWs.Pong) !== 0 + const isCont = (meta.flags & CurlWs.Cont) !== 0 + + console.log('<- received ws frame:', { + type: isText + ? 'TEXT' + : isBinary + ? 'BINARY' + : isClose + ? 'CLOSE' + : isPing + ? 'PING' + : isPong + ? 'PONG' + : 'UNKNOWN', + continuation: isCont, + bytesReceived, + bytesleft: meta.bytesleft, + }) + + if (isClose) { + console.log('<- received close frame') + // send close frame if the connection close was not requested by us + if (!state.closeRequestedByUs) { + easyHandle.wsSend(Buffer.alloc(0), CurlWs.Close) + } + closeHandle(easyHandle) + return + } + + if (isPing) { + console.log('<- received ping frame - sending pong') + // Note: libcurl auto-responds to ping by default + // We're just logging it here + return + } + + if (isPong) { + console.log('<- received pong frame') + return + } + + if (isText) { + const payload = buffer.toString('utf8', 0, bytesReceived) + console.log('<- text frame payload:', payload) + if (meta.bytesleft > 0) { + console.log(` (fragmented, ${meta.bytesleft} bytes remaining)`) + } + } + + if (isBinary) { + console.log( + '<- binary frame payload:', + buffer.slice(0, bytesReceived), + ) + if (meta.bytesleft > 0) { + console.log(` (fragmented, ${meta.bytesleft} bytes remaining)`) + } + } + } catch (error) { + console.error('Error processing frame:', error) + closeHandle(easyHandle) + } + } + }) + + // think on this like using poll() on the socket + // (internally this uses libuv to do the polling) + easyHandle.monitorSocketEvents() + + // Send initial greeting + const greeting = Buffer.from('hello :)', 'utf8') + const { code } = easyHandle.wsSend(greeting, CurlWs.Text) + if (code === CurlCode.CURLE_OK) { + console.log('-> sent initial greeting:', greeting.toString()) + } + } catch (error) { + console.log('oops something went wrong', error) + closeHandle(easyHandle) + } +} + +///////////////////// +// connect function +///////////////////// +const multi = new Multi() + +multi.onMessage((error, easyHandle, errorCode) => { + if (error) { + console.error('Connection error:', error, errorCode) + closeHandle(easyHandle) + return + } + + onConnected(easyHandle) +}) + +const connect = () => { + const useMulti = true + // first, we are going to create our easy handle + const easyHandle = new Easy() + easyHandle.setOpt('URL', 'ws://localhost:8080') + // IMPORTANT: Use CONNECT_ONLY = 2 for WebSocket + easyHandle.setOpt('CONNECT_ONLY', 2) + easyHandle.private = {} + + console.log('Connecting to ws://localhost:8080...\n') + + if (useMulti) { + multi.addHandle(easyHandle) + easyHandle.private.multi = multi + } else { + const code = easyHandle.perform() + console.assert( + code === CurlCode.CURLE_OK, + 'perform() returned invalid response', + ) + onConnected(easyHandle) + } + + return easyHandle +} + +/////////////////// +// STDIN Handling +////////////////// + +// let's read stdin to be able to +// interact with the code from the terminal +process.stdin.on( + 'data', + (() => { + let easyHandle = null + + return (data) => { + const dataStrRaw = data + .toString('utf-8') + .replace(new RegExp(os.EOL, 'g'), '') + const [dataStr, ...args] = dataStrRaw.split(':') + + // two special handlers + switch (dataStr) { + case 'connect': + if (state.connectionOpen) { + console.log('Already connected!') + return + } + easyHandle = connect() + return + case 'quit': + case 'exit': + process.stdin.pause() + + console.log('Closing connection...') + if (easyHandle && state.connectionOpen) { + try { + easyHandle.wsSend(Buffer.alloc(0), CurlWs.Close) + } catch { + // ignore + } + closeHandle(easyHandle) + } + if (multi) { + multi.close() + } + console.log('Goodbye!') + return + } + + if (!easyHandle || !state.connectionOpen) { + console.log('Not connected. Type "connect" first.') + return + } + + try { + switch (dataStr) { + case 'big': { + const repeats = parseInt(args[0]) || 100 + const message = Buffer.from( + 'abcdefghijklmnopqrstuvwxyz'.repeat(repeats), + 'utf8', + ) + const { code, bytesSent } = easyHandle.wsSend(message, CurlWs.Text) + if (code === CurlCode.CURLE_OK) { + console.log(`-> sent big message: ${bytesSent} bytes`) + } else { + console.error('Send error:', Easy.strError(code)) + } + break + } + case 'close': + state.closeRequestedByUs = true + easyHandle.wsSend(Buffer.alloc(0), CurlWs.Close) + console.log('-> sent close frame') + break + case 'multiple': + console.log('-> sending multiple messages') + easyHandle.wsSend(Buffer.from('double1!', 'utf8'), CurlWs.Text) + easyHandle.wsSend(Buffer.from('double1!', 'utf8'), CurlWs.Text) + easyHandle.wsSend(Buffer.from('double2!', 'utf8'), CurlWs.Text) + easyHandle.wsSend(Buffer.from('double2!', 'utf8'), CurlWs.Text) + break + case 'ping': { + const payload = Buffer.from(args[0] || 'ping', 'utf8') + const { code } = easyHandle.wsSend(payload, CurlWs.Ping) + if (code === CurlCode.CURLE_OK) { + console.log('-> sent ping frame') + } + break + } + case 'binary': { + const binaryData = Buffer.from([0x00, 0x01, 0x02, 0x03, 0xff]) + const { code } = easyHandle.wsSend(binaryData, CurlWs.Binary) + if (code === CurlCode.CURLE_OK) { + console.log('-> sent binary frame:', binaryData) + } + break + } + default: { + const message = Buffer.from(dataStr, 'utf8') + const { code, bytesSent } = easyHandle.wsSend(message, CurlWs.Text) + if (code === CurlCode.CURLE_OK) { + console.log(`-> sent: "${dataStr}" (${bytesSent} bytes)`) + } else if (code === CurlCode.CURLE_AGAIN) { + console.log('-> send would block, try again') + } else { + console.error('Send error:', Easy.strError(code)) + } + } + } + } catch (error) { + console.error('Error sending:', error) + } + } + })(), +) + +console.log('WebSocket Native Client Ready') +console.log('Type "connect" to start\n') diff --git a/examples/21-websockets-server/package.json b/examples/21-websockets-server/package.json index 14bfa60d4..8625655b4 100644 --- a/examples/21-websockets-server/package.json +++ b/examples/21-websockets-server/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "ws": "7.3.1" + "ws": "8.18.3" } } diff --git a/examples/21-websockets-server/pnpm-lock.yaml b/examples/21-websockets-server/pnpm-lock.yaml new file mode 100644 index 000000000..a1f6817dc --- /dev/null +++ b/examples/21-websockets-server/pnpm-lock.yaml @@ -0,0 +1,31 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + ws: + specifier: 8.18.3 + version: 8.18.3 + +packages: + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + +snapshots: + + ws@8.18.3: {} diff --git a/examples/21-websockets-server/yarn.lock b/examples/21-websockets-server/yarn.lock deleted file mode 100644 index 8ded22f84..000000000 --- a/examples/21-websockets-server/yarn.lock +++ /dev/null @@ -1,8 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -ws@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== diff --git a/examples/22-worker-threads.js b/examples/22-worker-threads.js new file mode 100644 index 000000000..97ee550b7 --- /dev/null +++ b/examples/22-worker-threads.js @@ -0,0 +1,290 @@ +#!/usr/bin/env node +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const { + Worker, + isMainThread, + parentPort, + workerData, +} = require('worker_threads') +const path = require('path') + +const nodeLibcurl = require( + path.join(__dirname, '..', 'lib', 'binding', 'node_libcurl.node'), +) + +const { Curl } = require('../dist') + +// Worker thread - run the actual tests + +function log(message) { + parentPort.postMessage({ + type: 'log', + message: `[thread: ${nodeLibcurl.Curl.THREAD_ID}] ${message}`, + }) +} + +async function workerMain() { + const { testName, url } = workerData + + try { + log(`Worker ${testName}: Module loaded successfully - ${Curl.getVersion()}`) + + switch (testName) { + case 'basic-test': + await runBasicTest(nodeLibcurl, log) + break + case 'concurrent-1': + case 'concurrent-2': + case 'concurrent-3': + await runConcurrentTest(nodeLibcurl, log, url) + break + case 'multi-test': + await runMultiTest(nodeLibcurl, log) + break + case 'share-test': + await runShareTest(nodeLibcurl, log) + break + default: + throw new Error(`Unknown test: ${testName}`) + } + + log(`Worker ${testName}: All tests passed!`) + process.exit(0) + } catch (error) { + log(`Worker ${testName}: Error - ${error.message}`) + process.exit(1) + } +} + +async function runBasicTest(nodeLibcurl, log) { + // Test basic module components + log('Testing Curl object...') + if (!nodeLibcurl.Curl) throw new Error('Curl object not found') + + const version = nodeLibcurl.Curl.getVersion() + log(`Curl version: ${version}`) + + const count = nodeLibcurl.Curl.getCount() + log(`Active handles: ${count}`) + + // Test Easy class + log('Testing Easy class...') + if (!nodeLibcurl.Easy) throw new Error('Easy class not found') + + const easy = new nodeLibcurl.Easy() + log(`Easy ID: ${easy.id}, isOpen: ${easy.isOpen}`) + + // Test basic setOpt/getInfo + const result = easy.setOpt('URL', 'https://httpbin.org/get') + log(`setOpt result: ${result}`) + + easy.close() + log('Easy handle closed') + + // Test Share class + log('Testing Share class...') + const share = new nodeLibcurl.Share() + const shareResult = share.setOpt('SHARE', 2) + log(`Share setOpt result: ${shareResult}`) + share.close() + + // Test Multi class + log('Testing Multi class...') + const multi = new nodeLibcurl.Multi() + const multiCount = multi.getCount() + log(`Multi count: ${multiCount}`) + multi.close() +} + +async function runConcurrentTest(nodeLibcurl, log, testUrl) { + try { + log(`Making HTTP request to: ${testUrl}`) + + const easy = new nodeLibcurl.Easy() + easy.setOpt('URL', testUrl) + easy.setOpt('FOLLOWLOCATION', 1) + easy.setOpt('TIMEOUT', 10) + + log(`Past setOpt`) + + // Use default write behavior for now + + const performResult = easy.perform() + log(`Perform result: ${performResult}`) + + const statusCode = easy.getInfo('RESPONSE_CODE') + const effectiveUrl = easy.getInfo('EFFECTIVE_URL') + + log(`Response code: ${statusCode.data}`) + log(`Effective URL: ${effectiveUrl.data}`) + + easy.close() + } catch (error) { + log(`Error in runConcurrentTest: ${error.message}`) + throw error + } +} + +async function runMultiTest(nodeLibcurl, log) { + try { + log('Testing Multi interface...') + + const multi = new nodeLibcurl.Multi() + const easy = new nodeLibcurl.Easy() + + easy.setOpt('URL', 'https://httpbin.org/get') + + let resolveInner + const innerPromise = new Promise((res) => { + resolveInner = res + }) + + multi.onMessage((error, easy, errorCode) => { + log('Multi message callback called!') + console.log(error, easy, errorCode, resolveInner) + + if (easy) { + const statusCode = easy.getInfo('RESPONSE_CODE') + const effectiveUrl = easy.getInfo('EFFECTIVE_URL') + log(`Multi response code: ${statusCode.data}`) + log(`Multi effective URL: ${effectiveUrl.data}`) + multi.removeHandle(easy) + easy.close() + } + resolveInner() + }) + + multi.addHandle(easy) + log(`Added ${multi.getCount()} handles to multi`) + log(`Performing request...`) + + easy.perform() + + // await new Promise((res) => setTimeout(res, 10000)) + await innerPromise + + log(`Performed request!`) + + multi.close() + } catch (error) { + log(`Error in runMultiTest: ${error.message}`) + console.error(error) + throw error + } +} + +async function runShareTest(nodeLibcurl, log) { + try { + log('Testing Share objects...') + + // Create share object for cookies + const share = new nodeLibcurl.Share() + share.setOpt('SHARE', 2) // CURL_LOCK_DATA_COOKIE + + // Create two Easy handles that will share cookies + const easy1 = new nodeLibcurl.Easy() + const easy2 = new nodeLibcurl.Easy() + + easy1.setOpt('URL', 'https://httpbin.org/cookies/set/test/worker-thread') + easy1.setOpt('SHARE', share) + easy1.perform() + + log('First request completed (set cookie)') + + easy2.setOpt('URL', 'https://httpbin.org/cookies') + easy2.setOpt('SHARE', share) + + // Use default write behavior for now + + easy2.perform() + + log('Second request completed (should have cookie)') + log('✅ Cookie sharing test completed (response written to default output)') + + easy1.close() + easy2.close() + share.close() + log('Share test completed') + } catch (error) { + log(`Error in runShareTest: ${error.message}`) + throw error + } +} + +async function runWorkerTest(workerName, testData = {}) { + return new Promise((resolve, reject) => { + const worker = new Worker(__filename, { + workerData: { testName: workerName, ...testData }, + }) + + let output = '' + + worker.on('message', (data) => { + if (data.type === 'log') { + output += data.message + '\n' + console.log(`[nodejs ${workerName}] ${data.message}`) + } + }) + + worker.on('error', (error) => { + reject(new Error(`Worker ${workerName} error: ${error.message}`)) + }) + + worker.on('exit', (code) => { + if (code === 0) { + resolve({ workerName, success: true, output }) + } else { + reject(new Error(`Worker ${workerName} exited with code ${code}`)) + } + }) + }) +} + +async function main() { + try { + // Test 1: Basic functionality test in worker + console.log('Test 1: Basic functionality in worker thread') + await runWorkerTest('basic-test') + + // Test 2: Single worker with HTTP request to avoid complexity + console.log('\nTest 2: Single worker with HTTP request') + await Promise.all([ + runWorkerTest('concurrent-1', { url: 'https://httpbin.org/json' }), + runWorkerTest('concurrent-2', { url: 'https://httpbin.org/json' }), + runWorkerTest('concurrent-3', { url: 'https://httpbin.org/json' }), + ]) + + // Test 3: Worker with Multi interface + console.log('\nTest 3: Multi interface in worker thread') + await runWorkerTest('multi-test') + + // Test 4: Share objects between operations in worker + console.log('\nTest 4: Share objects in worker thread') + await runWorkerTest('share-test') + + console.log('\n✅ All worker thread tests completed successfully!') + } catch (error) { + console.error('\n❌ Worker thread test failed:', error.message) + process.exit(1) + } +} + +const logMainThread = (message) => { + console.log( + `[nodejs main] [thread: ${nodeLibcurl.Curl.THREAD_ID}] ${message}`, + ) +} + +if (isMainThread) { + logMainThread('🚀 Starting N-API Worker Thread Tests\n') + + main() +} else { + workerMain() +} diff --git a/examples/Dockerfile.ubuntu b/examples/Dockerfile.ubuntu new file mode 100644 index 000000000..75dd9a7f1 --- /dev/null +++ b/examples/Dockerfile.ubuntu @@ -0,0 +1,10 @@ +FROM --platform=linux/amd64 node:24-bookworm + +RUN mkdir -p /usr/src/app + +WORKDIR /usr/src/app + +RUN npm install node-libcurl@5.0.0-0 +RUN node -e "const { Curl } = require('node-libcurl'); console.log(Curl.getVersionInfoString())" + +RUN node -e "const { Easy, Curl } = require('node-libcurl'); const easy = new Easy(); easy.setOpt(Curl.option.URL, 'https://example.com'); easy.perform(); console.log(easy.getInfo(Curl.info.RESPONSE_CODE))" diff --git a/examples/README.md b/examples/README.md index c0c07d5e9..82f80cfda 100644 --- a/examples/README.md +++ b/examples/README.md @@ -3,7 +3,7 @@ To run the examples in this directory, you must first download this folder or clone the repository, install the dependencies: ``` -yarn +pnpm i ``` And then just run the example you want: diff --git a/examples/package.json b/examples/package.json index 453cb6246..e30f02c0a 100644 --- a/examples/package.json +++ b/examples/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "node-libcurl": "^2.2.0", - "protobufjs": "6.9.0" + "node-libcurl": "^4.1.0", + "protobufjs": "7.5.4" } } diff --git a/examples/yarn.lock b/examples/yarn.lock deleted file mode 100644 index f853c7c33..000000000 --- a/examples/yarn.lock +++ /dev/null @@ -1,978 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= - -"@types/long@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" - integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== - -"@types/node@^13.7.0": - version "13.13.12" - resolved "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz#9c72e865380a7dc99999ea0ef20fc9635b503d20" - integrity sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw== - -abbrev@1: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -ajv@^6.5.5: - version "6.12.2" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" - integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -env-paths@2.2.0, env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - 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" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.2.3: - version "4.2.4" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^3.0.0: - version "3.1.3" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -minizlib@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3" - integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^0.5.0, mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nan@2.14.1: - version "2.14.1" - resolved "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== - -needle@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz#e6fc4b3cc6c25caed7554bd613a5cf0bac8c31c0" - integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -node-gyp@7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-7.0.0.tgz#2e88425ce84e9b1a4433958ed55d74c70fffb6be" - integrity sha512-ZW34qA3CJSPKDz2SJBHKRvyNQN0yWO5EGKKksJc+jElu9VA468gwJTyTArC1iOXU7rN3Wtfg/CMt/dBAOFIjvg== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^4.0.3" - npmlog "^4.1.2" - request "^2.88.2" - rimraf "^2.6.3" - semver "^7.3.2" - tar "^6.0.1" - which "^2.0.2" - -node-libcurl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libcurl/-/node-libcurl-2.2.0.tgz#911d8cc0fd66f73b358be7d44b3c19bd02124679" - integrity sha512-dyv3IuQBqO4KK5ojtM4k6FuBA3RxZjTqO4c+MUirwvlTY7qIH2oNSws8Xte1pp2aso9TuXyAwxS/g3ZqmAk8aA== - dependencies: - env-paths "2.2.0" - nan "2.14.1" - node-gyp "7.0.0" - node-pre-gyp "0.15.0" - npmlog "4.1.2" - tslib "2.0.0" - -node-pre-gyp@0.15.0: - version "0.15.0" - resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz#c2fc383276b74c7ffa842925241553e8b40f1087" - integrity sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.3" - needle "^2.5.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - -nopt@^4.0.1, nopt@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - -npmlog@4.1.2, npmlog@^4.0.2, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -protobufjs@6.9.0: - version "6.9.0" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz#c08b2bf636682598e6fabbf0edb0b1256ff090bd" - integrity sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" "^13.7.0" - long "^4.0.0" - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - 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" - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - 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" - -rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver@^5.3.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^7.3.2: - version "7.3.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -signal-exit@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - 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" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -tar@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz#5df17813468a6264ff14f766886c622b84ae2f39" - integrity sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.0" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tslib@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" - integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -which@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/issue-multi-crash-promise.js b/issue-multi-crash-promise.js new file mode 100644 index 000000000..241c7c2f3 --- /dev/null +++ b/issue-multi-crash-promise.js @@ -0,0 +1,136 @@ +#!/usr/bin/env node +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const path = require('path') +const { Worker, isMainThread } = require('worker_threads') + +const nodeLibcurl = require( + path.join(__dirname, 'lib', 'binding', 'node_libcurl.node'), +) + +function log(message) { + if (isMainThread) { + console.log(`[main thread: ${nodeLibcurl.Curl.THREAD_ID}] ${message}`) + } else { + console.log(`[worker thread: ${nodeLibcurl.Curl.THREAD_ID}] ${message}`) + } +} + +async function runMultiTest(nodeLibcurl, log) { + return new Promise((resolve, reject) => { + try { + log('Testing Multi interface...') + + const multi = new nodeLibcurl.Multi() + const easy = new nodeLibcurl.Easy() + + easy.setOpt('URL', 'https://httpbin.org/get') + + let resolveInner + const innerPromise = new Promise((res) => { + resolveInner = res + }) + + multi.onMessage((error, easy, errorCode) => { + log('Multi message callback called!') + console.log(error, easy, errorCode, resolveInner) + + if (easy) { + const statusCode = easy.getInfo('RESPONSE_CODE') + const effectiveUrl = easy.getInfo('EFFECTIVE_URL') + log(`Multi response code: ${statusCode.data}`) + log(`Multi effective URL: ${effectiveUrl.data}`) + multi.removeHandle(easy) + easy.close() + } + resolveInner() + }) + + multi.addHandle(easy) + log(`Added ${multi.getCount()} handles to multi`) + log(`Performing request...`) + + easy.perform() + + innerPromise + .then(() => { + log(`Performed request!`) + multi.close() + resolve() + }) + .catch(reject) + } catch (error) { + log(`Error in runMultiTest: ${error.message}`) + console.error(error) + reject(error) + } + }) +} + +async function mainWorker() { + await runMultiTest(nodeLibcurl, log) +} + +async function runWorkerTest() { + return new Promise((resolve, reject) => { + const worker = new Worker(__filename, { + workerData: { testName: 'worker-test' }, + }) + + worker.on('message', (data) => { + if (data.type === 'log') { + console.log(`[worker] ${data.message}`) + } + }) + + worker.on('error', (error) => { + reject(new Error(`Worker error: ${error.message}`)) + }) + + worker.on('exit', (code) => { + if (code === 0) { + resolve({ success: true }) + } else { + reject(new Error(`Worker exited with code ${code}`)) + } + }) + }) +} + +async function main() { + try { + console.log('Testing Multi interface in main thread') + await runMultiTest(nodeLibcurl, log) + console.log('✅ Multi test in main thread completed successfully!') + + console.log('\nSpawning worker thread...') + await runWorkerTest() + console.log('✅ Worker thread test completed successfully!') + } catch (error) { + console.error('❌ Test failed:', error.message) + process.exit(1) + } +} + +async function workerMain() { + try { + log('Worker started') + await mainWorker() + log('Worker completed successfully') + process.exit(0) + } catch (error) { + log(`Worker error: ${error.message}`) + process.exit(1) + } +} + +if (isMainThread) { + main() +} else { + workerMain() +} diff --git a/lib/Curl.ts b/lib/Curl.ts index 14013dfc4..cf76a5c1c 100644 --- a/lib/Curl.ts +++ b/lib/Curl.ts @@ -4,20 +4,15 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +import './moduleSetup' + import { EventEmitter } from 'events' import { StringDecoder } from 'string_decoder' -import assert from 'assert' import { Readable } from 'stream' -// eslint-disable-next-line @typescript-eslint/no-var-requires -const pkg = require('../package.json') +import pkg from '../package.json' -import { - NodeLibcurlNativeBinding, - EasyNativeBinding, - FileInfo, - HttpPostField, -} from './types' +import { NodeLibcurlNativeBinding, FileInfo, HttpPostField } from './types' import { Easy } from './Easy' import { Multi } from './Multi' @@ -41,7 +36,6 @@ import { CurlFeature } from './enum/CurlFeature' import { CurlFnMatchFunc } from './enum/CurlFnMatchFunc' import { CurlFtpMethod } from './enum/CurlFtpMethod' import { CurlFtpSsl } from './enum/CurlFtpSsl' -import { CurlGlobalInit } from './enum/CurlGlobalInit' import { CurlGssApi } from './enum/CurlGssApi' import { CurlHeader } from './enum/CurlHeader' import { @@ -66,70 +60,27 @@ import { CurlTimeCond } from './enum/CurlTimeCond' import { CurlUseSsl } from './enum/CurlUseSsl' import { CurlWriteFunc } from './enum/CurlWriteFunc' import { CurlReadFunc } from './enum/CurlReadFunc' -import { CurlInfoNameSpecific, GetInfoReturn } from './types/EasyNativeBinding' +import { CurlInfoNameSpecific, GetInfoReturn } from './Easy' -// eslint-disable-next-line @typescript-eslint/no-var-requires -const bindings: NodeLibcurlNativeBinding = require('../lib/binding/node_libcurl.node') +const bindings: typeof NodeLibcurlNativeBinding = require('../lib/binding/node_libcurl.node') const { Curl: _Curl, CurlVersionInfo } = bindings -if ( - !process.env.NODE_LIBCURL_DISABLE_GLOBAL_INIT_CALL || - process.env.NODE_LIBCURL_DISABLE_GLOBAL_INIT_CALL !== 'true' -) { - // We could just pass nothing here, CurlGlobalInitEnum.All is the default anyway. - const globalInitResult = _Curl.globalInit(CurlGlobalInit.All) - assert(globalInitResult === 0 || 'Libcurl global init failed.') -} - const decoder = new StringDecoder('utf8') // Handle used by curl instances created by the Curl wrapper. const multiHandle = new Multi() -const curlInstanceMap = new WeakMap() - -multiHandle.onMessage((error, handle, errorCode) => { - multiHandle.removeHandle(handle) - - const curlInstance = curlInstanceMap.get(handle) - - assert( - curlInstance, - 'Could not retrieve curl instance from easy handle on onMessage callback', - ) - - if (error) { - curlInstance!.onError(error, errorCode) - } else { - curlInstance!.onEnd() - } -}) /** - * Wrapper around {@link "Easy".Easy | `Easy`} class with a more *nodejs-friendly* interface. + * Wrapper around {@link Easy | `Easy`} class with a more *nodejs-friendly* interface. * - * This uses an internal {@link "Multi".Multi | `Multi`} instance allowing for asynchronous + * N.B: *nodejs-friendly* at the time the library was written, so it is callback based. For a Promises based API, check {@link curly}. + * + * This uses an internal {@link Multi | `Multi`} instance allowing for asynchronous * requests. * * @public */ class Curl extends EventEmitter { - /** - * Calls [`curl_global_init()`](http://curl.haxx.se/libcurl/c/curl_global_init.html). - * - * For **flags** see the the enum {@link CurlGlobalInit | `CurlGlobalInit`}. - * - * This is automatically called when the addon is loaded, to disable this, set the environment variable - * `NODE_LIBCURL_DISABLE_GLOBAL_INIT_CALL=false` - */ - static globalInit = _Curl.globalInit - - /** - * Calls [`curl_global_cleanup()`](http://curl.haxx.se/libcurl/c/curl_global_cleanup.html) - * - * This is automatically called when the process is exiting. - */ - static globalCleanup = _Curl.globalCleanup - /** * Returns libcurl version string. * @@ -164,7 +115,7 @@ class Curl extends EventEmitter { /** * This is a object with members resembling the `CURLINFO_*` libcurl constants. * - * It can be used with {@link "Easy".Easy.getInfo | `Easy#getInfo`} or {@link getInfo | `Curl#getInfo`}. + * It can be used with {@link Easy.getInfo | `Easy#getInfo`} or {@link getInfo | `Curl#getInfo`}. * * See the official documentation of [`curl_easy_getinfo()`](http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html) * for reference. @@ -176,7 +127,7 @@ class Curl extends EventEmitter { /** * This is a object with members resembling the `CURLOPT_*` libcurl constants. * - * It can be used with {@link "Easy".Easy.setOpt | `Easy#setOpt`} or {@link setOpt | `Curl#setOpt`}. + * It can be used with {@link Easy.setOpt | `Easy#setOpt`} or {@link setOpt | `Curl#setOpt`}. * * See the official documentation of [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) * for reference. @@ -186,7 +137,7 @@ class Curl extends EventEmitter { static option = _Curl.option /** - * Returns the number of handles currently open in the internal {@link "Multi".Multi | `Multi`} handle being used. + * Returns the number of handles currently open in the internal {@link Multi | `Multi`} handle being used. */ static getCount = multiHandle.getCount @@ -213,7 +164,13 @@ class Curl extends EventEmitter { /** * Internal Easy handle being used */ - protected handle: EasyNativeBinding + protected handle: Easy + + /** + * Optional Multi instance to use for performing requests. + * If not set, uses the default shared Multi instance. + */ + protected multiInstance?: Multi /** * Stores current response payload. @@ -263,20 +220,19 @@ class Curl extends EventEmitter { protected streamReadFunctionPaused = false // WRITEFUNCTION / download related protected streamWriteFunctionHighWaterMark: number | undefined - protected streamWriteFunctionShouldPause = false - protected streamWriteFunctionPaused = false - protected streamWriteFunctionFirstRun = true + protected streamPendingReadSize = 0 // common protected streamPauseNext = false protected streamContinueNext = false protected streamError: false | Error = false protected streamUserSuppliedProgressFunction: CurlOptionValueType['xferInfoFunction'] = null + protected nextPauseFlags: CurlPause | null = null /** - * @param cloneHandle {@link "Easy".Easy | `Easy`} handle that should be used instead of creating a new one. + * @param cloneHandle {@link Easy | `Easy`} handle that should be used instead of creating a new one. */ - constructor(cloneHandle?: EasyNativeBinding) { + constructor(cloneHandle?: Easy) { super() const handle = cloneHandle || new Easy() @@ -294,15 +250,22 @@ class Curl extends EventEmitter { ) handle.setOpt(Curl.option.USERAGENT, Curl.defaultUserAgent) + } - curlInstanceMap.set(handle, this) + /** + * Returns the unique ID of the Easy handle. + * + * The value is unique across threads. + */ + get id() { + return this.handle.id } /** * Callback called when an error is thrown on this handle. * - * This is called from the internal callback we use with the {@link "Multi".Multi.onMessage | `onMessage`} - * method of the global {@link "Multi".Multi | `Multi`} handle used by all `Curl` instances. + * This is called from the internal callback we use with the {@link Multi.onMessage | `onMessage`} + * method of the global {@link Multi | `Multi`} handle used by all `Curl` instances. * * @protected */ @@ -315,8 +278,8 @@ class Curl extends EventEmitter { /** * Callback called when this handle has finished the request. * - * This is called from the internal callback we use with the {@link "Multi".Multi.onMessage | `onMessage`} - * method of the global {@link "Multi".Multi | `Multi`} handle used by all `Curl` instances. + * This is called from the internal callback we use with the {@link Multi.onMessage | `onMessage`} + * method of the global {@link Multi | `Multi`} handle used by all `Curl` instances. * * This should not be called in any other way. * @@ -670,6 +633,18 @@ class Curl extends EventEmitter { */ setStreamResponseHighWaterMark(highWaterMark: number | null) { this.streamWriteFunctionHighWaterMark = highWaterMark || undefined + const bufferSize = highWaterMark + ? Math.max( + 1024, + Math.min( + highWaterMark, + Curl.isVersionGreaterOrEqualThan(7, 88, 1) + ? 10 * 1024 * 1024 + : 512 * 1024, + ), + ) + : 16 * 1024 + this.setOpt('BUFFERSIZE', bufferSize) return this } @@ -718,6 +693,30 @@ class Curl extends EventEmitter { return this } + /** + * Sets a custom Multi instance to use for performing requests. + * + * This allows for HTTP/2 connection isolation - each Multi instance + * maintains its own connection pool, ensuring requests don't share + * connections between different Multi instances. + * + * @param multi - The Multi instance to use, or undefined to use the default shared instance + * @returns This Curl instance for method chaining + * + * @example + * ``` + * const multi = new Multi() + * const curl = new Curl() + * curl.setMulti(multi) + * curl.setOpt('URL', 'https://example.com') + * curl.perform() + * ``` + */ + setMulti(multi: Multi | undefined): this { + this.multiInstance = multi + return this + } + /** * Add this instance to the processing queue. * This method should be called only one time per request, @@ -725,7 +724,7 @@ class Curl extends EventEmitter { * * @remarks * - * This basically calls the {@link "Multi".Multi.addHandle | `Multi#addHandle`} method. + * This basically calls the {@link Multi.addHandle | `Multi#addHandle`} method. */ perform() { if (this.isRunning) { @@ -742,7 +741,19 @@ class Curl extends EventEmitter { this.setOpt('NOPROGRESS', false) } - multiHandle.addHandle(this.handle) + // Use custom Multi instance if set, otherwise use the default global one + const multi = this.multiInstance || multiHandle + + multi + .perform(this.handle) + .then(() => { + multi.removeHandle(this.handle) + this.onEnd() + }) + .catch((error) => { + multi.removeHandle(this.handle) + this.onError(error, error.code) + }) return this } @@ -845,8 +856,9 @@ class Curl extends EventEmitter { * Official libcurl documentation: [`curl_easy_cleanup()`](http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html) */ close() { - // TODO(jonathan): on next semver major check if this.handle.isOpen is false and if it is, return immediately. - curlInstanceMap.delete(this.handle) + if (!this.handle.isOpen) { + return + } this.removeAllListeners() @@ -890,10 +902,6 @@ class Curl extends EventEmitter { this.streamReadFunctionShouldEnd = false this.streamReadFunctionShouldPause = false this.streamReadFunctionPaused = false - // WRITEFUNCTION / download related - this.streamWriteFunctionShouldPause = false - this.streamWriteFunctionPaused = false - this.streamWriteFunctionFirstRun = true // common this.streamPauseNext = false this.streamContinueNext = false @@ -944,6 +952,14 @@ class Curl extends EventEmitter { ultotal: number, ulnow: number, ) { + if (this.nextPauseFlags !== null) { + const pauseFlags = this.nextPauseFlags + this.nextPauseFlags = null + this.pause(pauseFlags) + } else if (this.handle.isPausedRecv && this.streamPendingReadSize) { + this.pause(this.handle.pauseFlags & ~CurlPause.Recv) + } + if (this.streamError) throw this.streamError const ret = this.streamUserSuppliedProgressFunction @@ -987,18 +1003,20 @@ class Curl extends EventEmitter { size: number, nmemb: number, ) { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const handle = this + if (!this.writeFunctionStream) { - // eslint-disable-next-line @typescript-eslint/no-this-alias - const handle = this // create the response stream we are going to use - this.writeFunctionStream = new Readable({ + this.streamPendingReadSize = 0 + const writeFunctionStream = new Readable({ + autoDestroy: true, highWaterMark: this.streamWriteFunctionHighWaterMark, destroy(error, cb) { handle.streamError = error || new Error('Curl response stream was unexpectedly destroyed') - // let the event loop run one more time before we do anything // if the handle is not running anymore it means that the // error we set above was caught, if it is still running, then it means that: // - the handle is paused @@ -1007,40 +1025,36 @@ class Curl extends EventEmitter { // - the WRITEFUNCTION callback will be called // - this will pause the handle again (because we cannot throw the error in here) // - the PROGRESSFUNCTION callback will be called, and then the error will be thrown. - setImmediate(() => { - if (handle.isRunning && handle.streamWriteFunctionPaused) { - handle.streamWriteFunctionPaused = false - handle.streamWriteFunctionShouldPause = true - try { - handle.pause(CurlPause.RecvCont) - } catch (error) { - cb(error as Error) - return - } + if (handle.isRunning && handle.handle.isPausedRecv) { + try { + handle.pause(handle.handle.pauseFlags & ~CurlPause.Recv) + } catch (error) { + cb(error as Error) + return } + } - cb(null) - }) + cb(null) }, - read(_size) { - if ( - handle.streamWriteFunctionFirstRun || - handle.streamWriteFunctionPaused - ) { - if (handle.streamWriteFunctionFirstRun) { - handle.streamWriteFunctionFirstRun = false - } - // we must allow Node.js to process the whole event queue - // before we unpause - setImmediate(() => { - if (handle.isRunning) { - handle.streamWriteFunctionPaused = false - handle.pause(CurlPause.RecvCont) - } - }) + read(size) { + handle.streamPendingReadSize += size + + if (handle.handle.isPausedRecv && handle.isRunning) { + handle.nextPauseFlags = handle.handle.pauseFlags & ~CurlPause.Recv } }, }) + this.writeFunctionStream = writeFunctionStream + + writeFunctionStream.on('pause', () => { + handle.nextPauseFlags = handle.handle.pauseFlags | CurlPause.Recv + }) + + writeFunctionStream.on('resume', () => { + if (handle.isRunning) { + handle.pause(handle.handle.pauseFlags & ~CurlPause.Recv) + } + }) // as soon as we have the stream, we need to emit the "stream" event // but the "stream" event needs the statusCode and the headers, so this @@ -1054,35 +1068,26 @@ class Curl extends EventEmitter { if (code !== CurlCode.CURLE_OK) { const error = new Error('Could not get status code of request') this.emit('error', error, code, this) - return 0 + return -1 } // let's emit the event only in the next iteration of the event loop // We need to do this otherwise the event listener callbacks would run - // before the pause below, and this is probably not what we want. + // before the pause below, which could potentially lead to a deadlock, + // as the stream would unpause the handle before it is actually paused. setImmediate(() => this.emit('stream', this.writeFunctionStream, status, headers, this), ) - - this.streamWriteFunctionPaused = true return CurlWriteFunc.Pause } - // pause this req - if (this.streamWriteFunctionShouldPause) { - this.streamWriteFunctionShouldPause = false - this.streamWriteFunctionPaused = true + // write to the stream + if (!this.streamPendingReadSize) { return CurlWriteFunc.Pause } - // write to the stream - const ok = this.writeFunctionStream.push(chunk) - - // pause connection until there is more data - if (!ok) { - this.streamWriteFunctionPaused = true - this.pause(CurlPause.Recv) - } + this.streamPendingReadSize -= chunk.length + this.writeFunctionStream!.push(chunk) return size * nmemb } @@ -1141,6 +1146,33 @@ class Curl extends EventEmitter { static isVersionGreaterOrEqualThan = (x: number, y: number, z = 0) => { return _Curl.VERSION_NUM >= (x << 16) + (y << 8) + z } + + /** + * Calls [`curl_global_init()`](http://curl.haxx.se/libcurl/c/curl_global_init.html). + * + * For **flags** see the the enum {@link CurlGlobalInit | `CurlGlobalInit`}. + * + * This is automatically called when the addon is loaded, and there is no way to disable it. + * + * This is a no-op now, and the call itself is deprecated. + * + * @deprecated + */ + static globalInit = () => { + /* noop */ + } + + /** + * Calls [`curl_global_cleanup()`](http://curl.haxx.se/libcurl/c/curl_global_cleanup.html) + * + * This is automatically called when the process is exiting. + * + * @deprecated Does nothing, do not call. This is called by the addon itself when the environment + * is being unloaded. + */ + static globalCleanup = () => { + /* noop */ + } } interface Curl { @@ -1198,12 +1230,12 @@ interface Curl { curlInstance: Curl, ) => void, ): this - // eslint-disable-next-line @typescript-eslint/ban-types + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type on(event: string, listener: Function): this // START AUTOMATICALLY GENERATED CODE - DO NOT EDIT /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) @@ -1211,16 +1243,11 @@ interface Curl { setOpt( option: DataCallbackOptions, value: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) @@ -1229,7 +1256,7 @@ interface Curl { option: ProgressCallbackOptions, value: | (( - this: EasyNativeBinding, + this: Easy, dltotal: number, dlnow: number, ultotal: number, @@ -1238,21 +1265,21 @@ interface Curl { | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: StringListOptions, value: string[] | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: BlobOptions, value: ArrayBuffer | Buffer | string | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) @@ -1260,37 +1287,31 @@ interface Curl { setOpt( option: 'CHUNK_BGN_FUNCTION', value: - | (( - this: EasyNativeBinding, - fileInfo: FileInfo, - remains: number, - ) => CurlChunk) + | ((this: Easy, fileInfo: FileInfo, remains: number) => CurlChunk) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt( option: 'CHUNK_END_FUNCTION', - value: ((this: EasyNativeBinding) => CurlChunk) | null, + value: ((this: Easy) => CurlChunk) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt( option: 'DEBUGFUNCTION', - value: - | ((this: EasyNativeBinding, type: CurlInfoDebug, data: Buffer) => 0) - | null, + value: ((this: Easy, type: CurlInfoDebug, data: Buffer) => 0) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) @@ -1298,15 +1319,11 @@ interface Curl { setOpt( option: 'FNMATCH_FUNCTION', value: - | (( - this: EasyNativeBinding, - pattern: string, - value: string, - ) => CurlFnMatchFunc) + | ((this: Easy, pattern: string, value: string) => CurlFnMatchFunc) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * You can either return a single `CurlHstsReadCallbackResult` object or an array of `CurlHstsReadCallbackResult` objects. * If returning an array, the callback will only be called once per request. @@ -1319,12 +1336,13 @@ interface Curl { option: 'HSTSREADFUNCTION', value: | (( - this: EasyNativeBinding, + this: Easy, + options: { maxHostLengthBytes: number }, ) => null | CurlHstsCacheEntry | CurlHstsCacheEntry[]) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) @@ -1333,14 +1351,14 @@ interface Curl { option: 'HSTSWRITEFUNCTION', value: | (( - this: EasyNativeBinding, + this: Easy, cacheEntry: CurlHstsCacheEntry, cacheCount: CurlHstsCacheCount, ) => any) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) @@ -1349,7 +1367,7 @@ interface Curl { option: 'PREREQFUNCTION', value: | (( - this: EasyNativeBinding, + this: Easy, connPrimaryIp: string, connLocalIp: string, connPrimaryPort: number, @@ -1358,169 +1376,167 @@ interface Curl { | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt( option: 'SEEKFUNCTION', - value: - | ((this: EasyNativeBinding, offset: number, origin: number) => number) - | null, + value: ((this: Easy, offset: number, origin: number) => number) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt( option: 'TRAILERFUNCTION', - value: ((this: EasyNativeBinding) => string[] | false) | null, + value: ((this: Easy) => string[] | false) | null, ): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'SHARE', value: Share | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'HTTPPOST', value: HttpPostField[] | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'FTP_SSL_CCC', value: CurlFtpSsl | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'FTP_FILEMETHOD', value: CurlFtpMethod | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'GSSAPI_DELEGATION', value: CurlGssApi | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'HEADEROPT', value: CurlHeader | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'HTTP_VERSION', value: CurlHttpVersion | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'IPRESOLVE', value: CurlIpResolve | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'NETRC', value: CurlNetrc | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'PROTOCOLS', value: CurlProtocol | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'PROXY_SSL_OPTIONS', value: CurlSslOpt | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'PROXYTYPE', value: CurlProxy | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'REDIR_PROTOCOLS', value: CurlProtocol | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'RTSP_REQUEST', value: CurlRtspRequest | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'SSH_AUTH_TYPES', value: CurlSshAuth | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'SSL_OPTIONS', value: CurlSslOpt | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'SSLVERSION', value: CurlSslVersion | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'TIMECONDITION', value: CurlTimeCond | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'USE_SSL', value: CurlUseSsl | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) */ setOpt(option: 'HSTS_CTRL', value: CurlHsts | null): this /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. + * Use {@link Curl.option|`Curl.option`} for predefined constants. * * * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) @@ -1531,7 +1547,7 @@ interface Curl { ): this // END AUTOMATICALLY GENERATED CODE - DO NOT EDIT - // overloaded getInfo definitions - changes made here must also be made in EasyNativeBinding.ts + // overloaded getInfo definitions - changes made here must also be made in Easy.ts // TODO: do this automatically, like above. /** @@ -1539,7 +1555,7 @@ interface Curl { * * Official libcurl documentation: [`curl_easy_getinfo()`](http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html) * - * @param info Info to retrieve. Use {@link "Curl".Curl.info | `Curl.info`} for predefined constants. + * @param info Info to retrieve. Use {@link Curl.info | `Curl.info`} for predefined constants. */ getInfo(info: 'CERTINFO'): GetInfoReturn['data'] @@ -1548,7 +1564,7 @@ interface Curl { * * Official libcurl documentation: [`curl_easy_getinfo()`](http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html) * - * @param info Info to retrieve. Use {@link "Curl".Curl.info | `Curl.info`} for predefined constants. + * @param info Info to retrieve. Use {@link Curl.info | `Curl.info`} for predefined constants. */ getInfo( info: Exclude, diff --git a/lib/CurlEasyError.ts b/lib/CurlEasyError.ts new file mode 100644 index 000000000..450006318 --- /dev/null +++ b/lib/CurlEasyError.ts @@ -0,0 +1,14 @@ +import { CurlCode } from './enum/CurlCode' +import { CurlError } from './CurlError' + +export class CurlEasyError extends CurlError { + static override readonly name = 'CurlEasyError' + + constructor( + message: string, + readonly code: CurlCode, + errorOptions?: ErrorOptions, + ) { + super(message, errorOptions) + } +} diff --git a/lib/CurlError.ts b/lib/CurlError.ts new file mode 100644 index 000000000..e08cc4868 --- /dev/null +++ b/lib/CurlError.ts @@ -0,0 +1,3 @@ +export class CurlError extends Error { + static override readonly name: string = 'CurlError' +} diff --git a/lib/CurlMultiError.ts b/lib/CurlMultiError.ts new file mode 100644 index 000000000..8134ba210 --- /dev/null +++ b/lib/CurlMultiError.ts @@ -0,0 +1,14 @@ +import { CurlMultiCode } from './enum/CurlCode' +import { CurlError } from './CurlError' + +export class CurlMultiError extends CurlError { + static override readonly name = 'CurlMultiError' + + constructor( + message: string, + readonly code: CurlMultiCode, + errorOptions?: ErrorOptions, + ) { + super(message, errorOptions) + } +} diff --git a/lib/CurlSharedError.ts b/lib/CurlSharedError.ts new file mode 100644 index 000000000..5d60dc6ea --- /dev/null +++ b/lib/CurlSharedError.ts @@ -0,0 +1,14 @@ +import { CurlShareCode } from './enum/CurlCode' +import { CurlError } from './CurlError' + +export class CurlSharedError extends CurlError { + static override readonly name = 'CurlSharedError' + + constructor( + message: string, + readonly code: CurlShareCode, + errorOptions?: ErrorOptions, + ) { + super(message, errorOptions) + } +} diff --git a/lib/Easy.ts b/lib/Easy.ts index 36d189d9b..1f4b627e5 100644 --- a/lib/Easy.ts +++ b/lib/Easy.ts @@ -4,16 +4,654 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -import { NodeLibcurlNativeBinding } from './types' +import './moduleSetup' -// eslint-disable-next-line @typescript-eslint/no-var-requires -const bindings: NodeLibcurlNativeBinding = require('../lib/binding/node_libcurl.node') +import { Share } from './Share' +import { + CurlOptionName, + DataCallbackOptions, + ProgressCallbackOptions, + BlobOptions, + StringListOptions, + SpecificOptions, +} from './generated/CurlOption' +import { CurlInfoName } from './generated/CurlInfo' + +import { CurlChunk } from './enum/CurlChunk' +import { CurlCode } from './enum/CurlCode' +import { CurlFnMatchFunc } from './enum/CurlFnMatchFunc' +import { CurlFtpMethod } from './enum/CurlFtpMethod' +import { CurlFtpSsl } from './enum/CurlFtpSsl' +import { CurlGssApi } from './enum/CurlGssApi' +import { CurlHeader } from './enum/CurlHeader' +import { + CurlHsts, + CurlHstsCacheEntry, + CurlHstsCacheCount, +} from './enum/CurlHsts' +import { CurlHttpVersion } from './enum/CurlHttpVersion' +import { CurlInfoDebug } from './enum/CurlInfoDebug' +import { CurlIpResolve } from './enum/CurlIpResolve' +import { CurlNetrc } from './enum/CurlNetrc' +import { CurlPause } from './enum/CurlPause' +import { CurlPreReqFunc } from './enum/CurlPreReqFunc' +import { CurlProgressFunc } from './enum/CurlProgressFunc' +import { CurlProtocol } from './enum/CurlProtocol' +import { CurlProxy } from './enum/CurlProxy' +import { CurlRtspRequest } from './enum/CurlRtspRequest' +import { CurlSshAuth } from './enum/CurlSshAuth' +import { CurlSslOpt } from './enum/CurlSslOpt' +import { CurlSslVersion } from './enum/CurlSslVersion' +import { CurlTimeCond } from './enum/CurlTimeCond' +import { CurlUseSsl } from './enum/CurlUseSsl' +import { SocketState } from './enum/SocketState' + +import { Curl } from './Curl' +import { Multi } from './Multi' + +import { CurlWsFrame, FileInfo, HttpPostField } from './' + +export interface GetInfoReturn { + data: DataType + code: CurlCode +} + +export type CurlInfoNameSpecific = 'CERTINFO' /** - * This is a Node.js wrapper around the binding {@link EasyNativeBinding | native Easy class} + * `Easy` class that acts as an wrapper around the libcurl connection handle. + * > [C++ source code](https://github.com/JCMais/node-libcurl/blob/master/src/Easy.cc) + * + * It can be used by itself, in a synchronous way: + * ```javascript + * import { Curl, CurlCode, Easy } from 'node-libcurl' + * import { StringDecoder } from 'string_decoder' + * + * const decoder = new StringDecoder('utf8') + * const easyHandle = new Easy() + * + * easyHandle.setOpt(Curl.option.URL, 'https://www.google.com') + * // This is used to receive the headers + * // See https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html + * easyHandle.setOpt(Curl.option.HEADERFUNCTION, function (buf, size, nmemb) { + * console.log('Received some headers:', decoder.write(buf)) + * return size * nmemb + * }) + * + * // This is used to receive the response data + * // See https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html + * easyHandle.setOpt(Curl.option.WRITEFUNCTION, function (buf, size, nmemb) { + * console.log('Received some body:', decoder.write(buf)) + * return size * nmemb + * }) + * + * // this will trigger the request + * const ret = easyHandle.perform() + * // The Easy handle will block the JS main thread: + * console.log('I will only show after the request has finished') + * // In case there is something wrong, you can use Easy.strError to get a human readable string about the error + * console.log(ret, ret === CurlCode.CURLE_OK, Easy.strError(ret)) + * // Remember to always close the handle after you have finished using it for good + * easyHandle.close() + * ``` + * + * or with the {@link Multi | Multi} class, allowing asynchronous usage. * * @public */ -class Easy extends bindings.Easy {} +// @ts-expect-error - we are abusing TS merging here to have sane types for the addon classes +declare class Easy { + /** + * This will be `true` if the handle was added to a {@link Multi | `Multi`} handle. + */ + readonly isInsideMultiHandle: boolean + + /** + * This is the unique ID of the Easy handle. + * + * This ID is also unique across threads. + */ + readonly id: number + + /** + * This will be `true` if {@link monitorSocketEvents | `monitorSocketEvents`} was called. + */ + readonly isMonitoringSockets: boolean + + /** + * This will be `true` if {@link close | `close`} was not called. + */ + readonly isOpen: boolean + + readonly pauseFlags: CurlPause + + readonly isPausedRecv: boolean + + readonly isPausedSend: boolean + + /** + * You can set this to anything - Use it to bind some data to this Easy instance. + * + * This will not be copied to other instaces created when duplicating this one. + */ + private: any + + /** + * @private + */ + debugLog(message: string): void + + // START AUTOMATICALLY GENERATED CODE - DO NOT EDIT + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: DataCallbackOptions, + value: + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) + | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: ProgressCallbackOptions, + value: + | (( + this: Easy, + dltotal: number, + dlnow: number, + ultotal: number, + ulnow: number, + ) => number | CurlProgressFunc) + | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: StringListOptions, value: string[] | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: BlobOptions, + value: ArrayBuffer | Buffer | string | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'CHUNK_BGN_FUNCTION', + value: + | ((this: Easy, fileInfo: FileInfo, remains: number) => CurlChunk) + | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'CHUNK_END_FUNCTION', + value: ((this: Easy) => CurlChunk) | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'DEBUGFUNCTION', + value: ((this: Easy, type: CurlInfoDebug, data: Buffer) => 0) | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'FNMATCH_FUNCTION', + value: + | ((this: Easy, pattern: string, value: string) => CurlFnMatchFunc) + | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * You can either return a single `CurlHstsReadCallbackResult` object or an array of `CurlHstsReadCallbackResult` objects. + * If returning an array, the callback will only be called once per request. + * If returning a single object, the callback will be called multiple times until `null` is returned. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'HSTSREADFUNCTION', + value: + | (( + this: Easy, + options: { maxHostLengthBytes: number }, + ) => null | CurlHstsCacheEntry | CurlHstsCacheEntry[]) + | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'HSTSWRITEFUNCTION', + value: + | (( + this: Easy, + cacheEntry: CurlHstsCacheEntry, + cacheCount: CurlHstsCacheCount, + ) => any) + | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'PREREQFUNCTION', + value: + | (( + this: Easy, + connPrimaryIp: string, + connLocalIp: string, + connPrimaryPort: number, + conLocalPort: number, + ) => CurlPreReqFunc) + | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'SEEKFUNCTION', + value: ((this: Easy, offset: number, origin: number) => number) | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: 'TRAILERFUNCTION', + value: ((this: Easy) => string[] | false) | null, + ): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'SHARE', value: Share | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'HTTPPOST', value: HttpPostField[] | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'FTP_SSL_CCC', value: CurlFtpSsl | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'FTP_FILEMETHOD', value: CurlFtpMethod | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'GSSAPI_DELEGATION', value: CurlGssApi | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'HEADEROPT', value: CurlHeader | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'HTTP_VERSION', value: CurlHttpVersion | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'IPRESOLVE', value: CurlIpResolve | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'NETRC', value: CurlNetrc | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'PROTOCOLS', value: CurlProtocol | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'PROXY_SSL_OPTIONS', value: CurlSslOpt | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'PROXYTYPE', value: CurlProxy | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'REDIR_PROTOCOLS', value: CurlProtocol | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'RTSP_REQUEST', value: CurlRtspRequest | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'SSH_AUTH_TYPES', value: CurlSshAuth | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'SSL_OPTIONS', value: CurlSslOpt | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'SSLVERSION', value: CurlSslVersion | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'TIMECONDITION', value: CurlTimeCond | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'USE_SSL', value: CurlUseSsl | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt(option: 'HSTS_CTRL', value: CurlHsts | null): CurlCode + /** + * Use {@link Curl.option|`Curl.option`} for predefined constants. + * + * + * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) + */ + setOpt( + option: Exclude, + value: string | number | boolean | null, + ): CurlCode + // END AUTOMATICALLY GENERATED CODE - DO NOT EDIT + + // overloaded getInfo definitions - changes made here must also be made in Curl.ts + // TODO: do this automatically, like above. + + /** + * Official libcurl documentation: [`curl_easy_getinfo()`](http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html) + * + * @param info Info to retrieve. Use {@link Curl.info | `Curl.info`} for predefined constants. + */ + getInfo(info: 'CERTINFO'): GetInfoReturn + + /** + * Returns information about the finished connection. + * + * Official libcurl documentation: [`curl_easy_getinfo()`](http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html) + * + * @param info Info to retrieve. Use {@link Curl.info | `Curl.info`} for predefined constants. + */ + getInfo(info: Exclude): GetInfoReturn + + /** + * Sends arbitrary data over the established connection. + * + * See also {@link onSocketEvent | `onSocketEvent`}. + * + * Official libcurl documentation: [`curl_easy_send()`](http://curl.haxx.se/libcurl/c/curl_easy_send.html) + */ + send(data: Buffer): { code: CurlCode; bytesSent: number } + + /** + * Receives data over the established connection, data will be written to the passed buffer. + * + * See also {@link onSocketEvent | `onSocketEvent`}. + * + * Official libcurl documentation: [`curl_easy_recv()`](http://curl.haxx.se/libcurl/c/curl_easy_recv.html) + */ + recv(storage: Buffer): { code: CurlCode; bytesReceived: number } + + /** + * Receive WebSocket data when using CONNECT_ONLY mode. + * + * Retrieves as much as possible of a received WebSocket frame into the buffer, but not more than buflen bytes. + * Check `meta.bytesleft` to determine whether the complete frame has been received. + * If more payload is pending, call this function again with an updated buffer to resume receiving. + * + * Requires libcurl >= 7.86.0 + * + * Official libcurl documentation: [`curl_ws_recv()`](https://curl.se/libcurl/c/curl_ws_recv.html) + */ + wsRecv(buffer: Buffer): { + code: CurlCode + bytesReceived: number + meta: CurlWsFrame | null + } + + /** + * Send WebSocket data when using CONNECT_ONLY mode. + * + * Sends a specific message chunk over an established WebSocket connection. + * `flags` must contain at least one flag indicating the type of the message (Text, Binary, Close, Ping, Pong). + * For fragmented messages, set the Cont bit in all frames except the final one. + * + * Requires libcurl >= 7.86.0 + * + * Official libcurl documentation: [`curl_ws_send()`](https://curl.se/libcurl/c/curl_ws_send.html) + * + * @param buffer The data to send + * @param flags Frame type and flags from {@link CurlWs | `CurlWs`} + * @param fragsize Optional fragment size, only used with CURLWS_OFFSET flag + */ + wsSend( + buffer: Buffer, + flags: number, + fragsize?: number, + ): { code: CurlCode; bytesSent: number } + + /** + * Get WebSocket frame metadata when called from within a WRITEFUNCTION callback. + * + * This function provides additional information about the current WebSocket frame being received. + * It only works from within the callback, and only when receiving WebSocket data. + * + * Requires libcurl >= 7.86.0 + * + * Official libcurl documentation: [`curl_ws_meta()`](https://curl.se/libcurl/c/curl_ws_meta.html) + * + * @returns Frame metadata or null if not available + */ + wsMeta(): CurlWsFrame | null + + /** + * Start a new WebSocket frame. + * + * This should only be called from within a READFUNCTION callback. Calling it from anywhere else is undefined behavior. + * + * Official libcurl documentation: [`curl_ws_start_frame()`](https://curl.se/libcurl/c/curl_ws_start_frame.html) + */ + wsStartFrame(flags: number, frameLength: number): CurlCode + + /** + * Performs the entire request in a blocking manner and returns when done. + * + * Official libcurl documentation: [`curl_easy_perform()`](http://curl.haxx.se/libcurl/c/curl_easy_perform.html) + */ + perform(): CurlCode + + /** + * Perform any connection upkeep checks. + * + * Official libcurl documentation: [curl_easy_upkeep()](http://curl.haxx.se/libcurl/c/curl_easy_upkeep.html) + */ + upkeep(): CurlCode + + /** + * Using this function, you can explicitly mark a running connection + * to get paused, and you can unpause a connection that was previously paused. + * + * Use the {@link CurlPause | `CurlPause`} enum for predefined constants. + * + * Official libcurl documentation: [`curl_easy_pause()`](http://curl.haxx.se/libcurl/c/curl_easy_pause.html) + */ + pause(bitmask: CurlPause): CurlCode + + /** + * Reset this handle to their original state. + * + * This method is useful if you plan to reuse this handle later on. + * + * Official libcurl documentation: [`curl_easy_reset()`](http://curl.haxx.se/libcurl/c/curl_easy_reset.html) + */ + reset(): CurlCode + + /** + * Duplicate this handle with all their options and callbacks. + * + * Official libcurl documentation: [`curl_easy_duphandle()`](http://curl.haxx.se/libcurl/c/curl_easy_duphandle.html) + */ + dupHandle(): Easy + + /** + * This method is only useful when the internal polling of the connection socket is enabled by calling + * {@link monitorSocketEvents | `monitorSocketEvents`}. + * + * The passed callback is going to be called everytime there are changes to the connection socket. + * + * One use case for this is when using the {@link send | `send`} and {@link recv | `recv`} methods + * + * A full example is available at [examples/15-send-recv-methods.js](https://github.com/JCMais/node-libcurl/blob/master/examples/15-send-recv-methods.js) + * + * Pass `null` to remove the current callback set. + */ + onSocketEvent( + cb: ((error: Error | null, events: SocketState) => void) | null, + ): this + + /** + * Start monitoring for events in the connection socket used by this handle. + * + * This is only useful if using the {@link onSocketEvent | `onSocketEvent`} callback. + * + * This method will throw an Error if the handle is already monitoring socket events. + * You can use {@link isMonitoringSockets | `isMonitoringSockets`} to check if socket events are already being monitored or not. + */ + monitorSocketEvents(): this + + /** + * Stop monitoring for events in the connection socket used by this handle. + * + * This method will throw an Error if the handle is not monitoring socket events. + * You can use {@link isMonitoringSockets | `isMonitoringSockets`} to check if socket events are already being monitored or not. + */ + unmonitorSocketEvents(): this + + /** + * Close this handle and dispose any resources bound to it. + * After closed, the handle **MUST** not be used again, doing so will throw an Error. + * + * This is basically the same than [`curl_easy_cleanup()`](http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html) + */ + close(): void + + // below ones are duplicated from below + // just so that it also appears on the documentation for this class + + /** + * Returns a description for the given error code. + * + * Official libcurl documentation: [`curl_easy_strerror()`](http://curl.haxx.se/libcurl/c/curl_easy_strerror.html) + */ + static strError(errorCode: CurlCode): string +} + +const bindings: any = require('../lib/binding/node_libcurl.node') + +// @ts-expect-error - we are abusing TS merging here to have sane types for the addon classes +const Easy = bindings.Easy as Easy export { Easy } diff --git a/lib/Multi.ts b/lib/Multi.ts index f02577266..69fe32944 100644 --- a/lib/Multi.ts +++ b/lib/Multi.ts @@ -4,28 +4,233 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -import { NodeLibcurlNativeBinding } from './types' +import './moduleSetup' -// eslint-disable-next-line @typescript-eslint/no-var-requires -const bindings: NodeLibcurlNativeBinding = require('../lib/binding/node_libcurl.node') +import { MultiOptionName } from './generated/MultiOption' +import { CurlMultiCode, CurlCode } from './enum/CurlCode' +import { CurlPipe } from './enum/CurlPipe' +import { CurlPush } from './enum/CurlPush' + +import { Http2PushFrameHeaders } from './types/Http2PushFrameHeaders' +import { Curl } from './Curl' +import { Easy } from './Easy' + +type SpecificOptions = 'PIPELINING' + +/** + * Options for constructing a new Multi instance. + * + * @public + */ +export interface MultiOptions { + /** + * Enable libcurl's notification API for better performance. + * + * @remarks + * When enabled, this uses libcurl's notification callback system (available in libcurl >= 8.17.0) + * instead of polling for messages. This can improve performance by 50-100% for short transfers, + * especially when handling many connections. + * + * The notification API works by having libcurl call a callback when transfer events occur, + * eliminating the need to call `curl_multi_info_read()` after every operation. + * + * **Behavior:** + * - If `true` and libcurl >= 8.17.0 is available: Uses notification API + * - If `true` and libcurl < 8.17.0: Falls back to polling (no error, debug log only) + * - If `false` or not specified: Uses traditional polling approach + * - When compiled against libcurl < 8.17.0: Always falls back to polling + * + * **Defaults:** + * - `true` when compiled against libcurl >= 8.17.0 + * - `false` when compiled against libcurl < 8.17.0 + * + * @defaultValue `true` (if compiled with libcurl >= 8.17.0), `false` otherwise + * + * @see {@link https://curl.se/libcurl/c/curl_multi_notify_enable.html | curl_multi_notify_enable()} + * @see {@link https://curl.se/libcurl/c/CURLMOPT_NOTIFYFUNCTION.html | CURLMOPT_NOTIFYFUNCTION} + * @see {@link https://eissing.org/icing/posts/curl-notifications/ | Curl Notifications Blog Post} + * + * @since 5.0.0 + */ + shouldUseNotificationsApi?: boolean +} /** - * This is a Node.js wrapper around the binding {@link MultiNativeBinding | native Multi class}. + * `Multi` class that acts as an wrapper around the native libcurl multi handle. + * > [C++ source code](https://github.com/JCMais/node-libcurl/blob/master/src/Multi.cc) + * + * Using this class instead of just the {@link Easy | Easy} allows one to run requests asynchronously. * - * The only extra is that it provides a static field `option`. + * For usage see [examples/04-multi.js](https://github.com/JCMais/node-libcurl/blob/master/examples/04-multi.js) + * + * The {@link Curl | Curl} class uses one of this internally to provide asynchronous usage of the library. * * @public */ -class Multi extends bindings.Multi { +// @ts-expect-error - we are abusing TS merging here to have sane types for the addon classes +declare class Multi { + /** + * Creates a new Multi instance. + * + * @param options - Optional configuration for the Multi instance + * + * @example + * ```typescript + * // Use default settings (notifications enabled if libcurl >= 8.17.0) + * const multi = new Multi() + * + * // Explicitly enable notifications (recommended for libcurl >= 8.17.0) + * const multiWithNotifications = new Multi({ shouldUseNotificationsApi: true }) + * + * // Use traditional polling (compatible with all libcurl versions) + * const multiWithPolling = new Multi({ shouldUseNotificationsApi: false }) + * ``` + */ + constructor(options?: MultiOptions) + /** + * Sets the [`PIPELINING`](https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING.html) option. + * + * Official libcurl documentation: [`curl_multi_setopt()`](http://curl.haxx.se/libcurl/c/curl_multi_setopt.html) + */ + setOpt(option: 'PIPELINING', value: CurlPipe): CurlMultiCode + + /** + * Sets the [`PUSHFUNCTION`](https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHFUNCTION.html) option. + * + * @remarks + * You **must** not use the {@link Http2PushFrameHeaders | `Http2PushFrameHeaders`} object outside + * of this callback, doing so will try to use memory that libcurl has already + * freed and, in the best case scenario, will cause a segmentation fault. + * + * In case you have denied the push, you **must** also not use the `duplicatedHandle` + * outside of this callback, as libcurl would already have closed it and you would + * try to access memory that has been freed. + * + * Errors thrown inside this callback will have the same effect than returning `CurlPush.Deny`. + * + * Per a libcurl limitation, there is no direct way to cancel the connection from inside + * this callback, a possible workaround is to return an error + * from another callback, like the progress one. + * + * Official libcurl documentation: [`curl_multi_setopt()`](http://curl.haxx.se/libcurl/c/curl_multi_setopt.html) + */ + setOpt( + option: 'PUSHFUNCTION', + value: ( + parent: Easy, + duplicatedHandle: Easy, + pushFrameHeaders: Http2PushFrameHeaders, + ) => CurlPush, + ): CurlMultiCode + /** - * Options to be used with {@link setOpt | `setOpt`}. + * Sets options on this instance. * - * See the official documentation of [`curl_multi_setopt()`](http://curl.haxx.se/libcurl/c/curl_multi_setopt.html) - * for reference. + * Use {@link Curl.option | `Curl.option`} for predefined constants. * - * `CURLMOPT_MAXCONNECTS` becomes `Multi.option.MAXCONNECTS` + * Official libcurl documentation: [`curl_multi_setopt()`](http://curl.haxx.se/libcurl/c/curl_multi_setopt.html) */ - static option = bindings.Curl.multi + setOpt( + option: Exclude, + value: number, + ): CurlMultiCode + + /** + * Adds an {@link Easy | `Easy`} handle to be managed by this instance. + * + * The request will start right after calling this method. + * + * Official libcurl documentation: [`curl_multi_add_handle()`](http://curl.haxx.se/libcurl/c/curl_multi_add_handle.html) + * + * @deprecated This will be eventually removed in favor of just using {@link Multi.perform | `perform`} to add handles to the multi handle. + * + */ + addHandle(handle: Easy): CurlMultiCode + + /** + * Removes an {@link Easy | `Easy`} handle that was inside this instance. + * + * Official libcurl documentation: [`curl_multi_remove_handle()`](http://curl.haxx.se/libcurl/c/curl_multi_remove_handle.html) + * + * Notice, removing a handle that is being performed will result in the original promise returned by {@link Multi.perform | `perform`} being rejected. + */ + removeHandle(handle: Easy): CurlMultiCode + + /** + * Adds an {@link Easy | `Easy`} handle to this Multi instance and returns a promise + * that resolves when the request completes successfully, or rejects with a CurlError if it fails. + * + * This is the modern, promise-based alternative to using {@link Multi.addHandle | `addHandle`} + * with {@link Multi.onMessage | `onMessage`}. + * + * The returned promise will: + * - Resolve with the Easy handle when the request completes successfully + * - Reject with a CurlError (containing a `code` property with the CurlCode value) on failure + * + * @param handle - The Easy handle to perform the request with + * @returns A promise that resolves with the Easy handle or rejects with a CurlError + * + * @example + * ```ts + * const multi = new Multi() + * const easy = new Easy() + * easy.setOpt('URL', 'https://example.com') + * + * try { + * await multi.perform(easy) + * console.log('Request completed successfully') + * } catch (error) { + * console.error('Request failed with code:', error.code) + * } + * ``` + * + * This does what [`curl_multi_add_handle()`](http://curl.haxx.se/libcurl/c/curl_multi_add_handle.html) does. + */ + perform(handle: Easy): Promise + + /** + * Allow to provide a callback that will be called when there are + * new information about the handles inside this instance. + * + * This is basically an abstraction over [`curl_multi_info_read()`](http://curl.haxx.se/libcurl/c/curl_multi_info_read.html) + * + * Pass `null` to remove the current callback set. + * + * @deprecated This will be eventually removed in favor of just using {@link Multi.perform | `perform`} to add handles to the multi handle, instead + * of using {@link Multi.addHandle | `addHandle`}. + */ + onMessage( + cb: ((error: Error, easyHandle: Easy, errorCode: CurlCode) => void) | null, + ): this + + /** + * Returns the number of {@link Easy | 'Easy'} handles that are currently inside this instance + */ + getCount(): number + + /** + * Closes this multi handle. + * + * After the handle has been closed it must not be used again. + * + * This is basically the same than [`curl_multi_cleanup()`](http://curl.haxx.se/libcurl/c/curl_multi_cleanup.html) + */ + close(): void + + // below ones are duplicated from below + // just so that it also appears on the documentation for this class + + /** + * Returns a description for the given error code. + * + * Official libcurl documentation: [`curl_multi_strerror()`](http://curl.haxx.se/libcurl/c/curl_multi_strerror.html) + */ + strError(errorCode: CurlMultiCode): string } +const bindings: any = require('../lib/binding/node_libcurl.node') + +// @ts-expect-error - we are abusing TS merging here to have sane types for the addon classes +const Multi = bindings.Multi as Multi + export { Multi } diff --git a/lib/Share.ts b/lib/Share.ts index 9bba413b8..2928830ae 100644 --- a/lib/Share.ts +++ b/lib/Share.ts @@ -4,31 +4,57 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -import { NodeLibcurlNativeBinding } from './types' -import { CurlShareOption } from './enum/CurlShareOption' +import './moduleSetup' + +import { CurlShareCode } from './enum/CurlCode' -// eslint-disable-next-line @typescript-eslint/no-var-requires -const bindings: NodeLibcurlNativeBinding = require('../lib/binding/node_libcurl.node') +import { CurlShareOption } from './enum/CurlShareOption' +import { CurlShareLock } from './enum/CurlShareLock' /** - * This is a Node.js wrapper around the binding {@link EasyNativeBinding | native Easy class}. + * `Share` class that acts as an wrapper around the native libcurl share handle. + * > [C++ source code](https://github.com/JCMais/node-libcurl/blob/master/src/Share.cc) + * + * Using this class you should be able to share data between + * two {@link Easy | Easy} handles, like cookies for instance. * - * The only extra is that it provides a static field `option` and `lock`. + * For usage see [examples/05-share.js](https://github.com/JCMais/node-libcurl/blob/master/examples/05-share.js) * * @public */ -class Share extends bindings.Share { +// @ts-expect-error - we are abusing TS merging here to have sane types for the addon classes +declare class Share { + /** + * You can use {@link CurlShareOption|`CurlShareOption`} and {@link CurlShareLock|`CurlShareLock`} + * for predefined constants. + * + * Official libcurl documentation: [`curl_share_setopt()`](http://curl.haxx.se/libcurl/c/curl_share_setopt.html) + */ + setOpt(option: CurlShareOption, value: CurlShareLock): CurlShareCode + /** - * Options to be used with {@link setOpt | `setOpt`}. + * Closes this handle. * - * See the official documentation of [`curl_share_setopt()`](http://curl.haxx.se/libcurl/c/curl_share_setopt.html) - * for reference. + * After the handle has been closed it must not be used again. * - * `CURLSHOPT_SHARE` becomes `Share.option.SHARE` + * This is basically the same than [curl_share_cleanup()](http://curl.haxx.se/libcurl/c/curl_share_cleanup.html) + */ + close(): void + + // below ones are duplicated from below + // just so that it also appears on the documentation for this class + + /** + * Returns a description for the given error code. * - * @deprecated Use {@link CurlShareOption|`CurlShareOption`} directly instead. + * Official libcurl documentation: [`curl_share_strerror()`](http://curl.haxx.se/libcurl/c/curl_share_strerror.html) */ - static option = CurlShareOption + strError(errorCode: CurlShareCode): string } +const bindings: any = require('../lib/binding/node_libcurl.node') + +// @ts-expect-error - we are abusing TS merging here to have sane types for the addon classes +const Share = bindings.Share as Share + export { Share } diff --git a/lib/curly.ts b/lib/curly.ts index c39c14c68..7bdde8c51 100644 --- a/lib/curly.ts +++ b/lib/curly.ts @@ -4,6 +4,8 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +import './moduleSetup' + import { Readable } from 'stream' import { @@ -16,6 +18,8 @@ import { HeaderInfo } from './parseHeaders' import { Curl } from './Curl' import { CurlFeature } from './enum/CurlFeature' +import { CurlError } from './CurlError' +import { CurlEasyError } from './CurlEasyError' /** * Object the curly call resolves to. @@ -109,8 +113,8 @@ export interface CurlyOptions extends CurlOptionValueType { * @remarks * * This basically calls one of the following methods, depending on if any of the streams feature is being used or not: - * - If using streams: {@link "Curl".Curl.setStreamProgressCallback | `Curl#setStreamProgressCallback`} - * - else: {@link "Curl".Curl.setProgressCallback | `Curl#setProgressCallback`} + * - If using streams: {@link Curl.setStreamProgressCallback | `Curl#setStreamProgressCallback`} + * - else: {@link Curl.setProgressCallback | `Curl#setProgressCallback`} */ curlyProgressCallback?: CurlOptionValueType['xferInfoFunction'] @@ -149,10 +153,10 @@ export interface CurlyOptions extends CurlOptionValueType { * * The `curly` call will resolve as soon as the stream is available. * - * When using this option, if an error is thrown in the internal {@link "Curl".Curl | `Curl`} instance + * When using this option, if an error is thrown in the internal {@link Curl | `Curl`} instance * after the `curly` call has been resolved (it resolves as soon as the stream is available) * it will cause the `error` event to be emitted on the stream itself, this way it's possible - * to handle these too, if necessary. The error object will have the property `isCurlError` set to `true`. + * to handle these too, if necessary. The error object will inherit from the {@link CurlError | `CurlError`} class. * * Calling `destroy()` on the stream will always cause the `Curl` instance to emit the error event. * Even if an error argument was not supplied to `stream.destroy()`. @@ -165,7 +169,7 @@ export interface CurlyOptions extends CurlOptionValueType { * Versions older than that one are not reliable for streams usage. * * This basically enables the {@link CurlFeature.StreamResponse | `CurlFeature.StreamResponse`} feature - * flag in the internal {@link "Curl".Curl | `Curl`} instance. + * flag in the internal {@link Curl | `Curl`} instance. */ curlyStreamResponse?: boolean @@ -174,8 +178,8 @@ export interface CurlyOptions extends CurlOptionValueType { * * @remarks * - * This basically calls {@link "Curl".Curl.setStreamResponseHighWaterMark | `Curl#setStreamResponseHighWaterMark`} - * method in the internal {@link "Curl".Curl | `Curl`} instance. + * This basically calls {@link Curl.setStreamResponseHighWaterMark | `Curl#setStreamResponseHighWaterMark`} + * method in the internal {@link Curl | `Curl`} instance. */ curlyStreamResponseHighWaterMark?: number @@ -189,7 +193,7 @@ export interface CurlyOptions extends CurlOptionValueType { * * If the stream set here is destroyed before libcurl finishes uploading it, the error * `Curl upload stream was unexpectedly destroyed` (Code `42`) will be emitted in the - * internal {@link "Curl".Curl | `Curl`} instance, and so will cause the curly call to be rejected with that error. + * internal {@link Curl | `Curl`} instance, and so will cause the curly call to be rejected with that error. * * If the stream was destroyed with a specific error, this error will be passed instead. * @@ -200,13 +204,13 @@ export interface CurlyOptions extends CurlOptionValueType { * Make sure your libcurl version is greater than or equal 7.69.1. * Versions older than that one are not reliable for streams usage. * - * This basically calls {@link "Curl".Curl.setUploadStream | `Curl#setUploadStream`} - * method in the internal {@link "Curl".Curl | `Curl`} instance. + * This basically calls {@link Curl.setUploadStream | `Curl#setUploadStream`} + * method in the internal {@link Curl | `Curl`} instance. */ curlyStreamUpload?: Readable | null } -interface CurlyHttpMethodCall { +export interface CurlyHttpMethodCall { /** * **EXPERIMENTAL** This API can change between minor releases * @@ -225,6 +229,7 @@ interface CurlyHttpMethodCall { // type HttpMethodCalls = { readonly [K in HttpMethod]: CurlyHttpMethodCall } type HttpMethodCalls = Record +/** @expand */ export interface CurlyFunction extends HttpMethodCalls { /** * **EXPERIMENTAL** This API can change between minor releases @@ -261,14 +266,77 @@ export interface CurlyFunction extends HttpMethodCalls { * - * */ defaultResponseBodyParsers: CurlyResponseBodyParsersProperty + + /** + * Set the object pool limit for Curl instances. + * + * When set to 0 (default), pooling is disabled and Curl instances are created/destroyed on each request. + * When set to a positive number, that many Curl instances will be pre-created and reused. + * + * @param limit - Number of Curl instances to keep in the pool. 0 disables pooling. + */ + setObjectPoolLimit: (limit: number) => void } const create = (defaultOptions: CurlyOptions = {}): CurlyFunction => { + // Object pool for Curl instances + let poolLimit = 0 + const pool: Curl[] = [] + + const getFromPool = (): Curl => { + if (poolLimit === 0) { + // Pooling disabled, create new instance + return new Curl() + } + + if (pool.length > 0) { + // Get from pool + return pool.pop()! + } + + // Pool empty, create new instance + return new Curl() + } + + const returnToPool = (curlHandle: Curl): void => { + if (poolLimit === 0) { + // Pooling disabled, close the handle + curlHandle.close() + return + } + + if (pool.length < poolLimit) { + // Reset the handle for reuse + curlHandle.reset() + pool.push(curlHandle) + } else { + // Pool full, close the handle + curlHandle.close() + } + } + + const setObjectPoolLimit = (limit: number): void => { + poolLimit = limit + + if (limit <= 0) { + for (const handle of pool) { + handle.close() + } + pool.length = 0 + } else { + // If reducing limit, close excess instances + while (pool.length > limit) { + const handle = pool.pop()! + handle.close() + } + } + } + function curly( url: string, options: CurlyOptions = {}, ): Promise> { - const curlHandle = new Curl() + const curlHandle = getFromPool() curlHandle.enable(CurlFeature.NoDataParsing) @@ -372,7 +440,7 @@ const create = (defaultOptions: CurlyOptions = {}): CurlyFunction => { curlHandle.on( 'end', (statusCode, data: Buffer, headers: HeaderInfo[]) => { - curlHandle.close() + returnToPool(curlHandle) // only need to the remaining here if we did not enabled // the stream response @@ -460,28 +528,28 @@ const create = (defaultOptions: CurlyOptions = {}): CurlyFunction => { ) curlHandle.on('error', (error, errorCode) => { - curlHandle.close() + returnToPool(curlHandle) - // @ts-ignore - error.code = errorCode - // @ts-ignore - error.isCurlError = true + const errorToUse = + error instanceof CurlError + ? error + : new CurlEasyError(error.message, errorCode, { cause: error }) // oops, if have a stream it means the promise // has been resolved with it // so instead of rejecting the original promise // we are emitting the error event on the stream if (stream) { - stream.emit('error', error) + stream.emit('error', errorToUse) } else { - reject(error) + reject(errorToUse) } }) try { curlHandle.perform() } catch (error) /* istanbul ignore next: this should never happen 🤷‍♂️ */ { - curlHandle.close() + returnToPool(curlHandle) reject(error) } }) @@ -489,12 +557,14 @@ const create = (defaultOptions: CurlyOptions = {}): CurlyFunction => { curly.create = create + curly.setObjectPoolLimit = setObjectPoolLimit + curly.defaultResponseBodyParsers = { 'application/json': (data, _headers) => { try { const string = data.toString('utf8') return JSON.parse(string) - } catch (error) { + } catch { throw new Error( `curly failed to parse "application/json" content as JSON. This is generally caused by receiving malformed JSON data from the server. You can disable this automatic behavior by setting the option curlyResponseBodyParser to false, then a Buffer will be returned as the data. diff --git a/lib/enum/CurlCode.ts b/lib/enum/CurlCode.ts index 8e907faa9..a0ec7022a 100644 --- a/lib/enum/CurlCode.ts +++ b/lib/enum/CurlCode.ts @@ -167,6 +167,9 @@ export enum CurlCode { CURLE_QUIC_CONNECT_ERROR /* 96 - QUIC connection error */, CURLE_PROXY /* 97 - proxy handshake error */, CURLE_SSL_CLIENTCERT /* 98 - client-side certificate required */, + CURLE_UNRECOVERABLE_POLL /* 99 - poll/select returned fatal error */, + CURLE_TOO_LARGE /* 100 - a value/data met its maximum */, + CURLE_ECH_REQUIRED /* 101 - ECH tried but failed */, CURLE_LAST, /* compatibility with older names */ CURLE_FTP_WEIRD_SERVER_REPLY = CURLE_WEIRD_SERVER_REPLY, diff --git a/lib/enum/CurlFeature.ts b/lib/enum/CurlFeature.ts index df048419f..0e159e2fc 100644 --- a/lib/enum/CurlFeature.ts +++ b/lib/enum/CurlFeature.ts @@ -6,7 +6,7 @@ */ /** - * Flags to be used with {@link "Curl".Curl.enable | `Curl#enable`} and {@link "Curl".Curl.disable | `Curl#disable`} + * Flags to be used with {@link Curl.enable | `Curl#enable`} and {@link Curl.disable | `Curl#disable`} * @public */ export enum CurlFeature { @@ -83,7 +83,7 @@ export enum CurlFeature { * * Using this implies `NoDataStorage`. * - * To control the `highWaterMark` option of the response stream, see {@link "Curl".Curl.setStreamResponseHighWaterMark | `Curl#setStreamResponseHighWaterMark`} + * To control the `highWaterMark` option of the response stream, see {@link Curl.setStreamResponseHighWaterMark | `Curl#setStreamResponseHighWaterMark`} * * @remarks * diff --git a/lib/enum/CurlFollow.ts b/lib/enum/CurlFollow.ts new file mode 100644 index 000000000..f6fe47d13 --- /dev/null +++ b/lib/enum/CurlFollow.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +// https://github.com/curl/curl/blob/8c4fbcbc4f6e158b3b2a644d5ec6b4b38183b081/include/curl/curl.h#L177 +/** + * Object with constants for option bits for `CURLOPT_FOLLOWLOCATION` + * + * `CURLFOLLOW_ALL` becomes `CurlFollow.All` + * + * @public + */ +export enum CurlFollow { + /** + * Generic follow redirects + */ + All = 1, + /** + * Do not use the custom method in the follow-up request if the HTTP code + * instructs so (301, 302, 303). + */ + ObeyCode = 2, + /** + * Only use the custom method in the first request, + * always reset in the next. + */ + FirstOnly = 3, +} diff --git a/lib/enum/CurlGlobalInit.ts b/lib/enum/CurlGlobalInit.ts index 98da2f2b0..94eeaa386 100644 --- a/lib/enum/CurlGlobalInit.ts +++ b/lib/enum/CurlGlobalInit.ts @@ -7,6 +7,8 @@ // https://github.com/curl/curl/blob/c4e0be44089/include/curl/curl.h#L2630 /** * @public + * + * @deprecated This will be removed in the next major version. */ export const enum CurlGlobalInit { Nothing = 0, diff --git a/lib/enum/CurlHttpVersion.ts b/lib/enum/CurlHttpVersion.ts index 01228a7fb..ba9cc5113 100644 --- a/lib/enum/CurlHttpVersion.ts +++ b/lib/enum/CurlHttpVersion.ts @@ -31,5 +31,6 @@ export enum CurlHttpVersion { * Use HTTP 2 without HTTP/1.1 Upgrade */ V2PriorKnowledge, - v3, + v3 = 30, + V3Only = 31, } diff --git a/lib/enum/CurlMultiNetworkChanged.ts b/lib/enum/CurlMultiNetworkChanged.ts new file mode 100644 index 000000000..f7b6f8b0c --- /dev/null +++ b/lib/enum/CurlMultiNetworkChanged.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +// https://github.com/curl/curl/blob/00cb679c04ef9e0f30bd99c9dcc58c1e1928c01a/include/curl/multi.h#L410 +/** + * To be used with the `NETRC` option + * + * `CURLMNC_CLEAR_CONNS` becomes `CurlMultiNetworkChanged.ClearConns` + * + * @public + */ +export enum CurlMultiNetworkChanged { + /** + * Tells libcurl to prevent further reuse of existing connections. + * Connections that are idle will be closed. Ongoing transfers + * will continue with the connection they have. + */ + ClearConns = 1 << 0, + /** + * Tells libcurl to clear the DNS cache. + */ + ClearDns = 1 << 0, +} diff --git a/lib/enum/CurlPause.ts b/lib/enum/CurlPause.ts index 16d87d3c6..d38ee49cc 100644 --- a/lib/enum/CurlPause.ts +++ b/lib/enum/CurlPause.ts @@ -4,9 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +import { Easy } from '../Easy' // https://github.com/curl/curl/blob/e1be8254/include/curl/curl.h#L2828 /** - * Options to be used with {@link "Easy".Easy.pause | `Easy#pause`} and {@link "Curl".Curl.pause | `Curl#pause`}. + * Options to be used with {@link Easy.pause | `Easy#pause`} and {@link Curl.pause | `Curl#pause`}. * * `CURLPAUSE_RECV_CONT` becomes `CurlPause.RecvCont` * diff --git a/lib/enum/CurlProxy.ts b/lib/enum/CurlProxy.ts index 69812ff1d..34375f82d 100644 --- a/lib/enum/CurlProxy.ts +++ b/lib/enum/CurlProxy.ts @@ -16,6 +16,7 @@ export enum CurlProxy { Http = 0, Http_1_0 = 1, Https = 2, + Https2 = 3, Socks4 = 4, Socks5 = 5, Socks4A = 6, diff --git a/lib/enum/CurlPush.ts b/lib/enum/CurlPush.ts index 024898688..85e8ad42c 100644 --- a/lib/enum/CurlPush.ts +++ b/lib/enum/CurlPush.ts @@ -4,9 +4,12 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ + +import { Multi } from '../Multi' + // https://github.com/curl/curl/blob/eab2f95c0de94e9816c8a6110d20673761dd97a4/include/curl/multi.h#L426-L435 /** - * Object with constants to be used as the return value for the {@link "Multi".Multi.setOpt | `Multi`} option `PUSHFUNCTION`. + * Object with constants to be used as the return value for the {@link Multi.setOpt | `Multi`} option `PUSHFUNCTION`. * * `CURL_PUSH_OK` becomes `CurlPush.Ok` * diff --git a/lib/enum/CurlShareLock.ts b/lib/enum/CurlShareLock.ts index 0697e6610..60c0d44bc 100644 --- a/lib/enum/CurlShareLock.ts +++ b/lib/enum/CurlShareLock.ts @@ -4,9 +4,12 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ + +import { Share } from '../Share' + // https://github.com/curl/curl/blob/e1be82545348/include/curl/curl.h#L2643 /** - * Options to be used when setting `SHARE` or `UNSHARE` with {@link "Share".Share.setOpt | `Share#setOpt`}. + * Options to be used when setting `SHARE` or `UNSHARE` with {@link Share.setOpt | `Share#setOpt`}. * * `CURL_LOCK_DATA_SSL_SESSION` becomes `CurlShareLock.DataSslSession` * @@ -15,14 +18,46 @@ export enum CurlShareLock { DataNone, /** - * DataShare is used internally to say that - * the locking is just made to change the internal state of the share - * itself. + * DataShare is used internally to say that the locking is just made to change + * the internal state of the share itself. */ DataShare, + /** + * Cookie data is shared across the easy handles using this shared object. + * Note that this does not activate an easy handle's cookie handling. You can + * do that separately by using CURLOPT_COOKIEFILE for example. + */ DataCookie, + /** + * Cached DNS hosts are shared across the easy handles using this shared object. + * Note that when you use the multi interface, all easy handles added to the + * same multi handle share the DNS cache by default without using this option. + */ DataDns, + /** + * SSL sessions are shared across the easy handles using this shared object. + * This reduces the time spent in the SSL handshake when reconnecting to the + * same server. + * + * Note that when you use the multi interface, all easy handles added to the + * same multi handle share the SSL session cache by default without using + * this option. + */ DataSslSession, + /** + * Put the connection cache in the share object and make all easy handles using this share object share the connection cache. + * Connections that are used for HTTP/2 or HTTP/3 multiplexing only get additional transfers added to them if the existing connection is held by the same multi or easy handle. libcurl does not support doing multiplexed streams in different threads using a shared connection. + * Note that when you use the multi interface, all easy handles added to the same multi handle share the connection cache by default without using this option. + */ DataConnect, + /** + * The Public Suffix List stored in the share object is made available to all easy handle bound to the later. Since the Public Suffix List is periodically refreshed, this avoids updates in too many different contexts. + * + * Note that when you use the multi interface, all easy handles added to the same multi handle share the PSL cache by default without using this option. + */ DataPsl, + /** + * The in-memory HSTS cache. + */ + DataHsts, } diff --git a/lib/enum/CurlShareOption.ts b/lib/enum/CurlShareOption.ts index da764e97a..33b20ad4a 100644 --- a/lib/enum/CurlShareOption.ts +++ b/lib/enum/CurlShareOption.ts @@ -4,10 +4,13 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ + +import { Share } from '../Share' + // https://github.com/curl/curl/blob/e1be82545348/include/curl/curl.h#L2685 // not following enum naming convention on this one to keep consistent with other curl options /** - * Options to be used with {@link "Share".Share.setOpt | `Share#setOpt`}. + * Options to be used with {@link Share.setOpt | `Share#setOpt`}. * * @public */ diff --git a/lib/enum/CurlSslOpt.ts b/lib/enum/CurlSslOpt.ts index 56e6d4daf..cfd48c636 100644 --- a/lib/enum/CurlSslOpt.ts +++ b/lib/enum/CurlSslOpt.ts @@ -53,4 +53,9 @@ export enum CurlSslOpt { * Added with libcurl 7.77 - This was the default in previous versions */ AutoClientCert = 1 << 5, + + /** + * If possible, send data using TLS 1.3 early data + */ + Earlydata = 1 << 6, } diff --git a/lib/enum/CurlUploadFlag.ts b/lib/enum/CurlUploadFlag.ts new file mode 100644 index 000000000..cd25f07ee --- /dev/null +++ b/lib/enum/CurlUploadFlag.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +// https://github.com/curl/curl/blob/e1be82545348/include/curl/curl.h#L2058 +/** + * Object with constants for option `UPLOAD_FLAGS` + * + * `CURLULFLAG_ANSWERED` becomes `CurlUploadFlag.Answered` + * + * @public + */ +export enum CurlUploadFlag { + /** + * Sets the Answered flag for IMAP uploads + */ + Answered = 1 << 0, + + /** + * Sets the Deleted flag for IMAP uploads + */ + Deleted = 1 << 1, + + /** + * Sets the Draft flag for IMAP uploads + */ + Draft = 1 << 2, + + /** + * Sets the Flagged flag for IMAP uploads + */ + Flagged = 1 << 3, + + /** + * Sets the Seen flag for IMAP uploads + */ + Seen = 1 << 4, +} diff --git a/lib/enum/CurlWriteFunc.ts b/lib/enum/CurlWriteFunc.ts index 4c8f04cdd..de5c68f7e 100644 --- a/lib/enum/CurlWriteFunc.ts +++ b/lib/enum/CurlWriteFunc.ts @@ -13,5 +13,14 @@ * @public */ export enum CurlWriteFunc { + /** + * This is a magic return code for the write callback that, when returned, + * will signal libcurl to pause receiving on the current transfer. + */ Pause = 0x10000001, + /** + * This is a magic return code for the write callback that, when returned, + * will signal an error from the callback. + */ + Abort = 0xffffffff, } diff --git a/lib/enum/CurlWs.ts b/lib/enum/CurlWs.ts new file mode 100644 index 000000000..ec7f99df6 --- /dev/null +++ b/lib/enum/CurlWs.ts @@ -0,0 +1,75 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +// https://github.com/curl/curl/blob/master/include/curl/websockets.h +/** + * WebSocket frame flags + * + * These flags are used to identify the type of WebSocket frame and its properties. + * The frame type flags (Text, Binary, Close, Ping, Pong) are mutually exclusive. + * + * `CURLWS_TEXT` becomes `CurlWs.Text` + * + * @public + */ +export enum CurlWs { + /** + * The frame contains text data. Note that libcurl does not verify that + * the content is valid UTF-8. + */ + Text = 1 << 0, + /** + * The frame contains binary data. + */ + Binary = 1 << 1, + /** + * This is a continuation frame. It implies there is another fragment coming + * as part of the same message. Only one fragmented message can be transmitted + * at a time, but it may be interrupted by control frames (Close, Ping, Pong). + */ + Cont = 1 << 2, + /** + * This is a close frame. It may contain a 2-byte unsigned integer in network + * byte order that indicates the close reason and may additionally contain up + * to 123 bytes of further textual payload. + */ + Close = 1 << 3, + /** + * This is a ping frame. It may contain up to 125 bytes of payload. + * libcurl automatically responds with a pong message unless disabled via + * WS_OPTIONS. + */ + Ping = 1 << 4, + /** + * This is a pong frame. It may contain up to 125 bytes of payload. + */ + Pong = 1 << 5, + /** + * Used when sending partial frames. The provided data is only a partial frame + * and there is more coming in a following call to wsSend(). + */ + Offset = 1 << 6, +} + +/** + * WebSocket options flags + * + * These flags are used with the WS_OPTIONS curl option. + * + * @public + */ +export enum CurlWsOptions { + /** + * Passes on the data from the network without parsing it, leaving that + * entirely to the application. This mode is intended for applications that + * already have a WebSocket parser/engine. + */ + RawMode = 1 << 0, + /** + * Tells libcurl to not automatically respond to PING frames with PONG. + */ + NoAutoPong = 1 << 1, +} diff --git a/lib/enum/SocketState.ts b/lib/enum/SocketState.ts index 254f82abd..725ed6143 100644 --- a/lib/enum/SocketState.ts +++ b/lib/enum/SocketState.ts @@ -4,9 +4,10 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +import { Easy } from '../Easy' /** * This will be the type of the second parameter passed to the callback set with - * {@link "Easy".Easy.onSocketEvent|`Easy#onSocketEvent`}. + * {@link Easy.onSocketEvent | `Easy#onSocketEvent`}. * @public */ export enum SocketState { diff --git a/lib/generated/CurlInfo.ts b/lib/generated/CurlInfo.ts index 5f34bbb7f..2bbf4b5db 100644 --- a/lib/generated/CurlInfo.ts +++ b/lib/generated/CurlInfo.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -// This file was generated by scripts/build-constants.js on 2022-10-31T13:21:27.964Z +// This file was generated by scripts/build-constants.js on 2025-10-19T23:48:53.798Z // Do not edit manually /** @@ -14,485 +14,541 @@ export interface CurlInfo { /** * The session's active socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_ACTIVESOCKET.html](https://curl.haxx.se/libcurl/c/CURLINFO_ACTIVESOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_ACTIVESOCKET.html](https://curl.haxx.se/libcurl/c/CURLINFO_ACTIVESOCKET.html) */ readonly ACTIVESOCKET: 'ACTIVESOCKET' /** - * Time from start until SSL/SSH handshake completed. + * The time it took from the start until the SSL connect/handshake with the remote host was completed as a double in number of seconds. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME.html) */ readonly APPCONNECT_TIME: 'APPCONNECT_TIME' /** - * Time from start until SSL/SSH handshake completed. + * The time it took from the start until the SSL connect/handshake with the remote host was completed in number of microseconds. (Added in 7.60.0) * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_APPCONNECT_TIME_T.html) */ readonly APPCONNECT_TIME_T: 'APPCONNECT_TIME_T' /** - * Get the default value for . + * Get the default value for CURLOPT_CAINFO. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLINFO_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLINFO_CAINFO.html) */ readonly CAINFO: 'CAINFO' /** - * Get the default value for . + * Get the default value for CURLOPT_CAPATH. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLINFO_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLINFO_CAPATH.html) */ readonly CAPATH: 'CAPATH' /** * Certificate chain. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLINFO_CERTINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLINFO_CERTINFO.html) */ readonly CERTINFO: 'CERTINFO' /** * Whether or not a time conditional was met or 304 HTTP response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONDITION_UNMET.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONDITION_UNMET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONDITION_UNMET.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONDITION_UNMET.html) */ readonly CONDITION_UNMET: 'CONDITION_UNMET' /** - * Time from start until remote host or proxy completed. + * The ID of the last connection used by the transfer. (Added in 8.2.0) * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONN_ID.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONN_ID.html) + */ + readonly CONN_ID: 'CONN_ID' + + /** + * The time it took from the start until the connect to the remote host (or proxy) was completed. As a double. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME.html) */ readonly CONNECT_TIME: 'CONNECT_TIME' /** - * Time from start until remote host or proxy completed. + * The time it took from the start until the connect to the remote host (or proxy) was completed. In microseconds. See CURLINFO_CONNECT_TIME_T. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONNECT_TIME_T.html) */ readonly CONNECT_TIME_T: 'CONNECT_TIME_T' /** * (Deprecated) Content length from the Content-Length header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD.html) */ readonly CONTENT_LENGTH_DOWNLOAD: 'CONTENT_LENGTH_DOWNLOAD' /** * Content length from the Content-Length header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.html) */ readonly CONTENT_LENGTH_DOWNLOAD_T: 'CONTENT_LENGTH_DOWNLOAD_T' /** * (Deprecated) Upload size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD.html) */ readonly CONTENT_LENGTH_UPLOAD: 'CONTENT_LENGTH_UPLOAD' /** * Upload size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_LENGTH_UPLOAD_T.html) */ readonly CONTENT_LENGTH_UPLOAD_T: 'CONTENT_LENGTH_UPLOAD_T' /** - * Content type from the Content-Type header. + * Content type from the Content-Type: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_TYPE.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_TYPE.html](https://curl.haxx.se/libcurl/c/CURLINFO_CONTENT_TYPE.html) */ readonly CONTENT_TYPE: 'CONTENT_TYPE' /** * List of all known cookies. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLINFO_COOKIELIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLINFO_COOKIELIST.html) */ readonly COOKIELIST: 'COOKIELIST' + /** + * Amount of TLS early data sent (in number of bytes) when CURLSSLOPT_EARLYDATA is enabled. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_EARLYDATA_SENT_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_EARLYDATA_SENT_T.html) + */ + readonly EARLYDATA_SENT_T: 'EARLYDATA_SENT_T' + /** * Last used HTTP method. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_METHOD.html](https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_METHOD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_METHOD.html](https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_METHOD.html) */ readonly EFFECTIVE_METHOD: 'EFFECTIVE_METHOD' /** * Last used URL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_URL.html](https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_URL.html](https://curl.haxx.se/libcurl/c/CURLINFO_EFFECTIVE_URL.html) */ readonly EFFECTIVE_URL: 'EFFECTIVE_URL' /** * Remote time of the retrieved document. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME.html) */ readonly FILETIME: 'FILETIME' /** * Remote time of the retrieved document. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_FILETIME_T.html) */ readonly FILETIME_T: 'FILETIME_T' /** * The entry path after logging in to an FTP server. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_FTP_ENTRY_PATH.html](https://curl.haxx.se/libcurl/c/CURLINFO_FTP_ENTRY_PATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_FTP_ENTRY_PATH.html](https://curl.haxx.se/libcurl/c/CURLINFO_FTP_ENTRY_PATH.html) */ readonly FTP_ENTRY_PATH: 'FTP_ENTRY_PATH' /** * Number of bytes of all headers received. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_HEADER_SIZE.html](https://curl.haxx.se/libcurl/c/CURLINFO_HEADER_SIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_HEADER_SIZE.html](https://curl.haxx.se/libcurl/c/CURLINFO_HEADER_SIZE.html) */ readonly HEADER_SIZE: 'HEADER_SIZE' /** * Last proxy CONNECT response code. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_CONNECTCODE.html](https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_CONNECTCODE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_CONNECTCODE.html](https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_CONNECTCODE.html) */ readonly HTTP_CONNECTCODE: 'HTTP_CONNECTCODE' /** * The http version used in the connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_VERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLINFO_HTTP_VERSION.html) */ readonly HTTP_VERSION: 'HTTP_VERSION' /** * Available HTTP authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_HTTPAUTH_AVAIL.html](https://curl.haxx.se/libcurl/c/CURLINFO_HTTPAUTH_AVAIL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_HTTPAUTH_AVAIL.html](https://curl.haxx.se/libcurl/c/CURLINFO_HTTPAUTH_AVAIL.html) */ readonly HTTPAUTH_AVAIL: 'HTTPAUTH_AVAIL' + /** + * Used HTTP authentication method. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_HTTPAUTH_USED.html](https://curl.haxx.se/libcurl/c/CURLINFO_HTTPAUTH_USED.html) + */ + readonly HTTPAUTH_USED: 'HTTPAUTH_USED' + /** * (Deprecated) Last socket used. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_LASTSOCKET.html](https://curl.haxx.se/libcurl/c/CURLINFO_LASTSOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_LASTSOCKET.html](https://curl.haxx.se/libcurl/c/CURLINFO_LASTSOCKET.html) */ readonly LASTSOCKET: 'LASTSOCKET' /** - * Local-end IP address of last connection. + * Source IP address of the last connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_IP.html](https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_IP.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_IP.html](https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_IP.html) */ readonly LOCAL_IP: 'LOCAL_IP' /** - * Local-end port of last connection. + * Source port number of the last connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_PORT.html](https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_PORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_PORT.html](https://curl.haxx.se/libcurl/c/CURLINFO_LOCAL_PORT.html) */ readonly LOCAL_PORT: 'LOCAL_PORT' /** - * Time from start until name resolving completed. + * Time from start until name resolving completed as a double. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME.html) */ readonly NAMELOOKUP_TIME: 'NAMELOOKUP_TIME' /** - * Time from start until name resolving completed. + * Time from start until name resolving completed in number of microseconds. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_NAMELOOKUP_TIME_T.html) */ readonly NAMELOOKUP_TIME_T: 'NAMELOOKUP_TIME_T' /** * Number of new successful connections used for previous transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_NUM_CONNECTS.html](https://curl.haxx.se/libcurl/c/CURLINFO_NUM_CONNECTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_NUM_CONNECTS.html](https://curl.haxx.se/libcurl/c/CURLINFO_NUM_CONNECTS.html) */ readonly NUM_CONNECTS: 'NUM_CONNECTS' /** * The errno from the last failure to connect. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_OS_ERRNO.html](https://curl.haxx.se/libcurl/c/CURLINFO_OS_ERRNO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_OS_ERRNO.html](https://curl.haxx.se/libcurl/c/CURLINFO_OS_ERRNO.html) */ readonly OS_ERRNO: 'OS_ERRNO' /** - * Time from start until just before the transfer begins. + * The time it took from the start until the last byte is sent by libcurl. In microseconds. (Added in 8.10.0) + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_POSTTRANSFER_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_POSTTRANSFER_TIME_T.html) + */ + readonly POSTTRANSFER_TIME_T: 'POSTTRANSFER_TIME_T' + + /** + * The time it took from the start until the file transfer is just about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME.html) */ readonly PRETRANSFER_TIME: 'PRETRANSFER_TIME' /** - * Time from start until just before the transfer begins. + * The time it took from the start until the file transfer is just about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved. In microseconds. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRETRANSFER_TIME_T.html) */ readonly PRETRANSFER_TIME_T: 'PRETRANSFER_TIME_T' /** - * IP address of the last connection. + * Destination IP address of the last connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_IP.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_IP.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_IP.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_IP.html) */ readonly PRIMARY_IP: 'PRIMARY_IP' /** - * Port of the last connection. + * Destination port of the last connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_PORT.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_PORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_PORT.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRIMARY_PORT.html) */ readonly PRIMARY_PORT: 'PRIMARY_PORT' /** * User's private data pointer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PRIVATE.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRIVATE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PRIVATE.html](https://curl.haxx.se/libcurl/c/CURLINFO_PRIVATE.html) */ readonly PRIVATE: 'PRIVATE' /** - * (Deprecated) The protocol used for the connection. (Added in 7.52.0) + * (Deprecated) The protocol used for the connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROTOCOL.html) */ readonly PROTOCOL: 'PROTOCOL' /** * Detailed proxy error. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_ERROR.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_ERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_ERROR.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_ERROR.html) */ readonly PROXY_ERROR: 'PROXY_ERROR' /** * Proxy certificate verification result. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_SSL_VERIFYRESULT.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_SSL_VERIFYRESULT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_SSL_VERIFYRESULT.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROXY_SSL_VERIFYRESULT.html) */ readonly PROXY_SSL_VERIFYRESULT: 'PROXY_SSL_VERIFYRESULT' /** * Available HTTP proxy authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_PROXYAUTH_AVAIL.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROXYAUTH_AVAIL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PROXYAUTH_AVAIL.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROXYAUTH_AVAIL.html) */ readonly PROXYAUTH_AVAIL: 'PROXYAUTH_AVAIL' + /** + * Used HTTP proxy authentication methods. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_PROXYAUTH_USED.html](https://curl.haxx.se/libcurl/c/CURLINFO_PROXYAUTH_USED.html) + */ + readonly PROXYAUTH_USED: 'PROXYAUTH_USED' + + /** + * The time during which the transfer was held in a waiting queue before it could start for real in number of microseconds. (Added in 8.6.0) + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_QUEUE_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_QUEUE_TIME_T.html) + */ + readonly QUEUE_TIME_T: 'QUEUE_TIME_T' + /** * Total number of redirects that were followed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_COUNT.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_COUNT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_COUNT.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_COUNT.html) */ readonly REDIRECT_COUNT: 'REDIRECT_COUNT' /** - * Time taken for all redirect steps before the final transfer. + * The time it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started. So, this is zero if no redirection took place. As a double. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME.html) */ readonly REDIRECT_TIME: 'REDIRECT_TIME' /** - * Time taken for all redirect steps before the final transfer. + * The time it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started. So, this is zero if no redirection took place. In number of microseconds. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_TIME_T.html) */ readonly REDIRECT_TIME_T: 'REDIRECT_TIME_T' /** * URL a redirect would take you to, had you enabled redirects. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_URL.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_URL.html](https://curl.haxx.se/libcurl/c/CURLINFO_REDIRECT_URL.html) */ readonly REDIRECT_URL: 'REDIRECT_URL' /** * Referrer header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_REFERER.html](https://curl.haxx.se/libcurl/c/CURLINFO_REFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_REFERER.html](https://curl.haxx.se/libcurl/c/CURLINFO_REFERER.html) */ readonly REFERER: 'REFERER' /** * Number of bytes sent in the issued HTTP requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_REQUEST_SIZE.html](https://curl.haxx.se/libcurl/c/CURLINFO_REQUEST_SIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_REQUEST_SIZE.html](https://curl.haxx.se/libcurl/c/CURLINFO_REQUEST_SIZE.html) */ readonly REQUEST_SIZE: 'REQUEST_SIZE' /** * Last received response code. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_RESPONSE_CODE.html](https://curl.haxx.se/libcurl/c/CURLINFO_RESPONSE_CODE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_RESPONSE_CODE.html](https://curl.haxx.se/libcurl/c/CURLINFO_RESPONSE_CODE.html) */ readonly RESPONSE_CODE: 'RESPONSE_CODE' /** - * The value from the from the Retry-After header. + * The value from the Retry-After header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_RETRY_AFTER.html](https://curl.haxx.se/libcurl/c/CURLINFO_RETRY_AFTER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_RETRY_AFTER.html](https://curl.haxx.se/libcurl/c/CURLINFO_RETRY_AFTER.html) */ readonly RETRY_AFTER: 'RETRY_AFTER' /** - * RTSP CSeq that will next be used. + * The RTSP client CSeq that is expected next. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CLIENT_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CLIENT_CSEQ.html) */ readonly RTSP_CLIENT_CSEQ: 'RTSP_CLIENT_CSEQ' /** * RTSP CSeq last received. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CSEQ_RECV.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CSEQ_RECV.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CSEQ_RECV.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_CSEQ_RECV.html) */ readonly RTSP_CSEQ_RECV: 'RTSP_CSEQ_RECV' /** - * RTSP CSeq that will next be expected. + * The RTSP server CSeq that is expected next. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SERVER_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SERVER_CSEQ.html) */ readonly RTSP_SERVER_CSEQ: 'RTSP_SERVER_CSEQ' /** * RTSP session ID. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SESSION_ID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLINFO_RTSP_SESSION_ID.html) */ readonly RTSP_SESSION_ID: 'RTSP_SESSION_ID' /** - * The scheme used for the connection. (Added in 7.52.0) + * The scheme used for the connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SCHEME.html](https://curl.haxx.se/libcurl/c/CURLINFO_SCHEME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SCHEME.html](https://curl.haxx.se/libcurl/c/CURLINFO_SCHEME.html) */ readonly SCHEME: 'SCHEME' /** * (Deprecated) Number of bytes downloaded. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD.html) */ readonly SIZE_DOWNLOAD: 'SIZE_DOWNLOAD' /** * Number of bytes downloaded. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_DOWNLOAD_T.html) */ readonly SIZE_DOWNLOAD_T: 'SIZE_DOWNLOAD_T' /** * (Deprecated) Number of bytes uploaded. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD.html) */ readonly SIZE_UPLOAD: 'SIZE_UPLOAD' /** * Number of bytes uploaded. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SIZE_UPLOAD_T.html) */ readonly SIZE_UPLOAD_T: 'SIZE_UPLOAD_T' /** * (Deprecated) Average download speed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD.html) */ readonly SPEED_DOWNLOAD: 'SPEED_DOWNLOAD' /** * Average download speed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_DOWNLOAD_T.html) */ readonly SPEED_DOWNLOAD_T: 'SPEED_DOWNLOAD_T' /** * (Deprecated) Average upload speed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD.html) */ readonly SPEED_UPLOAD: 'SPEED_UPLOAD' /** - * Average upload speed. + * Average upload speed in number of bytes per second. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_SPEED_UPLOAD_T.html) */ readonly SPEED_UPLOAD_T: 'SPEED_UPLOAD_T' /** * A list of OpenSSL crypto engines. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SSL_ENGINES.html](https://curl.haxx.se/libcurl/c/CURLINFO_SSL_ENGINES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SSL_ENGINES.html](https://curl.haxx.se/libcurl/c/CURLINFO_SSL_ENGINES.html) */ readonly SSL_ENGINES: 'SSL_ENGINES' /** * Certificate verification result. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_SSL_VERIFYRESULT.html](https://curl.haxx.se/libcurl/c/CURLINFO_SSL_VERIFYRESULT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_SSL_VERIFYRESULT.html](https://curl.haxx.se/libcurl/c/CURLINFO_SSL_VERIFYRESULT.html) */ readonly SSL_VERIFYRESULT: 'SSL_VERIFYRESULT' /** - * Time from start until just when the first byte is received. + * The time it took from the start until the first byte is received by libcurl. As a double. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME.html) */ readonly STARTTRANSFER_TIME: 'STARTTRANSFER_TIME' /** - * Time from start until just when the first byte is received. + * The time it took from the start until the first byte is received by libcurl. In microseconds. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_STARTTRANSFER_TIME_T.html) */ readonly STARTTRANSFER_TIME_T: 'STARTTRANSFER_TIME_T' /** - * TLS session info that can be used for further processing. See . Deprecated option, use instead! + * (Deprecated) TLS session info that can be used for further processing. See CURLINFO_TLS_SESSION. Use CURLINFO_TLS_SSL_PTR instead. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SESSION.html](https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SESSION.html](https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SESSION.html) */ readonly TLS_SESSION: 'TLS_SESSION' /** * TLS session info that can be used for further processing. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SSL_PTR.html](https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SSL_PTR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SSL_PTR.html](https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SSL_PTR.html) */ readonly TLS_SSL_PTR: 'TLS_SSL_PTR' /** * Total time of previous transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME.html](https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME.html) */ readonly TOTAL_TIME: 'TOTAL_TIME' /** * Total time of previous transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME_T.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME_T.html](https://curl.haxx.se/libcurl/c/CURLINFO_TOTAL_TIME_T.html) */ readonly TOTAL_TIME_T: 'TOTAL_TIME_T' + + /** + * Whether the proxy was used (Added in 8.7.0). + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_USED_PROXY.html](https://curl.haxx.se/libcurl/c/CURLINFO_USED_PROXY.html) + */ + readonly USED_PROXY: 'USED_PROXY' + + /** + * The ID of the transfer. (Added in 8.2.0) + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLINFO_XFER_ID.html](https://curl.haxx.se/libcurl/c/CURLINFO_XFER_ID.html) + */ + readonly XFER_ID: 'XFER_ID' } /** @@ -506,6 +562,7 @@ export type CurlInfoName = | 'CAPATH' | 'CERTINFO' | 'CONDITION_UNMET' + | 'CONN_ID' | 'CONNECT_TIME' | 'CONNECT_TIME_T' | 'CONTENT_LENGTH_DOWNLOAD' @@ -514,6 +571,7 @@ export type CurlInfoName = | 'CONTENT_LENGTH_UPLOAD_T' | 'CONTENT_TYPE' | 'COOKIELIST' + | 'EARLYDATA_SENT_T' | 'EFFECTIVE_METHOD' | 'EFFECTIVE_URL' | 'FILETIME' @@ -523,6 +581,7 @@ export type CurlInfoName = | 'HTTP_CONNECTCODE' | 'HTTP_VERSION' | 'HTTPAUTH_AVAIL' + | 'HTTPAUTH_USED' | 'LASTSOCKET' | 'LOCAL_IP' | 'LOCAL_PORT' @@ -530,6 +589,7 @@ export type CurlInfoName = | 'NAMELOOKUP_TIME_T' | 'NUM_CONNECTS' | 'OS_ERRNO' + | 'POSTTRANSFER_TIME_T' | 'PRETRANSFER_TIME' | 'PRETRANSFER_TIME_T' | 'PRIMARY_IP' @@ -539,6 +599,8 @@ export type CurlInfoName = | 'PROXY_ERROR' | 'PROXY_SSL_VERIFYRESULT' | 'PROXYAUTH_AVAIL' + | 'PROXYAUTH_USED' + | 'QUEUE_TIME_T' | 'REDIRECT_COUNT' | 'REDIRECT_TIME' | 'REDIRECT_TIME_T' @@ -568,3 +630,5 @@ export type CurlInfoName = | 'TLS_SSL_PTR' | 'TOTAL_TIME' | 'TOTAL_TIME_T' + | 'USED_PROXY' + | 'XFER_ID' diff --git a/lib/generated/CurlOption.ts b/lib/generated/CurlOption.ts index 8796f7cb7..1641e12a4 100644 --- a/lib/generated/CurlOption.ts +++ b/lib/generated/CurlOption.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -// This file was generated by scripts/build-constants.js on 2022-10-31T13:21:27.724Z +// This file was generated by scripts/build-constants.js on 2025-10-19T23:48:53.573Z // Do not edit manually import { CurlChunk } from '../enum/CurlChunk' @@ -32,7 +32,7 @@ import { CurlSslOpt } from '../enum/CurlSslOpt' import { CurlSslVersion } from '../enum/CurlSslVersion' import { CurlTimeCond } from '../enum/CurlTimeCond' import { CurlUseSsl } from '../enum/CurlUseSsl' -import { EasyNativeBinding } from '../types/EasyNativeBinding' +import { Easy } from '../Easy' import { Share } from '../Share' /** @@ -42,490 +42,511 @@ export interface CurlOption { /** * Path to an abstract Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) */ readonly ABSTRACT_UNIX_SOCKET: 'ABSTRACT_UNIX_SOCKET' /** * Accept-Encoding and automatic decompressing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) */ readonly ACCEPT_ENCODING: 'ACCEPT_ENCODING' /** * Timeout for waiting for the server's connect back to be accepted. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) */ readonly ACCEPTTIMEOUT_MS: 'ACCEPTTIMEOUT_MS' /** * IPv6 scope for local addresses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) */ readonly ADDRESS_SCOPE: 'ADDRESS_SCOPE' /** - * Specify the Alt-Svc: cache file name. + * Specify the Alt-Svc: cache filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) */ readonly ALTSVC: 'ALTSVC' /** * Enable and configure Alt-Svc: treatment. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) */ readonly ALTSVC_CTRL: 'ALTSVC_CTRL' /** * Append to remote file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) */ readonly APPEND: 'APPEND' /** * Automatically set Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) */ readonly AUTOREFERER: 'AUTOREFERER' /** - * AWS HTTP V4 Signature. + * AWS HTTP V4 Signature. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) */ readonly AWS_SIGV4: 'AWS_SIGV4' /** * Ask for alternate buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) */ readonly BUFFERSIZE: 'BUFFERSIZE' + /** + * Timeout for CA cache. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html) + */ + readonly CA_CACHE_TIMEOUT: 'CA_CACHE_TIMEOUT' + /** * CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) */ readonly CAINFO: 'CAINFO' /** * CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) */ readonly CAINFO_BLOB: 'CAINFO_BLOB' /** * Path to CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) */ readonly CAPATH: 'CAPATH' /** * Extract certificate info. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) */ readonly CERTINFO: 'CERTINFO' /** * Callback for wildcard download start of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) */ readonly CHUNK_BGN_FUNCTION: 'CHUNK_BGN_FUNCTION' /** * Callback for wildcard download end of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) */ readonly CHUNK_END_FUNCTION: 'CHUNK_END_FUNCTION' /** * Only connect, nothing else. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) */ readonly CONNECT_ONLY: 'CONNECT_ONLY' /** * Connect to a specific host and port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) */ readonly CONNECT_TO: 'CONNECT_TO' /** * Timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) */ readonly CONNECTTIMEOUT: 'CONNECTTIMEOUT' /** * Millisecond timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) */ readonly CONNECTTIMEOUT_MS: 'CONNECTTIMEOUT_MS' /** * Cookie(s) to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) */ readonly COOKIE: 'COOKIE' /** * File to read cookies from. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) */ readonly COOKIEFILE: 'COOKIEFILE' /** * File to write cookies to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) */ readonly COOKIEJAR: 'COOKIEJAR' /** * Add or control cookies. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) */ readonly COOKIELIST: 'COOKIELIST' /** * Start a new cookie session. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) */ readonly COOKIESESSION: 'COOKIESESSION' /** * Convert newlines. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) */ readonly CRLF: 'CRLF' /** * Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) */ readonly CRLFILE: 'CRLFILE' /** * Custom request/method. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) */ readonly CUSTOMREQUEST: 'CUSTOMREQUEST' /** * Callback for debug information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) */ readonly DEBUGFUNCTION: 'DEBUGFUNCTION' /** * Default protocol. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) */ readonly DEFAULT_PROTOCOL: 'DEFAULT_PROTOCOL' /** * List only. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) */ readonly DIRLISTONLY: 'DIRLISTONLY' /** * Do not allow username in URL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) */ readonly DISALLOW_USERNAME_IN_URL: 'DISALLOW_USERNAME_IN_URL' /** * Timeout for DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) */ readonly DNS_CACHE_TIMEOUT: 'DNS_CACHE_TIMEOUT' /** * Bind name resolves to this interface. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) */ readonly DNS_INTERFACE: 'DNS_INTERFACE' /** - * Bind name resolves to this IP4 address. + * Bind name resolves to this IP4 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) */ readonly DNS_LOCAL_IP4: 'DNS_LOCAL_IP4' /** - * Bind name resolves to this IP6 address. + * Bind name resolves to this IP6 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) */ readonly DNS_LOCAL_IP6: 'DNS_LOCAL_IP6' /** * Preferred DNS servers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) */ readonly DNS_SERVERS: 'DNS_SERVERS' /** * Shuffle addresses before use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) */ readonly DNS_SHUFFLE_ADDRESSES: 'DNS_SHUFFLE_ADDRESSES' /** * OBSOLETE Enable global DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) */ readonly DNS_USE_GLOBAL_CACHE: 'DNS_USE_GLOBAL_CACHE' /** - * Verify the host name in the DoH (DNS-over-HTTPS) SSL certificate. + * Verify the hostname in the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) */ readonly DOH_SSL_VERIFYHOST: 'DOH_SSL_VERIFYHOST' /** * Verify the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) */ readonly DOH_SSL_VERIFYPEER: 'DOH_SSL_VERIFYPEER' /** * Verify the DoH (DNS-over-HTTPS) SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) */ readonly DOH_SSL_VERIFYSTATUS: 'DOH_SSL_VERIFYSTATUS' /** * Use this DoH server for name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) */ readonly DOH_URL: 'DOH_URL' + /** + * Set the configuration for ECH. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html](https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html) + */ + readonly ECH: 'ECH' + /** * OBSOLETE Identify EGD socket for entropy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) */ readonly EGDSOCKET: 'EGDSOCKET' /** - * 100-continue timeout. + * 100-continue timeout. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) */ readonly EXPECT_100_TIMEOUT_MS: 'EXPECT_100_TIMEOUT_MS' /** * Fail on HTTP 4xx errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) */ readonly FAILONERROR: 'FAILONERROR' /** * Request file modification date and time. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) */ readonly FILETIME: 'FILETIME' /** * Callback for wildcard matching. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) */ readonly FNMATCH_FUNCTION: 'FNMATCH_FUNCTION' /** * Follow HTTP redirects. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) */ readonly FOLLOWLOCATION: 'FOLLOWLOCATION' /** - * Prevent subsequent connections from re-using this. + * Prevent subsequent connections from reusing this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) */ readonly FORBID_REUSE: 'FORBID_REUSE' /** * Use a new connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) */ readonly FRESH_CONNECT: 'FRESH_CONNECT' /** * Send ACCT command. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) */ readonly FTP_ACCOUNT: 'FTP_ACCOUNT' /** * Alternative to USER. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) */ readonly FTP_ALTERNATIVE_TO_USER: 'FTP_ALTERNATIVE_TO_USER' /** * Create missing directories on the remote server. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) */ readonly FTP_CREATE_MISSING_DIRS: 'FTP_CREATE_MISSING_DIRS' /** * Specify how to reach files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) */ readonly FTP_FILEMETHOD: 'FTP_FILEMETHOD' /** * Ignore the IP address in the PASV response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) */ readonly FTP_SKIP_PASV_IP: 'FTP_SKIP_PASV_IP' /** * Back to non-TLS again after authentication. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) */ readonly FTP_SSL_CCC: 'FTP_SSL_CCC' /** * Use EPRT. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) */ readonly FTP_USE_EPRT: 'FTP_USE_EPRT' /** * Use EPSV. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) */ readonly FTP_USE_EPSV: 'FTP_USE_EPSV' /** * Use PRET. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) */ readonly FTP_USE_PRET: 'FTP_USE_PRET' /** * Use active FTP. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) */ readonly FTPPORT: 'FTPPORT' /** * Control how to do TLS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) */ readonly FTPSSLAUTH: 'FTPSSLAUTH' /** * Disable GSS-API delegation. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) */ readonly GSSAPI_DELEGATION: 'GSSAPI_DELEGATION' /** * Timeout for happy eyeballs. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) */ readonly HAPPY_EYEBALLS_TIMEOUT_MS: 'HAPPY_EYEBALLS_TIMEOUT_MS' + /** + * Spoof the client IP in an HAProxy PROXY protocol v1 header. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html) + */ + readonly HAPROXY_CLIENT_IP: 'HAPROXY_CLIENT_IP' + /** * Send an HAProxy PROXY protocol v1 header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) */ readonly HAPROXYPROTOCOL: 'HAPROXYPROTOCOL' /** * Include the header in the body output. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) */ readonly HEADER: 'HEADER' /** * Callback for writing received headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) */ readonly HEADERFUNCTION: 'HEADERFUNCTION' /** * Control custom headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) */ readonly HEADEROPT: 'HEADEROPT' /** * Set HSTS cache file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) */ readonly HSTS: 'HSTS' /** * Enable HSTS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) */ readonly HSTS_CTRL: 'HSTS_CTRL' @@ -536,1309 +557,1337 @@ export interface CurlOption { * If returning an array, the callback will only be called once per request. * If returning a single object, the callback will be called multiple times until `null` is returned. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) */ readonly HSTSREADFUNCTION: 'HSTSREADFUNCTION' /** * Set HSTS write callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) */ readonly HSTSWRITEFUNCTION: 'HSTSWRITEFUNCTION' /** * Disable Content decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) */ readonly HTTP_CONTENT_DECODING: 'HTTP_CONTENT_DECODING' /** * Disable Transfer decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) */ readonly HTTP_TRANSFER_DECODING: 'HTTP_TRANSFER_DECODING' /** * HTTP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) */ readonly HTTP_VERSION: 'HTTP_VERSION' /** * Allow HTTP/0.9 responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) */ readonly HTTP09_ALLOWED: 'HTTP09_ALLOWED' /** - * Alternative versions of 200 OK. + * Alternative versions of 200 OK. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) */ readonly HTTP200ALIASES: 'HTTP200ALIASES' /** * HTTP server authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) */ readonly HTTPAUTH: 'HTTPAUTH' /** * Do an HTTP GET request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) */ readonly HTTPGET: 'HTTPGET' /** * Custom HTTP headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) */ readonly HTTPHEADER: 'HTTPHEADER' /** * Deprecated option Multipart formpost HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) */ readonly HTTPPOST: 'HTTPPOST' /** * Tunnel through the HTTP proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) */ readonly HTTPPROXYTUNNEL: 'HTTPPROXYTUNNEL' /** * Ignore Content-Length. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) */ readonly IGNORE_CONTENT_LENGTH: 'IGNORE_CONTENT_LENGTH' /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) */ readonly INFILESIZE: 'INFILESIZE' /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) */ readonly INFILESIZE_LARGE: 'INFILESIZE_LARGE' /** * Bind connection locally to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) */ readonly INTERFACE: 'INTERFACE' /** * IP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) */ readonly IPRESOLVE: 'IPRESOLVE' /** * Issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) */ readonly ISSUERCERT: 'ISSUERCERT' /** * Issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) */ readonly ISSUERCERT_BLOB: 'ISSUERCERT_BLOB' /** * Keep sending on HTTP \>= 300 errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) */ readonly KEEP_SENDING_ON_ERROR: 'KEEP_SENDING_ON_ERROR' /** * Client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) */ readonly KEYPASSWD: 'KEYPASSWD' /** - * Kerberos security level. + * OBSOLETE. Kerberos security level. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) */ readonly KRBLEVEL: 'KRBLEVEL' /** * Bind connection locally to this port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) */ readonly LOCALPORT: 'LOCALPORT' /** * Bind connection locally to port range. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) */ readonly LOCALPORTRANGE: 'LOCALPORTRANGE' /** * Login options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) */ readonly LOGIN_OPTIONS: 'LOGIN_OPTIONS' /** * Low speed limit to abort transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) */ readonly LOW_SPEED_LIMIT: 'LOW_SPEED_LIMIT' /** * Time to be below the speed to trigger low speed abort. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) */ readonly LOW_SPEED_TIME: 'LOW_SPEED_TIME' /** * Authentication address. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) */ readonly MAIL_AUTH: 'MAIL_AUTH' /** * Address of the sender. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) */ readonly MAIL_FROM: 'MAIL_FROM' /** * Address of the recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) */ readonly MAIL_RCPT: 'MAIL_RCPT' /** * Allow RCPT TO command to fail for some recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html) */ - readonly MAIL_RCPT_ALLLOWFAILS: 'MAIL_RCPT_ALLLOWFAILS' + readonly MAIL_RCPT_ALLOWFAILS: 'MAIL_RCPT_ALLOWFAILS' /** * Cap the download speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) */ readonly MAX_RECV_SPEED_LARGE: 'MAX_RECV_SPEED_LARGE' /** * Cap the upload speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) */ readonly MAX_SEND_SPEED_LARGE: 'MAX_SEND_SPEED_LARGE' /** * Limit the age (idle time) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) */ readonly MAXAGE_CONN: 'MAXAGE_CONN' /** * Maximum number of connections in the connection pool. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) */ readonly MAXCONNECTS: 'MAXCONNECTS' /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) */ readonly MAXFILESIZE: 'MAXFILESIZE' /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) */ readonly MAXFILESIZE_LARGE: 'MAXFILESIZE_LARGE' /** * Limit the age (since creation) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) */ readonly MAXLIFETIME_CONN: 'MAXLIFETIME_CONN' /** * Maximum number of redirects to follow. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) */ readonly MAXREDIRS: 'MAXREDIRS' /** * Enable .netrc parsing. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) */ readonly NETRC: 'NETRC' /** - * .netrc file name. + * .netrc filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) */ readonly NETRC_FILE: 'NETRC_FILE' /** * Mode for creating new remote directories. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) */ readonly NEW_DIRECTORY_PERMS: 'NEW_DIRECTORY_PERMS' /** * Mode for creating new remote files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) */ readonly NEW_FILE_PERMS: 'NEW_FILE_PERMS' /** * Do not get the body contents. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) */ readonly NOBODY: 'NOBODY' /** * Shut off the progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) */ readonly NOPROGRESS: 'NOPROGRESS' /** * Filter out hosts from proxy use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) */ readonly NOPROXY: 'NOPROXY' /** * Do not install signal handlers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) */ readonly NOSIGNAL: 'NOSIGNAL' /** * Password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) */ readonly PASSWORD: 'PASSWORD' /** * Disable squashing /../ and /./ sequences in the path. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) */ readonly PATH_AS_IS: 'PATH_AS_IS' /** * Set pinned SSL public key . * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) */ readonly PINNEDPUBLICKEY: 'PINNEDPUBLICKEY' /** * Wait on connection to pipeline on it. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) */ readonly PIPEWAIT: 'PIPEWAIT' /** * Port number to connect to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) */ readonly PORT: 'PORT' /** - * Issue an HTTP POST request. + * Make an HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) */ readonly POST: 'POST' - /** - * Send a POST with this data. - * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html) - */ - readonly POSTFIELDS: 'POSTFIELDS' - /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) */ readonly POSTFIELDSIZE: 'POSTFIELDSIZE' /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) */ readonly POSTFIELDSIZE_LARGE: 'POSTFIELDSIZE_LARGE' /** * Commands to run after transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) */ readonly POSTQUOTE: 'POSTQUOTE' /** * How to act on redirects after POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) */ readonly POSTREDIR: 'POSTREDIR' /** * Socks proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) */ readonly PRE_PROXY: 'PRE_PROXY' /** * Commands to run just before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) */ readonly PREQUOTE: 'PREQUOTE' /** * Callback to be called after a connection is established but before a request is made on that connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) */ readonly PREREQFUNCTION: 'PREREQFUNCTION' /** * OBSOLETE callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) */ readonly PROGRESSFUNCTION: 'PROGRESSFUNCTION' /** * Deprecated option Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) */ readonly PROTOCOLS: 'PROTOCOLS' /** * Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) */ readonly PROTOCOLS_STR: 'PROTOCOLS_STR' /** * Proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) */ readonly PROXY: 'PROXY' /** * Proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) */ readonly PROXY_CAINFO: 'PROXY_CAINFO' /** * Proxy CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) */ readonly PROXY_CAINFO_BLOB: 'PROXY_CAINFO_BLOB' /** * Path to proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) */ readonly PROXY_CAPATH: 'PROXY_CAPATH' /** * Proxy Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) */ readonly PROXY_CRLFILE: 'PROXY_CRLFILE' /** * Proxy issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) */ readonly PROXY_ISSUERCERT: 'PROXY_ISSUERCERT' /** * Proxy issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) */ readonly PROXY_ISSUERCERT_BLOB: 'PROXY_ISSUERCERT_BLOB' /** * Proxy client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) */ readonly PROXY_KEYPASSWD: 'PROXY_KEYPASSWD' /** * Set the proxy's pinned SSL public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) */ readonly PROXY_PINNEDPUBLICKEY: 'PROXY_PINNEDPUBLICKEY' /** * Proxy authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) */ readonly PROXY_SERVICE_NAME: 'PROXY_SERVICE_NAME' /** * Proxy ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) */ readonly PROXY_SSL_CIPHER_LIST: 'PROXY_SSL_CIPHER_LIST' /** * Control proxy SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) */ readonly PROXY_SSL_OPTIONS: 'PROXY_SSL_OPTIONS' /** - * Verify the host name in the proxy SSL certificate. + * Verify the hostname in the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) */ readonly PROXY_SSL_VERIFYHOST: 'PROXY_SSL_VERIFYHOST' /** * Verify the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) */ readonly PROXY_SSL_VERIFYPEER: 'PROXY_SSL_VERIFYPEER' /** * Proxy client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) */ readonly PROXY_SSLCERT: 'PROXY_SSLCERT' /** * Proxy client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) */ readonly PROXY_SSLCERT_BLOB: 'PROXY_SSLCERT_BLOB' /** * Proxy client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) */ readonly PROXY_SSLCERTTYPE: 'PROXY_SSLCERTTYPE' /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) */ readonly PROXY_SSLKEY: 'PROXY_SSLKEY' /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) */ readonly PROXY_SSLKEY_BLOB: 'PROXY_SSLKEY_BLOB' /** * Proxy client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) */ readonly PROXY_SSLKEYTYPE: 'PROXY_SSLKEYTYPE' /** * Proxy SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) */ readonly PROXY_SSLVERSION: 'PROXY_SSLVERSION' /** - * Proxy TLS 1.3 cipher suites to use. + * Proxy TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) */ readonly PROXY_TLS13_CIPHERS: 'PROXY_TLS13_CIPHERS' /** * Proxy TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) */ readonly PROXY_TLSAUTH_PASSWORD: 'PROXY_TLSAUTH_PASSWORD' /** * Proxy TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) */ readonly PROXY_TLSAUTH_TYPE: 'PROXY_TLSAUTH_TYPE' /** - * Proxy TLS authentication user name. + * Proxy TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) */ readonly PROXY_TLSAUTH_USERNAME: 'PROXY_TLSAUTH_USERNAME' /** * Add transfer mode to URL over proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) */ readonly PROXY_TRANSFER_MODE: 'PROXY_TRANSFER_MODE' /** * HTTP proxy authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) */ readonly PROXYAUTH: 'PROXYAUTH' /** * Custom HTTP headers sent to proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) */ readonly PROXYHEADER: 'PROXYHEADER' /** * Proxy password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) */ readonly PROXYPASSWORD: 'PROXYPASSWORD' /** * Proxy port to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) */ readonly PROXYPORT: 'PROXYPORT' /** * Proxy type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) */ readonly PROXYTYPE: 'PROXYTYPE' /** - * Proxy user name. + * Proxy username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) */ readonly PROXYUSERNAME: 'PROXYUSERNAME' /** - * Proxy user name and password. + * Proxy username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) */ readonly PROXYUSERPWD: 'PROXYUSERPWD' /** * Deprecated option Issue an HTTP PUT request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) */ readonly PUT: 'PUT' + /** + * To be set by toplevel tools like "curl" to skip lengthy cleanups when they are about to call exit() anyway. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html) + */ + readonly QUICK_EXIT: 'QUICK_EXIT' + /** * Commands to run before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) */ readonly QUOTE: 'QUOTE' /** * OBSOLETE Provide source for entropy random data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) */ readonly RANDOM_FILE: 'RANDOM_FILE' /** * Range requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) */ readonly RANGE: 'RANGE' /** * Data pointer to pass to the read callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) */ readonly READDATA: 'READDATA' /** * Callback for reading data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) */ readonly READFUNCTION: 'READFUNCTION' /** * Deprecated option Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) */ readonly REDIR_PROTOCOLS: 'REDIR_PROTOCOLS' /** * Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) */ readonly REDIR_PROTOCOLS_STR: 'REDIR_PROTOCOLS_STR' /** * Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) */ readonly REFERER: 'REFERER' /** * Set the request target. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) */ readonly REQUEST_TARGET: 'REQUEST_TARGET' /** * Provide fixed/fake name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) */ readonly RESOLVE: 'RESOLVE' /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) */ readonly RESUME_FROM: 'RESUME_FROM' /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) */ readonly RESUME_FROM_LARGE: 'RESUME_FROM_LARGE' /** * Client CSEQ number. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) */ readonly RTSP_CLIENT_CSEQ: 'RTSP_CLIENT_CSEQ' /** * RTSP request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) */ readonly RTSP_REQUEST: 'RTSP_REQUEST' /** * CSEQ number for RTSP Server-\>Client request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) */ readonly RTSP_SERVER_CSEQ: 'RTSP_SERVER_CSEQ' /** * RTSP session-id. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) */ readonly RTSP_SESSION_ID: 'RTSP_SESSION_ID' /** * RTSP stream URI. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) */ readonly RTSP_STREAM_URI: 'RTSP_STREAM_URI' /** * RTSP Transport: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) */ readonly RTSP_TRANSPORT: 'RTSP_TRANSPORT' /** * SASL authorization identity (identity to act as). * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) */ readonly SASL_AUTHZID: 'SASL_AUTHZID' /** * Enable SASL initial response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) */ readonly SASL_IR: 'SASL_IR' /** * Callback for seek operations. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) */ readonly SEEKFUNCTION: 'SEEKFUNCTION' /** * Timeout for server responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) */ readonly SERVER_RESPONSE_TIMEOUT: 'SERVER_RESPONSE_TIMEOUT' + /** + * Timeout for server responses. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html) + */ + readonly SERVER_RESPONSE_TIMEOUT_MS: 'SERVER_RESPONSE_TIMEOUT_MS' + /** * Authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) */ readonly SERVICE_NAME: 'SERVICE_NAME' /** * Share object to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) */ readonly SHARE: 'SHARE' /** - * Socks5 authentication methods. + * Socks5 authentication methods. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) */ readonly SOCKS5_AUTH: 'SOCKS5_AUTH' /** - * Socks5 GSSAPI NEC mode. + * Socks5 GSSAPI NEC mode. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) */ readonly SOCKS5_GSSAPI_NEC: 'SOCKS5_GSSAPI_NEC' /** - * Deprecated option Socks5 GSSAPI service name. + * Deprecated option Socks5 GSSAPI service name. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) */ readonly SOCKS5_GSSAPI_SERVICE: 'SOCKS5_GSSAPI_SERVICE' /** * SSH authentication types. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) */ readonly SSH_AUTH_TYPES: 'SSH_AUTH_TYPES' /** * Enable SSH compression. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) */ readonly SSH_COMPRESSION: 'SSH_COMPRESSION' /** - * MD5 of host's public key. + * MD5 of host's public key. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) */ readonly SSH_HOST_PUBLIC_KEY_MD5: 'SSH_HOST_PUBLIC_KEY_MD5' /** * Custom pointer to pass to ssh host key callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) */ readonly SSH_HOSTKEYDATA: 'SSH_HOSTKEYDATA' /** - * File name with known hosts. + * Filename with known hosts. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) */ readonly SSH_KNOWNHOSTS: 'SSH_KNOWNHOSTS' /** - * File name of private key. + * Filename of the private key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) */ readonly SSH_PRIVATE_KEYFILE: 'SSH_PRIVATE_KEYFILE' /** - * File name of public key. + * Filename of the public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) */ readonly SSH_PUBLIC_KEYFILE: 'SSH_PUBLIC_KEYFILE' /** * Ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) */ readonly SSL_CIPHER_LIST: 'SSL_CIPHER_LIST' /** * Set key exchange curves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) */ readonly SSL_EC_CURVES: 'SSL_EC_CURVES' /** * Enable use of ALPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) */ readonly SSL_ENABLE_ALPN: 'SSL_ENABLE_ALPN' /** * OBSOLETE Enable use of NPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) */ readonly SSL_ENABLE_NPN: 'SSL_ENABLE_NPN' /** - * Enable TLS False Start. + * Deprecated option Enable TLS False Start. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) */ readonly SSL_FALSESTART: 'SSL_FALSESTART' /** * Control SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) */ readonly SSL_OPTIONS: 'SSL_OPTIONS' /** * Disable SSL session-id cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) */ readonly SSL_SESSIONID_CACHE: 'SSL_SESSIONID_CACHE' /** - * Verify the host name in the SSL certificate. + * TLS signature algorithms to use. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html) + */ + readonly SSL_SIGNATURE_ALGORITHMS: 'SSL_SIGNATURE_ALGORITHMS' + + /** + * Verify the hostname in the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) */ readonly SSL_VERIFYHOST: 'SSL_VERIFYHOST' /** * Verify the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) */ readonly SSL_VERIFYPEER: 'SSL_VERIFYPEER' /** * Verify the SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) */ readonly SSL_VERIFYSTATUS: 'SSL_VERIFYSTATUS' /** * Client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) */ readonly SSLCERT: 'SSLCERT' /** * Client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) */ readonly SSLCERT_BLOB: 'SSLCERT_BLOB' /** * Client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) */ readonly SSLCERTTYPE: 'SSLCERTTYPE' /** * Use identifier with SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) */ readonly SSLENGINE: 'SSLENGINE' /** * Default SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) */ readonly SSLENGINE_DEFAULT: 'SSLENGINE_DEFAULT' /** * Client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) */ readonly SSLKEY: 'SSLKEY' /** * Client key memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) */ readonly SSLKEY_BLOB: 'SSLKEY_BLOB' /** * Client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) */ readonly SSLKEYTYPE: 'SSLKEYTYPE' /** * SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) */ readonly SSLVERSION: 'SSLVERSION' /** * Suppress proxy CONNECT response headers from user callbacks. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) */ readonly SUPPRESS_CONNECT_HEADERS: 'SUPPRESS_CONNECT_HEADERS' /** * Enable TCP Fast Open. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) */ readonly TCP_FASTOPEN: 'TCP_FASTOPEN' /** * Enable TCP keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) */ readonly TCP_KEEPALIVE: 'TCP_KEEPALIVE' + /** + * Maximum number of keep-alive probes. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html) + */ + readonly TCP_KEEPCNT: 'TCP_KEEPCNT' + /** * Idle time before sending keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) */ readonly TCP_KEEPIDLE: 'TCP_KEEPIDLE' /** * Interval between keep-alive probes. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) */ readonly TCP_KEEPINTVL: 'TCP_KEEPINTVL' /** * Disable the Nagle algorithm. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) */ readonly TCP_NODELAY: 'TCP_NODELAY' /** * TELNET options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) */ readonly TELNETOPTIONS: 'TELNETOPTIONS' /** * TFTP block size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) */ readonly TFTP_BLKSIZE: 'TFTP_BLKSIZE' /** * Do not send TFTP options requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) */ readonly TFTP_NO_OPTIONS: 'TFTP_NO_OPTIONS' /** * Make a time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) */ readonly TIMECONDITION: 'TIMECONDITION' /** * Timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) */ readonly TIMEOUT: 'TIMEOUT' /** * Millisecond timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) */ readonly TIMEOUT_MS: 'TIMEOUT_MS' /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) */ readonly TIMEVALUE: 'TIMEVALUE' /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) */ readonly TIMEVALUE_LARGE: 'TIMEVALUE_LARGE' /** - * TLS 1.3 cipher suites to use. + * TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) */ readonly TLS13_CIPHERS: 'TLS13_CIPHERS' /** * TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) */ readonly TLSAUTH_PASSWORD: 'TLSAUTH_PASSWORD' /** * TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) */ readonly TLSAUTH_TYPE: 'TLSAUTH_TYPE' /** - * TLS authentication user name. + * TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) */ readonly TLSAUTH_USERNAME: 'TLSAUTH_USERNAME' /** * Set callback for sending trailing headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) */ readonly TRAILERFUNCTION: 'TRAILERFUNCTION' /** * Request Transfer-Encoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) */ readonly TRANSFER_ENCODING: 'TRANSFER_ENCODING' /** * Use text transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) */ readonly TRANSFERTEXT: 'TRANSFERTEXT' /** * Path to a Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) */ readonly UNIX_SOCKET_PATH: 'UNIX_SOCKET_PATH' /** * Do not restrict authentication to original host. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) */ readonly UNRESTRICTED_AUTH: 'UNRESTRICTED_AUTH' /** * Sets the interval at which connection upkeep are performed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) */ readonly UPKEEP_INTERVAL_MS: 'UPKEEP_INTERVAL_MS' /** * Upload data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) */ readonly UPLOAD: 'UPLOAD' /** * Set upload buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) */ readonly UPLOAD_BUFFERSIZE: 'UPLOAD_BUFFERSIZE' + /** + * Set upload flags. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html) + */ + readonly UPLOAD_FLAGS: 'UPLOAD_FLAGS' + /** * URL to work on. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) */ readonly URL: 'URL' /** * Use TLS/SSL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) */ readonly USE_SSL: 'USE_SSL' /** * User-Agent: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) */ readonly USERAGENT: 'USERAGENT' /** - * User name. + * Username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) */ readonly USERNAME: 'USERNAME' /** - * User name and password. + * Username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) */ readonly USERPWD: 'USERPWD' /** * Display verbose information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) */ readonly VERBOSE: 'VERBOSE' /** - * Transfer multiple files according to a file name pattern. + * Transfer multiple files according to a filename pattern. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) */ readonly WILDCARDMATCH: 'WILDCARDMATCH' /** * Callback for writing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) */ readonly WRITEFUNCTION: 'WRITEFUNCTION' /** * Callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) */ readonly XFERINFOFUNCTION: 'XFERINFOFUNCTION' /** - * OAuth2 bearer token. + * OAuth2 bearer token. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) */ readonly XOAUTH2_BEARER: 'XOAUTH2_BEARER' } @@ -1847,490 +1896,511 @@ export const CurlOptionCamelCaseMap = { /** * Path to an abstract Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) */ abstractUnixSocket: 'ABSTRACT_UNIX_SOCKET', /** * Accept-Encoding and automatic decompressing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) */ acceptEncoding: 'ACCEPT_ENCODING', /** * Timeout for waiting for the server's connect back to be accepted. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) */ acceptTimeoutMs: 'ACCEPTTIMEOUT_MS', /** * IPv6 scope for local addresses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) */ addressScope: 'ADDRESS_SCOPE', /** - * Specify the Alt-Svc: cache file name. + * Specify the Alt-Svc: cache filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) */ altSvc: 'ALTSVC', /** * Enable and configure Alt-Svc: treatment. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) */ altSvcCtrl: 'ALTSVC_CTRL', /** * Append to remote file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) */ append: 'APPEND', /** * Automatically set Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) */ autoReferer: 'AUTOREFERER', /** - * AWS HTTP V4 Signature. + * AWS HTTP V4 Signature. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) */ awsSigV4: 'AWS_SIGV4', /** * Ask for alternate buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) */ bufferSize: 'BUFFERSIZE', + /** + * Timeout for CA cache. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html) + */ + caCacheTimeout: 'CA_CACHE_TIMEOUT', + /** * CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) */ caInfo: 'CAINFO', /** * CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) */ caInfoBlob: 'CAINFO_BLOB', /** * Path to CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) */ caPath: 'CAPATH', /** * Extract certificate info. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) */ certInfo: 'CERTINFO', /** * Callback for wildcard download start of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) */ chunkBgnFunction: 'CHUNK_BGN_FUNCTION', /** * Callback for wildcard download end of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) */ chunkEndFunction: 'CHUNK_END_FUNCTION', /** * Only connect, nothing else. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) */ connectOnly: 'CONNECT_ONLY', /** * Connect to a specific host and port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) */ connectTo: 'CONNECT_TO', /** * Timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) */ connectTimeout: 'CONNECTTIMEOUT', /** * Millisecond timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) */ connectTimeoutMs: 'CONNECTTIMEOUT_MS', /** * Cookie(s) to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) */ cookie: 'COOKIE', /** * File to read cookies from. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) */ cookieFile: 'COOKIEFILE', /** * File to write cookies to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) */ cookieJar: 'COOKIEJAR', /** * Add or control cookies. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) */ cookieList: 'COOKIELIST', /** * Start a new cookie session. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) */ cookieSession: 'COOKIESESSION', /** * Convert newlines. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) */ crlf: 'CRLF', /** * Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) */ crlFile: 'CRLFILE', /** * Custom request/method. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) */ customRequest: 'CUSTOMREQUEST', /** * Callback for debug information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) */ debugFunction: 'DEBUGFUNCTION', /** * Default protocol. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) */ defaultProtocol: 'DEFAULT_PROTOCOL', /** * List only. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) */ dirListOnly: 'DIRLISTONLY', /** * Do not allow username in URL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) */ disallowUsernameInUrl: 'DISALLOW_USERNAME_IN_URL', /** * Timeout for DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) */ dnsCacheTimeout: 'DNS_CACHE_TIMEOUT', /** * Bind name resolves to this interface. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) */ dnsInterface: 'DNS_INTERFACE', /** - * Bind name resolves to this IP4 address. + * Bind name resolves to this IP4 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) */ dnsLocalIp4: 'DNS_LOCAL_IP4', /** - * Bind name resolves to this IP6 address. + * Bind name resolves to this IP6 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) */ dnsLocalIp6: 'DNS_LOCAL_IP6', /** * Preferred DNS servers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) */ dnsServers: 'DNS_SERVERS', /** * Shuffle addresses before use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) */ dnsShuffleAddresses: 'DNS_SHUFFLE_ADDRESSES', /** * OBSOLETE Enable global DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) */ dnsUseGlobalCache: 'DNS_USE_GLOBAL_CACHE', /** - * Verify the host name in the DoH (DNS-over-HTTPS) SSL certificate. + * Verify the hostname in the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) */ dohSslVerifyHost: 'DOH_SSL_VERIFYHOST', /** * Verify the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) */ dohSslVerifyPeer: 'DOH_SSL_VERIFYPEER', /** * Verify the DoH (DNS-over-HTTPS) SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) */ dohSslVerifyStatus: 'DOH_SSL_VERIFYSTATUS', /** * Use this DoH server for name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) */ dohUrl: 'DOH_URL', + /** + * Set the configuration for ECH. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html](https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html) + */ + ech: 'ECH', + /** * OBSOLETE Identify EGD socket for entropy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) */ egdSocket: 'EGDSOCKET', /** - * 100-continue timeout. + * 100-continue timeout. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) */ expect100TimeoutMs: 'EXPECT_100_TIMEOUT_MS', /** * Fail on HTTP 4xx errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) */ failOnError: 'FAILONERROR', /** * Request file modification date and time. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) */ fileTime: 'FILETIME', /** * Callback for wildcard matching. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) */ fnMatchFunction: 'FNMATCH_FUNCTION', /** * Follow HTTP redirects. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) */ followLocation: 'FOLLOWLOCATION', /** - * Prevent subsequent connections from re-using this. + * Prevent subsequent connections from reusing this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) */ forbIdReuse: 'FORBID_REUSE', /** * Use a new connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) */ freshConnect: 'FRESH_CONNECT', /** * Send ACCT command. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) */ ftpAccount: 'FTP_ACCOUNT', /** * Alternative to USER. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) */ ftpAlternativeToUser: 'FTP_ALTERNATIVE_TO_USER', /** * Create missing directories on the remote server. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) */ ftpCreateMissingDirs: 'FTP_CREATE_MISSING_DIRS', /** * Specify how to reach files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) */ ftpFileMethod: 'FTP_FILEMETHOD', /** * Ignore the IP address in the PASV response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) */ ftpSkipPasvIp: 'FTP_SKIP_PASV_IP', /** * Back to non-TLS again after authentication. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) */ ftpSslCcc: 'FTP_SSL_CCC', /** * Use EPRT. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) */ ftpUseEprt: 'FTP_USE_EPRT', /** * Use EPSV. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) */ ftpUseEpsv: 'FTP_USE_EPSV', /** * Use PRET. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) */ ftpUsePret: 'FTP_USE_PRET', /** * Use active FTP. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) */ ftpPort: 'FTPPORT', /** * Control how to do TLS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) */ ftpSslAuth: 'FTPSSLAUTH', /** * Disable GSS-API delegation. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) */ gssapiDelegation: 'GSSAPI_DELEGATION', /** * Timeout for happy eyeballs. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) */ happyEyeballsTimeoutMs: 'HAPPY_EYEBALLS_TIMEOUT_MS', + /** + * Spoof the client IP in an HAProxy PROXY protocol v1 header. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html) + */ + haProxyClientIp: 'HAPROXY_CLIENT_IP', + /** * Send an HAProxy PROXY protocol v1 header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) */ haProxyProtocol: 'HAPROXYPROTOCOL', /** * Include the header in the body output. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) */ header: 'HEADER', /** * Callback for writing received headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) */ headerFunction: 'HEADERFUNCTION', /** * Control custom headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) */ headerOpt: 'HEADEROPT', /** * Set HSTS cache file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) */ hsts: 'HSTS', /** * Enable HSTS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) */ hstsCtrl: 'HSTS_CTRL', @@ -2341,1309 +2411,1337 @@ export const CurlOptionCamelCaseMap = { * If returning an array, the callback will only be called once per request. * If returning a single object, the callback will be called multiple times until `null` is returned. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) */ hstsReadFunction: 'HSTSREADFUNCTION', /** * Set HSTS write callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) */ hstsWriteFunction: 'HSTSWRITEFUNCTION', /** * Disable Content decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) */ httpContentDecoding: 'HTTP_CONTENT_DECODING', /** * Disable Transfer decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) */ httpTransferDecoding: 'HTTP_TRANSFER_DECODING', /** * HTTP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) */ httpVersion: 'HTTP_VERSION', /** * Allow HTTP/0.9 responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) */ http09Allowed: 'HTTP09_ALLOWED', /** - * Alternative versions of 200 OK. + * Alternative versions of 200 OK. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) */ http200aliases: 'HTTP200ALIASES', /** * HTTP server authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) */ httpAuth: 'HTTPAUTH', /** * Do an HTTP GET request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) */ httpGet: 'HTTPGET', /** * Custom HTTP headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) */ httpHeader: 'HTTPHEADER', /** * Deprecated option Multipart formpost HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) */ httpPost: 'HTTPPOST', /** * Tunnel through the HTTP proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) */ httpProxyTunnel: 'HTTPPROXYTUNNEL', /** * Ignore Content-Length. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) */ ignoreContentLength: 'IGNORE_CONTENT_LENGTH', /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) */ inFileSize: 'INFILESIZE', /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) */ inFileSizeLarge: 'INFILESIZE_LARGE', /** * Bind connection locally to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) */ interface: 'INTERFACE', /** * IP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) */ ipResolve: 'IPRESOLVE', /** * Issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) */ issuerCert: 'ISSUERCERT', /** * Issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) */ issuerCertBlob: 'ISSUERCERT_BLOB', /** * Keep sending on HTTP \>= 300 errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) */ keepSendingOnError: 'KEEP_SENDING_ON_ERROR', /** * Client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) */ keyPasswd: 'KEYPASSWD', /** - * Kerberos security level. + * OBSOLETE. Kerberos security level. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) */ krbLevel: 'KRBLEVEL', /** * Bind connection locally to this port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) */ localPort: 'LOCALPORT', /** * Bind connection locally to port range. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) */ localPortRange: 'LOCALPORTRANGE', /** * Login options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) */ loginOptions: 'LOGIN_OPTIONS', /** * Low speed limit to abort transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) */ lowSpeedLimit: 'LOW_SPEED_LIMIT', /** * Time to be below the speed to trigger low speed abort. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) */ lowSpeedTime: 'LOW_SPEED_TIME', /** * Authentication address. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) */ mailAuth: 'MAIL_AUTH', /** * Address of the sender. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) */ mailFrom: 'MAIL_FROM', /** * Address of the recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) */ mailRcpt: 'MAIL_RCPT', /** * Allow RCPT TO command to fail for some recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html) */ - mailRcptAlllowfails: 'MAIL_RCPT_ALLLOWFAILS', + mailRcptAllowfails: 'MAIL_RCPT_ALLOWFAILS', /** * Cap the download speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) */ maxRecvSpeedLarge: 'MAX_RECV_SPEED_LARGE', /** * Cap the upload speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) */ maxSendSpeedLarge: 'MAX_SEND_SPEED_LARGE', /** * Limit the age (idle time) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) */ maxAgeConn: 'MAXAGE_CONN', /** * Maximum number of connections in the connection pool. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) */ maxConnects: 'MAXCONNECTS', /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) */ maxFileSize: 'MAXFILESIZE', /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) */ maxFileSizeLarge: 'MAXFILESIZE_LARGE', /** * Limit the age (since creation) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) */ maxLifetimeConn: 'MAXLIFETIME_CONN', /** * Maximum number of redirects to follow. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) */ maxRedirs: 'MAXREDIRS', /** * Enable .netrc parsing. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) */ netrc: 'NETRC', /** - * .netrc file name. + * .netrc filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) */ netrcFile: 'NETRC_FILE', /** * Mode for creating new remote directories. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) */ newDirectoryPerms: 'NEW_DIRECTORY_PERMS', /** * Mode for creating new remote files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) */ newFilePerms: 'NEW_FILE_PERMS', /** * Do not get the body contents. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) */ nobody: 'NOBODY', /** * Shut off the progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) */ noProgress: 'NOPROGRESS', /** * Filter out hosts from proxy use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) */ noProxy: 'NOPROXY', /** * Do not install signal handlers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) */ noSignal: 'NOSIGNAL', /** * Password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) */ password: 'PASSWORD', /** * Disable squashing /../ and /./ sequences in the path. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) */ pathAsIs: 'PATH_AS_IS', /** * Set pinned SSL public key . * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) */ pinnedPublicKey: 'PINNEDPUBLICKEY', /** * Wait on connection to pipeline on it. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) */ pipeWait: 'PIPEWAIT', /** * Port number to connect to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) */ port: 'PORT', /** - * Issue an HTTP POST request. + * Make an HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) */ post: 'POST', - /** - * Send a POST with this data. - * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html) - */ - postFields: 'POSTFIELDS', - /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) */ postFieldSize: 'POSTFIELDSIZE', /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) */ postFieldSizeLarge: 'POSTFIELDSIZE_LARGE', /** * Commands to run after transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) */ postQuote: 'POSTQUOTE', /** * How to act on redirects after POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) */ postRedir: 'POSTREDIR', /** * Socks proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) */ preProxy: 'PRE_PROXY', /** * Commands to run just before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) */ preQuote: 'PREQUOTE', /** * Callback to be called after a connection is established but before a request is made on that connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) */ preReqFunction: 'PREREQFUNCTION', /** * OBSOLETE callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) */ progressFunction: 'PROGRESSFUNCTION', /** * Deprecated option Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) */ protocols: 'PROTOCOLS', /** * Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) */ protocolsStr: 'PROTOCOLS_STR', /** * Proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) */ proxy: 'PROXY', /** * Proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) */ proxyCaInfo: 'PROXY_CAINFO', /** * Proxy CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) */ proxyCaInfoBlob: 'PROXY_CAINFO_BLOB', /** * Path to proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) */ proxyCaPath: 'PROXY_CAPATH', /** * Proxy Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) */ proxyCrlFile: 'PROXY_CRLFILE', /** * Proxy issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) */ proxyIssuerCert: 'PROXY_ISSUERCERT', /** * Proxy issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) */ proxyIssuerCertBlob: 'PROXY_ISSUERCERT_BLOB', /** * Proxy client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) */ proxyKeyPasswd: 'PROXY_KEYPASSWD', /** * Set the proxy's pinned SSL public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) */ proxyPinnedPublicKey: 'PROXY_PINNEDPUBLICKEY', /** * Proxy authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) */ proxyServiceName: 'PROXY_SERVICE_NAME', /** * Proxy ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) */ proxySslCipherList: 'PROXY_SSL_CIPHER_LIST', /** * Control proxy SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) */ proxySslOptions: 'PROXY_SSL_OPTIONS', /** - * Verify the host name in the proxy SSL certificate. + * Verify the hostname in the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) */ proxySslVerifyHost: 'PROXY_SSL_VERIFYHOST', /** * Verify the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) */ proxySslVerifyPeer: 'PROXY_SSL_VERIFYPEER', /** * Proxy client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) */ proxySslCert: 'PROXY_SSLCERT', /** * Proxy client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) */ proxySslCertBlob: 'PROXY_SSLCERT_BLOB', /** * Proxy client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) */ proxySslCertType: 'PROXY_SSLCERTTYPE', /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) */ proxySslKey: 'PROXY_SSLKEY', /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) */ proxySslKeyBlob: 'PROXY_SSLKEY_BLOB', /** * Proxy client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) */ proxySslKeyType: 'PROXY_SSLKEYTYPE', /** * Proxy SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) */ proxySslversion: 'PROXY_SSLVERSION', /** - * Proxy TLS 1.3 cipher suites to use. + * Proxy TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) */ proxyTls13Ciphers: 'PROXY_TLS13_CIPHERS', /** * Proxy TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) */ proxyTlsAuthPassword: 'PROXY_TLSAUTH_PASSWORD', /** * Proxy TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) */ proxyTlsAuthType: 'PROXY_TLSAUTH_TYPE', /** - * Proxy TLS authentication user name. + * Proxy TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) */ proxyTlsAuthUsername: 'PROXY_TLSAUTH_USERNAME', /** * Add transfer mode to URL over proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) */ proxyTransferMode: 'PROXY_TRANSFER_MODE', /** * HTTP proxy authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) */ proxyAuth: 'PROXYAUTH', /** * Custom HTTP headers sent to proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) */ proxyHeader: 'PROXYHEADER', /** * Proxy password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) */ proxyPassword: 'PROXYPASSWORD', /** * Proxy port to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) */ proxyPort: 'PROXYPORT', /** * Proxy type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) */ proxyType: 'PROXYTYPE', /** - * Proxy user name. + * Proxy username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) */ proxyUsername: 'PROXYUSERNAME', /** - * Proxy user name and password. + * Proxy username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) */ proxyUserpwd: 'PROXYUSERPWD', /** * Deprecated option Issue an HTTP PUT request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) */ put: 'PUT', + /** + * To be set by toplevel tools like "curl" to skip lengthy cleanups when they are about to call exit() anyway. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html) + */ + quickExit: 'QUICK_EXIT', + /** * Commands to run before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) */ quote: 'QUOTE', /** * OBSOLETE Provide source for entropy random data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) */ randomFile: 'RANDOM_FILE', /** * Range requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) */ range: 'RANGE', /** * Data pointer to pass to the read callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) */ readData: 'READDATA', /** * Callback for reading data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) */ readFunction: 'READFUNCTION', /** * Deprecated option Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) */ redirProtocols: 'REDIR_PROTOCOLS', /** * Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) */ redirProtocolsStr: 'REDIR_PROTOCOLS_STR', /** * Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) */ referer: 'REFERER', /** * Set the request target. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) */ requestTarget: 'REQUEST_TARGET', /** * Provide fixed/fake name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) */ resolve: 'RESOLVE', /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) */ resumeFrom: 'RESUME_FROM', /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) */ resumeFromLarge: 'RESUME_FROM_LARGE', /** * Client CSEQ number. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) */ rtspClientCseq: 'RTSP_CLIENT_CSEQ', /** * RTSP request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) */ rtspRequest: 'RTSP_REQUEST', /** * CSEQ number for RTSP Server-\>Client request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) */ rtspServerCseq: 'RTSP_SERVER_CSEQ', /** * RTSP session-id. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) */ rtspSessionId: 'RTSP_SESSION_ID', /** * RTSP stream URI. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) */ rtspStreamUri: 'RTSP_STREAM_URI', /** * RTSP Transport: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) */ rtspTransPort: 'RTSP_TRANSPORT', /** * SASL authorization identity (identity to act as). * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) */ saslAuthzId: 'SASL_AUTHZID', /** * Enable SASL initial response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) */ saslIr: 'SASL_IR', /** * Callback for seek operations. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) */ seekFunction: 'SEEKFUNCTION', /** * Timeout for server responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) */ serverResponseTimeout: 'SERVER_RESPONSE_TIMEOUT', + /** + * Timeout for server responses. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html) + */ + serverResponseTimeoutMs: 'SERVER_RESPONSE_TIMEOUT_MS', + /** * Authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) */ serviceName: 'SERVICE_NAME', /** * Share object to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) */ share: 'SHARE', /** - * Socks5 authentication methods. + * Socks5 authentication methods. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) */ socks5Auth: 'SOCKS5_AUTH', /** - * Socks5 GSSAPI NEC mode. + * Socks5 GSSAPI NEC mode. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) */ socks5GssapiNec: 'SOCKS5_GSSAPI_NEC', /** - * Deprecated option Socks5 GSSAPI service name. + * Deprecated option Socks5 GSSAPI service name. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) */ socks5GssapiService: 'SOCKS5_GSSAPI_SERVICE', /** * SSH authentication types. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) */ sshAuthTypes: 'SSH_AUTH_TYPES', /** * Enable SSH compression. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) */ sshCompression: 'SSH_COMPRESSION', /** - * MD5 of host's public key. + * MD5 of host's public key. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) */ sshHostPublicKeyMd5: 'SSH_HOST_PUBLIC_KEY_MD5', /** * Custom pointer to pass to ssh host key callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) */ sshHostKeyData: 'SSH_HOSTKEYDATA', /** - * File name with known hosts. + * Filename with known hosts. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) */ sshKnownHosts: 'SSH_KNOWNHOSTS', /** - * File name of private key. + * Filename of the private key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) */ sshPrivateKeyFile: 'SSH_PRIVATE_KEYFILE', /** - * File name of public key. + * Filename of the public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) */ sshPublicKeyFile: 'SSH_PUBLIC_KEYFILE', /** * Ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) */ sslCipherList: 'SSL_CIPHER_LIST', /** * Set key exchange curves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) */ sslEcCurves: 'SSL_EC_CURVES', /** * Enable use of ALPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) */ sslEnableAlpn: 'SSL_ENABLE_ALPN', /** * OBSOLETE Enable use of NPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) */ sslEnableNpn: 'SSL_ENABLE_NPN', /** - * Enable TLS False Start. + * Deprecated option Enable TLS False Start. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) */ sslFalsestart: 'SSL_FALSESTART', /** * Control SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) */ sslOptions: 'SSL_OPTIONS', /** * Disable SSL session-id cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) */ sslSessionIdCache: 'SSL_SESSIONID_CACHE', /** - * Verify the host name in the SSL certificate. + * TLS signature algorithms to use. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html) + */ + sslSignatureAlgorithms: 'SSL_SIGNATURE_ALGORITHMS', + + /** + * Verify the hostname in the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) */ sslVerifyHost: 'SSL_VERIFYHOST', /** * Verify the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) */ sslVerifyPeer: 'SSL_VERIFYPEER', /** * Verify the SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) */ sslVerifyStatus: 'SSL_VERIFYSTATUS', /** * Client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) */ sslCert: 'SSLCERT', /** * Client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) */ sslCertBlob: 'SSLCERT_BLOB', /** * Client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) */ sslCertType: 'SSLCERTTYPE', /** * Use identifier with SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) */ sslEngine: 'SSLENGINE', /** * Default SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) */ sslEngineDefault: 'SSLENGINE_DEFAULT', /** * Client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) */ sslKey: 'SSLKEY', /** * Client key memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) */ sslKeyBlob: 'SSLKEY_BLOB', /** * Client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) */ sslKeyType: 'SSLKEYTYPE', /** * SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) */ sslversion: 'SSLVERSION', /** * Suppress proxy CONNECT response headers from user callbacks. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) */ suppressConnectHeaders: 'SUPPRESS_CONNECT_HEADERS', /** * Enable TCP Fast Open. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) */ tcpFastOpen: 'TCP_FASTOPEN', /** * Enable TCP keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) */ tcpKeepAlive: 'TCP_KEEPALIVE', + /** + * Maximum number of keep-alive probes. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html) + */ + tcpKeepCnt: 'TCP_KEEPCNT', + /** * Idle time before sending keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) */ tcpKeepIdle: 'TCP_KEEPIDLE', /** * Interval between keep-alive probes. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) */ tcpKeepIntvl: 'TCP_KEEPINTVL', /** * Disable the Nagle algorithm. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) */ tcpNoDelay: 'TCP_NODELAY', /** * TELNET options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) */ telnetOptions: 'TELNETOPTIONS', /** * TFTP block size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) */ tftpBlkSize: 'TFTP_BLKSIZE', /** * Do not send TFTP options requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) */ tftpNoOptions: 'TFTP_NO_OPTIONS', /** * Make a time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) */ timeCondition: 'TIMECONDITION', /** * Timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) */ timeout: 'TIMEOUT', /** * Millisecond timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) */ timeoutMs: 'TIMEOUT_MS', /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) */ timeValue: 'TIMEVALUE', /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) */ timeValueLarge: 'TIMEVALUE_LARGE', /** - * TLS 1.3 cipher suites to use. + * TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) */ tls13Ciphers: 'TLS13_CIPHERS', /** * TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) */ tlsAuthPassword: 'TLSAUTH_PASSWORD', /** * TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) */ tlsAuthType: 'TLSAUTH_TYPE', /** - * TLS authentication user name. + * TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) */ tlsAuthUsername: 'TLSAUTH_USERNAME', /** * Set callback for sending trailing headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) */ trailerFunction: 'TRAILERFUNCTION', /** * Request Transfer-Encoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) */ transferEncoding: 'TRANSFER_ENCODING', /** * Use text transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) */ transferText: 'TRANSFERTEXT', /** * Path to a Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) */ unixSocketPath: 'UNIX_SOCKET_PATH', /** * Do not restrict authentication to original host. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) */ unrestrictedAuth: 'UNRESTRICTED_AUTH', /** * Sets the interval at which connection upkeep are performed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) */ upkeepIntervalMs: 'UPKEEP_INTERVAL_MS', /** * Upload data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) */ upload: 'UPLOAD', /** * Set upload buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) */ uploadBufferSize: 'UPLOAD_BUFFERSIZE', + /** + * Set upload flags. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html) + */ + uploadFlags: 'UPLOAD_FLAGS', + /** * URL to work on. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) */ url: 'URL', /** * Use TLS/SSL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) */ useSsl: 'USE_SSL', /** * User-Agent: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) */ userAgent: 'USERAGENT', /** - * User name. + * Username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) */ username: 'USERNAME', /** - * User name and password. + * Username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) */ userpwd: 'USERPWD', /** * Display verbose information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) */ verbose: 'VERBOSE', /** - * Transfer multiple files according to a file name pattern. + * Transfer multiple files according to a filename pattern. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) */ wildcardMatch: 'WILDCARDMATCH', /** * Callback for writing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) */ writeFunction: 'WRITEFUNCTION', /** * Callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) */ xferInfoFunction: 'XFERINFOFUNCTION', /** - * OAuth2 bearer token. + * OAuth2 bearer token. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) */ xoauth2Bearer: 'XOAUTH2_BEARER', } as const @@ -3662,6 +3760,7 @@ export type CurlOptionName = | 'AUTOREFERER' | 'AWS_SIGV4' | 'BUFFERSIZE' + | 'CA_CACHE_TIMEOUT' | 'CAINFO' | 'CAINFO_BLOB' | 'CAPATH' @@ -3695,6 +3794,7 @@ export type CurlOptionName = | 'DOH_SSL_VERIFYPEER' | 'DOH_SSL_VERIFYSTATUS' | 'DOH_URL' + | 'ECH' | 'EGDSOCKET' | 'EXPECT_100_TIMEOUT_MS' | 'FAILONERROR' @@ -3716,6 +3816,7 @@ export type CurlOptionName = | 'FTPSSLAUTH' | 'GSSAPI_DELEGATION' | 'HAPPY_EYEBALLS_TIMEOUT_MS' + | 'HAPROXY_CLIENT_IP' | 'HAPROXYPROTOCOL' | 'HEADER' | 'HEADERFUNCTION' @@ -3752,7 +3853,7 @@ export type CurlOptionName = | 'MAIL_AUTH' | 'MAIL_FROM' | 'MAIL_RCPT' - | 'MAIL_RCPT_ALLLOWFAILS' + | 'MAIL_RCPT_ALLOWFAILS' | 'MAX_RECV_SPEED_LARGE' | 'MAX_SEND_SPEED_LARGE' | 'MAXAGE_CONN' @@ -3775,7 +3876,6 @@ export type CurlOptionName = | 'PIPEWAIT' | 'PORT' | 'POST' - | 'POSTFIELDS' | 'POSTFIELDSIZE' | 'POSTFIELDSIZE_LARGE' | 'POSTQUOTE' @@ -3820,6 +3920,7 @@ export type CurlOptionName = | 'PROXYUSERNAME' | 'PROXYUSERPWD' | 'PUT' + | 'QUICK_EXIT' | 'QUOTE' | 'RANDOM_FILE' | 'RANGE' @@ -3842,6 +3943,7 @@ export type CurlOptionName = | 'SASL_IR' | 'SEEKFUNCTION' | 'SERVER_RESPONSE_TIMEOUT' + | 'SERVER_RESPONSE_TIMEOUT_MS' | 'SERVICE_NAME' | 'SHARE' | 'SOCKS5_AUTH' @@ -3861,6 +3963,7 @@ export type CurlOptionName = | 'SSL_FALSESTART' | 'SSL_OPTIONS' | 'SSL_SESSIONID_CACHE' + | 'SSL_SIGNATURE_ALGORITHMS' | 'SSL_VERIFYHOST' | 'SSL_VERIFYPEER' | 'SSL_VERIFYSTATUS' @@ -3876,6 +3979,7 @@ export type CurlOptionName = | 'SUPPRESS_CONNECT_HEADERS' | 'TCP_FASTOPEN' | 'TCP_KEEPALIVE' + | 'TCP_KEEPCNT' | 'TCP_KEEPIDLE' | 'TCP_KEEPINTVL' | 'TCP_NODELAY' @@ -3899,6 +4003,7 @@ export type CurlOptionName = | 'UPKEEP_INTERVAL_MS' | 'UPLOAD' | 'UPLOAD_BUFFERSIZE' + | 'UPLOAD_FLAGS' | 'URL' | 'USE_SSL' | 'USERAGENT' @@ -3977,1022 +4082,1034 @@ export type CurlOptionValueType = { /** * Path to an abstract Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) */ ABSTRACT_UNIX_SOCKET?: string | number | boolean | null /** * Path to an abstract Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_ABSTRACT_UNIX_SOCKET.html) */ abstractUnixSocket?: string | number | boolean | null /** * Accept-Encoding and automatic decompressing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) */ ACCEPT_ENCODING?: string | number | boolean | null /** * Accept-Encoding and automatic decompressing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html) */ acceptEncoding?: string | number | boolean | null /** * Timeout for waiting for the server's connect back to be accepted. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) */ ACCEPTTIMEOUT_MS?: string | number | boolean | null /** * Timeout for waiting for the server's connect back to be accepted. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPTTIMEOUT_MS.html) */ acceptTimeoutMs?: string | number | boolean | null /** * IPv6 scope for local addresses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) */ ADDRESS_SCOPE?: string | number | boolean | null /** * IPv6 scope for local addresses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_ADDRESS_SCOPE.html) */ addressScope?: string | number | boolean | null /** - * Specify the Alt-Svc: cache file name. + * Specify the Alt-Svc: cache filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) */ ALTSVC?: string | number | boolean | null /** - * Specify the Alt-Svc: cache file name. + * Specify the Alt-Svc: cache filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC.html) */ altSvc?: string | number | boolean | null /** * Enable and configure Alt-Svc: treatment. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) */ ALTSVC_CTRL?: string | number | boolean | null /** * Enable and configure Alt-Svc: treatment. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_ALTSVC_CTRL.html) */ altSvcCtrl?: string | number | boolean | null /** * Append to remote file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) */ APPEND?: string | number | boolean | null /** * Append to remote file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html](https://curl.haxx.se/libcurl/c/CURLOPT_APPEND.html) */ append?: string | number | boolean | null /** * Automatically set Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) */ AUTOREFERER?: string | number | boolean | null /** * Automatically set Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_AUTOREFERER.html) */ autoReferer?: string | number | boolean | null /** - * AWS HTTP V4 Signature. + * AWS HTTP V4 Signature. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) */ AWS_SIGV4?: string | number | boolean | null /** - * AWS HTTP V4 Signature. + * AWS HTTP V4 Signature. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html](https://curl.haxx.se/libcurl/c/CURLOPT_AWS_SIGV4.html) */ awsSigV4?: string | number | boolean | null /** * Ask for alternate buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) */ BUFFERSIZE?: string | number | boolean | null /** * Ask for alternate buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html) */ bufferSize?: string | number | boolean | null + /** + * Timeout for CA cache. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html) + */ + CA_CACHE_TIMEOUT?: string | number | boolean | null + + /** + * Timeout for CA cache. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CA_CACHE_TIMEOUT.html) + */ + caCacheTimeout?: string | number | boolean | null + /** * CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) */ CAINFO?: string | number | boolean | null /** * CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO.html) */ caInfo?: string | number | boolean | null /** * CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) */ CAINFO_BLOB?: ArrayBuffer | Buffer | string | null /** * CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAINFO_BLOB.html) */ caInfoBlob?: ArrayBuffer | Buffer | string | null /** * Path to CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) */ CAPATH?: string | number | boolean | null /** * Path to CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_CAPATH.html) */ caPath?: string | number | boolean | null /** * Extract certificate info. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) */ CERTINFO?: string | number | boolean | null /** * Extract certificate info. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CERTINFO.html) */ certInfo?: string | number | boolean | null /** * Callback for wildcard download start of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) */ CHUNK_BGN_FUNCTION?: - | (( - this: EasyNativeBinding, - fileInfo: FileInfo, - remains: number, - ) => CurlChunk) + | ((this: Easy, fileInfo: FileInfo, remains: number) => CurlChunk) | null /** * Callback for wildcard download start of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_BGN_FUNCTION.html) */ chunkBgnFunction?: - | (( - this: EasyNativeBinding, - fileInfo: FileInfo, - remains: number, - ) => CurlChunk) + | ((this: Easy, fileInfo: FileInfo, remains: number) => CurlChunk) | null /** * Callback for wildcard download end of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) */ - CHUNK_END_FUNCTION?: ((this: EasyNativeBinding) => CurlChunk) | null + CHUNK_END_FUNCTION?: ((this: Easy) => CurlChunk) | null /** * Callback for wildcard download end of chunk. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_CHUNK_END_FUNCTION.html) */ - chunkEndFunction?: ((this: EasyNativeBinding) => CurlChunk) | null + chunkEndFunction?: ((this: Easy) => CurlChunk) | null /** * Only connect, nothing else. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) */ CONNECT_ONLY?: string | number | boolean | null /** * Only connect, nothing else. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_ONLY.html) */ connectOnly?: string | number | boolean | null /** * Connect to a specific host and port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) */ CONNECT_TO?: string[] | null /** * Connect to a specific host and port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECT_TO.html) */ connectTo?: string[] | null /** * Timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) */ CONNECTTIMEOUT?: string | number | boolean | null /** * Timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html) */ connectTimeout?: string | number | boolean | null /** * Millisecond timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) */ CONNECTTIMEOUT_MS?: string | number | boolean | null /** * Millisecond timeout for the connection phase. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_CONNECTTIMEOUT_MS.html) */ connectTimeoutMs?: string | number | boolean | null /** * Cookie(s) to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) */ COOKIE?: string | number | boolean | null /** * Cookie(s) to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html) */ cookie?: string | number | boolean | null /** * File to read cookies from. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) */ COOKIEFILE?: string | number | boolean | null /** * File to read cookies from. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEFILE.html) */ cookieFile?: string | number | boolean | null /** * File to write cookies to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) */ COOKIEJAR?: string | number | boolean | null /** * File to write cookies to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIEJAR.html) */ cookieJar?: string | number | boolean | null /** * Add or control cookies. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) */ COOKIELIST?: string | number | boolean | null /** * Add or control cookies. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIELIST.html) */ cookieList?: string | number | boolean | null /** * Start a new cookie session. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) */ COOKIESESSION?: string | number | boolean | null /** * Start a new cookie session. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_COOKIESESSION.html) */ cookieSession?: string | number | boolean | null /** * Convert newlines. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) */ CRLF?: string | number | boolean | null /** * Convert newlines. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLF.html) */ crlf?: string | number | boolean | null /** * Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) */ CRLFILE?: string | number | boolean | null /** * Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_CRLFILE.html) */ crlFile?: string | number | boolean | null /** * Custom request/method. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) */ CUSTOMREQUEST?: string | number | boolean | null /** * Custom request/method. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html) */ customRequest?: string | number | boolean | null /** * Callback for debug information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) */ - DEBUGFUNCTION?: - | ((this: EasyNativeBinding, type: CurlInfoDebug, data: Buffer) => 0) - | null + DEBUGFUNCTION?: ((this: Easy, type: CurlInfoDebug, data: Buffer) => 0) | null /** * Callback for debug information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEBUGFUNCTION.html) */ - debugFunction?: - | ((this: EasyNativeBinding, type: CurlInfoDebug, data: Buffer) => 0) - | null + debugFunction?: ((this: Easy, type: CurlInfoDebug, data: Buffer) => 0) | null /** * Default protocol. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) */ DEFAULT_PROTOCOL?: string | number | boolean | null /** * Default protocol. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DEFAULT_PROTOCOL.html) */ defaultProtocol?: string | number | boolean | null /** * List only. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) */ DIRLISTONLY?: string | number | boolean | null /** * List only. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html](https://curl.haxx.se/libcurl/c/CURLOPT_DIRLISTONLY.html) */ dirListOnly?: string | number | boolean | null /** * Do not allow username in URL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) */ DISALLOW_USERNAME_IN_URL?: string | number | boolean | null /** * Do not allow username in URL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DISALLOW_USERNAME_IN_URL.html) */ disallowUsernameInUrl?: string | number | boolean | null /** * Timeout for DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) */ DNS_CACHE_TIMEOUT?: string | number | boolean | null /** * Timeout for DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html) */ dnsCacheTimeout?: string | number | boolean | null /** * Bind name resolves to this interface. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) */ DNS_INTERFACE?: string | number | boolean | null /** * Bind name resolves to this interface. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_INTERFACE.html) */ dnsInterface?: string | number | boolean | null /** - * Bind name resolves to this IP4 address. + * Bind name resolves to this IP4 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) */ DNS_LOCAL_IP4?: string | number | boolean | null /** - * Bind name resolves to this IP4 address. + * Bind name resolves to this IP4 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP4.html) */ dnsLocalIp4?: string | number | boolean | null /** - * Bind name resolves to this IP6 address. + * Bind name resolves to this IP6 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) */ DNS_LOCAL_IP6?: string | number | boolean | null /** - * Bind name resolves to this IP6 address. + * Bind name resolves to this IP6 address. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_LOCAL_IP6.html) */ dnsLocalIp6?: string | number | boolean | null /** * Preferred DNS servers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) */ DNS_SERVERS?: string | number | boolean | null /** * Preferred DNS servers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SERVERS.html) */ dnsServers?: string | number | boolean | null /** * Shuffle addresses before use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) */ DNS_SHUFFLE_ADDRESSES?: string | number | boolean | null /** * Shuffle addresses before use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_SHUFFLE_ADDRESSES.html) */ dnsShuffleAddresses?: string | number | boolean | null /** * OBSOLETE Enable global DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) */ DNS_USE_GLOBAL_CACHE?: string | number | boolean | null /** * OBSOLETE Enable global DNS cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_DNS_USE_GLOBAL_CACHE.html) */ dnsUseGlobalCache?: string | number | boolean | null /** - * Verify the host name in the DoH (DNS-over-HTTPS) SSL certificate. + * Verify the hostname in the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) */ DOH_SSL_VERIFYHOST?: string | number | boolean | null /** - * Verify the host name in the DoH (DNS-over-HTTPS) SSL certificate. + * Verify the hostname in the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYHOST.html) */ dohSslVerifyHost?: string | number | boolean | null /** * Verify the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) */ DOH_SSL_VERIFYPEER?: string | number | boolean | null /** * Verify the DoH (DNS-over-HTTPS) SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYPEER.html) */ dohSslVerifyPeer?: string | number | boolean | null /** * Verify the DoH (DNS-over-HTTPS) SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) */ DOH_SSL_VERIFYSTATUS?: string | number | boolean | null /** * Verify the DoH (DNS-over-HTTPS) SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_SSL_VERIFYSTATUS.html) */ dohSslVerifyStatus?: string | number | boolean | null /** * Use this DoH server for name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) */ DOH_URL?: string | number | boolean | null /** * Use this DoH server for name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_DOH_URL.html) */ dohUrl?: string | number | boolean | null + /** + * Set the configuration for ECH. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html](https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html) + */ + ECH?: string | number | boolean | null + + /** + * Set the configuration for ECH. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html](https://curl.haxx.se/libcurl/c/CURLOPT_ECH.html) + */ + ech?: string | number | boolean | null + /** * OBSOLETE Identify EGD socket for entropy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) */ EGDSOCKET?: string | number | boolean | null /** * OBSOLETE Identify EGD socket for entropy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html](https://curl.haxx.se/libcurl/c/CURLOPT_EGDSOCKET.html) */ egdSocket?: string | number | boolean | null /** - * 100-continue timeout. + * 100-continue timeout. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) */ EXPECT_100_TIMEOUT_MS?: string | number | boolean | null /** - * 100-continue timeout. + * 100-continue timeout. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_EXPECT_100_TIMEOUT_MS.html) */ expect100TimeoutMs?: string | number | boolean | null /** * Fail on HTTP 4xx errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) */ FAILONERROR?: string | number | boolean | null /** * Fail on HTTP 4xx errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_FAILONERROR.html) */ failOnError?: string | number | boolean | null /** * Request file modification date and time. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) */ FILETIME?: string | number | boolean | null /** * Request file modification date and time. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_FILETIME.html) */ fileTime?: string | number | boolean | null /** * Callback for wildcard matching. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) */ FNMATCH_FUNCTION?: - | (( - this: EasyNativeBinding, - pattern: string, - value: string, - ) => CurlFnMatchFunc) + | ((this: Easy, pattern: string, value: string) => CurlFnMatchFunc) | null /** * Callback for wildcard matching. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FNMATCH_FUNCTION.html) */ fnMatchFunction?: - | (( - this: EasyNativeBinding, - pattern: string, - value: string, - ) => CurlFnMatchFunc) + | ((this: Easy, pattern: string, value: string) => CurlFnMatchFunc) | null /** * Follow HTTP redirects. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) */ FOLLOWLOCATION?: string | number | boolean | null /** * Follow HTTP redirects. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) */ followLocation?: string | number | boolean | null /** - * Prevent subsequent connections from re-using this. + * Prevent subsequent connections from reusing this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) */ FORBID_REUSE?: string | number | boolean | null /** - * Prevent subsequent connections from re-using this. + * Prevent subsequent connections from reusing this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_FORBID_REUSE.html) */ forbIdReuse?: string | number | boolean | null /** * Use a new connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) */ FRESH_CONNECT?: string | number | boolean | null /** * Use a new connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FRESH_CONNECT.html) */ freshConnect?: string | number | boolean | null /** * Send ACCT command. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) */ FTP_ACCOUNT?: string | number | boolean | null /** * Send ACCT command. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ACCOUNT.html) */ ftpAccount?: string | number | boolean | null /** * Alternative to USER. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) */ FTP_ALTERNATIVE_TO_USER?: string | number | boolean | null /** * Alternative to USER. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_ALTERNATIVE_TO_USER.html) */ ftpAlternativeToUser?: string | number | boolean | null /** * Create missing directories on the remote server. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) */ FTP_CREATE_MISSING_DIRS?: string | number | boolean | null /** * Create missing directories on the remote server. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_CREATE_MISSING_DIRS.html) */ ftpCreateMissingDirs?: string | number | boolean | null /** * Specify how to reach files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) */ FTP_FILEMETHOD?: CurlFtpMethod | null /** * Specify how to reach files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_FILEMETHOD.html) */ ftpFileMethod?: CurlFtpMethod | null /** * Ignore the IP address in the PASV response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) */ FTP_SKIP_PASV_IP?: string | number | boolean | null /** * Ignore the IP address in the PASV response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html) */ ftpSkipPasvIp?: string | number | boolean | null /** * Back to non-TLS again after authentication. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) */ FTP_SSL_CCC?: CurlFtpSsl | null /** * Back to non-TLS again after authentication. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_SSL_CCC.html) */ ftpSslCcc?: CurlFtpSsl | null /** * Use EPRT. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) */ FTP_USE_EPRT?: string | number | boolean | null /** * Use EPRT. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPRT.html) */ ftpUseEprt?: string | number | boolean | null /** * Use EPSV. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) */ FTP_USE_EPSV?: string | number | boolean | null /** * Use EPSV. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_EPSV.html) */ ftpUseEpsv?: string | number | boolean | null /** * Use PRET. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) */ FTP_USE_PRET?: string | number | boolean | null /** * Use PRET. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTP_USE_PRET.html) */ ftpUsePret?: string | number | boolean | null /** * Use active FTP. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) */ FTPPORT?: string | number | boolean | null /** * Use active FTP. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html) */ ftpPort?: string | number | boolean | null /** * Control how to do TLS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) */ FTPSSLAUTH?: string | number | boolean | null /** * Control how to do TLS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_FTPSSLAUTH.html) */ ftpSslAuth?: string | number | boolean | null /** * Disable GSS-API delegation. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) */ GSSAPI_DELEGATION?: CurlGssApi | null /** * Disable GSS-API delegation. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html](https://curl.haxx.se/libcurl/c/CURLOPT_GSSAPI_DELEGATION.html) */ gssapiDelegation?: CurlGssApi | null /** * Timeout for happy eyeballs. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) */ HAPPY_EYEBALLS_TIMEOUT_MS?: string | number | boolean | null /** * Timeout for happy eyeballs. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.html) */ happyEyeballsTimeoutMs?: string | number | boolean | null + /** + * Spoof the client IP in an HAProxy PROXY protocol v1 header. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html) + */ + HAPROXY_CLIENT_IP?: string | number | boolean | null + + /** + * Spoof the client IP in an HAProxy PROXY protocol v1 header. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXY_CLIENT_IP.html) + */ + haProxyClientIp?: string | number | boolean | null + /** * Send an HAProxy PROXY protocol v1 header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) */ HAPROXYPROTOCOL?: string | number | boolean | null /** * Send an HAProxy PROXY protocol v1 header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HAPROXYPROTOCOL.html) */ haProxyProtocol?: string | number | boolean | null /** * Include the header in the body output. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) */ HEADER?: string | number | boolean | null /** * Include the header in the body output. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADER.html) */ header?: string | number | boolean | null /** * Callback for writing received headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) */ HEADERFUNCTION?: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) | null /** * Callback for writing received headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html) */ headerFunction?: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) | null /** * Control custom headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) */ HEADEROPT?: CurlHeader | null /** * Control custom headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_HEADEROPT.html) */ headerOpt?: CurlHeader | null /** * Set HSTS cache file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) */ HSTS?: string | number | boolean | null /** * Set HSTS cache file. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS.html) */ hsts?: string | number | boolean | null /** * Enable HSTS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) */ HSTS_CTRL?: CurlHsts | null /** * Enable HSTS. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTS_CTRL.html) */ hstsCtrl?: CurlHsts | null @@ -5003,11 +5120,12 @@ export type CurlOptionValueType = { * If returning an array, the callback will only be called once per request. * If returning a single object, the callback will be called multiple times until `null` is returned. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) */ HSTSREADFUNCTION?: | (( - this: EasyNativeBinding, + this: Easy, + options: { maxHostLengthBytes: number }, ) => null | CurlHstsCacheEntry | CurlHstsCacheEntry[]) | null @@ -5018,22 +5136,23 @@ export type CurlOptionValueType = { * If returning an array, the callback will only be called once per request. * If returning a single object, the callback will be called multiple times until `null` is returned. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSREADFUNCTION.html) */ hstsReadFunction?: | (( - this: EasyNativeBinding, + this: Easy, + options: { maxHostLengthBytes: number }, ) => null | CurlHstsCacheEntry | CurlHstsCacheEntry[]) | null /** * Set HSTS write callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) */ HSTSWRITEFUNCTION?: | (( - this: EasyNativeBinding, + this: Easy, cacheEntry: CurlHstsCacheEntry, cacheCount: CurlHstsCacheCount, ) => any) @@ -5042,11 +5161,11 @@ export type CurlOptionValueType = { /** * Set HSTS write callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HSTSWRITEFUNCTION.html) */ hstsWriteFunction?: | (( - this: EasyNativeBinding, + this: Easy, cacheEntry: CurlHstsCacheEntry, cacheCount: CurlHstsCacheCount, ) => any) @@ -5055,823 +5174,809 @@ export type CurlOptionValueType = { /** * Disable Content decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) */ HTTP_CONTENT_DECODING?: string | number | boolean | null /** * Disable Content decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html) */ httpContentDecoding?: string | number | boolean | null /** * Disable Transfer decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) */ HTTP_TRANSFER_DECODING?: string | number | boolean | null /** * Disable Transfer decoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_TRANSFER_DECODING.html) */ httpTransferDecoding?: string | number | boolean | null /** * HTTP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) */ HTTP_VERSION?: CurlHttpVersion | null /** * HTTP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_VERSION.html) */ httpVersion?: CurlHttpVersion | null /** * Allow HTTP/0.9 responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) */ HTTP09_ALLOWED?: string | number | boolean | null /** * Allow HTTP/0.9 responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP09_ALLOWED.html) */ http09Allowed?: string | number | boolean | null /** - * Alternative versions of 200 OK. + * Alternative versions of 200 OK. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) */ HTTP200ALIASES?: string[] | null /** - * Alternative versions of 200 OK. + * Alternative versions of 200 OK. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTP200ALIASES.html) */ http200aliases?: string[] | null /** * HTTP server authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) */ HTTPAUTH?: string | number | boolean | null /** * HTTP server authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) */ httpAuth?: string | number | boolean | null /** * Do an HTTP GET request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) */ HTTPGET?: string | number | boolean | null /** * Do an HTTP GET request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPGET.html) */ httpGet?: string | number | boolean | null /** * Custom HTTP headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) */ HTTPHEADER?: string[] | null /** * Custom HTTP headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) */ httpHeader?: string[] | null /** * Deprecated option Multipart formpost HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) */ HTTPPOST?: HttpPostField[] | null /** * Deprecated option Multipart formpost HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPOST.html) */ httpPost?: HttpPostField[] | null /** * Tunnel through the HTTP proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) */ HTTPPROXYTUNNEL?: string | number | boolean | null /** * Tunnel through the HTTP proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html) */ httpProxyTunnel?: string | number | boolean | null /** * Ignore Content-Length. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) */ IGNORE_CONTENT_LENGTH?: string | number | boolean | null /** * Ignore Content-Length. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_IGNORE_CONTENT_LENGTH.html) */ ignoreContentLength?: string | number | boolean | null /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) */ INFILESIZE?: string | number | boolean | null /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE.html) */ inFileSize?: string | number | boolean | null /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) */ INFILESIZE_LARGE?: string | number | boolean | null /** * Size of file to send. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html) */ inFileSizeLarge?: string | number | boolean | null /** * Bind connection locally to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) */ INTERFACE?: string | number | boolean | null /** * Bind connection locally to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html](https://curl.haxx.se/libcurl/c/CURLOPT_INTERFACE.html) */ interface?: string | number | boolean | null /** * IP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) */ IPRESOLVE?: CurlIpResolve | null /** * IP version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_IPRESOLVE.html) */ ipResolve?: CurlIpResolve | null /** * Issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) */ ISSUERCERT?: string | number | boolean | null /** * Issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT.html) */ issuerCert?: string | number | boolean | null /** * Issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) */ ISSUERCERT_BLOB?: ArrayBuffer | Buffer | string | null /** * Issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_ISSUERCERT_BLOB.html) */ issuerCertBlob?: ArrayBuffer | Buffer | string | null /** * Keep sending on HTTP \>= 300 errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) */ KEEP_SENDING_ON_ERROR?: string | number | boolean | null /** * Keep sending on HTTP \>= 300 errors. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEEP_SENDING_ON_ERROR.html) */ keepSendingOnError?: string | number | boolean | null /** * Client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) */ KEYPASSWD?: string | number | boolean | null /** * Client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) */ keyPasswd?: string | number | boolean | null /** - * Kerberos security level. + * OBSOLETE. Kerberos security level. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) */ KRBLEVEL?: string | number | boolean | null /** - * Kerberos security level. + * OBSOLETE. Kerberos security level. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html](https://curl.haxx.se/libcurl/c/CURLOPT_KRBLEVEL.html) */ krbLevel?: string | number | boolean | null /** * Bind connection locally to this port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) */ LOCALPORT?: string | number | boolean | null /** * Bind connection locally to this port. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORT.html) */ localPort?: string | number | boolean | null /** * Bind connection locally to port range. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) */ LOCALPORTRANGE?: string | number | boolean | null /** * Bind connection locally to port range. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOCALPORTRANGE.html) */ localPortRange?: string | number | boolean | null /** * Login options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) */ LOGIN_OPTIONS?: string | number | boolean | null /** * Login options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOGIN_OPTIONS.html) */ loginOptions?: string | number | boolean | null /** * Low speed limit to abort transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) */ LOW_SPEED_LIMIT?: string | number | boolean | null /** * Low speed limit to abort transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html) */ lowSpeedLimit?: string | number | boolean | null /** * Time to be below the speed to trigger low speed abort. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) */ LOW_SPEED_TIME?: string | number | boolean | null /** * Time to be below the speed to trigger low speed abort. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html](https://curl.haxx.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html) */ lowSpeedTime?: string | number | boolean | null /** * Authentication address. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) */ MAIL_AUTH?: string | number | boolean | null /** * Authentication address. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_AUTH.html) */ mailAuth?: string | number | boolean | null /** * Address of the sender. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) */ MAIL_FROM?: string | number | boolean | null /** * Address of the sender. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_FROM.html) */ mailFrom?: string | number | boolean | null /** * Address of the recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) */ MAIL_RCPT?: string[] | null /** * Address of the recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT.html) */ mailRcpt?: string[] | null /** * Allow RCPT TO command to fail for some recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html) */ - MAIL_RCPT_ALLLOWFAILS?: string | number | boolean | null + MAIL_RCPT_ALLOWFAILS?: string | number | boolean | null /** * Allow RCPT TO command to fail for some recipients. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLLOWFAILS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAIL_RCPT_ALLOWFAILS.html) */ - mailRcptAlllowfails?: string | number | boolean | null + mailRcptAllowfails?: string | number | boolean | null /** * Cap the download speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) */ MAX_RECV_SPEED_LARGE?: string | number | boolean | null /** * Cap the download speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_RECV_SPEED_LARGE.html) */ maxRecvSpeedLarge?: string | number | boolean | null /** * Cap the upload speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) */ MAX_SEND_SPEED_LARGE?: string | number | boolean | null /** * Cap the upload speed to this. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAX_SEND_SPEED_LARGE.html) */ maxSendSpeedLarge?: string | number | boolean | null /** * Limit the age (idle time) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) */ MAXAGE_CONN?: string | number | boolean | null /** * Limit the age (idle time) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXAGE_CONN.html) */ maxAgeConn?: string | number | boolean | null /** * Maximum number of connections in the connection pool. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) */ MAXCONNECTS?: string | number | boolean | null /** * Maximum number of connections in the connection pool. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXCONNECTS.html) */ maxConnects?: string | number | boolean | null /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) */ MAXFILESIZE?: string | number | boolean | null /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE.html) */ maxFileSize?: string | number | boolean | null /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) */ MAXFILESIZE_LARGE?: string | number | boolean | null /** * Maximum file size to get. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXFILESIZE_LARGE.html) */ maxFileSizeLarge?: string | number | boolean | null /** * Limit the age (since creation) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) */ MAXLIFETIME_CONN?: string | number | boolean | null /** * Limit the age (since creation) of connections for reuse. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXLIFETIME_CONN.html) */ maxLifetimeConn?: string | number | boolean | null /** * Maximum number of redirects to follow. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) */ MAXREDIRS?: string | number | boolean | null /** * Maximum number of redirects to follow. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html](https://curl.haxx.se/libcurl/c/CURLOPT_MAXREDIRS.html) */ maxRedirs?: string | number | boolean | null /** * Enable .netrc parsing. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) */ NETRC?: CurlNetrc | null /** * Enable .netrc parsing. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC.html) */ netrc?: CurlNetrc | null /** - * .netrc file name. + * .netrc filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) */ NETRC_FILE?: string | number | boolean | null /** - * .netrc file name. + * .netrc filename. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_NETRC_FILE.html) */ netrcFile?: string | number | boolean | null /** * Mode for creating new remote directories. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) */ NEW_DIRECTORY_PERMS?: string | number | boolean | null /** * Mode for creating new remote directories. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_DIRECTORY_PERMS.html) */ newDirectoryPerms?: string | number | boolean | null /** * Mode for creating new remote files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) */ NEW_FILE_PERMS?: string | number | boolean | null /** * Mode for creating new remote files. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NEW_FILE_PERMS.html) */ newFilePerms?: string | number | boolean | null /** * Do not get the body contents. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) */ NOBODY?: string | number | boolean | null /** * Do not get the body contents. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html) */ nobody?: string | number | boolean | null /** * Shut off the progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) */ NOPROGRESS?: string | number | boolean | null /** * Shut off the progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROGRESS.html) */ noProgress?: string | number | boolean | null /** * Filter out hosts from proxy use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) */ NOPROXY?: string | number | boolean | null /** * Filter out hosts from proxy use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html) */ noProxy?: string | number | boolean | null /** * Do not install signal handlers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) */ NOSIGNAL?: string | number | boolean | null /** * Do not install signal handlers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html](https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html) */ noSignal?: string | number | boolean | null /** * Password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) */ PASSWORD?: string | number | boolean | null /** * Password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PASSWORD.html) */ password?: string | number | boolean | null /** * Disable squashing /../ and /./ sequences in the path. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) */ PATH_AS_IS?: string | number | boolean | null /** * Disable squashing /../ and /./ sequences in the path. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PATH_AS_IS.html) */ pathAsIs?: string | number | boolean | null /** * Set pinned SSL public key . * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) */ PINNEDPUBLICKEY?: string | number | boolean | null /** * Set pinned SSL public key . * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html) */ pinnedPublicKey?: string | number | boolean | null /** * Wait on connection to pipeline on it. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) */ PIPEWAIT?: string | number | boolean | null /** * Wait on connection to pipeline on it. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PIPEWAIT.html) */ pipeWait?: string | number | boolean | null /** * Port number to connect to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) */ PORT?: string | number | boolean | null /** * Port number to connect to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PORT.html) */ port?: string | number | boolean | null /** - * Issue an HTTP POST request. + * Make an HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) */ POST?: string | number | boolean | null /** - * Issue an HTTP POST request. + * Make an HTTP POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POST.html](https://curl.haxx.se/libcurl/c/CURLOPT_POST.html) */ post?: string | number | boolean | null - /** - * Send a POST with this data. - * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html) - */ - POSTFIELDS?: string | number | boolean | null - - /** - * Send a POST with this data. - * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html) - */ - postFields?: string | number | boolean | null - /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) */ POSTFIELDSIZE?: string | number | boolean | null /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE.html) */ postFieldSize?: string | number | boolean | null /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) */ POSTFIELDSIZE_LARGE?: string | number | boolean | null /** * The POST data is this big. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDSIZE_LARGE.html) */ postFieldSizeLarge?: string | number | boolean | null /** * Commands to run after transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) */ POSTQUOTE?: string[] | null /** * Commands to run after transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTQUOTE.html) */ postQuote?: string[] | null /** * How to act on redirects after POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) */ POSTREDIR?: string | number | boolean | null /** * How to act on redirects after POST. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html](https://curl.haxx.se/libcurl/c/CURLOPT_POSTREDIR.html) */ postRedir?: string | number | boolean | null /** * Socks proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) */ PRE_PROXY?: string | number | boolean | null /** * Socks proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PRE_PROXY.html) */ preProxy?: string | number | boolean | null /** * Commands to run just before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) */ PREQUOTE?: string[] | null /** * Commands to run just before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREQUOTE.html) */ preQuote?: string[] | null /** * Callback to be called after a connection is established but before a request is made on that connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) */ PREREQFUNCTION?: | (( - this: EasyNativeBinding, + this: Easy, connPrimaryIp: string, connLocalIp: string, connPrimaryPort: number, @@ -5882,11 +5987,11 @@ export type CurlOptionValueType = { /** * Callback to be called after a connection is established but before a request is made on that connection. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PREREQFUNCTION.html) */ preReqFunction?: | (( - this: EasyNativeBinding, + this: Easy, connPrimaryIp: string, connLocalIp: string, connPrimaryPort: number, @@ -5897,11 +6002,11 @@ export type CurlOptionValueType = { /** * OBSOLETE callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) */ PROGRESSFUNCTION?: | (( - this: EasyNativeBinding, + this: Easy, dltotal: number, dlnow: number, ultotal: number, @@ -5912,11 +6017,11 @@ export type CurlOptionValueType = { /** * OBSOLETE callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html) */ progressFunction?: | (( - this: EasyNativeBinding, + this: Easy, dltotal: number, dlnow: number, ultotal: number, @@ -5927,1765 +6032,1811 @@ export type CurlOptionValueType = { /** * Deprecated option Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) */ PROTOCOLS?: CurlProtocol | null /** * Deprecated option Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS.html) */ protocols?: CurlProtocol | null /** * Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) */ PROTOCOLS_STR?: string | number | boolean | null /** * Allowed protocols. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROTOCOLS_STR.html) */ protocolsStr?: string | number | boolean | null /** * Proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) */ PROXY?: string | number | boolean | null /** * Proxy to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) */ proxy?: string | number | boolean | null /** * Proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) */ PROXY_CAINFO?: string | number | boolean | null /** * Proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO.html) */ proxyCaInfo?: string | number | boolean | null /** * Proxy CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) */ PROXY_CAINFO_BLOB?: ArrayBuffer | Buffer | string | null /** * Proxy CA cert bundle memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAINFO_BLOB.html) */ proxyCaInfoBlob?: ArrayBuffer | Buffer | string | null /** * Path to proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) */ PROXY_CAPATH?: string | number | boolean | null /** * Path to proxy CA cert bundle. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CAPATH.html) */ proxyCaPath?: string | number | boolean | null /** * Proxy Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) */ PROXY_CRLFILE?: string | number | boolean | null /** * Proxy Certificate Revocation List. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_CRLFILE.html) */ proxyCrlFile?: string | number | boolean | null /** * Proxy issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) */ PROXY_ISSUERCERT?: string | number | boolean | null /** * Proxy issuer certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT.html) */ proxyIssuerCert?: string | number | boolean | null /** * Proxy issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) */ PROXY_ISSUERCERT_BLOB?: string | number | boolean | null /** * Proxy issuer certificate memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_ISSUERCERT_BLOB.html) */ proxyIssuerCertBlob?: string | number | boolean | null /** * Proxy client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) */ PROXY_KEYPASSWD?: string | number | boolean | null /** * Proxy client key password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_KEYPASSWD.html) */ proxyKeyPasswd?: string | number | boolean | null /** * Set the proxy's pinned SSL public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) */ PROXY_PINNEDPUBLICKEY?: string | number | boolean | null /** * Set the proxy's pinned SSL public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_PINNEDPUBLICKEY.html) */ proxyPinnedPublicKey?: string | number | boolean | null /** * Proxy authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) */ PROXY_SERVICE_NAME?: string | number | boolean | null /** * Proxy authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SERVICE_NAME.html) */ proxyServiceName?: string | number | boolean | null /** * Proxy ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) */ PROXY_SSL_CIPHER_LIST?: string | number | boolean | null /** * Proxy ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_CIPHER_LIST.html) */ proxySslCipherList?: string | number | boolean | null /** * Control proxy SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) */ PROXY_SSL_OPTIONS?: CurlSslOpt | null /** * Control proxy SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_OPTIONS.html) */ proxySslOptions?: CurlSslOpt | null /** - * Verify the host name in the proxy SSL certificate. + * Verify the hostname in the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) */ PROXY_SSL_VERIFYHOST?: string | number | boolean | null /** - * Verify the host name in the proxy SSL certificate. + * Verify the hostname in the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html) */ proxySslVerifyHost?: string | number | boolean | null /** * Verify the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) */ PROXY_SSL_VERIFYPEER?: string | number | boolean | null /** * Verify the proxy SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html) */ proxySslVerifyPeer?: string | number | boolean | null /** * Proxy client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) */ PROXY_SSLCERT?: ArrayBuffer | Buffer | string | null /** * Proxy client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT.html) */ proxySslCert?: ArrayBuffer | Buffer | string | null /** * Proxy client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) */ PROXY_SSLCERT_BLOB?: ArrayBuffer | Buffer | string | null /** * Proxy client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERT_BLOB.html) */ proxySslCertBlob?: ArrayBuffer | Buffer | string | null /** * Proxy client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) */ PROXY_SSLCERTTYPE?: string | number | boolean | null /** * Proxy client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLCERTTYPE.html) */ proxySslCertType?: string | number | boolean | null /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) */ PROXY_SSLKEY?: string | number | boolean | null /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY.html) */ proxySslKey?: string | number | boolean | null /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) */ PROXY_SSLKEY_BLOB?: ArrayBuffer | Buffer | string | null /** * Proxy client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEY_BLOB.html) */ proxySslKeyBlob?: ArrayBuffer | Buffer | string | null /** * Proxy client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) */ PROXY_SSLKEYTYPE?: string | number | boolean | null /** * Proxy client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLKEYTYPE.html) */ proxySslKeyType?: string | number | boolean | null /** * Proxy SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) */ PROXY_SSLVERSION?: string | number | boolean | null /** * Proxy SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_SSLVERSION.html) */ proxySslversion?: string | number | boolean | null /** - * Proxy TLS 1.3 cipher suites to use. + * Proxy TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) */ PROXY_TLS13_CIPHERS?: string | number | boolean | null /** - * Proxy TLS 1.3 cipher suites to use. + * Proxy TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLS13_CIPHERS.html) */ proxyTls13Ciphers?: string | number | boolean | null /** * Proxy TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) */ PROXY_TLSAUTH_PASSWORD?: string | number | boolean | null /** * Proxy TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_PASSWORD.html) */ proxyTlsAuthPassword?: string | number | boolean | null /** * Proxy TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) */ PROXY_TLSAUTH_TYPE?: string | number | boolean | null /** * Proxy TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_TYPE.html) */ proxyTlsAuthType?: string | number | boolean | null /** - * Proxy TLS authentication user name. + * Proxy TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) */ PROXY_TLSAUTH_USERNAME?: string | number | boolean | null /** - * Proxy TLS authentication user name. + * Proxy TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TLSAUTH_USERNAME.html) */ proxyTlsAuthUsername?: string | number | boolean | null /** * Add transfer mode to URL over proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) */ PROXY_TRANSFER_MODE?: string | number | boolean | null /** * Add transfer mode to URL over proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY_TRANSFER_MODE.html) */ proxyTransferMode?: string | number | boolean | null /** * HTTP proxy authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) */ PROXYAUTH?: string | number | boolean | null /** * HTTP proxy authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYAUTH.html) */ proxyAuth?: string | number | boolean | null /** * Custom HTTP headers sent to proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) */ PROXYHEADER?: string[] | null /** * Custom HTTP headers sent to proxy. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYHEADER.html) */ proxyHeader?: string[] | null /** * Proxy password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) */ PROXYPASSWORD?: string | number | boolean | null /** * Proxy password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPASSWORD.html) */ proxyPassword?: string | number | boolean | null /** * Proxy port to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) */ PROXYPORT?: string | number | boolean | null /** * Proxy port to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYPORT.html) */ proxyPort?: string | number | boolean | null /** * Proxy type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) */ PROXYTYPE?: CurlProxy | null /** * Proxy type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) */ proxyType?: CurlProxy | null /** - * Proxy user name. + * Proxy username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) */ PROXYUSERNAME?: string | number | boolean | null /** - * Proxy user name. + * Proxy username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERNAME.html) */ proxyUsername?: string | number | boolean | null /** - * Proxy user name and password. + * Proxy username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) */ PROXYUSERPWD?: string | number | boolean | null /** - * Proxy user name and password. + * Proxy username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_PROXYUSERPWD.html) */ proxyUserpwd?: string | number | boolean | null /** * Deprecated option Issue an HTTP PUT request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) */ PUT?: string | number | boolean | null /** * Deprecated option Issue an HTTP PUT request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_PUT.html) */ put?: string | number | boolean | null + /** + * To be set by toplevel tools like "curl" to skip lengthy cleanups when they are about to call exit() anyway. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html) + */ + QUICK_EXIT?: string | number | boolean | null + + /** + * To be set by toplevel tools like "curl" to skip lengthy cleanups when they are about to call exit() anyway. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUICK_EXIT.html) + */ + quickExit?: string | number | boolean | null + /** * Commands to run before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) */ QUOTE?: string[] | null /** * Commands to run before transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html](https://curl.haxx.se/libcurl/c/CURLOPT_QUOTE.html) */ quote?: string[] | null /** * OBSOLETE Provide source for entropy random data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) */ RANDOM_FILE?: string | number | boolean | null /** * OBSOLETE Provide source for entropy random data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANDOM_FILE.html) */ randomFile?: string | number | boolean | null /** * Range requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) */ RANGE?: string | number | boolean | null /** * Range requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RANGE.html) */ range?: string | number | boolean | null /** * Data pointer to pass to the read callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) */ READDATA?: string | number | boolean | null /** * Data pointer to pass to the read callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html) */ readData?: string | number | boolean | null /** * Callback for reading data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) */ READFUNCTION?: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) | null /** * Callback for reading data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_READFUNCTION.html) */ readFunction?: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) | null /** * Deprecated option Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) */ REDIR_PROTOCOLS?: CurlProtocol | null /** * Deprecated option Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS.html) */ redirProtocols?: CurlProtocol | null /** * Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) */ REDIR_PROTOCOLS_STR?: string | number | boolean | null /** * Protocols to allow redirects to. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html](https://curl.haxx.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html) */ redirProtocolsStr?: string | number | boolean | null /** * Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) */ REFERER?: string | number | boolean | null /** * Referer: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html](https://curl.haxx.se/libcurl/c/CURLOPT_REFERER.html) */ referer?: string | number | boolean | null /** * Set the request target. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) */ REQUEST_TARGET?: string | number | boolean | null /** * Set the request target. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html](https://curl.haxx.se/libcurl/c/CURLOPT_REQUEST_TARGET.html) */ requestTarget?: string | number | boolean | null /** * Provide fixed/fake name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) */ RESOLVE?: string[] | null /** * Provide fixed/fake name resolves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html) */ resolve?: string[] | null /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) */ RESUME_FROM?: string | number | boolean | null /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM.html) */ resumeFrom?: string | number | boolean | null /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) */ RESUME_FROM_LARGE?: string | number | boolean | null /** * Resume a transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_RESUME_FROM_LARGE.html) */ resumeFromLarge?: string | number | boolean | null /** * Client CSEQ number. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) */ RTSP_CLIENT_CSEQ?: string | number | boolean | null /** * Client CSEQ number. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_CLIENT_CSEQ.html) */ rtspClientCseq?: string | number | boolean | null /** * RTSP request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) */ RTSP_REQUEST?: CurlRtspRequest | null /** * RTSP request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_REQUEST.html) */ rtspRequest?: CurlRtspRequest | null /** * CSEQ number for RTSP Server-\>Client request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) */ RTSP_SERVER_CSEQ?: string | number | boolean | null /** * CSEQ number for RTSP Server-\>Client request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SERVER_CSEQ.html) */ rtspServerCseq?: string | number | boolean | null /** * RTSP session-id. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) */ RTSP_SESSION_ID?: string | number | boolean | null /** * RTSP session-id. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_SESSION_ID.html) */ rtspSessionId?: string | number | boolean | null /** * RTSP stream URI. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) */ RTSP_STREAM_URI?: string | number | boolean | null /** * RTSP stream URI. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_STREAM_URI.html) */ rtspStreamUri?: string | number | boolean | null /** * RTSP Transport: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) */ RTSP_TRANSPORT?: string | number | boolean | null /** * RTSP Transport: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html](https://curl.haxx.se/libcurl/c/CURLOPT_RTSP_TRANSPORT.html) */ rtspTransPort?: string | number | boolean | null /** * SASL authorization identity (identity to act as). * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) */ SASL_AUTHZID?: string | number | boolean | null /** * SASL authorization identity (identity to act as). * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_AUTHZID.html) */ saslAuthzId?: string | number | boolean | null /** * Enable SASL initial response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) */ SASL_IR?: string | number | boolean | null /** * Enable SASL initial response. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html](https://curl.haxx.se/libcurl/c/CURLOPT_SASL_IR.html) */ saslIr?: string | number | boolean | null /** * Callback for seek operations. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) */ - SEEKFUNCTION?: - | ((this: EasyNativeBinding, offset: number, origin: number) => number) - | null + SEEKFUNCTION?: ((this: Easy, offset: number, origin: number) => number) | null /** * Callback for seek operations. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SEEKFUNCTION.html) */ - seekFunction?: - | ((this: EasyNativeBinding, offset: number, origin: number) => number) - | null + seekFunction?: ((this: Easy, offset: number, origin: number) => number) | null /** * Timeout for server responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) */ SERVER_RESPONSE_TIMEOUT?: string | number | boolean | null /** * Timeout for server responses. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT.html) */ serverResponseTimeout?: string | number | boolean | null + /** + * Timeout for server responses. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html) + */ + SERVER_RESPONSE_TIMEOUT_MS?: string | number | boolean | null + + /** + * Timeout for server responses. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.html) + */ + serverResponseTimeoutMs?: string | number | boolean | null + /** * Authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) */ SERVICE_NAME?: string | number | boolean | null /** * Authentication service name. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_SERVICE_NAME.html) */ serviceName?: string | number | boolean | null /** * Share object to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) */ SHARE?: Share | null /** * Share object to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SHARE.html) */ share?: Share | null /** - * Socks5 authentication methods. + * Socks5 authentication methods. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) */ SOCKS5_AUTH?: string | number | boolean | null /** - * Socks5 authentication methods. + * Socks5 authentication methods. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_AUTH.html) */ socks5Auth?: string | number | boolean | null /** - * Socks5 GSSAPI NEC mode. + * Socks5 GSSAPI NEC mode. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) */ SOCKS5_GSSAPI_NEC?: string | number | boolean | null /** - * Socks5 GSSAPI NEC mode. + * Socks5 GSSAPI NEC mode. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_NEC.html) */ socks5GssapiNec?: string | number | boolean | null /** - * Deprecated option Socks5 GSSAPI service name. + * Deprecated option Socks5 GSSAPI service name. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) */ SOCKS5_GSSAPI_SERVICE?: string | number | boolean | null /** - * Deprecated option Socks5 GSSAPI service name. + * Deprecated option Socks5 GSSAPI service name. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SOCKS5_GSSAPI_SERVICE.html) */ socks5GssapiService?: string | number | boolean | null /** * SSH authentication types. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) */ SSH_AUTH_TYPES?: CurlSshAuth | null /** * SSH authentication types. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_AUTH_TYPES.html) */ sshAuthTypes?: CurlSshAuth | null /** * Enable SSH compression. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) */ SSH_COMPRESSION?: string | number | boolean | null /** * Enable SSH compression. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_COMPRESSION.html) */ sshCompression?: string | number | boolean | null /** - * MD5 of host's public key. + * MD5 of host's public key. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) */ SSH_HOST_PUBLIC_KEY_MD5?: string | number | boolean | null /** - * MD5 of host's public key. + * MD5 of host's public key. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.html) */ sshHostPublicKeyMd5?: string | number | boolean | null /** * Custom pointer to pass to ssh host key callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) */ SSH_HOSTKEYDATA?: string | number | boolean | null /** * Custom pointer to pass to ssh host key callback. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_HOSTKEYDATA.html) */ sshHostKeyData?: string | number | boolean | null /** - * File name with known hosts. + * Filename with known hosts. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) */ SSH_KNOWNHOSTS?: string | number | boolean | null /** - * File name with known hosts. + * Filename with known hosts. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_KNOWNHOSTS.html) */ sshKnownHosts?: string | number | boolean | null /** - * File name of private key. + * Filename of the private key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) */ SSH_PRIVATE_KEYFILE?: string | number | boolean | null /** - * File name of private key. + * Filename of the private key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PRIVATE_KEYFILE.html) */ sshPrivateKeyFile?: string | number | boolean | null /** - * File name of public key. + * Filename of the public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) */ SSH_PUBLIC_KEYFILE?: string | number | boolean | null /** - * File name of public key. + * Filename of the public key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSH_PUBLIC_KEYFILE.html) */ sshPublicKeyFile?: string | number | boolean | null /** * Ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) */ SSL_CIPHER_LIST?: string | number | boolean | null /** * Ciphers to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) */ sslCipherList?: string | number | boolean | null /** * Set key exchange curves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) */ SSL_EC_CURVES?: string | number | boolean | null /** * Set key exchange curves. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_EC_CURVES.html) */ sslEcCurves?: string | number | boolean | null /** * Enable use of ALPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) */ SSL_ENABLE_ALPN?: string | number | boolean | null /** * Enable use of ALPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_ALPN.html) */ sslEnableAlpn?: string | number | boolean | null /** * OBSOLETE Enable use of NPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) */ SSL_ENABLE_NPN?: string | number | boolean | null /** * OBSOLETE Enable use of NPN. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_ENABLE_NPN.html) */ sslEnableNpn?: string | number | boolean | null /** - * Enable TLS False Start. + * Deprecated option Enable TLS False Start. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) */ SSL_FALSESTART?: string | number | boolean | null /** - * Enable TLS False Start. + * Deprecated option Enable TLS False Start. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_FALSESTART.html) */ sslFalsestart?: string | number | boolean | null /** * Control SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) */ SSL_OPTIONS?: CurlSslOpt | null /** * Control SSL behavior. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_OPTIONS.html) */ sslOptions?: CurlSslOpt | null /** * Disable SSL session-id cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) */ SSL_SESSIONID_CACHE?: string | number | boolean | null /** * Disable SSL session-id cache. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SESSIONID_CACHE.html) */ sslSessionIdCache?: string | number | boolean | null /** - * Verify the host name in the SSL certificate. + * TLS signature algorithms to use. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html) + */ + SSL_SIGNATURE_ALGORITHMS?: string | number | boolean | null + + /** + * TLS signature algorithms to use. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_SIGNATURE_ALGORITHMS.html) + */ + sslSignatureAlgorithms?: string | number | boolean | null + + /** + * Verify the hostname in the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) */ SSL_VERIFYHOST?: string | number | boolean | null /** - * Verify the host name in the SSL certificate. + * Verify the hostname in the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) */ sslVerifyHost?: string | number | boolean | null /** * Verify the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) */ SSL_VERIFYPEER?: string | number | boolean | null /** * Verify the SSL certificate. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) */ sslVerifyPeer?: string | number | boolean | null /** * Verify the SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) */ SSL_VERIFYSTATUS?: string | number | boolean | null /** * Verify the SSL certificate's status. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYSTATUS.html) */ sslVerifyStatus?: string | number | boolean | null /** * Client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) */ SSLCERT?: string | number | boolean | null /** * Client cert. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) */ sslCert?: string | number | boolean | null /** * Client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) */ SSLCERT_BLOB?: ArrayBuffer | Buffer | string | null /** * Client cert memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT_BLOB.html) */ sslCertBlob?: ArrayBuffer | Buffer | string | null /** * Client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) */ SSLCERTTYPE?: string | number | boolean | null /** * Client cert type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLCERTTYPE.html) */ sslCertType?: string | number | boolean | null /** * Use identifier with SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) */ SSLENGINE?: string | number | boolean | null /** * Use identifier with SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE.html) */ sslEngine?: string | number | boolean | null /** * Default SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) */ SSLENGINE_DEFAULT?: string | number | boolean | null /** * Default SSL engine. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLENGINE_DEFAULT.html) */ sslEngineDefault?: string | number | boolean | null /** * Client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) */ SSLKEY?: string | number | boolean | null /** * Client key. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) */ sslKey?: string | number | boolean | null /** * Client key memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) */ SSLKEY_BLOB?: ArrayBuffer | Buffer | string | null /** * Client key memory buffer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY_BLOB.html) */ sslKeyBlob?: ArrayBuffer | Buffer | string | null /** * Client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) */ SSLKEYTYPE?: string | number | boolean | null /** * Client key type. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLKEYTYPE.html) */ sslKeyType?: string | number | boolean | null /** * SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) */ SSLVERSION?: CurlSslVersion | null /** * SSL version to use. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html](https://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) */ sslversion?: CurlSslVersion | null /** * Suppress proxy CONNECT response headers from user callbacks. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) */ SUPPRESS_CONNECT_HEADERS?: string | number | boolean | null /** * Suppress proxy CONNECT response headers from user callbacks. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_SUPPRESS_CONNECT_HEADERS.html) */ suppressConnectHeaders?: string | number | boolean | null /** * Enable TCP Fast Open. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) */ TCP_FASTOPEN?: string | number | boolean | null /** * Enable TCP Fast Open. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_FASTOPEN.html) */ tcpFastOpen?: string | number | boolean | null /** * Enable TCP keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) */ TCP_KEEPALIVE?: string | number | boolean | null /** * Enable TCP keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html) */ tcpKeepAlive?: string | number | boolean | null + /** + * Maximum number of keep-alive probes. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html) + */ + TCP_KEEPCNT?: string | number | boolean | null + + /** + * Maximum number of keep-alive probes. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPCNT.html) + */ + tcpKeepCnt?: string | number | boolean | null + /** * Idle time before sending keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) */ TCP_KEEPIDLE?: string | number | boolean | null /** * Idle time before sending keep-alive. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPIDLE.html) */ tcpKeepIdle?: string | number | boolean | null /** * Interval between keep-alive probes. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) */ TCP_KEEPINTVL?: string | number | boolean | null /** * Interval between keep-alive probes. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html) */ tcpKeepIntvl?: string | number | boolean | null /** * Disable the Nagle algorithm. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) */ TCP_NODELAY?: string | number | boolean | null /** * Disable the Nagle algorithm. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html](https://curl.haxx.se/libcurl/c/CURLOPT_TCP_NODELAY.html) */ tcpNoDelay?: string | number | boolean | null /** * TELNET options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) */ TELNETOPTIONS?: string[] | null /** * TELNET options. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TELNETOPTIONS.html) */ telnetOptions?: string[] | null /** * TFTP block size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) */ TFTP_BLKSIZE?: string | number | boolean | null /** * TFTP block size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_BLKSIZE.html) */ tftpBlkSize?: string | number | boolean | null /** * Do not send TFTP options requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) */ TFTP_NO_OPTIONS?: string | number | boolean | null /** * Do not send TFTP options requests. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TFTP_NO_OPTIONS.html) */ tftpNoOptions?: string | number | boolean | null /** * Make a time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) */ TIMECONDITION?: CurlTimeCond | null /** * Make a time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMECONDITION.html) */ timeCondition?: CurlTimeCond | null /** * Timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) */ TIMEOUT?: string | number | boolean | null /** * Timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) */ timeout?: string | number | boolean | null /** * Millisecond timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) */ TIMEOUT_MS?: string | number | boolean | null /** * Millisecond timeout for the entire request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT_MS.html) */ timeoutMs?: string | number | boolean | null /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) */ TIMEVALUE?: string | number | boolean | null /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE.html) */ timeValue?: string | number | boolean | null /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) */ TIMEVALUE_LARGE?: string | number | boolean | null /** * Time value for the time conditional request. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEVALUE_LARGE.html) */ timeValueLarge?: string | number | boolean | null /** - * TLS 1.3 cipher suites to use. + * TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) */ TLS13_CIPHERS?: string | number | boolean | null /** - * TLS 1.3 cipher suites to use. + * TLS 1.3 cipher suites to use. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html) */ tls13Ciphers?: string | number | boolean | null /** * TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) */ TLSAUTH_PASSWORD?: string | number | boolean | null /** * TLS authentication password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_PASSWORD.html) */ tlsAuthPassword?: string | number | boolean | null /** * TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) */ TLSAUTH_TYPE?: string | number | boolean | null /** * TLS authentication methods. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_TYPE.html) */ tlsAuthType?: string | number | boolean | null /** - * TLS authentication user name. + * TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) */ TLSAUTH_USERNAME?: string | number | boolean | null /** - * TLS authentication user name. + * TLS authentication username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_TLSAUTH_USERNAME.html) */ tlsAuthUsername?: string | number | boolean | null /** * Set callback for sending trailing headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) */ - TRAILERFUNCTION?: ((this: EasyNativeBinding) => string[] | false) | null + TRAILERFUNCTION?: ((this: Easy) => string[] | false) | null /** * Set callback for sending trailing headers. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRAILERFUNCTION.html) */ - trailerFunction?: ((this: EasyNativeBinding) => string[] | false) | null + trailerFunction?: ((this: Easy) => string[] | false) | null /** * Request Transfer-Encoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) */ TRANSFER_ENCODING?: string | number | boolean | null /** * Request Transfer-Encoding. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFER_ENCODING.html) */ transferEncoding?: string | number | boolean | null /** * Use text transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) */ TRANSFERTEXT?: string | number | boolean | null /** * Use text transfer. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html](https://curl.haxx.se/libcurl/c/CURLOPT_TRANSFERTEXT.html) */ transferText?: string | number | boolean | null /** * Path to a Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) */ UNIX_SOCKET_PATH?: string | number | boolean | null /** * Path to a Unix domain socket. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html) */ unixSocketPath?: string | number | boolean | null /** * Do not restrict authentication to original host. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) */ UNRESTRICTED_AUTH?: string | number | boolean | null /** * Do not restrict authentication to original host. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html](https://curl.haxx.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html) */ unrestrictedAuth?: string | number | boolean | null /** * Sets the interval at which connection upkeep are performed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) */ UPKEEP_INTERVAL_MS?: string | number | boolean | null /** * Sets the interval at which connection upkeep are performed. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPKEEP_INTERVAL_MS.html) */ upkeepIntervalMs?: string | number | boolean | null /** * Upload data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) */ UPLOAD?: string | number | boolean | null /** * Upload data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html) */ upload?: string | number | boolean | null /** * Set upload buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) */ UPLOAD_BUFFERSIZE?: string | number | boolean | null /** * Set upload buffer size. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_BUFFERSIZE.html) */ uploadBufferSize?: string | number | boolean | null + /** + * Set upload flags. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html) + */ + UPLOAD_FLAGS?: string | number | boolean | null + + /** + * Set upload flags. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html](https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD_FLAGS.html) + */ + uploadFlags?: string | number | boolean | null + /** * URL to work on. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) */ URL?: string | number | boolean | null /** * URL to work on. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_URL.html](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) */ url?: string | number | boolean | null /** * Use TLS/SSL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) */ USE_SSL?: CurlUseSsl | null /** * Use TLS/SSL. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html](https://curl.haxx.se/libcurl/c/CURLOPT_USE_SSL.html) */ useSsl?: CurlUseSsl | null /** * User-Agent: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) */ USERAGENT?: string | number | boolean | null /** * User-Agent: header. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERAGENT.html) */ userAgent?: string | number | boolean | null /** - * User name. + * Username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) */ USERNAME?: string | number | boolean | null /** - * User name. + * Username. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERNAME.html) */ username?: string | number | boolean | null /** - * User name and password. + * Username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) */ USERPWD?: string | number | boolean | null /** - * User name and password. + * Username and password. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html](https://curl.haxx.se/libcurl/c/CURLOPT_USERPWD.html) */ userpwd?: string | number | boolean | null /** * Display verbose information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) */ VERBOSE?: string | number | boolean | null /** * Display verbose information. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html](https://curl.haxx.se/libcurl/c/CURLOPT_VERBOSE.html) */ verbose?: string | number | boolean | null /** - * Transfer multiple files according to a file name pattern. + * Transfer multiple files according to a filename pattern. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) */ WILDCARDMATCH?: string | number | boolean | null /** - * Transfer multiple files according to a file name pattern. + * Transfer multiple files according to a filename pattern. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html](https://curl.haxx.se/libcurl/c/CURLOPT_WILDCARDMATCH.html) */ wildcardMatch?: string | number | boolean | null /** * Callback for writing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) */ WRITEFUNCTION?: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) | null /** * Callback for writing data. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html) */ writeFunction?: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) + | ((this: Easy, data: Buffer, size: number, nmemb: number) => number) | null /** * Callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) */ XFERINFOFUNCTION?: | (( - this: EasyNativeBinding, + this: Easy, dltotal: number, dlnow: number, ultotal: number, @@ -7696,11 +7847,11 @@ export type CurlOptionValueType = { /** * Callback for progress meter. * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLOPT_XFERINFOFUNCTION.html) */ xferInfoFunction?: | (( - this: EasyNativeBinding, + this: Easy, dltotal: number, dlnow: number, ultotal: number, @@ -7709,16 +7860,16 @@ export type CurlOptionValueType = { | null /** - * OAuth2 bearer token. + * OAuth2 bearer token. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) */ XOAUTH2_BEARER?: string | number | boolean | null /** - * OAuth2 bearer token. + * OAuth2 bearer token. See * - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html](https://curl.haxx.se/libcurl/c/CURLOPT_XOAUTH2_BEARER.html) */ xoauth2Bearer?: string | number | boolean | null } diff --git a/lib/generated/MultiOption.ts b/lib/generated/MultiOption.ts index a263cf11b..69cc179be 100644 --- a/lib/generated/MultiOption.ts +++ b/lib/generated/MultiOption.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -// This file was generated by scripts/build-constants.js on 2022-10-31T13:21:28.213Z +// This file was generated by scripts/build-constants.js on 2025-10-19T23:48:54.015Z // Do not edit manually /** @@ -12,84 +12,67 @@ */ export interface MultiOption { /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html](https://curl.haxx.se/libcurl/c/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html) + * deprecated + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html](https://curl.haxx.se/libcurl/c/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.html) */ readonly CHUNK_LENGTH_PENALTY_SIZE: 'CHUNK_LENGTH_PENALTY_SIZE' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html](https://curl.haxx.se/libcurl/c/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html) + * deprecated + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html](https://curl.haxx.se/libcurl/c/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.html) */ readonly CONTENT_LENGTH_PENALTY_SIZE: 'CONTENT_LENGTH_PENALTY_SIZE' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_CONCURRENT_STREAMS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_CONCURRENT_STREAMS.html) + * Max concurrent streams for http2. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_CONCURRENT_STREAMS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_CONCURRENT_STREAMS.html) */ readonly MAX_CONCURRENT_STREAMS: 'MAX_CONCURRENT_STREAMS' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_HOST_CONNECTIONS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_HOST_CONNECTIONS.html) + * Max number of connections to a single host. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_HOST_CONNECTIONS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_HOST_CONNECTIONS.html) */ readonly MAX_HOST_CONNECTIONS: 'MAX_HOST_CONNECTIONS' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_PIPELINE_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_PIPELINE_LENGTH.html) + * deprecated. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_PIPELINE_LENGTH.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_PIPELINE_LENGTH.html) */ readonly MAX_PIPELINE_LENGTH: 'MAX_PIPELINE_LENGTH' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_TOTAL_CONNECTIONS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_TOTAL_CONNECTIONS.html) + * Max simultaneously open connections. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_TOTAL_CONNECTIONS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAX_TOTAL_CONNECTIONS.html) */ readonly MAX_TOTAL_CONNECTIONS: 'MAX_TOTAL_CONNECTIONS' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAXCONNECTS.html) + * Size of connection cache. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_MAXCONNECTS.html](https://curl.haxx.se/libcurl/c/CURLMOPT_MAXCONNECTS.html) */ readonly MAXCONNECTS: 'MAXCONNECTS' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING.html](https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING.html) + * Signal that the network has changed. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_NETWORK_CHANGED.html](https://curl.haxx.se/libcurl/c/CURLMOPT_NETWORK_CHANGED.html) */ - readonly PIPELINING: 'PIPELINING' + readonly NETWORK_CHANGED: 'NETWORK_CHANGED' /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING_SERVER_BL.html](https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING_SERVER_BL.html) - */ - readonly PIPELINING_SERVER_BL: 'PIPELINING_SERVER_BL' - - /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING_SITE_BL.html](https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING_SITE_BL.html) - */ - readonly PIPELINING_SITE_BL: 'PIPELINING_SITE_BL' - - /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHDATA.html](https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHDATA.html) - */ - readonly PUSHDATA: 'PUSHDATA' - - /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHFUNCTION.html) + * Callback that approves or denies server pushes. + * + * Official libcurl documentation: [https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHFUNCTION.html) */ readonly PUSHFUNCTION: 'PUSHFUNCTION' - - /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_SOCKETDATA.html](https://curl.haxx.se/libcurl/c/CURLMOPT_SOCKETDATA.html) - */ - readonly SOCKETDATA: 'SOCKETDATA' - - /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_SOCKETFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLMOPT_SOCKETFUNCTION.html) - */ - readonly SOCKETFUNCTION: 'SOCKETFUNCTION' - - /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_TIMERDATA.html](https://curl.haxx.se/libcurl/c/CURLMOPT_TIMERDATA.html) - */ - readonly TIMERDATA: 'TIMERDATA' - - /** - * Official libcurl documentation: : [https://curl.haxx.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html](https://curl.haxx.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html) - */ - readonly TIMERFUNCTION: 'TIMERFUNCTION' } /** @@ -103,12 +86,5 @@ export type MultiOptionName = | 'MAX_PIPELINE_LENGTH' | 'MAX_TOTAL_CONNECTIONS' | 'MAXCONNECTS' - | 'PIPELINING' - | 'PIPELINING_SERVER_BL' - | 'PIPELINING_SITE_BL' - | 'PUSHDATA' + | 'NETWORK_CHANGED' | 'PUSHFUNCTION' - | 'SOCKETDATA' - | 'SOCKETFUNCTION' - | 'TIMERDATA' - | 'TIMERFUNCTION' diff --git a/lib/index.ts b/lib/index.ts index 4d97b053d..a860f1f31 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -8,11 +8,33 @@ * node-libcurl * @packageDocumentation */ +import './moduleSetup' + export { Curl } from './Curl' -export { Easy } from './Easy' +export { Easy, GetInfoReturn } from './Easy' +// import { Easy as EasyCls } from './Easy' +// // @ts-expect-error +// import type { Easy } from './types' +// /** @class Easy */ +// export const Easy = EasyCls + export { Multi } from './Multi' export { Share } from './Share' -export { curly, CurlyFunction, CurlyResult } from './curly' +export { + curly, + CurlyFunction, + CurlyResult, + type CurlyHttpMethodCall, + type CurlyOptions, + type CurlyResponseBodyParsersProperty, + type CurlyResponseBodyParser, +} from './curly' + +// errors +export * from './CurlError' +export * from './CurlEasyError' +export * from './CurlMultiError' +export * from './CurlSharedError' // enums export * from './enum/CurlAuth' @@ -21,6 +43,7 @@ export * from './enum/CurlCode' export * from './enum/CurlFeature' export * from './enum/CurlFileType' export * from './enum/CurlFnMatchFunc' +export * from './enum/CurlFollow' export * from './enum/CurlFtpMethod' export * from './enum/CurlFtpSsl' export * from './enum/CurlGlobalInit' @@ -30,9 +53,11 @@ export * from './enum/CurlHsts' export * from './enum/CurlHttpVersion' export * from './enum/CurlInfoDebug' export * from './enum/CurlIpResolve' +export * from './enum/CurlMultiNetworkChanged' export * from './enum/CurlNetrc' export * from './enum/CurlPause' export * from './enum/CurlPipe' +export * from './enum/CurlPreReqFunc' export * from './enum/CurlProgressFunc' export * from './enum/CurlProtocol' export * from './enum/CurlProxy' @@ -46,9 +71,11 @@ export * from './enum/CurlSshAuth' export * from './enum/CurlSslOpt' export * from './enum/CurlSslVersion' export * from './enum/CurlTimeCond' +export * from './enum/CurlUploadFlag' export * from './enum/CurlUseSsl' export * from './enum/CurlVersion' export * from './enum/CurlWriteFunc' +export * from './enum/CurlWs' export * from './enum/SocketState' // types that can be helpful for library consumer @@ -59,7 +86,17 @@ export { CurlOption, CurlOptionName, CurlOptionValueType, + DataCallbackOptions, + ProgressCallbackOptions, + BlobOptions, + type StringListOptions, } from './generated/CurlOption' export { MultiOption, MultiOptionName } from './generated/MultiOption' -export { FileInfo, Http2PushFrameHeaders, HttpPostField } from './types' +export { + CurlWsFrame, + FileInfo, + Http2PushFrameHeaders, + HttpPostField, + CurlVersionInfoNativeBindingObject, +} from './types' diff --git a/lib/moduleSetup.ts b/lib/moduleSetup.ts new file mode 100644 index 000000000..a6d68769a --- /dev/null +++ b/lib/moduleSetup.ts @@ -0,0 +1,15 @@ +import tls from 'node:tls' +import { CurlEasyError } from './CurlEasyError' +import { CurlMultiError } from './CurlMultiError' +import { CurlSharedError } from './CurlSharedError' +// this is ugly, but required so we can easily access these modules from C++ +// order is important here +;(globalThis as any).__libcurlTls = tls +;(globalThis as any).__libcurlCurlEasyError = CurlEasyError +;(globalThis as any).__libcurlCurlMultiError = CurlMultiError +;(globalThis as any).__libcurlCurlSharedError = CurlSharedError +require('../lib/binding/node_libcurl.node') +delete (globalThis as any).__libcurlTls +delete (globalThis as any).__libcurlCurlEasyError +delete (globalThis as any).__libcurlCurlMultiError +delete (globalThis as any).__libcurlCurlSharedError diff --git a/lib/parseHeaders.ts b/lib/parseHeaders.ts index 1599830f7..63e8d78da 100644 --- a/lib/parseHeaders.ts +++ b/lib/parseHeaders.ts @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ /** - * Whe data parsing is enabled on the {@link "Curl".Curl} instance, the headers parameter passed + * Whe data parsing is enabled on the {@link Curl} instance, the headers parameter passed * to the `end` event's callback will be one array of this type. * @public */ diff --git a/lib/types/CurlNativeBinding.ts b/lib/types/CurlNativeBinding.ts index 5a7d743ef..75303ac45 100644 --- a/lib/types/CurlNativeBinding.ts +++ b/lib/types/CurlNativeBinding.ts @@ -4,8 +4,6 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -import { CurlGlobalInit } from '../enum/CurlGlobalInit' - import { CurlInfo } from '../generated/CurlInfo' import { CurlOption } from '../generated/CurlOption' import { MultiOption } from '../generated/MultiOption' @@ -16,8 +14,6 @@ import { MultiOption } from '../generated/MultiOption' * @internal */ export declare interface CurlNativeBindingObject { - globalInit(flags: CurlGlobalInit): number - globalCleanup(): void getVersion(): string VERSION_NUM: number diff --git a/lib/types/CurlVersionInfoNativeBinding.ts b/lib/types/CurlVersionInfoNativeBinding.ts index bed72468d..5f7ae28c8 100644 --- a/lib/types/CurlVersionInfoNativeBinding.ts +++ b/lib/types/CurlVersionInfoNativeBinding.ts @@ -6,6 +6,7 @@ */ import { CurlVersion } from '../enum/CurlVersion' +import { Curl } from '../Curl' /** * This is the data returned on {@link Curl.getVersionInfo| `Curl.getVersionInfo`}. diff --git a/lib/types/CurlWsFrame.ts b/lib/types/CurlWsFrame.ts new file mode 100644 index 000000000..33356ec03 --- /dev/null +++ b/lib/types/CurlWsFrame.ts @@ -0,0 +1,48 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import { CurlWs } from '../enum/CurlWs' + +/** + * WebSocket frame metadata + * + * This structure contains information about a WebSocket frame received or being sent. + * It is returned by {@link Easy.wsMeta | `Easy#wsMeta`} when called from within a + * WRITEFUNCTION callback, or as part of the return value from {@link Easy.wsRecv | `Easy#wsRecv`}. + * + * The naming convention of the fields is following libcurl's own naming convention. + * + * @public + */ +export interface CurlWsFrame { + /** + * The age of this struct. Always zero for now. + */ + age: number + + /** + * Bitmask describing the WebSocket frame. See {@link CurlWs | `CurlWs`} for flag values. + */ + flags: CurlWs + + /** + * When this chunk is a continuation of frame data already delivered, + * this is the offset into the final frame data where this piece belongs. + */ + offset: number + + /** + * If this is not a complete fragment, the bytesleft field informs about + * how many additional bytes are expected to arrive before this fragment + * is complete. If zero, the frame is complete. + */ + bytesleft: number + + /** + * The length of the current data chunk. + */ + len: number +} diff --git a/lib/types/EasyNativeBinding.ts b/lib/types/EasyNativeBinding.ts deleted file mode 100644 index 9152e443c..000000000 --- a/lib/types/EasyNativeBinding.ts +++ /dev/null @@ -1,590 +0,0 @@ -/** - * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -import { Share } from '../Share' -import { - CurlOptionName, - DataCallbackOptions, - ProgressCallbackOptions, - BlobOptions, - StringListOptions, - SpecificOptions, -} from '../generated/CurlOption' -import { CurlInfoName } from '../generated/CurlInfo' - -import { CurlChunk } from '../enum/CurlChunk' -import { CurlCode } from '../enum/CurlCode' -import { CurlFnMatchFunc } from '../enum/CurlFnMatchFunc' -import { CurlFtpMethod } from '../enum/CurlFtpMethod' -import { CurlFtpSsl } from '../enum/CurlFtpSsl' -import { CurlGssApi } from '../enum/CurlGssApi' -import { CurlHeader } from '../enum/CurlHeader' -import { - CurlHsts, - CurlHstsCacheEntry, - CurlHstsCacheCount, -} from '../enum/CurlHsts' -import { CurlHttpVersion } from '../enum/CurlHttpVersion' -import { CurlInfoDebug } from '../enum/CurlInfoDebug' -import { CurlIpResolve } from '../enum/CurlIpResolve' -import { CurlNetrc } from '../enum/CurlNetrc' -import { CurlPause } from '../enum/CurlPause' -import { CurlPreReqFunc } from '../enum/CurlPreReqFunc' -import { CurlProgressFunc } from '../enum/CurlProgressFunc' -import { CurlProtocol } from '../enum/CurlProtocol' -import { CurlProxy } from '../enum/CurlProxy' -import { CurlRtspRequest } from '../enum/CurlRtspRequest' -import { CurlSshAuth } from '../enum/CurlSshAuth' -import { CurlSslOpt } from '../enum/CurlSslOpt' -import { CurlSslVersion } from '../enum/CurlSslVersion' -import { CurlTimeCond } from '../enum/CurlTimeCond' -import { CurlUseSsl } from '../enum/CurlUseSsl' -import { SocketState } from '../enum/SocketState' - -import { FileInfo, HttpPostField } from './' - -export interface GetInfoReturn { - data: DataType - code: CurlCode -} - -export type CurlInfoNameSpecific = 'CERTINFO' - -/** - * `Easy` class that acts as an wrapper around the libcurl connection handle. - * > [C++ source code](https://github.com/JCMais/node-libcurl/blob/master/src/Easy.cc) - * - * It can be used by itself, in a synchronous way: - * ```javascript - * import { Curl, CurlCode, Easy } from 'node-libcurl' - * import { StringDecoder } from 'string_decoder' - * - * const decoder = new StringDecoder('utf8') - * const easyHandle = new Easy() - * - * easyHandle.setOpt(Curl.option.URL, 'https://www.google.com') - * // This is used to receive the headers - * // See https://curl.haxx.se/libcurl/c/CURLOPT_HEADERFUNCTION.html - * easyHandle.setOpt(Curl.option.HEADERFUNCTION, function (buf, size, nmemb) { - * console.log('Received some headers:', decoder.write(buf)) - * return size * nmemb - * }) - * - * // This is used to receive the response data - * // See https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html - * easyHandle.setOpt(Curl.option.WRITEFUNCTION, function (buf, size, nmemb) { - * console.log('Received some body:', decoder.write(buf)) - * return size * nmemb - * }) - * - * // this will trigger the request - * const ret = easyHandle.perform() - * // The Easy handle will block the JS main thread: - * console.log('I will only show after the request has finished') - * // In case there is something wrong, you can use Easy.strError to get a human readable string about the error - * console.log(ret, ret === CurlCode.CURLE_OK, Easy.strError(ret)) - * // Remember to always close the handle after you have finished using it for good - * easyHandle.close() - * ``` - * - * or with the {@link MultiNativeBinding | Multi} class, allowing asynchronous usage. - * - * @public - */ -export declare class EasyNativeBinding { - /** - * This will be `true` if the handle was added to a {@link MultiNativeBinding | `Multi`} handle. - */ - readonly isInsideMultiHandle: boolean - /** - * This will be `true` if {@link monitorSocketEvents | `monitorSocketEvents`} was called. - */ - readonly isMonitoringSockets: boolean - /** - * This will be `true` if {@link close | `close`} was not called. - */ - readonly isOpen: boolean - - /** - * You can set this to anything - Use it to bind some data to this Easy instance. - * - * This will not be copied to other instaces created when duplicating this one. - */ - private: any - - // START AUTOMATICALLY GENERATED CODE - DO NOT EDIT - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: DataCallbackOptions, - value: - | (( - this: EasyNativeBinding, - data: Buffer, - size: number, - nmemb: number, - ) => number) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: ProgressCallbackOptions, - value: - | (( - this: EasyNativeBinding, - dltotal: number, - dlnow: number, - ultotal: number, - ulnow: number, - ) => number | CurlProgressFunc) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: StringListOptions, value: string[] | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: BlobOptions, - value: ArrayBuffer | Buffer | string | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'CHUNK_BGN_FUNCTION', - value: - | (( - this: EasyNativeBinding, - fileInfo: FileInfo, - remains: number, - ) => CurlChunk) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'CHUNK_END_FUNCTION', - value: ((this: EasyNativeBinding) => CurlChunk) | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'DEBUGFUNCTION', - value: - | ((this: EasyNativeBinding, type: CurlInfoDebug, data: Buffer) => 0) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'FNMATCH_FUNCTION', - value: - | (( - this: EasyNativeBinding, - pattern: string, - value: string, - ) => CurlFnMatchFunc) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * You can either return a single `CurlHstsReadCallbackResult` object or an array of `CurlHstsReadCallbackResult` objects. - * If returning an array, the callback will only be called once per request. - * If returning a single object, the callback will be called multiple times until `null` is returned. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'HSTSREADFUNCTION', - value: - | (( - this: EasyNativeBinding, - ) => null | CurlHstsCacheEntry | CurlHstsCacheEntry[]) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'HSTSWRITEFUNCTION', - value: - | (( - this: EasyNativeBinding, - cacheEntry: CurlHstsCacheEntry, - cacheCount: CurlHstsCacheCount, - ) => any) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'PREREQFUNCTION', - value: - | (( - this: EasyNativeBinding, - connPrimaryIp: string, - connLocalIp: string, - connPrimaryPort: number, - conLocalPort: number, - ) => CurlPreReqFunc) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'SEEKFUNCTION', - value: - | ((this: EasyNativeBinding, offset: number, origin: number) => number) - | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: 'TRAILERFUNCTION', - value: ((this: EasyNativeBinding) => string[] | false) | null, - ): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'SHARE', value: Share | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'HTTPPOST', value: HttpPostField[] | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'FTP_SSL_CCC', value: CurlFtpSsl | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'FTP_FILEMETHOD', value: CurlFtpMethod | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'GSSAPI_DELEGATION', value: CurlGssApi | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'HEADEROPT', value: CurlHeader | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'HTTP_VERSION', value: CurlHttpVersion | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'IPRESOLVE', value: CurlIpResolve | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'NETRC', value: CurlNetrc | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'PROTOCOLS', value: CurlProtocol | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'PROXY_SSL_OPTIONS', value: CurlSslOpt | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'PROXYTYPE', value: CurlProxy | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'REDIR_PROTOCOLS', value: CurlProtocol | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'RTSP_REQUEST', value: CurlRtspRequest | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'SSH_AUTH_TYPES', value: CurlSshAuth | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'SSL_OPTIONS', value: CurlSslOpt | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'SSLVERSION', value: CurlSslVersion | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'TIMECONDITION', value: CurlTimeCond | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'USE_SSL', value: CurlUseSsl | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt(option: 'HSTS_CTRL', value: CurlHsts | null): CurlCode - /** - * Use {@link "Curl".Curl.option|`Curl.option`} for predefined constants. - * - * - * Official libcurl documentation: [`curl_easy_setopt()`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) - */ - setOpt( - option: Exclude, - value: string | number | boolean | null, - ): CurlCode - // END AUTOMATICALLY GENERATED CODE - DO NOT EDIT - - // overloaded getInfo definitions - changes made here must also be made in Curl.ts - // TODO: do this automatically, like above. - - /** - * Official libcurl documentation: [`curl_easy_getinfo()`](http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html) - * - * @param info Info to retrieve. Use {@link "Curl".Curl.info | `Curl.info`} for predefined constants. - */ - getInfo(info: 'CERTINFO'): GetInfoReturn - - /** - * Returns information about the finished connection. - * - * Official libcurl documentation: [`curl_easy_getinfo()`](http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html) - * - * @param info Info to retrieve. Use {@link "Curl".Curl.info | `Curl.info`} for predefined constants. - */ - getInfo(info: Exclude): GetInfoReturn - - /** - * Sends arbitrary data over the established connection. - * - * See also {@link onSocketEvent | `onSocketEvent`}. - * - * Official libcurl documentation: [`curl_easy_send()`](http://curl.haxx.se/libcurl/c/curl_easy_send.html) - */ - send(data: Buffer): { code: CurlCode; bytesSent: number } - - /** - * Receives data over the established connection, data will be written to the passed buffer. - * - * See also {@link onSocketEvent | `onSocketEvent`}. - * - * Official libcurl documentation: [`curl_easy_recv()`](http://curl.haxx.se/libcurl/c/curl_easy_recv.html) - */ - recv(storage: Buffer): { code: CurlCode; bytesReceived: number } - - /** - * Performs the entire request in a blocking manner and returns when done. - * - * Official libcurl documentation: [`curl_easy_perform()`](http://curl.haxx.se/libcurl/c/curl_easy_perform.html) - */ - perform(): CurlCode - - /** - * Perform any connection upkeep checks. - * - * Official libcurl documentation: [curl_easy_upkeep()](http://curl.haxx.se/libcurl/c/curl_easy_upkeep.html) - */ - upkeep(): CurlCode - - /** - * Using this function, you can explicitly mark a running connection - * to get paused, and you can unpause a connection that was previously paused. - * - * Use the {@link CurlPause | `CurlPause`} enum for predefined constants. - * - * Official libcurl documentation: [`curl_easy_pause()`](http://curl.haxx.se/libcurl/c/curl_easy_pause.html) - */ - pause(bitmask: CurlPause): CurlCode - - /** - * Reset this handle to their original state. - * - * This method is useful if you plan to reuse this handle later on. - * - * Official libcurl documentation: [`curl_easy_reset()`](http://curl.haxx.se/libcurl/c/curl_easy_reset.html) - */ - reset(): CurlCode - - /** - * Duplicate this handle with all their options and callbacks. - * - * Official libcurl documentation: [`curl_easy_duphandle()`](http://curl.haxx.se/libcurl/c/curl_easy_duphandle.html) - */ - dupHandle(): EasyNativeBinding - - /** - * This method is only useful when the internal polling of the connection socket is enabled by calling - * {@link monitorSocketEvents | `monitorSocketEvents`}. - * - * The passed callback is going to be called everytime there are changes to the connection socket. - * - * One use case for this is when using the {@link send | `send`} and {@link recv | `recv`} methods - * - * A full example is available at [examples/15-send-recv-methods.js](https://github.com/JCMais/node-libcurl/blob/master/examples/15-send-recv-methods.js) - * - * Pass `null` to remove the current callback set. - */ - onSocketEvent( - cb: ((error: Error | null, events: SocketState) => void) | null, - ): this - - /** - * Start monitoring for events in the connection socket used by this handle. - * - * This is only useful if using the {@link onSocketEvent | `onSocketEvent`} callback. - * - * This method will throw an Error if the handle is already monitoring socket events. - * You can use {@link isMonitoringSockets | `isMonitoringSockets`} to check if socket events are already being monitored or not. - */ - monitorSocketEvents(): this - - /** - * Stop monitoring for events in the connection socket used by this handle. - * - * This method will throw an Error if the handle is not monitoring socket events. - * You can use {@link isMonitoringSockets | `isMonitoringSockets`} to check if socket events are already being monitored or not. - */ - unmonitorSocketEvents(): this - - /** - * Close this handle and dispose any resources bound to it. - * After closed, the handle **MUST** not be used again, doing so will throw an Error. - * - * This is basically the same than [`curl_easy_cleanup()`](http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html) - */ - close(): void - - // below ones are duplicated from below - // just so that it also appears on the documentation for this class - - /** - * Returns a description for the given error code. - * - * Official libcurl documentation: [`curl_easy_strerror()`](http://curl.haxx.se/libcurl/c/curl_easy_strerror.html) - */ - static strError(errorCode: CurlCode): string -} - -export declare interface EasyNativeBindingObject { - new (): EasyNativeBinding - - /** - * Returns a description for the given error code. - * - * Official libcurl documentation: [`curl_easy_strerror()`](http://curl.haxx.se/libcurl/c/curl_easy_strerror.html) - */ - strError(errorCode: CurlCode): string -} diff --git a/lib/types/MultiNativeBinding.ts b/lib/types/MultiNativeBinding.ts deleted file mode 100644 index 115cbeff0..000000000 --- a/lib/types/MultiNativeBinding.ts +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -import { MultiOptionName } from '../generated/MultiOption' -import { CurlMultiCode, CurlCode } from '../enum/CurlCode' -import { CurlPipe } from '../enum/CurlPipe' -import { CurlPush } from '../enum/CurlPush' - -import { EasyNativeBinding } from './EasyNativeBinding' -import { Http2PushFrameHeaders } from './Http2PushFrameHeaders' - -type SpecificOptions = 'PIPELINING' - -/** - * `Multi` class that acts as an wrapper around the native libcurl multi handle. - * > [C++ source code](https://github.com/JCMais/node-libcurl/blob/master/src/Multi.cc) - * - * Using this class instead of just the {@link "Easy".Easy | Easy} allows one to run requests asynchronously. - * - * For usage see [examples/04-multi.js](https://github.com/JCMais/node-libcurl/blob/master/examples/04-multi.js) - * - * The {@link "Curl".Curl | Curl} class uses one of this internally to provide asynchronous usage of the library. - * - * @public - */ -export declare class MultiNativeBinding { - /** - * Sets the [`PIPELINING`](https://curl.haxx.se/libcurl/c/CURLMOPT_PIPELINING.html) option. - * - * Official libcurl documentation: [`curl_multi_setopt()`](http://curl.haxx.se/libcurl/c/curl_multi_setopt.html) - */ - setOpt(option: 'PIPELINING', value: CurlPipe): CurlMultiCode - - /** - * Sets the [`PUSHFUNCTION`](https://curl.haxx.se/libcurl/c/CURLMOPT_PUSHFUNCTION.html) option. - * - * @remarks - * You **must** not use the {@link Http2PushFrameHeaders | `Http2PushFrameHeaders`} object outside - * of this callback, doing so will try to use memory that libcurl has already - * freed and, in the best case scenario, will cause a segmentation fault. - * - * In case you have denied the push, you **must** also not use the `duplicatedHandle` - * outside of this callback, as libcurl would already have closed it and you would - * try to access memory that has been freed. - * - * Errors thrown inside this callback will have the same effect than returning `CurlPush.Deny`. - * - * Per a libcurl limitation, there is no direct way to cancel the connection from inside - * this callback, a possible workaround is to return an error - * from another callback, like the progress one. - * - * Official libcurl documentation: [`curl_multi_setopt()`](http://curl.haxx.se/libcurl/c/curl_multi_setopt.html) - */ - setOpt( - option: 'PUSHFUNCTION', - value: ( - parent: EasyNativeBinding, - duplicatedHandle: EasyNativeBinding, - pushFrameHeaders: Http2PushFrameHeaders, - ) => CurlPush, - ): CurlMultiCode - - /** - * Sets options on this instance. - * - * Use {@link "Multi".Multi.multi | `Multi.option`} for predefined constants. - * - * Official libcurl documentation: [`curl_multi_setopt()`](http://curl.haxx.se/libcurl/c/curl_multi_setopt.html) - */ - setOpt( - option: Exclude, - value: number, - ): CurlMultiCode - - /** - * Adds an {@link "Easy".Easy | `Easy`} handle to be managed by this instance. - * - * The request will start right after calling this method. - * - * Official libcurl documentation: [`curl_multi_add_handle()`](http://curl.haxx.se/libcurl/c/curl_multi_add_handle.html) - * - */ - addHandle(handle: EasyNativeBinding): CurlMultiCode - - /** - * Removes an {@link "Easy".Easy | `Easy`} handle that was inside this instance. - * - * Official libcurl documentation: [`curl_multi_remove_handle()`](http://curl.haxx.se/libcurl/c/curl_multi_remove_handle.html) - */ - removeHandle(handle: EasyNativeBinding): CurlMultiCode - - /** - * Allow to provide a callback that will be called when there are - * new information about the handles inside this instance. - * - * This is basically an abstraction over [`curl_multi_info_read()`](http://curl.haxx.se/libcurl/c/curl_multi_info_read.html) - * - * Pass `null` to remove the current callback set. - */ - onMessage( - cb: - | (( - error: Error, - easyHandle: EasyNativeBinding, - errorCode: CurlCode, - ) => void) - | null, - ): this - - /** - * Returns the number of {@link "Easy".Easy | 'Easy'} handles that are currently inside this instance - */ - getCount(): number - - /** - * Closes this multi handle. - * - * After the handle has been closed it must not be used again. - * - * This is basically the same than [`curl_multi_cleanup()`](http://curl.haxx.se/libcurl/c/curl_multi_cleanup.html) - */ - close(): void - - // below ones are duplicated from below - // just so that it also appears on the documentation for this class - - /** - * Returns a description for the given error code. - * - * Official libcurl documentation: [`curl_multi_strerror()`](http://curl.haxx.se/libcurl/c/curl_multi_strerror.html) - */ - strError(errorCode: CurlMultiCode): string -} - -export declare interface MultiNativeBindingObject { - new (): MultiNativeBinding - - /** - * Returns a description for the given error code. - * - * Official libcurl documentation: [`curl_multi_strerror()`](http://curl.haxx.se/libcurl/c/curl_multi_strerror.html) - */ - strError(errorCode: CurlMultiCode): string -} diff --git a/lib/types/NodeLibcurlNativeBinding.ts b/lib/types/NodeLibcurlNativeBinding.ts index ab2b369c4..fc5c0c027 100644 --- a/lib/types/NodeLibcurlNativeBinding.ts +++ b/lib/types/NodeLibcurlNativeBinding.ts @@ -1,38 +1,33 @@ +/* eslint-disable @typescript-eslint/no-namespace */ /** * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -import { - CurlNativeBindingObject, - CurlVersionInfoNativeBindingObject, - EasyNativeBindingObject, - MultiNativeBindingObject, - ShareNativeBindingObject, -} from './' +import { CurlNativeBindingObject, CurlVersionInfoNativeBindingObject } from './' // type Constructable = { // new (): T // } & B -/** - * This is the interface exported from the addon binding itself. - * Not available for library users. - * - * @internal - */ -export interface NodeLibcurlNativeBinding { - // This would work too, but I don't like it - // Curl: Constructable< - // CurlNativeBinding, - // { - // globalInit(): void - // } - // > - Curl: CurlNativeBindingObject - CurlVersionInfo: CurlVersionInfoNativeBindingObject - Easy: EasyNativeBindingObject - Multi: MultiNativeBindingObject - Share: ShareNativeBindingObject +export declare namespace NodeLibcurlNativeBinding { + export const Curl: CurlNativeBindingObject + export const CurlVersionInfo: CurlVersionInfoNativeBindingObject } + +// /** +// * This is the interface exported from the addon binding itself. +// * Not available for library users. +// * +// * @internal +// */ +// export interface NodeLibcurlNativeBinding { +// // This would work too, but I don't like it +// // Curl: Constructable< +// // CurlNativeBinding, +// // { +// // globalInit(): void +// // } +// // > +// } diff --git a/lib/types/ShareNativeBinding.ts b/lib/types/ShareNativeBinding.ts index 4b347faed..4caa4a616 100644 --- a/lib/types/ShareNativeBinding.ts +++ b/lib/types/ShareNativeBinding.ts @@ -14,7 +14,7 @@ import { CurlShareLock } from '../enum/CurlShareLock' * > [C++ source code](https://github.com/JCMais/node-libcurl/blob/master/src/Share.cc) * * Using this class you should be able to share data between - * two {@link "Easy".Easy | Easy} handles, like cookies for instance. + * two {@link Easy | Easy} handles, like cookies for instance. * * For usage see [examples/05-share.js](https://github.com/JCMais/node-libcurl/blob/master/examples/05-share.js) * diff --git a/lib/types/index.ts b/lib/types/index.ts index b555f917c..cb3a637e0 100644 --- a/lib/types/index.ts +++ b/lib/types/index.ts @@ -6,14 +6,10 @@ */ export { CurlNativeBindingObject } from './CurlNativeBinding' export { CurlVersionInfoNativeBindingObject } from './CurlVersionInfoNativeBinding' -export { EasyNativeBinding, EasyNativeBindingObject } from './EasyNativeBinding' +export { CurlWsFrame } from './CurlWsFrame' export { FileInfo } from './FileInfo' export { Http2PushFrameHeaders } from './Http2PushFrameHeaders' export { HttpPostField } from './HttpPostField' -export { - MultiNativeBinding, - MultiNativeBindingObject, -} from './MultiNativeBinding' export { NodeLibcurlNativeBinding } from './NodeLibcurlNativeBinding' export { ShareNativeBinding, diff --git a/netlify.toml b/netlify.toml index 95c78e323..d22ce5680 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,5 +1,5 @@ [build] - command = "yarn docs" + command = "pnpm gen:docs" publish = "docs" # Production context: All deploys from the main diff --git a/overlays/.gitkeep b/overlays/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/package.json b/package.json index e6069f136..9dcd4293d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-libcurl", - "version": "4.1.0", + "version": "5.0.0-4", "description": "The fastest http(s) client (and much more) for Node.js - Node.js bindings for libcurl", "keywords": [ "node-curl", @@ -28,7 +28,9 @@ "dist", "scripts", "src", - "LIBCURL_VERSION_WIN_DEPS" + "vcpkg.template.json", + "vcpkg-configuration.json", + "overlays" ], "binary": { "module_name": "node_libcurl", @@ -43,24 +45,24 @@ "brute-force-leak-test:run:debug:gdb": "gdb --args node --inspect --expose_gc -r ts-node/register ./tools/brute-force-leak-test.ts", "brute-force-leak-test:server": "http-server ./tools/brute-force-server-static-folder -p 8080 -s", "build:dist": "tsc", - "clean": "yarn clean:build && yarn clean:dist", + "clean": "pnpm clean:build && pnpm clean:dist", "clean:build": "rimraf build", "clean:dist": "rimraf dist tsconfig.tsbuildinfo", - "docs": "typedoc", - "gen:compile_commands:debug": "yarn pregyp -- configure --debug -- --format=\"gyp.generator.compile_commands_json.py\"", - "gen:compile_commands:release": "yarn pregyp -- configure --release -- --format=\"gyp.generator.compile_commands_json.py\"", + "gen:compile_commands": "node-pre-gyp configure -- -f compile_commands_json && cp ./build/Debug/compile_commands.json ./compile_commands.json", "gen:constants": "node scripts/build-constants.js", + "gen:docs": "typedoc", + "preinstall": "node scripts/vcpkg-setup.js", "install": "node-pre-gyp install --fallback-to-build", "postinstall": "node scripts/postinstall", "lint": "eslint lib/ scripts/ test/ examples/", "pregyp": "node-pre-gyp", "prepare": "husky", "prettier": "prettier --write", - "prettier:all": "yarn prettier lib/**/*.ts tools/**/*.js scripts/**/*.js test/**/*.ts examples/**/*.js", + "prettier:all": "pnpm prettier lib/**/*.ts tools/**/*.js scripts/**/*.js test/**/*.ts examples/**/*.js", "test": "vitest run --testTimeout=60000", - "test:coverage": "yarn test --coverage.enabled=true", + "test:coverage": "pnpm test -- --coverage.enabled=true", "test:watch": "vitest --testTimeout=60000", - "preversion": "yarn lint && yarn clean:dist && yarn build:dist" + "preversion": "pnpm lint && pnpm clean:dist && pnpm build:dist" }, "lint-staged": { "*.{cpp,cc,h}": [ @@ -76,17 +78,19 @@ ] }, "dependencies": { - "@mapbox/node-pre-gyp": "1.0.11", + "@mapbox/node-pre-gyp": "2.0.0", "env-paths": "2.2.0", - "nan": "github:JCMais/nan#fix/electron-failures", - "node-gyp": "10.2.0", + "node-addon-api": "8.5.0", + "node-gyp": "11.4.2", "npmlog": "7.0.1", "rimraf": "5.0.5", "tslib": "2.6.2" }, "devDependencies": { "@commitlint/cli": "18.4.3", - "@electron/rebuild": "^3.7.1", + "@electron/rebuild": "4.0.1", + "@eslint/eslintrc": "3.3.1", + "@eslint/js": "9.36.0", "@microsoft/api-documenter": "7.23.12", "@microsoft/api-extractor": "7.38.3", "@octokit/rest": "^20.0.2", @@ -94,42 +98,39 @@ "@types/cookie-parser": "1.4.8", "@types/express": "4.17.21", "@types/formidable": "3.4.5", - "@types/node": "20.10.3", - "@typescript-eslint/eslint-plugin": "6.13.1", - "@typescript-eslint/parser": "6.13.1", + "@types/node": "22.18.6", + "@vitest/coverage-v8": "3.2.4", "cheerio": "1.0.0-rc.3", "clang-format": "1.8.0", "cookie-parser": "1.4.7", - "electron": "33.2.1", - "eslint": "8.55.0", - "eslint-config-prettier": "9.1.0", - "eslint-formatter-friendly": "7.0.0", - "eslint-plugin-import": "2.29.0", - "eslint-plugin-prettier": "5.0.1", + "electron": "38.2.0", + "eslint": "9.36.0", + "eslint-plugin-prettier": "5.5.4", "express": "4.21.2", "formidable": "3.5.2", + "globals": "15.14.0", "http-auth": "4.2.0", "http-auth-connect": "1.0.6", "husky": "9.1.7", "lint-staged": "15.2.0", "node-abi": "^3.71.0", - "np": "9.2.0", - "nyc": "15.1.0", - "prettier": "3.1.0", + "np": "10.2.0", + "prettier": "3.6.2", "progress": "2.0.3", - "sort-package-json": "2.6.0", - "ts-node": "10.9.1", - "tslint": "6.1.3", - "tslint-config-airbnb": "5.11.2", - "tslint-config-prettier": "1.18.0", - "typedoc": "0.27.6", - "typedoc-plugin-ga": "^1.0.4", + "semver": "7.7.2", + "sort-package-json": "3.4.0", + "tsx": "4.20.6", + "typedoc": "0.28.13", + "typedoc-plugin-ga": "^1.0.5", "typedoc-plugin-nojekyll": "1.0.1", - "typescript": "5.3.2", - "vitest": "2.1.8" + "typescript": "5.9.2", + "typescript-eslint": "8.44.1", + "vitest": "3.2.4", + "ws": "8.18.3" }, + "packageManager": "pnpm@10.16.1+sha512.0e155aa2629db8672b49e8475da6226aa4bdea85fdcdfdc15350874946d4f3c91faaf64cbdc4a5d1ab8002f473d5c3fcedcd197989cf0390f9badd3c04678706", "engines": { - "node": ">=16.14" + "node": ">=22.14" }, "np": { "cleanup": false diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..d03616adc --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8950 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@mapbox/node-pre-gyp': + specifier: 2.0.0 + version: 2.0.0(encoding@0.1.13) + env-paths: + specifier: 2.2.0 + version: 2.2.0 + node-addon-api: + specifier: 8.5.0 + version: 8.5.0 + node-gyp: + specifier: 11.4.2 + version: 11.4.2 + npmlog: + specifier: 7.0.1 + version: 7.0.1 + rimraf: + specifier: 5.0.5 + version: 5.0.5 + tslib: + specifier: 2.6.2 + version: 2.6.2 + devDependencies: + '@commitlint/cli': + specifier: 18.4.3 + version: 18.4.3(@types/node@22.18.6)(typescript@5.9.2) + '@electron/rebuild': + specifier: 4.0.1 + version: 4.0.1 + '@eslint/eslintrc': + specifier: 3.3.1 + version: 3.3.1 + '@eslint/js': + specifier: 9.36.0 + version: 9.36.0 + '@microsoft/api-documenter': + specifier: 7.23.12 + version: 7.23.12(@types/node@22.18.6) + '@microsoft/api-extractor': + specifier: 7.38.3 + version: 7.38.3(@types/node@22.18.6) + '@octokit/rest': + specifier: ^20.0.2 + version: 20.1.2 + '@types/body-parser': + specifier: 1.19.5 + version: 1.19.5 + '@types/cookie-parser': + specifier: 1.4.8 + version: 1.4.8(@types/express@4.17.21) + '@types/express': + specifier: 4.17.21 + version: 4.17.21 + '@types/formidable': + specifier: 3.4.5 + version: 3.4.5 + '@types/node': + specifier: 22.18.6 + version: 22.18.6 + '@vitest/coverage-v8': + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4(@types/node@22.18.6)) + cheerio: + specifier: 1.0.0-rc.3 + version: 1.0.0-rc.3 + clang-format: + specifier: 1.8.0 + version: 1.8.0 + cookie-parser: + specifier: 1.4.7 + version: 1.4.7 + electron: + specifier: 38.2.0 + version: 38.2.0 + eslint: + specifier: 9.36.0 + version: 9.36.0(jiti@1.21.7) + eslint-plugin-prettier: + specifier: 5.5.4 + version: 5.5.4(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@9.36.0(jiti@1.21.7))(prettier@3.6.2) + express: + specifier: 4.21.2 + version: 4.21.2 + formidable: + specifier: 3.5.2 + version: 3.5.2 + globals: + specifier: 15.14.0 + version: 15.14.0 + http-auth: + specifier: 4.2.0 + version: 4.2.0 + http-auth-connect: + specifier: 1.0.6 + version: 1.0.6 + husky: + specifier: 9.1.7 + version: 9.1.7 + lint-staged: + specifier: 15.2.0 + version: 15.2.0 + node-abi: + specifier: ^3.71.0 + version: 3.75.0 + np: + specifier: 10.2.0 + version: 10.2.0(@types/node@22.18.6)(typescript@5.9.2) + prettier: + specifier: 3.6.2 + version: 3.6.2 + progress: + specifier: 2.0.3 + version: 2.0.3 + semver: + specifier: 7.7.2 + version: 7.7.2 + sort-package-json: + specifier: 3.4.0 + version: 3.4.0 + tsx: + specifier: 4.20.6 + version: 4.20.6 + typedoc: + specifier: 0.28.13 + version: 0.28.13(typescript@5.9.2) + typedoc-plugin-ga: + specifier: ^1.0.5 + version: 1.0.5(typedoc@0.28.13(typescript@5.9.2))(typescript@5.9.2) + typedoc-plugin-nojekyll: + specifier: 1.0.1 + version: 1.0.1(typedoc@0.28.13(typescript@5.9.2)) + typescript: + specifier: 5.9.2 + version: 5.9.2 + typescript-eslint: + specifier: 8.44.1 + version: 8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + vitest: + specifier: 3.2.4 + version: 3.2.4(@types/node@22.18.6) + ws: + specifier: 8.18.3 + version: 8.18.3 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.12.11': + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@commitlint/cli@18.4.3': + resolution: {integrity: sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-validator@18.6.1': + resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==} + engines: {node: '>=v18'} + + '@commitlint/ensure@18.6.1': + resolution: {integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@18.6.1': + resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==} + engines: {node: '>=v18'} + + '@commitlint/format@18.6.1': + resolution: {integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@18.6.1': + resolution: {integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==} + engines: {node: '>=v18'} + + '@commitlint/lint@18.6.1': + resolution: {integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==} + engines: {node: '>=v18'} + + '@commitlint/load@18.6.1': + resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} + engines: {node: '>=v18'} + + '@commitlint/message@18.6.1': + resolution: {integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==} + engines: {node: '>=v18'} + + '@commitlint/parse@18.6.1': + resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} + engines: {node: '>=v18'} + + '@commitlint/read@18.6.1': + resolution: {integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@18.6.1': + resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==} + engines: {node: '>=v18'} + + '@commitlint/rules@18.6.1': + resolution: {integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@18.6.1': + resolution: {integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==} + engines: {node: '>=v18'} + + '@commitlint/top-level@18.6.1': + resolution: {integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==} + engines: {node: '>=v18'} + + '@commitlint/types@18.6.1': + resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} + engines: {node: '>=v18'} + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/rebuild@4.0.1': + resolution: {integrity: sha512-iMGXb6Ib7H/Q3v+BKZJoETgF9g6KMNZVbsO4b7Dmpgb5qTFqyFTzqW9F3TOSHdybv2vKYKzSS9OiZL+dcJb+1Q==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@9.36.0': + resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@euberdeveloper/eslint-plugin@2.7.0': + resolution: {integrity: sha512-IyZfysHjYCSU6Ty86imkCZmZ5diTAOKn7DlEmEO1yHhFjvVk+xFr0ApjTD7TyIQolnBPixZNw477V7mq86llcw==} + + '@gerrit0/mini-shiki@3.13.0': + resolution: {integrity: sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@inquirer/ansi@1.0.0': + resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.2.4': + resolution: {integrity: sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.18': + resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.2.2': + resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.20': + resolution: {integrity: sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.20': + resolution: {integrity: sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + + '@inquirer/input@4.2.4': + resolution: {integrity: sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.20': + resolution: {integrity: sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.20': + resolution: {integrity: sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.8.6': + resolution: {integrity: sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.8': + resolution: {integrity: sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.1.3': + resolution: {integrity: sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.3.4': + resolution: {integrity: sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@malept/cross-spawn-promise@2.0.0': + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + + '@mapbox/node-pre-gyp@2.0.0': + resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} + engines: {node: '>=18'} + hasBin: true + + '@microsoft/api-documenter@7.23.12': + resolution: {integrity: sha512-ZFQGHNs8fSe3KoSCNa+jt/HLTN8IdTRGd0TZqmSeHpz2cSvUYHJeyQKhv8s7yi2flr1LezBq5/ig65ITZPSSqw==} + hasBin: true + + '@microsoft/api-extractor-model@7.28.2': + resolution: {integrity: sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==} + + '@microsoft/api-extractor@7.38.3': + resolution: {integrity: sha512-xt9iYyC5f39281j77JTA9C3ISJpW1XWkCcnw+2vM78CPnro6KhPfwQdPDfwS5JCPNuq0grm8cMdPUOPvrchDWw==} + hasBin: true + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.2': + resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.6': + resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.1': + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@24.2.0': + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + + '@octokit/plugin-paginate-rest@11.4.4-cjs.2': + resolution: {integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-request-log@4.0.1': + resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1': + resolution: {integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^5 + + '@octokit/request-error@5.1.1': + resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.1': + resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} + engines: {node: '>= 18'} + + '@octokit/rest@20.1.2': + resolution: {integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==} + engines: {node: '>= 18'} + + '@octokit/types@13.10.0': + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + + '@rollup/rollup-android-arm-eabi@4.49.0': + resolution: {integrity: sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.49.0': + resolution: {integrity: sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.49.0': + resolution: {integrity: sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.49.0': + resolution: {integrity: sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.49.0': + resolution: {integrity: sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.49.0': + resolution: {integrity: sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.49.0': + resolution: {integrity: sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.49.0': + resolution: {integrity: sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.49.0': + resolution: {integrity: sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.49.0': + resolution: {integrity: sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.49.0': + resolution: {integrity: sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.49.0': + resolution: {integrity: sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.49.0': + resolution: {integrity: sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.49.0': + resolution: {integrity: sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.49.0': + resolution: {integrity: sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.49.0': + resolution: {integrity: sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.49.0': + resolution: {integrity: sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.49.0': + resolution: {integrity: sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.49.0': + resolution: {integrity: sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.49.0': + resolution: {integrity: sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@3.61.0': + resolution: {integrity: sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.1': + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + + '@rushstack/ts-command-line@4.17.1': + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + + '@samverschueren/stream-to-observable@0.3.1': + resolution: {integrity: sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==} + engines: {node: '>=6'} + peerDependencies: + rxjs: '*' + zen-observable: '*' + peerDependenciesMeta: + rxjs: + optional: true + zen-observable: + optional: true + + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie-parser@1.4.8': + resolution: {integrity: sha512-l37JqFrOJ9yQfRQkljb41l0xVphc7kg5JTjjr+pLRZ0IyZ49V4BQ8vbF4Ut2C2e+WH4al3xD3ZwYwIUfnbT4NQ==} + peerDependencies: + '@types/express': '*' + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/formidable@3.4.5': + resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@22.18.6': + resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@6.13.1': + resolution: {integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@8.44.1': + resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.44.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@6.13.1': + resolution: {integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.44.1': + resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.44.1': + resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@6.13.1': + resolution: {integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@8.44.1': + resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.44.1': + resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@6.13.1': + resolution: {integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@8.44.1': + resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@6.13.1': + resolution: {integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@8.44.1': + resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@6.13.1': + resolution: {integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@8.44.1': + resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@6.13.1': + resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@8.44.1': + resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@6.13.1': + resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@8.44.1': + resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + peerDependencies: + '@vitest/browser': 3.2.4 + vitest: 3.2.4 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-observable@0.3.0: + resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} + engines: {node: '>=6'} + peerDependencies: + rxjs: '*' + zenObservable: '*' + peerDependenciesMeta: + rxjs: + optional: true + zenObservable: + optional: true + + apache-crypt@1.2.6: + resolution: {integrity: sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==} + engines: {node: '>=8'} + + apache-md5@1.1.8: + resolution: {integrity: sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==} + engines: {node: '>=8'} + + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} + + are-we-there-yet@4.0.2: + resolution: {integrity: sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@0.3.5: + resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + atomically@2.0.3: + resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chalk@5.6.0: + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + cheerio@1.0.0-rc.3: + resolution: {integrity: sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==} + engines: {node: '>= 0.6'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clang-format@1.8.0: + resolution: {integrity: sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw==} + hasBin: true + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@0.2.1: + resolution: {integrity: sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==} + engines: {node: '>=0.10.0'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@7.0.0: + resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==} + engines: {node: '>=18'} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + cookie-parser@1.4.7: + resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} + engines: {node: '>= 0.8.0'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cosmiconfig-typescript-loader@5.1.0: + resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@1.2.0: + resolution: {integrity: sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==} + + css-what@2.1.3: + resolution: {integrity: sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + date-fns@1.30.1: + resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + del@8.0.1: + resolution: {integrity: sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==} + engines: {node: '>=18'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@0.1.1: + resolution: {integrity: sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domutils@1.5.1: + resolution: {integrity: sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron@38.2.0: + resolution: {integrity: sha512-Cw5Mb+N5NxsG0Hc1qr8I65Kt5APRrbgTtEEn3zTod30UNJRnAE1xbGk/1NOaDn3ODzI/MYn6BzT9T9zreP7xWA==} + engines: {node: '>= 12.20.55'} + hasBin: true + + elegant-spinner@1.0.1: + resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} + engines: {node: '>=0.10.0'} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.0: + resolution: {integrity: sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-formatter-codeframe@7.32.1: + resolution: {integrity: sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==} + engines: {node: ^10.12.0 || >=12.0.0} + + eslint-plugin-mocha@10.5.0: + resolution: {integrity: sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-unicorn@49.0.0: + resolution: {integrity: sha512-0fHEa/8Pih5cmzFW5L7xMEfUTvI9WKeQtjmKpTUmY+BiFCDxkxrTdnURJOHKykhtwIeyYsxnecbGvDCml++z4Q==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.52.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + eslint@9.36.0: + resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + + figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + formidable@3.5.2: + resolution: {integrity: sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@6.0.1: + resolution: {integrity: sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@5.0.2: + resolution: {integrity: sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + git-hooks-list@4.1.1: + resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + github-url-from-git@1.5.0: + resolution: {integrity: sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hexoid@2.0.0: + resolution: {integrity: sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==} + engines: {node: '>=8'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + hosted-git-info@8.1.0: + resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} + engines: {node: ^18.17.0 || >=20.5.0} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + + http-auth-connect@1.0.6: + resolution: {integrity: sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw==} + engines: {node: '>=8'} + + http-auth@4.2.0: + resolution: {integrity: sha512-trIkGI7dgnFJ5k8YaQFSr1Q5uq9c19vK6Y9ZCjlY0zBEQgdJpXZU3Cyrmk4nwrAGy4pKJhs599o7q6eicbVnhw==} + engines: {node: '>=8'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-walk@7.0.0: + resolution: {integrity: sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@3.2.0: + resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} + engines: {node: '>=4'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} + engines: {node: '>=18'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer-autosubmit-prompt@0.2.0: + resolution: {integrity: sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==} + + inquirer@12.9.6: + resolution: {integrity: sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + inquirer@6.5.2: + resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} + engines: {node: '>=6.0.0'} + + inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-observable@1.1.0: + resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==} + engines: {node: '>=4'} + + is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-scoped@3.0.0: + resolution: {integrity: sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g==} + engines: {node: '>=12'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-url-superb@6.1.0: + resolution: {integrity: sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ==} + engines: {node: '>=12'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + issue-regex@4.3.0: + resolution: {integrity: sha512-7731a/t2llyrk8Hdwl1x3LkhIFGzxHQGpJA7Ur9cIRViakQF2y25Lwhx8Ziy1B068+kBYUmYPBzw5uo3DdWrdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + ky@1.9.0: + resolution: {integrity: sha512-NgBeR/cu7kuC4BAeF1rnXhfoI2uQ9RBe8zl5vo87ASsf1iIQoCeOxyt6Io6K4Ki++5ItCavXAtbEWWCGFciQ6g==} + engines: {node: '>=18'} + + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lint-staged@15.2.0: + resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr-input@0.2.1: + resolution: {integrity: sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==} + engines: {node: '>=6'} + + listr-silent-renderer@1.1.1: + resolution: {integrity: sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==} + engines: {node: '>=4'} + + listr-update-renderer@0.5.0: + resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==} + engines: {node: '>=6'} + peerDependencies: + listr: ^0.14.2 + + listr-verbose-renderer@0.5.0: + resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} + engines: {node: '>=4'} + + listr2@8.0.0: + resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} + engines: {node: '>=18.0.0'} + + listr@0.14.3: + resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@1.0.2: + resolution: {integrity: sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==} + engines: {node: '>=0.10.0'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + log-update@2.3.0: + resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} + engines: {node: '>=4'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.30.18: + resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.7: + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + new-github-release-url@2.0.0: + resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + + node-abi@4.14.0: + resolution: {integrity: sha512-E4n91K4Nk1Rch2KzD+edU2bfZTP4W42GypAUDXU4vu1A+4u9PvUNDkGI0dXbsy8ZeF3WGj0SD/uHxnXD/sW+3w==} + engines: {node: '>=22.12.0'} + + node-addon-api@8.5.0: + resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} + engines: {node: ^18 || ^20 || >= 21} + + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp@11.4.2: + resolution: {integrity: sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + np@10.2.0: + resolution: {integrity: sha512-7Pwk8qcsks2c9ETS35aeJSON6uJAbOsx7TwTFzZNUGgH4djT+Yt/p9S7PZuqH5pkcpNUhasne3cDRBzaUtvetg==} + engines: {bun: '>=1', git: '>=2.11.0', node: '>=18', npm: '>=9', pnpm: '>=8', yarn: '>=1.7.0'} + hasBin: true + + npm-name@8.0.0: + resolution: {integrity: sha512-DIuCGcKYYhASAZW6Xh/tiaGMko8IHOHe0n3zOA7SzTi0Yvy00x8L7sa5yNiZ75Ny58O/KeRtNouy8Ut6gPbKiw==} + engines: {node: '>=18'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@7.0.1: + resolution: {integrity: sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + nth-check@1.0.2: + resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + org-regex@1.0.0: + resolution: {integrity: sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==} + engines: {node: '>=8'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + p-memoize@7.1.1: + resolution: {integrity: sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==} + engines: {node: '>=14.16'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse5@3.0.3: + resolution: {integrity: sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@8.0.0: + resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} + engines: {node: '>=18'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + presentable-error@0.0.1: + resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==} + engines: {node: '>=16'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + rambda@7.5.0: + resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + rollup@4.49.0: + resolution: {integrity: sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-async@4.0.6: + resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scoped-regex@3.0.0: + resolution: {integrity: sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg==} + engines: {node: '>=12'} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@0.0.4: + resolution: {integrity: sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==} + engines: {node: '>=0.10.0'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@3.4.0: + resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} + engines: {node: '>=20'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + stubborn-fs@1.2.5: + resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + terminal-link@3.0.0: + resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} + engines: {node: '>=12'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typedoc-plugin-ga@1.0.5: + resolution: {integrity: sha512-qXtCqjTA9mJmlqCNmdKMWS1HENzyBN+exgFW+0qCYTJ5kEatDlmo3/EUa/LvKkEsaqJgpqA43Jnq425bdRuNZQ==} + peerDependencies: + typedoc: ^0.27.6 + + typedoc-plugin-nojekyll@1.0.1: + resolution: {integrity: sha512-hdFMhn0vAFCwepihSaVVs5yyImjo2FCX/OVQW89lrrqoARYHlAchOki4BQug23UqFSrYdykUu8yP4gD0M48qbw==} + peerDependencies: + typedoc: ^0.11.1 + + typedoc@0.28.13: + resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + + typescript-eslint@8.44.1: + resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unix-crypt-td-js@1.1.4: + resolution: {integrity: sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-notifier@7.3.1: + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} + engines: {node: '>=18'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + validator@13.15.15: + resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} + engines: {node: '>= 0.10'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + when-exit@2.1.4: + resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@3.0.1: + resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} + engines: {node: '>=4'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@babel/code-frame@7.12.11': + dependencies: + '@babel/highlight': 7.25.9 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@1.0.2': {} + + '@commitlint/cli@18.4.3(@types/node@22.18.6)(typescript@5.9.2)': + dependencies: + '@commitlint/format': 18.6.1 + '@commitlint/lint': 18.6.1 + '@commitlint/load': 18.6.1(@types/node@22.18.6)(typescript@5.9.2) + '@commitlint/read': 18.6.1 + '@commitlint/types': 18.6.1 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-validator@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + ajv: 8.17.1 + + '@commitlint/ensure@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@18.6.1': {} + + '@commitlint/format@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + chalk: 4.1.2 + + '@commitlint/is-ignored@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + semver: 7.6.0 + + '@commitlint/lint@18.6.1': + dependencies: + '@commitlint/is-ignored': 18.6.1 + '@commitlint/parse': 18.6.1 + '@commitlint/rules': 18.6.1 + '@commitlint/types': 18.6.1 + + '@commitlint/load@18.6.1(@types/node@22.18.6)(typescript@5.9.2)': + dependencies: + '@commitlint/config-validator': 18.6.1 + '@commitlint/execute-rule': 18.6.1 + '@commitlint/resolve-extends': 18.6.1 + '@commitlint/types': 18.6.1 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig-typescript-loader: 5.1.0(@types/node@22.18.6)(cosmiconfig@8.3.6(typescript@5.9.2))(typescript@5.9.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@18.6.1': {} + + '@commitlint/parse@18.6.1': + dependencies: + '@commitlint/types': 18.6.1 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@18.6.1': + dependencies: + '@commitlint/top-level': 18.6.1 + '@commitlint/types': 18.6.1 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + + '@commitlint/resolve-extends@18.6.1': + dependencies: + '@commitlint/config-validator': 18.6.1 + '@commitlint/types': 18.6.1 + import-fresh: 3.3.1 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + + '@commitlint/rules@18.6.1': + dependencies: + '@commitlint/ensure': 18.6.1 + '@commitlint/message': 18.6.1 + '@commitlint/to-lines': 18.6.1 + '@commitlint/types': 18.6.1 + execa: 5.1.1 + + '@commitlint/to-lines@18.6.1': {} + + '@commitlint/top-level@18.6.1': + dependencies: + find-up: 5.0.0 + + '@commitlint/types@18.6.1': + dependencies: + chalk: 4.1.2 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.1 + env-paths: 2.2.0 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/rebuild@4.0.1': + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + chalk: 4.1.2 + debug: 4.4.1 + detect-libc: 2.0.4 + got: 11.8.6 + graceful-fs: 4.2.11 + node-abi: 4.14.0 + node-api-version: 0.2.1 + node-gyp: 11.4.2 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.2 + tar: 6.2.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@1.21.7))': + dependencies: + eslint: 9.36.0(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.1': {} + + '@eslint/core@0.15.2': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@eslint/js@9.36.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.5': + dependencies: + '@eslint/core': 0.15.2 + levn: 0.4.1 + + '@euberdeveloper/eslint-plugin@2.7.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/eslint-plugin': 6.13.1(@typescript-eslint/parser@6.13.1(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': 6.13.1(eslint@8.57.1)(typescript@5.9.2) + eslint: 8.57.1 + eslint-config-prettier: 9.1.0(eslint@9.36.0(jiti@1.21.7)) + eslint-formatter-codeframe: 7.32.1 + eslint-plugin-mocha: 10.5.0(eslint@8.57.1) + eslint-plugin-prettier: 5.5.4(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) + eslint-plugin-unicorn: 49.0.0(eslint@8.57.1) + prettier: 3.6.2 + transitivePeerDependencies: + - '@types/eslint' + - supports-color + - typescript + + '@gerrit0/mini-shiki@3.13.0': + dependencies: + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@inquirer/ansi@1.0.0': {} + + '@inquirer/checkbox@4.2.4(@types/node@22.18.6)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.18.6) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/confirm@5.1.18(@types/node@22.18.6)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/core@10.2.2(@types/node@22.18.6)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.18.6) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/editor@4.2.20(@types/node@22.18.6)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/expand@4.0.20(@types/node@22.18.6)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/external-editor@1.0.2(@types/node@22.18.6)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/figures@1.0.13': {} + + '@inquirer/input@4.2.4(@types/node@22.18.6)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/number@3.0.20(@types/node@22.18.6)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/password@4.0.20(@types/node@22.18.6)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/prompts@7.8.6(@types/node@22.18.6)': + dependencies: + '@inquirer/checkbox': 4.2.4(@types/node@22.18.6) + '@inquirer/confirm': 5.1.18(@types/node@22.18.6) + '@inquirer/editor': 4.2.20(@types/node@22.18.6) + '@inquirer/expand': 4.0.20(@types/node@22.18.6) + '@inquirer/input': 4.2.4(@types/node@22.18.6) + '@inquirer/number': 3.0.20(@types/node@22.18.6) + '@inquirer/password': 4.0.20(@types/node@22.18.6) + '@inquirer/rawlist': 4.1.8(@types/node@22.18.6) + '@inquirer/search': 3.1.3(@types/node@22.18.6) + '@inquirer/select': 4.3.4(@types/node@22.18.6) + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/rawlist@4.1.8(@types/node@22.18.6)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/search@3.1.3(@types/node@22.18.6)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.18.6) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/select@4.3.4(@types/node@22.18.6)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.18.6) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.18.6 + + '@inquirer/type@3.0.8(@types/node@22.18.6)': + optionalDependencies: + '@types/node': 22.18.6 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': + dependencies: + consola: 3.4.2 + detect-libc: 2.0.4 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 8.1.0 + semver: 7.7.2 + tar: 7.4.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@microsoft/api-documenter@7.23.12(@types/node@22.18.6)': + dependencies: + '@microsoft/api-extractor-model': 7.28.2(@types/node@22.18.6) + '@microsoft/tsdoc': 0.14.2 + '@rushstack/node-core-library': 3.61.0(@types/node@22.18.6) + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + js-yaml: 3.13.1 + resolve: 1.22.10 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor-model@7.28.2(@types/node@22.18.6)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.61.0(@types/node@22.18.6) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.38.3(@types/node@22.18.6)': + dependencies: + '@microsoft/api-extractor-model': 7.28.2(@types/node@22.18.6) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.61.0(@types/node@22.18.6) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.2 + + '@octokit/auth-token@4.0.0': {} + + '@octokit/core@5.2.2': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.1 + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/endpoint@9.0.6': + dependencies: + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@7.1.1': + dependencies: + '@octokit/request': 8.4.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/openapi-types@24.2.0': {} + + '@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 13.10.0 + + '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + + '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 13.10.0 + + '@octokit/request-error@5.1.1': + dependencies: + '@octokit/types': 13.10.0 + deprecation: 2.3.1 + once: 1.4.0 + + '@octokit/request@8.4.1': + dependencies: + '@octokit/endpoint': 9.0.6 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/rest@20.1.2': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/plugin-paginate-rest': 11.4.4-cjs.2(@octokit/core@5.2.2) + '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.2) + '@octokit/plugin-rest-endpoint-methods': 13.3.2-cjs.1(@octokit/core@5.2.2) + + '@octokit/types@13.10.0': + dependencies: + '@octokit/openapi-types': 24.2.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@rollup/rollup-android-arm-eabi@4.49.0': + optional: true + + '@rollup/rollup-android-arm64@4.49.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.49.0': + optional: true + + '@rollup/rollup-darwin-x64@4.49.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.49.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.49.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.49.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.49.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.49.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.49.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.49.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.49.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.49.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.49.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.49.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.49.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.49.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.49.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.49.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.49.0': + optional: true + + '@rushstack/node-core-library@3.61.0(@types/node@22.18.6)': + dependencies: + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 22.18.6 + + '@rushstack/rig-package@0.5.1': + dependencies: + resolve: 1.22.10 + strip-json-comments: 3.1.1 + + '@rushstack/ts-command-line@4.17.1': + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + + '@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7)': + dependencies: + any-observable: 0.3.0(rxjs@6.6.7) + optionalDependencies: + rxjs: 6.6.7 + transitivePeerDependencies: + - zenObservable + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@types/argparse@1.0.38': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.18.6 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.18.6 + '@types/responselike': 1.0.3 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.18.6 + + '@types/cookie-parser@1.4.8(@types/express@4.17.21)': + dependencies: + '@types/express': 4.17.21 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.18.6 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 + + '@types/formidable@3.4.5': + dependencies: + '@types/node': 22.18.6 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.18.6 + + '@types/mime@1.3.5': {} + + '@types/minimist@1.2.5': {} + + '@types/node@22.18.6': + dependencies: + undici-types: 6.21.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.18.6 + + '@types/semver@7.7.0': {} + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.18.6 + + '@types/serve-static@1.15.8': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.18.6 + '@types/send': 0.17.5 + + '@types/unist@3.0.3': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.18.6 + optional: true + + '@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.13.1(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/type-utils': 6.13.1(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/utils': 6.13.1(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.4.1 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 + eslint: 9.36.0(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.13.1(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.1 + eslint: 9.36.0(jiti@1.21.7) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + debug: 4.4.1 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.13.1': + dependencies: + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/visitor-keys': 6.13.1 + + '@typescript-eslint/scope-manager@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/type-utils@6.13.1(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.9.2) + '@typescript-eslint/utils': 6.13.1(eslint@8.57.1)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + debug: 4.4.1 + eslint: 9.36.0(jiti@1.21.7) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.13.1': {} + + '@typescript-eslint/types@8.44.1': {} + + '@typescript-eslint/typescript-estree@6.13.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/visitor-keys': 6.13.1 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.13.1(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 6.13.1 + '@typescript-eslint/types': 6.13.1 + '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.9.2) + eslint: 8.57.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + eslint: 9.36.0(jiti@1.21.7) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@6.13.1': + dependencies: + '@typescript-eslint/types': 6.13.1 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.18.6))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.5 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.18 + magicast: 0.3.5 + std-env: 3.9.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/node@22.18.6) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@5.4.19(@types/node@22.18.6))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.18 + optionalDependencies: + vite: 5.4.19(@types/node@22.18.6) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.18 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + abbrev@3.0.1: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-escapes@3.2.0: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@5.0.0: + dependencies: + type-fest: 1.4.0 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@2.1.1: {} + + ansi-regex@3.0.1: {} + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.0: {} + + ansi-styles@2.2.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-observable@0.3.0(rxjs@6.6.7): + optionalDependencies: + rxjs: 6.6.7 + + apache-crypt@1.2.6: + dependencies: + unix-crypt-td-js: 1.1.4 + + apache-md5@1.1.8: {} + + aproba@2.1.0: {} + + are-we-there-yet@4.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + array-ify@1.0.0: {} + + array-union@2.1.0: {} + + arrify@1.0.1: {} + + asap@2.0.6: {} + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@0.3.5: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + + async@3.2.6: {} + + atomically@2.0.3: + dependencies: + stubborn-fs: 1.2.5 + when-exit: 2.1.4 + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bcryptjs@2.4.3: {} + + before-after-hook@2.2.3: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + boolean@3.2.0: + optional: true + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.0 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-crc32@0.2.13: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@3.3.0: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + tar: 7.4.3 + unique-filename: 4.0.0 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + camelcase@8.0.0: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk-template@1.1.0: + dependencies: + chalk: 5.6.0 + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + chalk@5.6.0: {} + + chardet@0.7.0: {} + + chardet@2.1.0: {} + + check-error@2.1.1: {} + + cheerio@1.0.0-rc.3: + dependencies: + css-select: 1.2.0 + dom-serializer: 0.1.1 + entities: 1.1.2 + htmlparser2: 3.10.1 + lodash: 4.17.21 + parse5: 3.0.3 + + chownr@2.0.0: {} + + chownr@3.0.0: {} + + ci-info@3.9.0: {} + + clang-format@1.8.0: + dependencies: + async: 3.2.6 + glob: 7.2.3 + resolve: 1.22.10 + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + cli-boxes@3.0.0: {} + + cli-cursor@2.1.0: + dependencies: + restore-cursor: 2.0.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@0.2.1: + dependencies: + slice-ansi: 0.0.4 + string-width: 1.0.2 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@2.2.1: {} + + cli-width@3.0.0: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + + code-point-at@1.1.0: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + colorette@2.0.20: {} + + colors@1.2.5: {} + + commander@11.1.0: {} + + commander@9.5.0: + optional: true + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@7.0.0: + dependencies: + atomically: 2.0.3 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + + consola@3.4.2: {} + + console-control-strings@1.1.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + cookie-parser@1.4.7: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.6 + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + cosmiconfig-typescript-loader@5.1.0(@types/node@22.18.6)(cosmiconfig@8.3.6(typescript@5.9.2))(typescript@5.9.2): + dependencies: + '@types/node': 22.18.6 + cosmiconfig: 8.3.6(typescript@5.9.2) + jiti: 1.21.7 + typescript: 5.9.2 + + cosmiconfig@8.3.6(typescript@5.9.2): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@1.2.0: + dependencies: + boolbase: 1.0.0 + css-what: 2.1.3 + domutils: 1.5.1 + nth-check: 1.0.2 + + css-what@2.1.3: {} + + dargs@7.0.0: {} + + date-fns@1.30.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@5.0.2: {} + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + del@8.0.1: + dependencies: + globby: 14.1.0 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 7.0.3 + presentable-error: 0.0.1 + slash: 5.1.0 + + depd@2.0.0: {} + + deprecation@2.3.1: {} + + destroy@1.2.0: {} + + detect-indent@7.0.1: {} + + detect-libc@2.0.4: {} + + detect-newline@4.0.1: {} + + detect-node@2.1.0: + optional: true + + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@0.1.1: + dependencies: + domelementtype: 1.3.1 + entities: 1.1.2 + + domelementtype@1.3.1: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domutils@1.5.1: + dependencies: + dom-serializer: 0.1.1 + domelementtype: 1.3.1 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.1.1 + domelementtype: 1.3.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron@38.2.0: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 22.18.6 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + elegant-spinner@1.0.1: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + entities@1.1.2: {} + + entities@4.5.0: {} + + env-paths@2.2.0: {} + + environment@1.1.0: {} + + err-code@2.0.3: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es6-error@4.1.1: + optional: true + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + escalade@3.2.0: {} + + escape-goat@4.0.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@9.1.0(eslint@9.36.0(jiti@1.21.7)): + dependencies: + eslint: 9.36.0(jiti@1.21.7) + + eslint-formatter-codeframe@7.32.1: + dependencies: + '@babel/code-frame': 7.12.11 + chalk: 4.1.2 + + eslint-plugin-mocha@10.5.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 3.0.0(eslint@8.57.1) + globals: 13.24.0 + rambda: 7.5.0 + + eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): + dependencies: + eslint: 8.57.1 + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@9.36.0(jiti@1.21.7)) + + eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@9.36.0(jiti@1.21.7))(prettier@3.6.2): + dependencies: + eslint: 9.36.0(jiti@1.21.7) + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@9.36.0(jiti@1.21.7)) + + eslint-plugin-unicorn@49.0.0(eslint@8.57.1): + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + ci-info: 3.9.0 + clean-regexp: 1.0.0 + eslint: 8.57.1 + esquery: 1.6.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.7.2 + strip-indent: 3.0.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + eslint@9.36.0(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.36.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@5.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exit-hook@4.0.0: {} + + expect-type@1.2.2: {} + + exponential-backoff@3.1.2: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extract-zip@2.0.1: + dependencies: + debug: 4.4.1 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + + figures@2.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up-simple@1.0.1: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + formidable@3.5.2: + dependencies: + dezalgo: 1.0.4 + hexoid: 2.0.0 + once: 1.4.0 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-extra@6.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gauge@5.0.2: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 4.1.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + git-hooks-list@4.1.1: {} + + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + github-url-from-git@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.2 + serialize-error: 7.0.1 + optional: true + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + global-dirs@0.1.1: + dependencies: + ini: 1.3.8 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.14.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + + gopd@1.2.0: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + hard-rejection@2.1.0: {} + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + has-symbols@1.1.0: {} + + has-unicode@2.0.1: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hexoid@2.0.0: {} + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + hosted-git-info@8.1.0: + dependencies: + lru-cache: 10.4.3 + + html-escaper@2.0.2: {} + + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + + http-auth-connect@1.0.6: {} + + http-auth@4.2.0: + dependencies: + apache-crypt: 1.2.6 + apache-md5: 1.1.8 + bcryptjs: 2.4.3 + uuid: 8.3.2 + + http-cache-semantics@4.2.0: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + husky@9.1.7: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore-walk@7.0.0: + dependencies: + minimatch: 9.0.5 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + indent-string@3.2.0: {} + + indent-string@4.0.0: {} + + index-to-position@1.1.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + inquirer-autosubmit-prompt@0.2.0: + dependencies: + chalk: 2.4.2 + inquirer: 6.5.2 + rxjs: 6.6.7 + + inquirer@12.9.6(@types/node@22.18.6): + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@22.18.6) + '@inquirer/prompts': 7.8.6(@types/node@22.18.6) + '@inquirer/type': 3.0.8(@types/node@22.18.6) + mute-stream: 2.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 22.18.6 + + inquirer@6.5.2: + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-width: 2.2.1 + external-editor: 3.1.0 + figures: 2.0.0 + lodash: 4.17.21 + mute-stream: 0.0.7 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 2.1.1 + strip-ansi: 5.2.0 + through: 2.3.8 + + inquirer@7.3.3: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + + ip-address@10.0.1: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@1.0.0: + dependencies: + number-is-nan: 1.0.1 + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-in-ci@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + + is-interactive@1.0.0: {} + + is-interactive@2.0.0: {} + + is-npm@6.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-observable@1.1.0: + dependencies: + symbol-observable: 1.2.0 + + is-path-cwd@3.0.0: {} + + is-path-inside@3.0.3: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@4.1.0: {} + + is-promise@2.2.2: {} + + is-scoped@3.0.0: + dependencies: + scoped-regex: 3.0.0 + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@2.1.0: {} + + is-url-superb@6.1.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + issue-regex@4.3.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.13.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@0.5.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + ky@1.9.0: {} + + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.0.0: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lint-staged@15.2.0: + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.0 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + + listr-input@0.2.1: + dependencies: + inquirer: 7.3.3 + inquirer-autosubmit-prompt: 0.2.0 + rxjs: 6.6.7 + through: 2.3.8 + + listr-silent-renderer@1.1.1: {} + + listr-update-renderer@0.5.0(listr@0.14.3): + dependencies: + chalk: 1.1.3 + cli-truncate: 0.2.1 + elegant-spinner: 1.0.1 + figures: 1.7.0 + indent-string: 3.2.0 + listr: 0.14.3 + log-symbols: 1.0.2 + log-update: 2.3.0 + strip-ansi: 3.0.1 + + listr-verbose-renderer@0.5.0: + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + date-fns: 1.30.1 + figures: 2.0.0 + + listr2@8.0.0: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + listr@0.14.3: + dependencies: + '@samverschueren/stream-to-observable': 0.3.1(rxjs@6.6.7) + is-observable: 1.1.0 + is-promise: 2.2.2 + is-stream: 1.1.0 + listr-silent-renderer: 1.1.1 + listr-update-renderer: 0.5.0(listr@0.14.3) + listr-verbose-renderer: 0.5.0 + p-map: 2.1.0 + rxjs: 6.6.7 + transitivePeerDependencies: + - zen-observable + - zenObservable + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash.isfunction@3.0.9: {} + + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash.zip@4.2.0: {} + + lodash@4.17.21: {} + + log-symbols@1.0.2: + dependencies: + chalk: 1.1.3 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + log-update@2.3.0: + dependencies: + ansi-escapes: 3.2.0 + cli-cursor: 2.1.0 + wrap-ansi: 3.0.1 + + log-update@6.1.0: + dependencies: + 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 + + loupe@3.2.1: {} + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lunr@2.3.9: {} + + magic-string@0.30.18: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + math-intrinsics@1.1.0: {} + + mdurl@2.0.0: {} + + media-typer@0.3.0: {} + + meow@12.1.1: {} + + meow@13.2.0: {} + + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@1.2.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.0.2 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + mute-stream@0.0.7: {} + + mute-stream@0.0.8: {} + + mute-stream@2.0.0: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + negotiator@1.0.0: {} + + new-github-release-url@2.0.0: + dependencies: + type-fest: 2.19.0 + + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + + node-abi@4.14.0: + dependencies: + semver: 7.7.2 + + node-addon-api@8.5.0: {} + + node-api-version@0.2.1: + dependencies: + semver: 7.7.2 + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-gyp@11.4.2: + dependencies: + env-paths: 2.2.0 + exponential-backoff: 3.1.2 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.2 + tar: 7.4.3 + tinyglobby: 0.2.14 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + + normalize-url@6.1.0: {} + + np@10.2.0(@types/node@22.18.6)(typescript@5.9.2): + dependencies: + chalk: 5.6.0 + chalk-template: 1.1.0 + cosmiconfig: 8.3.6(typescript@5.9.2) + del: 8.0.1 + escape-goat: 4.0.0 + escape-string-regexp: 5.0.0 + execa: 8.0.1 + exit-hook: 4.0.0 + github-url-from-git: 1.5.0 + hosted-git-info: 8.1.0 + ignore-walk: 7.0.0 + import-local: 3.2.0 + inquirer: 12.9.6(@types/node@22.18.6) + is-installed-globally: 1.0.0 + is-interactive: 2.0.0 + is-scoped: 3.0.0 + issue-regex: 4.3.0 + listr: 0.14.3 + listr-input: 0.2.1 + log-symbols: 7.0.1 + meow: 13.2.0 + new-github-release-url: 2.0.0 + npm-name: 8.0.0 + onetime: 7.0.0 + open: 10.2.0 + p-memoize: 7.1.1 + p-timeout: 6.1.4 + path-exists: 5.0.0 + pkg-dir: 8.0.0 + read-package-up: 11.0.0 + read-pkg: 9.0.1 + rxjs: 7.8.2 + semver: 7.7.2 + symbol-observable: 4.0.0 + terminal-link: 3.0.0 + update-notifier: 7.3.1 + transitivePeerDependencies: + - '@types/node' + - typescript + - zen-observable + - zenObservable + + npm-name@8.0.0: + dependencies: + is-scoped: 3.0.0 + is-url-superb: 6.1.0 + ky: 1.9.0 + lodash.zip: 4.2.0 + org-regex: 1.0.0 + p-map: 7.0.3 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + validate-npm-package-name: 5.0.1 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npmlog@7.0.1: + dependencies: + are-we-there-yet: 4.0.2 + console-control-strings: 1.1.0 + gauge: 5.0.2 + set-blocking: 2.0.0 + + nth-check@1.0.2: + dependencies: + boolbase: 1.0.0 + + number-is-nan@1.0.1: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: + optional: true + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@2.0.1: + dependencies: + mimic-fn: 1.2.0 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@10.2.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + org-regex@1.0.0: {} + + os-tmpdir@1.0.2: {} + + p-cancelable@2.1.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@2.1.0: {} + + p-map@7.0.3: {} + + p-memoize@7.1.1: + dependencies: + mimic-fn: 4.0.0 + type-fest: 3.13.1 + + p-timeout@6.1.4: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-json@10.0.1: + dependencies: + ky: 1.9.0 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.1.0 + type-fest: 4.41.0 + + parse5@3.0.3: + dependencies: + '@types/node': 22.18.6 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + path-type@4.0.0: {} + + path-type@6.0.0: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pidtree@0.6.0: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-dir@8.0.0: + dependencies: + find-up-simple: 1.0.1 + + pluralize@8.0.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + presentable-error@0.0.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.6.2: {} + + proc-log@5.0.0: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + pupa@3.1.0: + dependencies: + escape-goat: 4.0.0 + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-lru@4.0.1: {} + + quick-lru@5.1.1: {} + + rambda@7.5.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + read-binary-file-arch@1.0.6: + dependencies: + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + regexp-tree@0.1.27: {} + + registry-auth-token@5.1.0: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-alpn@1.2.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-global@1.0.0: + dependencies: + global-dirs: 0.1.1 + + resolve-pkg-maps@1.0.0: {} + + resolve@1.19.0: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + restore-cursor@2.0.0: + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retry@0.12.0: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@5.0.5: + dependencies: + glob: 10.4.5 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + rollup@4.49.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.49.0 + '@rollup/rollup-android-arm64': 4.49.0 + '@rollup/rollup-darwin-arm64': 4.49.0 + '@rollup/rollup-darwin-x64': 4.49.0 + '@rollup/rollup-freebsd-arm64': 4.49.0 + '@rollup/rollup-freebsd-x64': 4.49.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.49.0 + '@rollup/rollup-linux-arm-musleabihf': 4.49.0 + '@rollup/rollup-linux-arm64-gnu': 4.49.0 + '@rollup/rollup-linux-arm64-musl': 4.49.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.49.0 + '@rollup/rollup-linux-ppc64-gnu': 4.49.0 + '@rollup/rollup-linux-riscv64-gnu': 4.49.0 + '@rollup/rollup-linux-riscv64-musl': 4.49.0 + '@rollup/rollup-linux-s390x-gnu': 4.49.0 + '@rollup/rollup-linux-x64-gnu': 4.49.0 + '@rollup/rollup-linux-x64-musl': 4.49.0 + '@rollup/rollup-win32-arm64-msvc': 4.49.0 + '@rollup/rollup-win32-ia32-msvc': 4.49.0 + '@rollup/rollup-win32-x64-msvc': 4.49.0 + fsevents: 2.3.3 + + run-applescript@7.1.0: {} + + run-async@2.4.1: {} + + run-async@4.0.6: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@6.6.7: + dependencies: + tslib: 1.14.1 + + rxjs@7.8.2: + dependencies: + tslib: 2.6.2 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + scoped-regex@3.0.0: {} + + semver-compare@1.0.0: + optional: true + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.2: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slash@5.1.0: {} + + slice-ansi@0.0.4: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.0.1 + smart-buffer: 4.2.0 + + sort-object-keys@1.1.3: {} + + sort-package-json@3.4.0: + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + git-hooks-list: 4.1.1 + is-plain-obj: 4.1.0 + semver: 7.7.2 + sort-object-keys: 1.1.3 + tinyglobby: 0.2.14 + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + sprintf-js@1.1.3: + optional: true + + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + std-env@3.9.0: {} + + string-argv@0.3.2: {} + + string-width@1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.2.0 + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + stubborn-fs@1.2.5: {} + + sumchecker@3.0.1: + dependencies: + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + supports-color@2.0.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@2.3.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-observable@1.2.0: {} + + symbol-observable@4.0.0: {} + + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + terminal-link@3.0.0: + dependencies: + ansi-escapes: 5.0.0 + supports-hyperlinks: 2.3.0 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + text-extensions@2.4.0: {} + + text-table@0.2.0: {} + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + trim-newlines@3.0.1: {} + + ts-api-utils@1.4.3(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + ts-api-utils@2.1.0(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + tslib@1.14.1: {} + + tslib@2.6.2: {} + + tsx@4.20.6: + dependencies: + esbuild: 0.25.10 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.13.1: + optional: true + + type-fest@0.18.1: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-fest@3.13.1: {} + + type-fest@4.41.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typedoc-plugin-ga@1.0.5(typedoc@0.28.13(typescript@5.9.2))(typescript@5.9.2): + dependencies: + '@euberdeveloper/eslint-plugin': 2.7.0(typescript@5.9.2) + typedoc: 0.28.13(typescript@5.9.2) + transitivePeerDependencies: + - '@types/eslint' + - supports-color + - typescript + + typedoc-plugin-nojekyll@1.0.1(typedoc@0.28.13(typescript@5.9.2)): + dependencies: + fs-extra: 6.0.1 + typedoc: 0.28.13(typescript@5.9.2) + + typedoc@0.28.13(typescript@5.9.2): + dependencies: + '@gerrit0/mini-shiki': 3.13.0 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.9.2 + yaml: 2.8.1 + + typescript-eslint@8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@1.21.7))(typescript@5.9.2) + eslint: 9.36.0(jiti@1.21.7) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + typescript@5.0.4: {} + + typescript@5.9.2: {} + + uc.micro@2.1.0: {} + + undici-types@6.21.0: {} + + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + + universal-user-agent@6.0.1: {} + + universalify@0.1.2: {} + + unix-crypt-td-js@1.1.4: {} + + unpipe@1.0.0: {} + + update-notifier@7.3.1: + dependencies: + boxen: 8.0.1 + chalk: 5.6.0 + configstore: 7.0.0 + is-in-ci: 1.0.0 + is-installed-globally: 1.0.0 + is-npm: 6.0.0 + latest-version: 9.0.0 + pupa: 3.1.0 + semver: 7.7.2 + xdg-basedir: 5.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@8.3.2: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + + validator@13.15.15: {} + + vary@1.1.2: {} + + vite-node@3.2.4(@types/node@22.18.6): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 5.4.19(@types/node@22.18.6) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.19(@types/node@22.18.6): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.49.0 + optionalDependencies: + '@types/node': 22.18.6 + fsevents: 2.3.3 + + vitest@3.2.4(@types/node@22.18.6): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@5.4.19(@types/node@22.18.6)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.18 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 5.4.19(@types/node@22.18.6) + vite-node: 3.2.4(@types/node@22.18.6) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.18.6 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + when-exit@2.1.4: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@5.0.0: + dependencies: + isexe: 3.1.1 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + word-wrap@1.2.5: {} + + wrap-ansi@3.0.1: + dependencies: + string-width: 2.1.1 + strip-ansi: 4.0.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.3: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + xdg-basedir@5.1.0: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml@2.3.4: {} + + yaml@2.8.1: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.1.2: {} + + z-schema@5.0.5: + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.15.15 + optionalDependencies: + commander: 9.5.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..c32e14417 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +onlyBuiltDependencies: + - electron + - esbuild diff --git a/scripts/build-constants.js b/scripts/build-constants.js index e0f72f8f2..0f57b07c5 100644 --- a/scripts/build-constants.js +++ b/scripts/build-constants.js @@ -62,7 +62,7 @@ const run = async () => { import { CurlSslVersion } from '../enum/CurlSslVersion' import { CurlTimeCond } from '../enum/CurlTimeCond' import { CurlUseSsl } from '../enum/CurlUseSsl' - import { EasyNativeBinding } from "../types/EasyNativeBinding" + import { Easy } from "../Easy" import { Share } from "../Share" `, }) @@ -150,17 +150,14 @@ const run = async () => { flag: 'a+', }) - const easyBindingFilePath = path.resolve( - __dirname, - '../lib/types/EasyNativeBinding.ts', - ) + const easyBindingFilePath = path.resolve(__dirname, '../lib/Easy.ts') const curlClassFilePath = path.resolve(__dirname, '../lib/Curl.ts') createSetOptOverloads(easyBindingFilePath) createSetOptOverloads(curlClassFilePath, 'this') execSync( - `yarn prettier ${curlOptionsFilePath} ${curlInfoFilePath} ${multiOptionFilePath} ${easyBindingFilePath} ${curlClassFilePath}`, + `pnpm prettier ${curlOptionsFilePath} ${curlInfoFilePath} ${multiOptionFilePath} ${easyBindingFilePath} ${curlClassFilePath}`, ) } diff --git a/scripts/ci/build-libcurl.sh b/scripts/ci/build-libcurl.sh index 4d3a19d7e..7d6b06aad 100755 --- a/scripts/ci/build-libcurl.sh +++ b/scripts/ci/build-libcurl.sh @@ -33,11 +33,15 @@ HEIMDAL_BUILD_FOLDER=${HEIMDAL_BUILD_FOLDER:-} OPENLDAP_BUILD_FOLDER=${OPENLDAP_BUILD_FOLDER:-} LIBSSH2_BUILD_FOLDER=${LIBSSH2_BUILD_FOLDER:-} NGHTTP2_BUILD_FOLDER=${NGHTTP2_BUILD_FOLDER:-} +NGHTTP3_BUILD_FOLDER=${NGHTTP3_BUILD_FOLDER:-} +NGTCP2_BUILD_FOLDER=${NGTCP2_BUILD_FOLDER:-} OPENSSL_BUILD_FOLDER=${OPENSSL_BUILD_FOLDER:-} CARES_BUILD_FOLDER=${CARES_BUILD_FOLDER:-} BROTLI_BUILD_FOLDER=${BROTLI_BUILD_FOLDER:-} ZLIB_BUILD_FOLDER=${ZLIB_BUILD_FOLDER:-} +PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-} + LIBS=${LIBS:-} CPPFLAGS=${CPPFLAGS:-} LDFLAGS=${LDFLAGS:-} @@ -50,6 +54,11 @@ libcurl_args=() is_less_than_7_54_0=0 (printf '%s\n%s' "7.54.0" "$1" | $gsort -CV) || is_less_than_7_54_0=$? +# This is way faster than using distclean +if [ -d $2/source/$1 ] && [ -f $2/source/$1/configure ]; then + rm -rf $2/source/$1 +fi + if [ ! -d $2/source/$1 ]; then if [ "$is_less_than_7_54_0" == "1" ]; then echo "Using source tarball instead of release because this libcurl version does not have releases" @@ -73,12 +82,7 @@ if [ ! -d $2/source/$1 ]; then cd $2/source/$1 fi else - cd $2/source/$1 - if [ -f ./configure ]; then - make distclean || true; - else - ./buildconf - fi + ./buildconf fi # https://github.com/curl/curl/pull/1427#issuecomment-295783852 @@ -143,6 +147,16 @@ else libcurl_args+=("--without-ssl") fi +# --with-apple-sectrust was added on 8.7.0 +# So this script only adds it for versions >= that one. +is_less_than_8_7_0=0 +(printf '%s\n%s' "8.7.0" "$1" | $gsort -CV) || is_less_than_8_7_0=$? +if [ "$is_less_than_8_7_0" == "0" ]; then + if [ "$(uname)" == "Darwin" ]; then + libcurl_args+=("--with-apple-sectrust") + fi +fi + ###### # gss-api ##### @@ -225,6 +239,32 @@ else libcurl_args+=("--without-nghttp2") fi +##### +# nghttp3 and ngtcp2 (HTTP/3 support) +#### +# Only enable HTTP/3 if libcurl > 8.0.0 and both nghttp3 and ngtcp2 are available +is_less_than_8_0_0=0 +(printf '%s\n%s' "8.0.0" "$1"| $gsort -CV) || is_less_than_8_0_0=$? + +if [ "$is_less_than_8_0_0" == "0" ] && [ ! -z "$NGHTTP3_BUILD_FOLDER" ] && [ ! -z "$NGTCP2_BUILD_FOLDER" ]; then + echo "Enabling HTTP/3 support with nghttp3 and ngtcp2" + # nghttp3 support + CPPFLAGS="$CPPFLAGS -I$NGHTTP3_BUILD_FOLDER/include" + LDFLAGS="$LDFLAGS -L$NGHTTP3_BUILD_FOLDER/lib -Wl,-rpath,$NGHTTP3_BUILD_FOLDER/lib" + libcurl_args+=("--with-nghttp3=$NGHTTP3_BUILD_FOLDER") + + # ngtcp2 support + CPPFLAGS="$CPPFLAGS -I$NGTCP2_BUILD_FOLDER/include" + LDFLAGS="$LDFLAGS -L$NGTCP2_BUILD_FOLDER/lib -Wl,-rpath,$NGTCP2_BUILD_FOLDER/lib" + PKG_CONFIG_PATH="$NGTCP2_BUILD_FOLDER/lib/pkgconfig:$PKG_CONFIG_PATH" + # no path, we set pkg config path instead + # see https://github.com/curl/curl/issues/18188 + libcurl_args+=("--with-ngtcp2") +else + libcurl_args+=("--without-nghttp3") + libcurl_args+=("--without-ngtcp2") +fi + ##### # c-ares #### @@ -262,13 +302,18 @@ fi export LIBS=$LIBS export CPPFLAGS=$CPPFLAGS export LDFLAGS=$LDFLAGS +export PKG_CONFIG_PATH=$PKG_CONFIG_PATH # Debug # --enable-debug \ # Release - Static ./configure \ - --enable-debug \ + --disable-debug \ + --enable-optimize \ + --disable-warnings \ + --disable-curldebug \ + --disable-dependency-tracking \ --without-nss \ --without-libpsl \ --without-librtmp \ diff --git a/scripts/ci/build-nghttp2.sh b/scripts/ci/build-nghttp2.sh index 17177e76a..c06fe771e 100755 --- a/scripts/ci/build-nghttp2.sh +++ b/scripts/ci/build-nghttp2.sh @@ -45,6 +45,7 @@ fi ./configure \ --prefix=$build_folder \ --disable-app \ + --disable-debug \ --enable-lib-only \ --without-libxml2 \ --disable-shared diff --git a/scripts/ci/build-nghttp3.sh b/scripts/ci/build-nghttp3.sh new file mode 100755 index 000000000..86f8b0137 --- /dev/null +++ b/scripts/ci/build-nghttp3.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# +set -euo pipefail + +build_folder=$2/build/$1 +curr_dirname=$(dirname "$0") + +mkdir -p $build_folder +mkdir -p $2/source + +FORCE_REBUILD=${FORCE_REBUILD:-} + +# @TODO We are explicitly checking the static lib +if [[ -f $build_folder/lib/libnghttp3.a ]] && [[ -z $FORCE_REBUILD || $FORCE_REBUILD != "true" ]]; then + echo "Skipping rebuild of nghttp3 because lib file already exists" + exit 0 +fi + +if [ ! -d $2/source/$1 ]; then + $curr_dirname/download-and-unpack.sh https://github.com/ngtcp2/nghttp3/releases/download/v$1/nghttp3-$1.tar.gz $2 + + mv $2/nghttp3-$1 $2/source/$1 + cd $2/source/$1 +else + cd $2/source/$1 + make distclean || true; +fi + +CFLAGS=${CFLAGS:-} +export CFLAGS="$CFLAGS -fPIC" + +# Release - Static +./configure \ + --prefix=$build_folder \ + --enable-lib-only \ + --disable-debug \ + --disable-shared + +make && make install diff --git a/scripts/ci/build-ngtcp2.sh b/scripts/ci/build-ngtcp2.sh new file mode 100755 index 000000000..7318da927 --- /dev/null +++ b/scripts/ci/build-ngtcp2.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# +set -euo pipefail + +build_folder=$2/build/$1 +curr_dirname=$(dirname "$0") + +mkdir -p $build_folder +mkdir -p $2/source + +FORCE_REBUILD=${FORCE_REBUILD:-} + +# @TODO We are explicitly checking the static lib +if [[ -f $build_folder/lib/libngtcp2.a ]] && [[ -z $FORCE_REBUILD || $FORCE_REBUILD != "true" ]]; then + echo "Skipping rebuild of ngtcp2 because lib file already exists" + exit 0 +fi + +if [ ! -d $2/source/$1 ]; then + $curr_dirname/download-and-unpack.sh https://github.com/ngtcp2/ngtcp2/releases/download/v$1/ngtcp2-$1.tar.gz $2 + + mv $2/ngtcp2-$1 $2/source/$1 + cd $2/source/$1 +else + cd $2/source/$1 + make distclean || true; +fi + +CFLAGS=${CFLAGS:-} +export CFLAGS="$CFLAGS -fPIC" + +# Build PKG_CONFIG_PATH for dependencies +PKG_CONFIG_PATH_PARTS=() + +if [ -n "${OPENSSL_BUILD_FOLDER:-}" ]; then + PKG_CONFIG_PATH_PARTS+=("$OPENSSL_BUILD_FOLDER/lib/pkgconfig") +fi + +if [ -n "${NGHTTP3_BUILD_FOLDER:-}" ]; then + PKG_CONFIG_PATH_PARTS+=("$NGHTTP3_BUILD_FOLDER/lib/pkgconfig") +fi + +# Join array with colons +PKG_CONFIG_PATH_VALUE=$(IFS=:; echo "${PKG_CONFIG_PATH_PARTS[*]}") + +# Set LDFLAGS for rpath if OpenSSL is provided +LDFLAGS_VALUE="" +if [ -n "${OPENSSL_BUILD_FOLDER:-}" ]; then + LDFLAGS_VALUE="-Wl,-rpath,$OPENSSL_BUILD_FOLDER/lib" +fi + +# Release - Static +PKG_CONFIG_PATH="$PKG_CONFIG_PATH_VALUE" \ +LDFLAGS="$LDFLAGS_VALUE" \ +./configure \ + --prefix=$build_folder \ + --enable-lib-only \ + --enable-static \ + --disable-shared \ + --with-openssl \ + --with-libnghttp3 + +make && make install diff --git a/scripts/ci/build-zlib.sh b/scripts/ci/build-zlib.sh index 464712578..26f13ea61 100755 --- a/scripts/ci/build-zlib.sh +++ b/scripts/ci/build-zlib.sh @@ -19,12 +19,12 @@ fi if [ ! -d $2/source/$1 ]; then # zlib version may be in the format 1.2.13.1-motley # so we need to strip everything but major.minor.patch (removing the .1-motley part), and if we don't find it after that, we then need to try just major.minor - git_version_full=$(echo $1 | sed -E 's/([0-9]+\.[0-9]+\.[0-9]+)\..*/\1/') + git_version_full=$(echo $1 | sed -E 's/([0-9]+\.[0-9]+\.[0-9]+)[.-].*/\1/') git_version_major_minor=$(echo $git_version_full | sed -E 's/([0-9]+\.[0-9]+).*/\1/') $curr_dirname/download-and-unpack.sh https://github.com/madler/zlib/archive/v$1.tar.gz $2 || \ $curr_dirname/download-and-unpack.sh https://github.com/madler/zlib/archive/v${git_version_full}.tar.gz $2 || \ - $curr_dirname/download-and-unpack.sh https://github.com/madler/zlib/archive/v${git_version_major_minor}.tar.gz $2 || + $curr_dirname/download-and-unpack.sh https://github.com/madler/zlib/archive/v${git_version_major_minor}.tar.gz $2 ls -al $2/ diff --git a/scripts/ci/build.sh b/scripts/ci/build.sh index 33d041175..6a85e5a60 100755 --- a/scripts/ci/build.sh +++ b/scripts/ci/build.sh @@ -1,9 +1,13 @@ #!/bin/bash # This must be run from the root of the repo, and the following variables must be available: # GIT_COMMIT -# GIT_TAG +# GIT_REF_NAME # In case it's needed to use the vars declared here, this should be sourced on the current shell # . ./scripts/ci/build.sh + +# Eventually this will be replaced by vcpkg, only thing remaining is for vcpkg to support +# musl: https://github.com/microsoft/vcpkg/issues/21218 + set -euvo pipefail curr_dirname=$(dirname "$0") @@ -11,9 +15,6 @@ curr_dirname=$(dirname "$0") . $curr_dirname/utils/gsort.sh FORCE_REBUILD_DEFAULT=false -# if [[ ! -z "$GIT_TAG" ]]; then -# FORCE_REBUILD_DEFAULT=true -# fi export FORCE_REBUILD=${FORCE_REBUILD:-$FORCE_REBUILD_DEFAULT} @@ -39,7 +40,7 @@ if [ "$(uname)" == "Darwin" ]; then export MACOS_ARCH_FLAGS="" fi - export MACOSX_DEPLOYMENT_TARGET=11.6 + export MACOSX_DEPLOYMENT_TARGET=13 export MACOS_TARGET_FLAGS="-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET" export CFLAGS="$MACOS_TARGET_FLAGS $MACOS_ARCH_FLAGS" @@ -61,6 +62,7 @@ function cat_slower() { CI=${CI:-} PREFIX_DIR=${PREFIX_DIR:-$HOME} STOP_ON_INSTALL=${STOP_ON_INSTALL:-false} +ONLY_BUILD_DEPS=${ONLY_BUILD_DEPS:-false} RUN_PREGYP_CLEAN=${RUN_PREGYP_CLEAN:-true} # Disabled by default @@ -100,19 +102,37 @@ if [ "$(uname)" == "Darwin" ]; then if ! command -v cmake &>/dev/null; then (>&2 echo "Could not find cmake, we need it to build some dependencies (such as brotli)") (>&2 echo "You can get it by installing the cmake package:") - (>&2 echo "brew install cmake") + (>&2 echo "> brew install cmake") exit 1 fi if ! command -v autoreconf &>/dev/null; then (>&2 echo "Could not find autoreconf, we need it to build some dependencies (such as libssh2)") (>&2 echo "You can get it by installing the autoconf package:") - (>&2 echo "brew install autoconf") + (>&2 echo "> brew install autoconf") exit 1 fi if ! command -v aclocal &>/dev/null; then (>&2 echo "Could not find aclocal, we need it to build some dependencies (such as libssh2)") (>&2 echo "You can get it by installing the automake package:") - (>&2 echo "brew install automake") + (>&2 echo "> brew install automake") + exit 1 + fi + if ! command -v glibtoolize &>/dev/null; then + (>&2 echo "Could not find glibtoolize, we need it to build some dependencies (such as libssh2)") + (>&2 echo "You can get it by installing the glibtool package:") + (>&2 echo "> brew install libtool") + exit 1 + fi +fi + +if ! command -v soelim &>/dev/null; then + (>&2 echo "Could not find soelim, we need it to build some dependencies (such as openldap)") + (>&2 echo "You can get it by installing the groff package") + if [ "$(uname)" == "Darwin" ]; then + (>&2 echo "> brew install groff") + exit 1 + elif [ "$(uname)" == "Linux" ]; then + (>&2 echo "> apt-get install groff") exit 1 fi fi @@ -186,6 +206,39 @@ echo "Building nghttp2 v$NGHTTP2_RELEASE" export NGHTTP2_BUILD_FOLDER=$NGHTTP2_DEST_FOLDER/build/$NGHTTP2_RELEASE ls -al $NGHTTP2_BUILD_FOLDER/lib +################### +# Build HTTP/3 deps (nghttp3 and ngtcp2) if OpenSSL >= 3.5 +################### +# Check if OpenSSL version is >= 3.5.0 +is_openssl_ge_3_5_0=0 +(printf '%s\n%s' "3.5.0" "$OPENSSL_RELEASE" | $gsort -CV) && is_openssl_ge_3_5_0=1 || true + +if [ "$is_openssl_ge_3_5_0" == "1" ]; then + echo "OpenSSL version $OPENSSL_RELEASE is >= 3.5.0, building HTTP/3 support (nghttp3 and ngtcp2)" + + ################### + # Build nghttp3 + ################### + NGHTTP3_RELEASE=${NGHTTP3_RELEASE:-1.12.0} + NGHTTP3_DEST_FOLDER=$PREFIX_DIR/deps/nghttp3 + echo "Building nghttp3 v$NGHTTP3_RELEASE" + ./scripts/ci/build-nghttp3.sh $NGHTTP3_RELEASE $NGHTTP3_DEST_FOLDER >$LOGS_FOLDER/build-nghttp3.log 2>&1 + export NGHTTP3_BUILD_FOLDER=$NGHTTP3_DEST_FOLDER/build/$NGHTTP3_RELEASE + ls -al $NGHTTP3_BUILD_FOLDER/lib + + ################### + # Build ngtcp2 + ################### + NGTCP2_RELEASE=${NGTCP2_RELEASE:-1.17.0} + NGTCP2_DEST_FOLDER=$PREFIX_DIR/deps/ngtcp2 + echo "Building ngtcp2 v$NGTCP2_RELEASE" + ./scripts/ci/build-ngtcp2.sh $NGTCP2_RELEASE $NGTCP2_DEST_FOLDER >$LOGS_FOLDER/build-ngtcp2.log 2>&1 + export NGTCP2_BUILD_FOLDER=$NGTCP2_DEST_FOLDER/build/$NGTCP2_RELEASE + ls -al $NGTCP2_BUILD_FOLDER/lib +else + echo "OpenSSL version $OPENSSL_RELEASE is < 3.5.0, skipping HTTP/3 support (nghttp3 and ngtcp2)" +fi + ################### # Build GSS API Lib ################### @@ -311,6 +364,13 @@ curl-config --static-libs curl-config --prefix curl-config --cflags +if [ "$ONLY_BUILD_DEPS" == "true" ]; then + echo "Only building dependencies, exiting" + exit 0 +fi + +echo "Building node-libcurl" + # Some vars we will need below DISPLAY=${DISPLAY:-} PUBLISH_BINARY=${PUBLISH_BINARY:-} @@ -321,17 +381,13 @@ RUN_TESTS=${RUN_TESTS:-"true"} if [ -z "$PUBLISH_BINARY" ]; then PUBLISH_BINARY=false COMMIT_MESSAGE=$(git show -s --format=%B $GIT_COMMIT | tr -d '\n') - if [[ $GIT_TAG == `git describe --tags --always HEAD` || ${COMMIT_MESSAGE} =~ "[publish binary]" ]]; then + if [[ $GIT_REF_NAME == `git describe --tags --always HEAD` || ${COMMIT_MESSAGE} =~ "[publish binary]" ]]; then PUBLISH_BINARY=true; fi fi echo "Publish binary is: $PUBLISH_BINARY" -# Configure Yarn cache -mkdir -p ~/.cache/yarn -yarn config set cache-folder ~/.cache/yarn - run_tests_electron=false has_display=$(xdpyinfo -display $DISPLAY >/dev/null 2>&1 && echo "true" || echo "false") @@ -344,12 +400,12 @@ elif [ -n "$NWJS_VERSION" ]; then dist_url='' target="$NWJS_VERSION" - yarn global add nw-gyp nw@$target + pnpm i -g nw-gyp nw@$target # On macOS node-pre-gyp uses node-webkit instead of nw, see: # https://github.com/mapbox/node-pre-gyp/blob/d60bc992d20500e8ceb6fe3242df585a28c56413/lib/testbinary.js#L43 if [ "$(uname)" == "Darwin" ]; then - ln -s $(yarn global bin)/nw $(yarn global bin)/node-webkit + ln -s $(pnpm bin --global)/nw $(pnpm bin --global)/node-webkit fi else @@ -360,9 +416,18 @@ fi target=`echo $target | sed 's/^v//'` # ia32, x64, armv7, etc -target_arch=${TARGET_ARCH:-"x64"} +if [[ -z "${TARGET_ARCH:-}" ]]; then + case "$(uname -m)" in + x86_64) target_arch="x64" ;; + aarch64|arm64) target_arch="arm64" ;; + armv7l) target_arch="arm" ;; + *) target_arch="$(uname -m)" ;; + esac +else + target_arch="$TARGET_ARCH" +fi -NODE_LIBCURL_CPP_STD=${NODE_LIBCURL_CPP_STD:-$(node $curr_dirname/../cpp-std.js)} +NODE_LIBCURL_CPP_STD=${NODE_LIBCURL_CPP_STD:-"c++20"} # Build Addon export npm_config_curl_config_bin="$LIBCURL_DEST_FOLDER/build/$LIBCURL_RELEASE/bin/curl-config" @@ -385,7 +450,9 @@ echo "npm_config_dist_url=$npm_config_dist_url" echo "npm_config_target=$npm_config_target" echo "npm_config_target_arch=$npm_config_target_arch" -yarn install --frozen-lockfile --network-timeout 300000 +pnpm install --frozen-lockfile --force --fetch-timeout 300000 + +touch built-and-installed.hidden.txt if [ "$STOP_ON_INSTALL" == "true" ]; then set +uv @@ -410,40 +477,45 @@ sleep 1 if [ "$RUN_TESTS" == "true" ]; then if [ -n "$ELECTRON_VERSION" ]; then - [ $run_tests_electron == "true" ] && yarn test:electron || echo "Tests for this version of electron were disabled" + [ $run_tests_electron == "true" ] && pnpm test:electron || echo "Tests for this version of electron were disabled" elif [ -n "$NWJS_VERSION" ]; then echo "No tests available for node-webkit (nw.js)" else - yarn ts-node -e "console.log(require('./lib').Curl.getVersionInfoString())" || true - yarn test + pnpm exec ts-node -e "console.log(require('./lib').Curl.getVersionInfoString())" || true + pnpm test fi fi +# Create the tarballs +if [[ "$MACOS_UNIVERSAL_BUILD" == "true" ]]; then + # Need to publish two binaries when doing a universal build. + # + # Could also publish the universal build twice instead, but it might not + # play well with electron-builder which will try to lipo native add-ons + # for different architectures. + # -- + lipo build/Release/node_libcurl.node -thin x86_64 -output lib/binding/node_libcurl.node + lipo build/Release/node_libcurl.node -thin arm64 -output lib/binding/node_libcurl.node + + npm_config_target_arch=arm64 pnpm pregyp package testpackage --verbose + npm_config_target_arch=x64 pnpm pregyp package testpackage --verbose +else + pnpm pregyp package testpackage --verbose +fi + # If we are here, it means the addon worked # Check if we need to publish the binaries +# Notice, this is only useful if publishing locally, as the CI has a separate +# step defined on the workflow itself, which uses attestations. if [[ $PUBLISH_BINARY == true && $LIBCURL_RELEASE == $LATEST_LIBCURL_RELEASE ]]; then - echo "Publish binary is true - Testing and publishing package with pregyp" + echo "Publish binary is true - Publishing package with pregyp" if [[ "$MACOS_UNIVERSAL_BUILD" == "true" ]]; then - # Need to publish two binaries when doing a universal build. - # - # Could also publish the universal build twice instead, but it might not - # play well with electron-builder which will try to lipo native add-ons - # for different architectures. - # -- - # Build and publish x64 package - lipo build/Release/node_libcurl.node -thin x86_64 -output lib/binding/node_libcurl.node - npm_config_target_arch=x64 yarn pregyp package testpackage --verbose - npm_config_target_arch=x64 node scripts/module-packaging.js --publish \ - "$(npm_config_target_arch=x64 yarn --silent pregyp reveal staged_tarball --silent)" - - # Build and publish arm64 package. - lipo build/Release/node_libcurl.node -thin arm64 -output lib/binding/node_libcurl.node - npm_config_target_arch=arm64 yarn pregyp package --verbose # Can't testpackage for arm64 yet. - npm_config_target_arch=arm64 node scripts/module-packaging.js --publish \ - "$(npm_config_target_arch=arm64 yarn --silent pregyp reveal staged_tarball --silent)" + node scripts/module-packaging.js --publish \ + "$(npm_config_target_arch=x64 pnpm --silent pregyp reveal staged_tarball --silent)" + node scripts/module-packaging.js --publish \ + "$(npm_config_target_arch=arm64 pnpm --silent pregyp reveal staged_tarball --silent)" else - yarn pregyp package testpackage --verbose - node scripts/module-packaging.js --publish "$(yarn --silent pregyp reveal staged_tarball --silent)" + node scripts/module-packaging.js --publish "$(pnpm --silent pregyp reveal staged_tarball --silent)" fi fi @@ -452,17 +524,17 @@ fi INSTALL_RESULT=0 if [[ $PUBLISH_BINARY == true ]]; then echo "Publish binary is true - Testing if it was published correctly" - INSTALL_RESULT=$(npm_config_fallback_to_build=false yarn install --frozen-lockfile --network-timeout 300000 > /dev/null)$? || true + INSTALL_RESULT=$(npm_config_fallback_to_build=false pnpm install --frozen-lockfile --fetch-timeout 300000 > /dev/null)$? || true fi if [[ $INSTALL_RESULT != 0 ]]; then echo "Failed to install package from npm after being published" - node scripts/module-packaging.js --unpublish "$(yarn --silent pregyp reveal hosted_tarball --silent)" + node scripts/module-packaging.js --unpublish "$(pnpm --silent pregyp reveal hosted_tarball --silent)" false fi # Clean everything if [[ $RUN_PREGYP_CLEAN == true ]]; then - yarn pregyp clean + pnpm pregyp clean fi set +uv diff --git a/scripts/ci/windows/build.ps1 b/scripts/ci/windows/build.ps1 new file mode 100644 index 000000000..40132a80e --- /dev/null +++ b/scripts/ci/windows/build.ps1 @@ -0,0 +1,242 @@ +# Windows Build Script for node-libcurl +# This script is based on the AppVeyor configuration and is designed to run in GitHub Actions + +param( + [string]$GitCommit = $env:GIT_COMMIT, + [string]$GitRefName = $env:GIT_REF_NAME, + [string]$ElectronVersion = $env:ELECTRON_VERSION +) + +# Set error action preference +$ErrorActionPreference = "Stop" +$PSNativeCommandErrorActionPreference = "Stop" + +# Set up environment variables +$env:DEBUG = 'node-libcurl' +$env:NODE_LIBCURL_POSTINSTALL_SKIP_CLEANUP = 'true' + +# Get system information +$Architecture = (Get-WmiObject Win32_Processor).Architecture +# Convert architecture code to readable format +switch ($Architecture) { + 0 { $Architecture = "x86" } + 1 { $Architecture = "MIPS" } + 2 { $Architecture = "Alpha" } + 3 { $Architecture = "PowerPC" } + 5 { $Architecture = "ARM" } + 6 { $Architecture = "ia64" } + 9 { $Architecture = "x64" } + 12 { $Architecture = "ARM64" } + default { $Architecture = "Unknown" } +} + +Write-Host "=== Node-libcurl Windows Build Script ===" -ForegroundColor Green +Write-Host "Electron Version: $ElectronVersion" -ForegroundColor Yellow +Write-Host "Architecture: $Architecture" -ForegroundColor Yellow +Write-Host "Git Commit: $GitCommit" -ForegroundColor Yellow +Write-Host "Git Ref Name: $GitRefName" -ForegroundColor Yellow + +# Add localhost entries to hosts file (needed for c-ares DNS resolution) +Write-Host "Adding localhost entries to hosts file..." -ForegroundColor Blue +try { + Add-Content -Path "C:\Windows\System32\drivers\etc\hosts" -Value "127.0.0.1 localhost" -Force + Add-Content -Path "C:\Windows\System32\drivers\etc\hosts" -Value "::1 localhost" -Force +} catch { + Write-Warning "Failed to update hosts file: $($_.Exception.Message)" +} + +# Git is used for a couple of steps +Write-Host "Git Check..." -ForegroundColor Blue +try { + # vcpkg will be set up by the preinstall script + # Just verify git is available for vcpkg bootstrap + $gitVersion = git --version + Write-Host "Git version: $gitVersion" -ForegroundColor Cyan +} catch { + Write-Error "Git is required but not found in PATH: $($_.Exception.Message)" +} + +# Display system information +Write-Host "=== System Information ===" -ForegroundColor Green +Write-Host "Node version:" -ForegroundColor Blue +node --version +Write-Host "NPM version:" -ForegroundColor Blue +npm --version +Write-Host "PNPM version:" -ForegroundColor Blue +pnpm --version + +# Check if we need to publish the package +Write-Host "Checking if binary should be published..." -ForegroundColor Blue + +# Set default to false if not already set, but allow override via environment variable +if (-not $env:PUBLISH_BINARY) { + $env:PUBLISH_BINARY = "false" + + # Check commit message for [publish binary] or if we're on a tag + $commitMessage = "" + try { + $commitMessage = git show -s --format=%B $GitCommit + Write-Host "Commit message: $commitMessage" -ForegroundColor Cyan + } catch { + Write-Warning "Could not get commit message" + } + + $gitLatestTag = "" + try { + $gitLatestTag = git describe --tags --always HEAD + Write-Host "Git latest tag: $gitLatestTag" -ForegroundColor Cyan + } catch { + Write-Warning "Could not get git describe" + } + + if ($commitMessage.ToLower().Contains('[publish binary]') -or $gitLatestTag -eq $GitRefName) { + $env:PUBLISH_BINARY = "true" + Write-Host "Binary will be published (auto-detected)" -ForegroundColor Green + } else { + Write-Host "Binary will not be published (auto-detected)" -ForegroundColor Yellow + } +} else { + Write-Host "Binary publish setting overridden via environment variable: $env:PUBLISH_BINARY" -ForegroundColor Cyan +} + +# Note: vcpkg setup will be handled by the preinstall script in package.json +# No need for git submodules or Python configuration anymore + +# Set up build environment variables +Write-Host "Setting up build environment..." -ForegroundColor Blue + +$runtime = "" +$dist_url = "" +$target = "" + +if ($ElectronVersion) { + Write-Host "Building for Electron $ElectronVersion" -ForegroundColor Green + $runtime = "electron" + $dist_url = "https://electronjs.org/headers" + $target = $ElectronVersion + + # Install Electron globally + pnpm install -g electron@$ElectronVersion +} else { + Write-Host "Building for Node.js" -ForegroundColor Green + $runtime = "" + $dist_url = "" + $target = "" +} + + +# Get node-gyp version from package.json +$packageJson = Get-Content -Raw -Path "package.json" | ConvertFrom-Json +$nodeGypVersion = $null + +if ($packageJson.devDependencies -and $packageJson.devDependencies.'node-gyp') { + $nodeGypVersion = $packageJson.devDependencies.'node-gyp' +} elseif ($packageJson.dependencies -and $packageJson.dependencies.'node-gyp') { + $nodeGypVersion = $packageJson.dependencies.'node-gyp' +} + +if ($nodeGypVersion) { + Write-Host "node-gyp version from package.json: $nodeGypVersion" -ForegroundColor Cyan +} else { + Write-Host "node-gyp version not found in package.json, using latest" -ForegroundColor Yellow + $nodeGypVersion = "latest" +} + +# https://github.com/nodejs/node-gyp/blob/main/docs/Force-npm-to-use-global-node-gyp.md +Write-Host "Installing node-gyp@$nodeGypVersion..." -ForegroundColor Blue +npm install --global node-gyp@$nodeGypVersion +$globalNodeGypPath = Join-Path (npm prefix -g) "node_modules\node-gyp\bin\node-gyp.js" +Write-Host "Set node-gyp path to ${globalNodeGypPath}" + +# Remove 'v' prefix from target if present +$target = $target -replace '^v', '' + +# Set npm config variables +$env:npm_config_msvs_version = "2022" +$env:npm_config_build_from_source = "true" +$env:npm_config_runtime = $runtime +$env:npm_config_dist_url = $dist_url +$env:npm_config_target = $target +$env:npm_config_node_gyp = $globalNodeGypPath + +Write-Host "Build configuration:" -ForegroundColor Green +Write-Host " npm_config_msvs_version: $env:npm_config_msvs_version" -ForegroundColor Cyan +Write-Host " npm_config_build_from_source: $env:npm_config_build_from_source" -ForegroundColor Cyan +Write-Host " npm_config_runtime: $env:npm_config_runtime" -ForegroundColor Cyan +Write-Host " npm_config_dist_url: $env:npm_config_dist_url" -ForegroundColor Cyan +Write-Host " npm_config_target: $env:npm_config_target" -ForegroundColor Cyan + +# Install dependencies and build +Write-Host "Installing dependencies..." -ForegroundColor Blue +pnpm install --frozen-lockfile --fetch-timeout 300000 + +Write-Host "Build completed successfully!" -ForegroundColor Green + +# List build directory contents +Write-Host "Build directory contents:" -ForegroundColor Blue +Get-ChildItem -Path . -Force | Format-Table Name, Length, LastWriteTime + +# Run tests (skip for Electron builds) +Write-Host "Running tests..." -ForegroundColor Blue +if ($ElectronVersion) { + Write-Host "Skipping tests for Electron build" -ForegroundColor Yellow +} else { + try { + # Test basic functionality + pnpm exec ts-node -e "console.log(require('./lib').Curl.getVersionInfoString())" + + # Run full test suite + pnpm test + Write-Host "Tests passed!" -ForegroundColor Green + } catch { + Write-Error "Tests failed: $($_.Exception.Message)" + throw + } +} + +# Create the tarballs +pnpm pregyp package testpackage --verbose + +# Package and publish if needed +if ($env:PUBLISH_BINARY -eq "true") { + Write-Host "Packaging and publishing binary..." -ForegroundColor Blue + + try { + # Get the staged tarball path and publish it + $stagedTarball = pnpm --silent pregyp reveal staged_tarball --silent + Write-Host "Publishing: $stagedTarball" -ForegroundColor Cyan + node scripts\module-packaging.js --publish $stagedTarball + + Write-Host "Binary published successfully!" -ForegroundColor Green + } catch { + Write-Error "Failed to publish binary: $($_.Exception.Message)" + throw + } + + # Verify installation if binary was published + Write-Host "Verifying published binary..." -ForegroundColor Blue + + $installResult = 0 + try { + $env:npm_config_fallback_to_build = "false" + pnpm install --frozen-lockfile --fetch-timeout 300000 + Write-Host "Binary installation verification passed!" -ForegroundColor Green + } catch { + $installResult = 1 + Write-Error "Binary installation verification failed!" + + # Unpublish the binary if verification fails + try { + $hostedTarball = pnpm --silent pregyp reveal hosted_tarball --silent + Write-Host "Unpublishing: $hostedTarball" -ForegroundColor Yellow + node scripts\module-packaging.js --unpublish $hostedTarball + Write-Host "Binary unpublished due to verification failure" -ForegroundColor Yellow + } catch { + Write-Warning "Failed to unpublish binary: $($_.Exception.Message)" + } + + throw "Binary verification failed" + } +} + +Write-Host "=== Build script completed successfully! ===" -ForegroundColor Green diff --git a/scripts/cpp-std.js b/scripts/cpp-std.js deleted file mode 100644 index 2cbaa99f2..000000000 --- a/scripts/cpp-std.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -const isGreaterOrEqual = (a, b) => { - return a.localeCompare(b, undefined, { numeric: true }) >= 0 -} - -if (process.env.NODE_LIBCURL_CPP_STD) { - console.log(process.env.NODE_LIBCURL_CPP_STD) -} else { - // e.g: '/Users/jcm/.electron-gyp/32.2.6' - const nodeRootDir = process.argv[2] - - // detect electron related env vars coming from - // npm flags, e.g: npm_config_runtime - // we could also use node-abi here! - const isElectron = - process.env['npm_config_runtime'] === 'electron' || - nodeRootDir?.includes('electron-gyp') - const electronVersion = isElectron - ? process.env['npm_config_target'] ?? nodeRootDir?.split('/').pop() - : null - - if (isElectron && electronVersion) { - if (isGreaterOrEqual(electronVersion, '32.0.0')) { - console.log('c++20') - } else if (isGreaterOrEqual(electronVersion, '13.0.0')) { - console.log('c++17') - } else { - console.log('c++98') - } - } else { - // https://github.com/nodejs/node/blob/main/doc/abi_version_registry.json - // https://github.com/nodejs/node/blob/main/doc/abi_version_registry.json - // 129 === Node.js v23 - if (process.versions.modules && parseInt(process.versions.modules) >= 129) { - console.log('c++20') - } else if ( - process.versions.modules && - parseInt(process.versions.modules) >= 88 - ) { - // 88 === Node.js v15 - console.log('c++17') - } else { - console.log('c++98') - } - } -} diff --git a/scripts/data/options.js b/scripts/data/options.js index 2ae148b43..31fdd5118 100644 --- a/scripts/data/options.js +++ b/scripts/data/options.js @@ -60,33 +60,31 @@ const optionKindMap = { const optionKindValueMap = { dataCallback: - '((this: EasyNativeBinding, data: Buffer, size: number, nmemb: number) => number)', + '((this: Easy, data: Buffer, size: number, nmemb: number) => number)', progressCallback: - '((this: EasyNativeBinding, dltotal: number,dlnow: number,ultotal: number,ulnow: number) => number | CurlProgressFunc)', + '((this: Easy, dltotal: number,dlnow: number,ultotal: number,ulnow: number) => number | CurlProgressFunc)', stringList: 'string[]', blob: 'ArrayBuffer | Buffer | string', /* @TODO Add type definitions, they are on Curl.chunk */ CHUNK_BGN_FUNCTION: - '((this: EasyNativeBinding, fileInfo: FileInfo, remains: number) => CurlChunk)', + '((this: Easy, fileInfo: FileInfo, remains: number) => CurlChunk)', /* @TODO Add type definitions, they are on Curl.chunk */ - CHUNK_END_FUNCTION: '((this: EasyNativeBinding) => CurlChunk)', + CHUNK_END_FUNCTION: '((this: Easy) => CurlChunk)', /* @TODO Add type definitions, they are on Curl.info.debug */ - DEBUGFUNCTION: - '((this: EasyNativeBinding, type: CurlInfoDebug, data: Buffer) => 0)', + DEBUGFUNCTION: '((this: Easy, type: CurlInfoDebug, data: Buffer) => 0)', /* @TODO Add type definitions, they are on Curl.fnmatchfunc */ FNMATCH_FUNCTION: - '((this: EasyNativeBinding, pattern: string, value: string) => CurlFnMatchFunc)', + '((this: Easy, pattern: string, value: string) => CurlFnMatchFunc)', HSTSREADFUNCTION: - '((this: EasyNativeBinding) => null | CurlHstsCacheEntry | CurlHstsCacheEntry[])', + '((this: Easy, options: { maxHostLengthBytes: number }) => null | CurlHstsCacheEntry | CurlHstsCacheEntry[])', HSTSWRITEFUNCTION: - '((this: EasyNativeBinding, cacheEntry: CurlHstsCacheEntry, cacheCount: CurlHstsCacheCount) => any)', + '((this: Easy, cacheEntry: CurlHstsCacheEntry, cacheCount: CurlHstsCacheCount) => any)', PREREQFUNCTION: - '((this: EasyNativeBinding, connPrimaryIp: string, connLocalIp: string, connPrimaryPort: number, conLocalPort: number) => CurlPreReqFunc)', + '((this: Easy, connPrimaryIp: string, connLocalIp: string, connPrimaryPort: number, conLocalPort: number) => CurlPreReqFunc)', HTTPPOST: 'HttpPostField[]', - TRAILERFUNCTION: '((this: EasyNativeBinding) => string[] | false)', + TRAILERFUNCTION: '((this: Easy) => string[] | false)', /* @TODO Add CURL_SEEKFUNC_* type definitions */ - SEEKFUNCTION: - '((this: EasyNativeBinding, offset: number, origin: number) => number)', + SEEKFUNCTION: '((this: Easy, offset: number, origin: number) => number)', SHARE: 'Share', // enums diff --git a/scripts/openssl-disable.js b/scripts/openssl-disable.js new file mode 100644 index 000000000..3bc47d5e4 --- /dev/null +++ b/scripts/openssl-disable.js @@ -0,0 +1,40 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +// https://github.com/nodejs/node-gyp/blob/64bb407c14149c216885a48e78df178cedaec8fd/bin/node-gyp.js#L25 +if (process.platform !== 'win32') { + process.exit(0) +} + +const fs = require('fs') +const path = require('path') +const os = require('os') + +const envPaths = require('env-paths') + +const homeDir = os.homedir() + +let { version } = process +let gypFolder = envPaths('node-gyp', { suffix: '' }).cache + +if (process.env.npm_config_runtime === 'node-webkit') { + version = process.env.npm_config_target + gypFolder = path.resolve(homeDir, '.nw-gyp') +} + +// node-gyp path from here: https://github.com/nodejs/node-gyp/blob/v5.0.3/bin/node-gyp.js#L31 +const gypDir = path.resolve(gypFolder, version.replace('v', '')) + +// we are renaming the openssl directory so it does not get used when compilling. +// node-gyp default addon.gyp file adds the above folder as include, which would make +// the c++ includes for openssl/* point to that folder, instead of using the one from the openssl +// we are building. This only happens for node >= 10, probably because only with this version +// openssl started to be have their symbols exported on Windows, or for another obscure reason. +const opensslFolder = path.resolve(gypDir, 'include', 'node', 'openssl') +const opensslFolderDisabled = `${opensslFolder}.disabled` +if (fs.existsSync(opensslFolder)) { + fs.renameSync(opensslFolder, opensslFolderDisabled) +} diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 906c0a29f..0490c470f 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -26,7 +26,7 @@ if (process.env.npm_config_runtime === 'node-webkit') { // node-gyp path from here: https://github.com/nodejs/node-gyp/blob/v5.0.3/bin/node-gyp.js#L31 const gypDir = path.resolve(gypFolder, version.replace('v', '')) -// reverting what we did in scripts/retrieve-win-deps.js +// reverting what we did in our install script const opensslFolder = path.resolve(gypDir, 'include', 'node', 'openssl') const opensslFolderDisabled = `${opensslFolder}.disabled` if (fs.existsSync(opensslFolderDisabled)) { @@ -77,7 +77,7 @@ module.exports = function install() { // this is ternary will almost always fall into the first condition. // If we are using TS it probably means we have the git repo setup too. // But who knows, someone may be trying the code from a zip archive or something lol - const executable = distIndexExists ? 'node' : 'yarn ts-node' + const executable = distIndexExists ? 'node' : 'pnpm ts-node' const file = distIndexExists ? distIndexPath diff --git a/scripts/retrieve-win-deps.js b/scripts/retrieve-win-deps.js deleted file mode 100644 index a5fea2e41..000000000 --- a/scripts/retrieve-win-deps.js +++ /dev/null @@ -1,220 +0,0 @@ -/** - * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -// https://github.com/nodejs/node-gyp/blob/64bb407c14149c216885a48e78df178cedaec8fd/bin/node-gyp.js#L25 -if (process.platform !== 'win32') { - process.exit(0) -} - -const { exec } = require('child_process') -const fs = require('fs') -const path = require('path') -const os = require('os') -const util = require('util') - -const envPaths = require('env-paths') - -// we cannot use fs.promises because it was added on Node.js 10 -// but we need to support Node.js >= 8 -const fsOpenAsync = util.promisify(fs.open) -const fsCloseAsync = util.promisify(fs.close) -const fsReadAsync = util.promisify(fs.read) -const fsWriteAsync = util.promisify(fs.write) -const fsStatAsync = util.promisify(fs.stat) -const execAsync = util.promisify(exec) - -const homeDir = os.homedir() - -let { version } = process -let gypFolder = envPaths('node-gyp', { suffix: '' }).cache - -if (process.env.npm_config_runtime === 'node-webkit') { - version = process.env.npm_config_target - gypFolder = path.resolve(homeDir, '.nw-gyp') -} - -// node-gyp path from here: https://github.com/nodejs/node-gyp/blob/v5.0.3/bin/node-gyp.js#L31 -const gypDir = path.resolve(gypFolder, version.replace('v', '')) - -// we are renaming the openssl directory so it does not get used when compilling. -// node-gyp default addon.gyp file adds the above folder as include, which would make -// the c++ includes for openssl/* point to that folder, instead of using the one from the openssl -// we are building. This only happens for node >= 10, probably because only with this version -// openssl started to be have their symbols exported on Windows, or for another obscure reason. -const opensslFolder = path.resolve(gypDir, 'include', 'node', 'openssl') -const opensslFolderDisabled = `${opensslFolder}.disabled` -if (fs.existsSync(opensslFolder)) { - fs.renameSync(opensslFolder, opensslFolderDisabled) -} - -const execConfig = { - cwd: path.resolve(__dirname + '/..'), -} - -const depsGypTarget = 'curl-for-windows/curl.gyp:libcurl' - -const fileWithDepsTag = 'LIBCURL_VERSION_WIN_DEPS' -const depsRepo = 'https://github.com/JCMais/curl-for-windows.git' -const envCurlForWindowsDepsVersionTag = process.env.NODE_LIBCURL_WINDEPS_TAG - -const cleanupAndExit = (code = 0) => { - // we are not reverting the openssl change we did above in here because - // this is being done inside scripts/postinstall.js - process.exit(code) -} - -// let the magic begins -const run = async () => { - try { - const { stdout } = await execAsync( - 'git rev-parse --show-toplevel', - execConfig, - ) - - // Check if we are in the root git dir. - // That is, someone is running this directly from the node-libcurl repo. - // if we are, just replace the tokens. - if (path.relative(execConfig.cwd, stdout.trim()) === '') { - return replaceTokensOnFiles( - path.resolve(__dirname, '..', 'deps', 'curl-for-windows'), - ).then(() => { - process.stdout.write(`deps/${depsGypTarget}`) - }) - } - } catch (_) { - // ignore errors - } - - // otherwise retrieve the deps - return retrieveWinDeps() -} - -const retrieveWinDeps = async () => { - const fileExists = fs.existsSync(fileWithDepsTag) - - if (!fileExists && !envCurlForWindowsDepsVersionTag) { - console.error( - `File: ${fileWithDepsTag} not found, and no NODE_LIBCURL_WINDEPS_TAG environment variable found.`, - ) - cleanupAndExit(1) - } - - const depsTag = envCurlForWindowsDepsVersionTag - ? envCurlForWindowsDepsVersionTag.trim() - : fs.readFileSync(fileWithDepsTag).toString().replace(/\n|\s/g, '') - - try { - await execAsync(`git clone --branch ${depsTag} ${depsRepo}`, execConfig) - } catch (error) { - if ( - error - .toString() - .indexOf('already exists and is not an empty directory') !== -1 - ) { - await execAsync('rmdir curl-for-windows /S /Q', execConfig) - - return retrieveWinDeps() - } else { - throw error - } - } - - await execAsync( - 'cd curl-for-windows && git submodule update --init && python configure.py', - execConfig, - ) - - // Grab gyp config files and replace <(library) with static_library - await replaceTokensOnFiles(path.resolve(__dirname, '..', 'curl-for-windows')) - - // remove git folder - await execAsync('rmdir curl-for-windows\\.git /S /Q', execConfig) - - process.stdout.write(depsGypTarget) -} - -async function replaceTokensOnFiles(dir) { - const filesToCheck = [ - 'libssh2.gyp', - 'openssl/openssl.gyp', - 'cares/cares.gyp', - 'nghttp2/nghttp2.gyp', - 'zlib.gyp', - 'curl.gyp', - ] - - const replacements = [ - { - pattern: /<\(library\)/g, - replacement: 'static_library', - }, - // { - // pattern: /curl_for_windows_build_openssl%': 'true'/g, - // replacement: 'curl_for_windows_build_openssl\': \'false\'', - // }, - ] - - await Promise.all( - filesToCheck.map(async (file) => { - const filePath = path.resolve(dir, file) - for (const patternReplacementPair of replacements) { - await replaceOnFile( - filePath, - patternReplacementPair.pattern, - patternReplacementPair.replacement, - ) - } - }), - ) -} - -const REPLACE_ON_FILE_INITIAL_CHUNK_SIZE = 2048 - -async function replaceOnFile(file, search, replacement) { - const fd = await fsOpenAsync(file, 'r+') - - try { - const stat = await fsStatAsync(file) - - const totalSize = stat.size - const buffer = Buffer.alloc(totalSize) - - let chunkSize = REPLACE_ON_FILE_INITIAL_CHUNK_SIZE - let totalRead = 0 - - // this while is not the best way to do this - // but hey, it works, and we are processing just 5 files :D - // The best way here probably would be to use a readable stream - while (totalRead < totalSize) { - if (totalRead + chunkSize > totalSize) { - chunkSize = totalSize - totalRead - } - const { bytesRead } = await fsReadAsync( - fd, - buffer, - totalRead, - chunkSize, - totalRead, - ) - totalRead += bytesRead - } - - const fileNewContent = buffer.toString('utf8').replace(search, replacement) - - await fsWriteAsync(fd, fileNewContent, 0, 'utf8') - } finally { - await fsCloseAsync(fd) - } -} - -run() - .then(() => { - cleanupAndExit() - }) - .catch((error) => { - console.error(error.toString()) - cleanupAndExit(1) - }) diff --git a/scripts/utils/buildFlags.js b/scripts/utils/buildFlags.js index e321ad01b..27f398cba 100644 --- a/scripts/utils/buildFlags.js +++ b/scripts/utils/buildFlags.js @@ -7,7 +7,7 @@ let isGitRepo try { fs.statSync(path.resolve(__dirname, '..', '..', '.git')) isGitRepo = true -} catch (e) { +} catch { isGitRepo = false } diff --git a/scripts/utils/convertCurlConstantToCamelCase.js b/scripts/utils/convertCurlConstantToCamelCase.js index a30dd3115..bc1a916c0 100644 --- a/scripts/utils/convertCurlConstantToCamelCase.js +++ b/scripts/utils/convertCurlConstantToCamelCase.js @@ -10,7 +10,7 @@ // hstsReadFunction const regexp = - /^([A-Z]+)(FUNCTION|CONNECTS|DATA|RESOLVE|VALUE|ALIASES|REDIRS|CERT|KEY|MAX|AGE|REDIR|DELAY|AGENT|OPTIONS|TEXT|USERPWD|PASSWD|LEVEL|SVC|SOCKET|SSL|PUBLIC|LOCATION|LIST|(? /** * ${option.description.trim()} * - * Official libcurl documentation: : [${option.url}](${option.url}) + * Official libcurl documentation: [${option.url}](${option.url}) */ ` : ` /** - * Official libcurl documentation: : [${option.url}](${option.url}) + * Official libcurl documentation: [${option.url}](${option.url}) */ ` diff --git a/scripts/utils/createSetOptOverloads.js b/scripts/utils/createSetOptOverloads.js index 5e6b2a98a..aeec748fe 100644 --- a/scripts/utils/createSetOptOverloads.js +++ b/scripts/utils/createSetOptOverloads.js @@ -14,7 +14,7 @@ const getSetOptDefinition = ( extraComments = '', ) => `/** - * Use {@link "Curl".Curl.option|\`Curl.option\`} for predefined constants.${extraComments} + * Use {@link Curl.option|\`Curl.option\`} for predefined constants.${extraComments} * * * Official libcurl documentation: [\`curl_easy_setopt()\`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html) diff --git a/scripts/utils/multiOptionsBlacklist.js b/scripts/utils/multiOptionsBlacklist.js index f172e2f8a..71a668d8a 100644 --- a/scripts/utils/multiOptionsBlacklist.js +++ b/scripts/utils/multiOptionsBlacklist.js @@ -1,16 +1,18 @@ // This should be kept in sync with the options on src/Curl.cc curlMultiOptionNotImplemented const multiOptionsBlacklist = [ - 'SOCKETFUNCTION', - 'SOCKETDATA', - 'TIMERFUNCTION', - 'TIMERDATA', - 'PUSHDATA', + 'CURLMOPT_SOCKETFUNCTION', + 'CURLMOPT_SOCKETDATA', + 'CURLMOPT_TIMERFUNCTION', + 'CURLMOPT_TIMERDATA', + 'CURLMOPT_PUSHDATA', + 'CURLMOPT_NOTIFYFUNCTION', + 'CURLMOPT_NOTIFYDATA', // Those have been deprecated and support was removed with libcurl 7.62 // https://github.com/curl/curl/blob/curl-7_61_1/docs/DEPRECATE.md#http-pipelining // They currently do nothing, so I'm not documenting them - 'PIPELINING', - 'PIPELINING_SERVER_BL', - 'PIPELINING_SITE_BL', + 'CURLMOPT_PIPELINING', + 'CURLMOPT_PIPELINING_SERVER_BL', + 'CURLMOPT_PIPELINING_SITE_BL', ] module.exports = { diff --git a/scripts/utils/retrieveConstantList.js b/scripts/utils/retrieveConstantList.js index 6b145a7a9..890621cd1 100644 --- a/scripts/utils/retrieveConstantList.js +++ b/scripts/utils/retrieveConstantList.js @@ -20,13 +20,18 @@ const retrieveConstantList = async ({ url, constantPrefix, blacklist }) => { .map((i, el) => { const $descriptionEl = $(el).parent().next() - $descriptionEl.find('a').remove() + $descriptionEl.find('a').replaceWith(function () { + return $(this).text() + }) let description = $descriptionEl .text() .trim() .replace(/See$/, '') .replace(/>/g, '\\>') + .replace(/See [A-Z_]+$/, '') + .replace(/(\S.+)CURLOPT_[\w_]+$/, '$1') + .replace('We recommend using curl_easy_header instead.', '') .trim() const constantOriginal = $(el).text() diff --git a/scripts/vcpkg-common.js b/scripts/vcpkg-common.js new file mode 100644 index 000000000..eabdd8e29 --- /dev/null +++ b/scripts/vcpkg-common.js @@ -0,0 +1,31 @@ +const path = require('path') + +// Exit if not Windows +if (process.platform !== 'win32') { + process.exit(0) +} + +const moduleRoot = path.resolve(__dirname, '..') +const vcpkgRoot = process.env.VCPKG_ROOT || path.join(moduleRoot, 'vcpkg') + +// Triplet mapping +const arch = process.arch +const tripletMap = { + x64: 'x64-windows-static-md', + arm64: 'arm64-windows-static-md', + // x64: 'x64-windows-static', + // arm64: 'arm64-windows-static', +} +const triplet = tripletMap[arch] + +if (!triplet) { + console.error(`Unsupported architecture: ${arch}`) + process.exit(1) +} + +module.exports = { + triplet, + vcpkgRoot, + moduleRoot, + arch, +} diff --git a/scripts/vcpkg-get-info.js b/scripts/vcpkg-get-info.js new file mode 100644 index 000000000..3abf675f9 --- /dev/null +++ b/scripts/vcpkg-get-info.js @@ -0,0 +1,70 @@ +const fs = require('fs') +const path = require('path') + +const { triplet, moduleRoot } = require('./vcpkg-common') + +// Exit if not Windows +if (process.platform !== 'win32') { + process.exit(0) +} + +const args = process.argv.slice(2) + +const installedRoot = path.join(moduleRoot, 'vcpkg_installed', triplet) + +// Collect all .lib files +const libDir = path.join(installedRoot, 'lib') +const debugLibDir = path.join(installedRoot, 'debug', 'lib') + +const libs = fs + .readdirSync(libDir) + .filter((f) => f.endsWith('.lib')) + .map((f) => path.join(libDir, f)) + +const debugLibs = fs.existsSync(debugLibDir) + ? fs + .readdirSync(debugLibDir) + .filter((f) => f.endsWith('.lib')) + .map((f) => path.join(debugLibDir, f)) + : [] + +// System libraries +const systemLibs = [ + 'Ws2_32.lib', + // crypto / openssl + 'Crypt32.lib', + // ldap + 'Wldap32.lib', + // idn + 'Normaliz.lib', + // sspi / schannel + 'Secur32.lib', + 'Advapi32.lib', + 'Bcrypt.lib', + 'Iphlpapi.lib', +] +// -lwldap32 -lnormaliz -lbcrypt -ladvapi32 -lcrypt32 -lsecur32 -lws2_32 -liphlpapi --lws2_32 -lntdll -lbcrypt +function normalizePath(pathStr) { + return pathStr.split(path.sep).join('/') +} + +// Write config for binding.gyp +const config = { + triplet, + installedPath: normalizePath(installedRoot), + includeDir: normalizePath(path.join(installedRoot, 'include')), + libDir: normalizePath(libDir), + debugLibDir: normalizePath(debugLibDir), + libraries: [...libs, ...systemLibs].map(normalizePath), + debugLibraries: [...debugLibs, ...systemLibs].map(normalizePath), +} + +if (args.includes('--include-dir')) { + console.log(config.includeDir) +} else if (args.includes('--libs')) { + console.log(config.libraries.join(' ')) +} else { + console.log(config) +} + +// here -> we need to use openssl, and pick the same version as nodejs :| diff --git a/scripts/vcpkg-setup.js b/scripts/vcpkg-setup.js new file mode 100644 index 000000000..8e2aa563e --- /dev/null +++ b/scripts/vcpkg-setup.js @@ -0,0 +1,85 @@ +// this should not use any third party dependencies! Only native Node.js modules! +const { execSync: exec } = require('child_process') +const fs = require('fs') +const path = require('path') + +const { triplet, moduleRoot, vcpkgRoot } = require('./vcpkg-common') + +const modulePackageJson = require('../package.json') + +async function setupVcpkg() { + try { + let vcpkgExe + + // Check for global vcpkg + if (process.env.VCPKG_ROOT) { + vcpkgExe = path.join(process.env.VCPKG_ROOT, 'vcpkg.exe') + if (!fs.existsSync(vcpkgExe)) { + console.error('VCPKG_ROOT set but vcpkg.exe not found') + process.exit(1) + } + console.log(`Using global vcpkg at ${process.env.VCPKG_ROOT}`) + } else { + // Bootstrap local vcpkg + if (!fs.existsSync(vcpkgRoot)) { + console.log('Cloning vcpkg locally...') + exec( + `git clone https://github.com/microsoft/vcpkg.git "${vcpkgRoot}"`, + { + cwd: path.dirname(vcpkgRoot), + maxBuffer: 10 * 1024 * 1024, + stdio: 'inherit', + }, + ) + } else { + console.log(`Using local vcpkg at ${vcpkgRoot}`) + } + + vcpkgExe = path.join(vcpkgRoot, 'vcpkg.exe') + if (!fs.existsSync(vcpkgExe)) { + console.log('Bootstrapping vcpkg...') + exec(`"${path.join(vcpkgRoot, 'bootstrap-vcpkg.bat')}"`, { + cwd: vcpkgRoot, + maxBuffer: 10 * 1024 * 1024, + stdio: 'inherit', + }) + } + } + + await createVcpkgJson() + + // Install dependencies + console.log(`Installing curl with ${triplet}...`) + const installCmd = `"${vcpkgExe}" install --triplet ${triplet}` + exec(installCmd, { + cwd: moduleRoot, + maxBuffer: 20 * 1024 * 1024, + stdio: 'inherit', + }) + + const installedRoot = path.join(moduleRoot, 'vcpkg_installed', triplet) + + console.log(`✓ vcpkg setup complete`) + console.log(` Installed to: ${installedRoot}`) + } catch (error) { + console.error('vcpkg setup failed:', error.message) + if (error.stdout) console.error('stdout:', error.stdout) + if (error.stderr) console.error('stderr:', error.stderr) + process.exit(1) + } +} + +async function createVcpkgJson() { + const vcpkgJsonTemplate = fs.readFileSync( + path.join(moduleRoot, 'vcpkg.template.json'), + 'utf8', + ) + const nodeOpenSSLVersion = process.versions.openssl.replace('+quic', '') + const vcpkgJson = vcpkgJsonTemplate + .replace('$$OPENSSL_VERSION$$', nodeOpenSSLVersion) + .replace('$$NODE_LIBCURL_VERSION$$', modulePackageJson.version) + + fs.writeFileSync(path.join(moduleRoot, 'vcpkg.json'), vcpkgJson) +} + +setupVcpkg() diff --git a/src/Curl.cc b/src/Curl.cc index b16c745f4..e616df8f6 100644 --- a/src/Curl.cc +++ b/src/Curl.cc @@ -1,9 +1,10 @@ #ifndef NOMINMAX -// Fix for: warning C4003: not enough arguments for function-like macro invocation 'max' -// [C:\projects\node-libcurl\build\node_libcurl.vcxproj] #define NOMINMAX +#include #endif +#include "Multi.h" +#include "napi.h" /** * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. * @@ -11,79 +12,86 @@ * LICENSE file in the root directory of this source tree. */ #include "Curl.h" - +#include "CurlError.h" #include "CurlHttpPost.h" +#include "CurlVersionInfo.h" #include "Easy.h" +#include "Http2PushFrameHeaders.h" +#include "Share.h" +#include "curl/curl.h" +#include "macros.h" +#include #include - +#include +#include +#include namespace NodeLibcurl { -ssize_t addonAllocatedMemory = 0; -bool isLibcurlBuiltWithThreadedResolver = true; +// Values from a Win64 build +std::unordered_map handleMemoryMap = {{CURL_HANDLE_TYPE_EASY, 30000}, + {CURL_HANDLE_TYPE_MULTI, 60000}, + {CURL_HANDLE_TYPE_SHARE, 60000}}; -// This should be kept in sync with the options on scripts/utils/curlOptionsBlacklist.js -const std::vector curlOptionNotImplemented = { - // Options that are complex to add support for. - {"SSL_CTX_FUNCTION", CURLOPT_SSL_CTX_FUNCTION}, - {"OPENSOCKETFUNCTION", CURLOPT_OPENSOCKETFUNCTION}, - {"CLOSESOCKETFUNCTION", CURLOPT_CLOSESOCKETFUNCTION}, - {"SOCKOPTFUNCTION", CURLOPT_SOCKOPTFUNCTION}, +// Optimized hash map lookups for curl constants with category information +// Note: Stores vectors to handle duplicate names (e.g., CERTINFO as both option and info) +std::unordered_map> curlConstantsByName; +std::unordered_map> curlConstantsByValue; -#if NODE_LIBCURL_VER_GE(7, 59, 0) - {"RESOLVER_START_DATA", CURLOPT_RESOLVER_START_DATA}, - {"RESOLVER_START_FUNCTION", CURLOPT_RESOLVER_START_FUNCTION}, +const std::vector curlOptionBlob = { +#if NODE_LIBCURL_VER_GE(7, 77, 0) + {"CAINFO_BLOB", CURLOPT_CAINFO_BLOB}, #endif - {"CONV_FROM_UTF8_FUNCTION", CURLOPT_CONV_FROM_UTF8_FUNCTION}, - {"CONV_TO_NETWORK_FUNCTION", CURLOPT_CONV_TO_NETWORK_FUNCTION}, - {"CONV_FROM_NETWORK_FUNCTION", CURLOPT_CONV_FROM_NETWORK_FUNCTION}, +#if NODE_LIBCURL_VER_GE(7, 71, 0) + {"ISSUERCERT_BLOB", CURLOPT_ISSUERCERT_BLOB}, - // Options that are used internally. - {"WRITEDATA", CURLOPT_WRITEDATA}, - {"HEADERDATA", CURLOPT_HEADERDATA}, +#if NODE_LIBCURL_VER_GE(7, 77, 0) + {"PROXY_CAINFO_BLOB", CURLOPT_PROXY_CAINFO_BLOB}, +#endif -// Options that are not necessary because javascript nature. -#if NODE_LIBCURL_VER_GE(7, 63, 0) - // URL's can be easily parsed on JS - {"CURLU", CURLOPT_CURLU}, + {"PROXY_SSLCERT_BLOB", CURLOPT_PROXY_SSLCERT_BLOB}, + {"PROXY_SSLKEY_BLOB", CURLOPT_PROXY_SSLKEY_BLOB}, + {"SSLCERT_BLOB", CURLOPT_SSLCERT_BLOB}, + {"SSLKEY_BLOB", CURLOPT_SSLKEY_BLOB}, #endif +}; - {"PRIVATE", CURLOPT_PRIVATE}, - {"PROGRESSDATA", CURLOPT_PROGRESSDATA}, +const std::vector curlOptionFunction = { + {"CHUNK_BGN_FUNCTION", CURLOPT_CHUNK_BGN_FUNCTION}, + {"CHUNK_END_FUNCTION", CURLOPT_CHUNK_END_FUNCTION}, + {"FNMATCH_FUNCTION", CURLOPT_FNMATCH_FUNCTION}, + {"DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION}, + {"HEADERFUNCTION", CURLOPT_HEADERFUNCTION}, -#if NODE_LIBCURL_VER_GE(7, 32, 0) - {"XFERINFODATA", CURLOPT_XFERINFODATA}, +#if NODE_LIBCURL_VER_GE(7, 74, 0) + {"HSTSREADFUNCTION", CURLOPT_HSTSREADFUNCTION}, + {"HSTSWRITEFUNCTION", CURLOPT_HSTSWRITEFUNCTION}, #endif - {"DEBUGDATA", CURLOPT_DEBUGDATA}, - {"SEEKDATA", CURLOPT_SEEKDATA}, - {"IOCTLDATA", CURLOPT_IOCTLDATA}, - {"SOCKOPTDATA", CURLOPT_SOCKOPTDATA}, - {"OPENSOCKETDATA", CURLOPT_OPENSOCKETDATA}, - {"CLOSESOCKETDATA", CURLOPT_CLOSESOCKETDATA}, - {"SSL_CTX_DATA", CURLOPT_SSL_CTX_DATA}, - {"INTERLEAVEDATA", CURLOPT_INTERLEAVEDATA}, - {"CHUNK_DATA", CURLOPT_CHUNK_DATA}, - {"FNMATCH_DATA", CURLOPT_FNMATCH_DATA}, - {"ERRORBUFFER", CURLOPT_ERRORBUFFER}, - {"COPYPOSTFIELDS", CURLOPT_COPYPOSTFIELDS}, - {"SSH_KEYDATA", CURLOPT_SSH_KEYDATA}, +#if NODE_LIBCURL_VER_GE(7, 80, 0) + {"PREREQFUNCTION", CURLOPT_PREREQFUNCTION}, +#endif + + {"PROGRESSFUNCTION", CURLOPT_PROGRESSFUNCTION}, + {"READFUNCTION", CURLOPT_READFUNCTION}, + {"SEEKFUNCTION", CURLOPT_SEEKFUNCTION}, #if NODE_LIBCURL_VER_GE(7, 64, 0) - {"TRAILERDATA", CURLOPT_TRAILERDATA}, + {"TRAILERFUNCTION", CURLOPT_TRAILERFUNCTION}, #endif - // Maybe? - {"INTERLEAVEFUNCTION", CURLOPT_INTERLEAVEFUNCTION}, - {"SSH_KEYFUNCTION", CURLOPT_SSH_KEYFUNCTION}, - {"STDERR", CURLOPT_STDERR}, - -#if NODE_LIBCURL_VER_GE(7, 46, 0) - {"STREAM_DEPENDS", CURLOPT_STREAM_DEPENDS}, - {"STREAM_DEPENDS_E", CURLOPT_STREAM_DEPENDS_E}, - {"STREAM_WEIGHT", CURLOPT_STREAM_WEIGHT}, +#if NODE_LIBCURL_VER_GE(7, 32, 0) + {"XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION}, #endif + + {"WRITEFUNCTION", CURLOPT_WRITEFUNCTION}, +}; + +const std::vector curlOptionHttpPost = { + {"NAME", CurlHttpPost::NAME}, {"FILE", CurlHttpPost::FILE}, + {"CONTENTS", CurlHttpPost::CONTENTS}, {"TYPE", CurlHttpPost::TYPE}, + {"FILENAME", CurlHttpPost::FILENAME}, }; const std::vector curlOptionInteger = { @@ -92,6 +100,11 @@ const std::vector curlOptionInteger = { {"APPEND", CURLOPT_APPEND}, {"AUTOREFERER", CURLOPT_AUTOREFERER}, {"BUFFERSIZE", CURLOPT_BUFFERSIZE}, + +#if NODE_LIBCURL_VER_GE(7, 87, 0) + {"CA_CACHE_TIMEOUT", CURLOPT_CA_CACHE_TIMEOUT}, +#endif + {"CERTINFO", CURLOPT_CERTINFO}, {"CONNECTTIMEOUT", CURLOPT_CONNECTTIMEOUT}, {"CONNECTTIMEOUT_MS", CURLOPT_CONNECTTIMEOUT_MS}, @@ -180,6 +193,9 @@ const std::vector curlOptionInteger = { #if NODE_LIBCURL_VER_GE(7, 69, 0) {"MAIL_RCPT_ALLLOWFAILS", CURLOPT_MAIL_RCPT_ALLLOWFAILS}, #endif +#if NODE_LIBCURL_VER_GE(8, 2, 0) + {"MAIL_RCPT_ALLOWFAILS", CURLOPT_MAIL_RCPT_ALLOWFAILS}, +#endif #if NODE_LIBCURL_VER_GE(7, 65, 0) {"MAXAGE_CONN", CURLOPT_MAXAGE_CONN}, @@ -236,6 +252,10 @@ const std::vector curlOptionInteger = { {"SERVER_RESPONSE_TIMEOUT", CURLOPT_SERVER_RESPONSE_TIMEOUT}, +#if NODE_LIBCURL_VER_GE(8, 6, 0) + {"SERVER_RESPONSE_TIMEOUT_MS", CURLOPT_SERVER_RESPONSE_TIMEOUT_MS}, +#endif + #if NODE_LIBCURL_VER_GE(7, 55, 0) {"SOCKS5_AUTH", CURLOPT_SOCKS5_AUTH}, #endif @@ -274,6 +294,11 @@ const std::vector curlOptionInteger = { #endif {"TCP_KEEPALIVE", CURLOPT_TCP_KEEPALIVE}, + +#if NODE_LIBCURL_VER_GE(8, 9, 0) + {"TCP_KEEPCNT", CURLOPT_TCP_KEEPCNT}, +#endif + {"TCP_KEEPIDLE", CURLOPT_TCP_KEEPIDLE}, {"TCP_KEEPINTVL", CURLOPT_TCP_KEEPINTVL}, {"TCP_NODELAY", CURLOPT_TCP_NODELAY}, @@ -289,6 +314,9 @@ const std::vector curlOptionInteger = { #if NODE_LIBCURL_VER_GE(7, 62, 0) {"UPLOAD_BUFFERSIZE", CURLOPT_UPLOAD_BUFFERSIZE}, +#if NODE_LIBCURL_VER_GE(8, 13, 0) + {"UPLOAD_FLAGS", CURLOPT_UPLOAD_FLAGS}, +#endif {"UPKEEP_INTERVAL_MS", CURLOPT_UPKEEP_INTERVAL_MS}, #endif @@ -308,6 +336,99 @@ const std::vector curlOptionInteger = { #endif }; +const std::vector curlOptionLinkedList = { +#if NODE_LIBCURL_VER_GE(7, 49, 0) + {"CONNECT_TO", CURLOPT_CONNECT_TO}, +#endif + + {"HTTP200ALIASES", CURLOPT_HTTP200ALIASES}, + {"HTTPHEADER", CURLOPT_HTTPHEADER}, + {"HTTPPOST", CURLOPT_HTTPPOST}, + {"MAIL_RCPT", CURLOPT_MAIL_RCPT}, + +#if NODE_LIBCURL_VER_GE(7, 37, 0) + {"PROXYHEADER", CURLOPT_PROXYHEADER}, +#endif + + {"POSTQUOTE", CURLOPT_POSTQUOTE}, + {"PREQUOTE", CURLOPT_PREQUOTE}, + {"QUOTE", CURLOPT_QUOTE}, + {"RESOLVE", CURLOPT_RESOLVE}, + {"RTSPHEADER", CURLOPT_RTSPHEADER}, + {"TELNETOPTIONS", CURLOPT_TELNETOPTIONS}, +}; + +// This should be kept in sync with the options on scripts/utils/curlOptionsBlacklist.js +const std::vector curlOptionNotImplemented = { + // Options that are complex to add support for. + {"SSL_CTX_FUNCTION", CURLOPT_TELNETOPTIONS}, + {"OPENSOCKETFUNCTION", CURLOPT_OPENSOCKETFUNCTION}, + {"CLOSESOCKETFUNCTION", CURLOPT_CLOSESOCKETFUNCTION}, + {"SOCKOPTFUNCTION", CURLOPT_SOCKOPTFUNCTION}, + +#if NODE_LIBCURL_VER_GE(7, 59, 0) + {"RESOLVER_START_DATA", CURLOPT_RESOLVER_START_DATA}, + {"RESOLVER_START_FUNCTION", CURLOPT_RESOLVER_START_FUNCTION}, +#endif + + {"CONV_FROM_UTF8_FUNCTION", CURLOPT_CONV_FROM_UTF8_FUNCTION}, + {"CONV_TO_NETWORK_FUNCTION", CURLOPT_CONV_TO_NETWORK_FUNCTION}, + {"CONV_FROM_NETWORK_FUNCTION", CURLOPT_CONV_FROM_NETWORK_FUNCTION}, + + // Options that are used internally. + {"WRITEDATA", CURLOPT_WRITEDATA}, + {"HEADERDATA", CURLOPT_HEADERDATA}, + +// Options that are not necessary because javascript nature. +#if NODE_LIBCURL_VER_GE(7, 63, 0) + // URL's can be easily parsed on JS + {"CURLU", CURLOPT_CURLU}, +#endif + + {"PRIVATE", CURLOPT_PRIVATE}, + {"PROGRESSDATA", CURLOPT_PROGRESSDATA}, + +#if NODE_LIBCURL_VER_GE(7, 32, 0) + {"XFERINFODATA", CURLOPT_XFERINFODATA}, +#endif + + {"CHUNK_DATA", CURLOPT_CHUNK_DATA}, + {"CLOSESOCKETDATA", CURLOPT_CLOSESOCKETDATA}, + {"COPYPOSTFIELDS", CURLOPT_COPYPOSTFIELDS}, + {"DEBUGDATA", CURLOPT_DEBUGDATA}, + {"ERRORBUFFER", CURLOPT_ERRORBUFFER}, + {"FNMATCH_DATA", CURLOPT_FNMATCH_DATA}, + {"INTERLEAVEDATA", CURLOPT_INTERLEAVEDATA}, + {"IOCTLDATA", CURLOPT_IOCTLDATA}, +#if NODE_LIBCURL_VER_GE(7, 87, 0) + {"QUICK_EXIT", CURLOPT_QUICK_EXIT}, +#endif + {"OPENSOCKETDATA", CURLOPT_OPENSOCKETDATA}, + {"SEEKDATA", CURLOPT_SEEKDATA}, + {"SOCKOPTDATA", CURLOPT_SOCKOPTDATA}, + {"SSH_KEYDATA", CURLOPT_SSH_KEYDATA}, + {"SSL_CTX_DATA", CURLOPT_SSL_CTX_DATA}, + +#if NODE_LIBCURL_VER_GE(7, 64, 0) + {"TRAILERDATA", CURLOPT_TRAILERDATA}, +#endif + + // Maybe? + {"INTERLEAVEFUNCTION", CURLOPT_INTERLEAVEFUNCTION}, + {"SSH_KEYFUNCTION", CURLOPT_SSH_KEYFUNCTION}, + {"STDERR", CURLOPT_STDERR}, + +#if NODE_LIBCURL_VER_GE(7, 46, 0) + {"STREAM_DEPENDS", CURLOPT_STREAM_DEPENDS}, + {"STREAM_DEPENDS_E", CURLOPT_STREAM_DEPENDS_E}, + {"STREAM_WEIGHT", CURLOPT_STREAM_WEIGHT}, +#endif +}; + +const std::vector curlOptionSpecific = { + {"SHARE", CURLOPT_SHARE}, +}; + const std::vector curlOptionString = { {"ACCEPT_ENCODING", CURLOPT_ACCEPT_ENCODING}, @@ -340,11 +461,20 @@ const std::vector curlOptionString = { {"DOH_URL", CURLOPT_DOH_URL}, #endif +#if NODE_LIBCURL_VER_GE(8, 8, 0) + {"ECH", CURLOPT_ECH}, +#endif + {"EGDSOCKET", CURLOPT_EGDSOCKET}, {"ENCODING", CURLOPT_ENCODING}, // should use ACCEPT_ENCODING {"FTPPORT", CURLOPT_FTPPORT}, {"FTP_ACCOUNT", CURLOPT_FTP_ACCOUNT}, {"FTP_ALTERNATIVE_TO_USER", CURLOPT_FTP_ALTERNATIVE_TO_USER}, + +#if NODE_LIBCURL_VER_GE(8, 2, 0) + {"HAPROXY_CLIENT_IP", CURLOPT_HAPROXY_CLIENT_IP}, +#endif + {"HTTP200ALIASES", CURLOPT_HTTP200ALIASES}, #if NODE_LIBCURL_VER_GE(7, 74, 0) @@ -456,6 +586,9 @@ const std::vector curlOptionString = { #if NODE_LIBCURL_VER_GE(7, 73, 0) {"SSL_EC_CURVES", CURLOPT_SSL_EC_CURVES}, #endif +#if NODE_LIBCURL_VER_GE(8, 14, 0) + {"SSL_SIGNATURE_ALGORITHMS", CURLOPT_SSL_SIGNATURE_ALGORITHMS}, +#endif {"TELNETOPTIONS", CURLOPT_TELNETOPTIONS}, @@ -481,67 +614,28 @@ const std::vector curlOptionString = { #endif }; -const std::vector curlOptionFunction = { - {"CHUNK_BGN_FUNCTION", CURLOPT_CHUNK_BGN_FUNCTION}, - {"CHUNK_END_FUNCTION", CURLOPT_CHUNK_END_FUNCTION}, - {"FNMATCH_FUNCTION", CURLOPT_FNMATCH_FUNCTION}, - {"DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION}, - {"HEADERFUNCTION", CURLOPT_HEADERFUNCTION}, - -#if NODE_LIBCURL_VER_GE(7, 74, 0) - {"HSTSREADFUNCTION", CURLOPT_HSTSREADFUNCTION}, - {"HSTSWRITEFUNCTION", CURLOPT_HSTSWRITEFUNCTION}, -#endif - -#if NODE_LIBCURL_VER_GE(7, 80, 0) - {"PREREQFUNCTION", CURLOPT_PREREQFUNCTION}, -#endif - - {"PROGRESSFUNCTION", CURLOPT_PROGRESSFUNCTION}, - {"READFUNCTION", CURLOPT_READFUNCTION}, - {"SEEKFUNCTION", CURLOPT_SEEKFUNCTION}, - -#if NODE_LIBCURL_VER_GE(7, 64, 0) - {"TRAILERFUNCTION", CURLOPT_TRAILERFUNCTION}, -#endif - -#if NODE_LIBCURL_VER_GE(7, 32, 0) - {"XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION}, +const std::vector curlMultiOptionFunction = { +#if NODE_LIBCURL_VER_GE(7, 44, 0) + {"PUSHFUNCTION", CURLMOPT_PUSHFUNCTION}, #endif - - {"WRITEFUNCTION", CURLOPT_WRITEFUNCTION}, }; -const std::vector curlOptionLinkedList = { -#if NODE_LIBCURL_VER_GE(7, 49, 0) - {"CONNECT_TO", CURLOPT_CONNECT_TO}, +const std::vector curlMultiOptionInteger = { + {"CHUNK_LENGTH_PENALTY_SIZE", CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE}, + {"CONTENT_LENGTH_PENALTY_SIZE", CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE}, +#if NODE_LIBCURL_VER_GE(7, 67, 0) + {"MAX_CONCURRENT_STREAMS", CURLMOPT_MAX_CONCURRENT_STREAMS}, #endif - - {"HTTP200ALIASES", CURLOPT_HTTP200ALIASES}, - {"HTTPHEADER", CURLOPT_HTTPHEADER}, - {"HTTPPOST", CURLOPT_HTTPPOST}, - {"MAIL_RCPT", CURLOPT_MAIL_RCPT}, - -#if NODE_LIBCURL_VER_GE(7, 37, 0) - {"PROXYHEADER", CURLOPT_PROXYHEADER}, +#if NODE_LIBCURL_VER_GE(8, 17, 0) + {"NETWORK_CHANGED", CURLMOPT_NETWORK_CHANGED}, #endif - - {"POSTQUOTE", CURLOPT_POSTQUOTE}, - {"PREQUOTE", CURLOPT_PREQUOTE}, - {"QUOTE", CURLOPT_QUOTE}, - {"RESOLVE", CURLOPT_RESOLVE}, - {"RTSPHEADER", CURLOPT_RTSPHEADER}, - {"TELNETOPTIONS", CURLOPT_TELNETOPTIONS}, -}; - -const std::vector curlOptionHttpPost = { - {"NAME", CurlHttpPost::NAME}, {"FILE", CurlHttpPost::FILE}, - {"CONTENTS", CurlHttpPost::CONTENTS}, {"TYPE", CurlHttpPost::TYPE}, - {"FILENAME", CurlHttpPost::FILENAME}, -}; - -const std::vector curlOptionSpecific = { - {"SHARE", CURLOPT_SHARE}, + {"MAX_HOST_CONNECTIONS", CURLMOPT_MAX_HOST_CONNECTIONS}, + {"MAX_TOTAL_CONNECTIONS", CURLMOPT_MAX_TOTAL_CONNECTIONS}, + {"MAXCONNECTS", CURLMOPT_MAXCONNECTS}, + // Pipelining was removed on libcurl 7.62, since then those options do nothing + // Also see: https://github.com/curl/curl/pull/3651 + {"MAX_PIPELINE_LENGTH", CURLMOPT_MAX_PIPELINE_LENGTH}, + {"PIPELINING", CURLMOPT_PIPELINING}, }; // This should be kept in sync with the options on scripts/utils/multiOptionsBlacklist.js @@ -555,21 +649,10 @@ const std::vector curlMultiOptionNotImplemented = { #if NODE_LIBCURL_VER_GE(7, 44, 0) {"PUSHDATA", CURLMOPT_PUSHDATA}, #endif -}; - -const std::vector curlMultiOptionInteger = { - {"CHUNK_LENGTH_PENALTY_SIZE", CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE}, - {"CONTENT_LENGTH_PENALTY_SIZE", CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE}, -#if NODE_LIBCURL_VER_GE(7, 67, 0) - {"MAX_CONCURRENT_STREAMS", CURLMOPT_MAX_CONCURRENT_STREAMS}, +#if NODE_LIBCURL_VER_GE(8, 17, 0) + {"NOTIFYFUNCTION", CURLMOPT_NOTIFYFUNCTION}, + {"NOTIFYDATA", CURLMOPT_NOTIFYDATA}, #endif - {"MAX_HOST_CONNECTIONS", CURLMOPT_MAX_HOST_CONNECTIONS}, - {"MAX_TOTAL_CONNECTIONS", CURLMOPT_MAX_TOTAL_CONNECTIONS}, - {"MAXCONNECTS", CURLMOPT_MAXCONNECTS}, - // Pipelining was removed on libcurl 7.62, since then those options do nothing - // Also see: https://github.com/curl/curl/pull/3651 - {"MAX_PIPELINE_LENGTH", CURLMOPT_MAX_PIPELINE_LENGTH}, - {"PIPELINING", CURLMOPT_PIPELINING}, }; const std::vector curlMultiOptionStringArray = { @@ -579,80 +662,6 @@ const std::vector curlMultiOptionStringArray = { {"PIPELINING_SITE_BL", CURLMOPT_PIPELINING_SITE_BL}, }; -const std::vector curlMultiOptionFunction = { -#if NODE_LIBCURL_VER_GE(7, 44, 0) - {"PUSHFUNCTION", CURLMOPT_PUSHFUNCTION}, -#endif -}; - -const std::vector curlInfoNotImplemented = { -// Complex. -#if NODE_LIBCURL_VER_GE(7, 34, 0) - {"TLS_SESSION", CURLINFO_TLS_SESSION}, -#endif -#if NODE_LIBCURL_VER_GE(7, 48, 0) - {"TLS_SSL_PTR", CURLINFO_TLS_SSL_PTR}, -#endif - // Unnecessary. - {"PRIVATE", CURLINFO_PRIVATE}, - // Maybe -}; - -const std::vector curlInfoString = { -#if NODE_LIBCURL_VER_GE(7, 84, 0) - {"CAINFO", CURLINFO_CAINFO}, - {"CAPATH", CURLINFO_CAPATH}, -#endif - - {"CONTENT_TYPE", CURLINFO_CONTENT_TYPE}, - {"EFFECTIVE_URL", CURLINFO_EFFECTIVE_URL}, - -#if NODE_LIBCURL_VER_GE(7, 72, 0) - {"EFFECTIVE_METHOD", CURLINFO_EFFECTIVE_METHOD}, -#endif - - {"FTP_ENTRY_PATH", CURLINFO_FTP_ENTRY_PATH}, - {"LOCAL_IP", CURLINFO_LOCAL_IP}, - {"PRIMARY_IP", CURLINFO_PRIMARY_IP}, - {"REDIRECT_URL", CURLINFO_REDIRECT_URL}, - -#if NODE_LIBCURL_VER_GE(7, 76, 0) - {"REFERER", CURLINFO_REFERER}, -#endif - - {"RTSP_SESSION_ID", CURLINFO_RTSP_SESSION_ID}, - -#if NODE_LIBCURL_VER_GE(7, 52, 0) - {"SCHEME", CURLINFO_SCHEME}, -#endif -}; - -const std::vector curlInfoOffT = { -#if NODE_LIBCURL_VER_GE(7, 55, 0) - {"CONTENT_LENGTH_DOWNLOAD_T", CURLINFO_CONTENT_LENGTH_DOWNLOAD_T}, - {"CONTENT_LENGTH_UPLOAD_T", CURLINFO_CONTENT_LENGTH_UPLOAD_T}, - {"SIZE_DOWNLOAD_T", CURLINFO_SIZE_DOWNLOAD_T}, - {"SIZE_UPLOAD_T", CURLINFO_SIZE_UPLOAD_T}, - {"SPEED_DOWNLOAD_T", CURLINFO_SPEED_DOWNLOAD_T}, - {"SPEED_UPLOAD_T", CURLINFO_SPEED_UPLOAD_T}, -#endif -#if NODE_LIBCURL_VER_GE(7, 59, 0) - {"FILETIME_T", CURLINFO_FILETIME_T}, -#endif -#if NODE_LIBCURL_VER_GE(7, 61, 0) - {"APPCONNECT_TIME_T", CURLINFO_APPCONNECT_TIME_T}, - {"CONNECT_TIME_T", CURLINFO_CONNECT_TIME_T}, - {"NAMELOOKUP_TIME_T", CURLINFO_NAMELOOKUP_TIME_T}, - {"PRETRANSFER_TIME_T", CURLINFO_PRETRANSFER_TIME_T}, - {"REDIRECT_TIME_T", CURLINFO_REDIRECT_TIME_T}, - {"STARTTRANSFER_TIME_T", CURLINFO_STARTTRANSFER_TIME_T}, - {"TOTAL_TIME_T", CURLINFO_TOTAL_TIME_T}, -#endif -#if NODE_LIBCURL_VER_GE(7, 66, 0) - {"RETRY_AFTER", CURLINFO_RETRY_AFTER}, -#endif -}; - const std::vector curlInfoDouble = { {"APPCONNECT_TIME", CURLINFO_APPCONNECT_TIME}, {"CONNECT_TIME", CURLINFO_CONNECT_TIME}, @@ -707,11 +716,12 @@ const std::vector curlInfoInteger = { {"RTSP_CSEQ_RECV", CURLINFO_RTSP_CSEQ_RECV}, {"RTSP_SERVER_CSEQ", CURLINFO_RTSP_SERVER_CSEQ}, {"SSL_VERIFYRESULT", CURLINFO_SSL_VERIFYRESULT}, -}; - -const std::vector curlInfoSocket = { -#if NODE_LIBCURL_VER_GE(7, 45, 0) - {"ACTIVESOCKET", CURLINFO_ACTIVESOCKET}, +#if NODE_LIBCURL_VER_GE(8, 7, 0) + {"USED_PROXY", CURLINFO_USED_PROXY}, +#endif +#if NODE_LIBCURL_VER_GE(8, 12, 0) + {"PROXYAUTH_USED", CURLINFO_PROXYAUTH_USED}, + {"HTTPAUTH_USED", CURLINFO_HTTPAUTH_USED}, #endif }; @@ -721,263 +731,374 @@ const std::vector curlInfoLinkedList = { {"CERTINFO", CURLINFO_CERTINFO}, }; -const std::vector curlOptionBlob = { -#if NODE_LIBCURL_VER_GE(7, 77, 0) - {"CAINFO_BLOB", CURLOPT_CAINFO_BLOB}, +const std::vector curlInfoNotImplemented = { +// Complex. +#if NODE_LIBCURL_VER_GE(7, 34, 0) + {"TLS_SESSION", CURLINFO_TLS_SESSION}, #endif +#if NODE_LIBCURL_VER_GE(7, 48, 0) + {"TLS_SSL_PTR", CURLINFO_TLS_SSL_PTR}, +#endif + // Unnecessary. + {"PRIVATE", CURLINFO_PRIVATE}, + // Maybe +}; -#if NODE_LIBCURL_VER_GE(7, 71, 0) - {"ISSUERCERT_BLOB", CURLOPT_ISSUERCERT_BLOB}, - -#if NODE_LIBCURL_VER_GE(7, 77, 0) - {"PROXY_CAINFO_BLOB", CURLOPT_PROXY_CAINFO_BLOB}, +const std::vector curlInfoOffT = { +#if NODE_LIBCURL_VER_GE(7, 55, 0) + {"CONTENT_LENGTH_DOWNLOAD_T", CURLINFO_CONTENT_LENGTH_DOWNLOAD_T}, + {"CONTENT_LENGTH_UPLOAD_T", CURLINFO_CONTENT_LENGTH_UPLOAD_T}, + {"SIZE_DOWNLOAD_T", CURLINFO_SIZE_DOWNLOAD_T}, + {"SIZE_UPLOAD_T", CURLINFO_SIZE_UPLOAD_T}, + {"SPEED_DOWNLOAD_T", CURLINFO_SPEED_DOWNLOAD_T}, + {"SPEED_UPLOAD_T", CURLINFO_SPEED_UPLOAD_T}, +#endif +#if NODE_LIBCURL_VER_GE(7, 59, 0) + {"FILETIME_T", CURLINFO_FILETIME_T}, #endif +#if NODE_LIBCURL_VER_GE(7, 61, 0) + {"APPCONNECT_TIME_T", CURLINFO_APPCONNECT_TIME_T}, + {"CONNECT_TIME_T", CURLINFO_CONNECT_TIME_T}, + {"NAMELOOKUP_TIME_T", CURLINFO_NAMELOOKUP_TIME_T}, + {"PRETRANSFER_TIME_T", CURLINFO_PRETRANSFER_TIME_T}, + {"REDIRECT_TIME_T", CURLINFO_REDIRECT_TIME_T}, + {"STARTTRANSFER_TIME_T", CURLINFO_STARTTRANSFER_TIME_T}, + {"TOTAL_TIME_T", CURLINFO_TOTAL_TIME_T}, +#endif +#if NODE_LIBCURL_VER_GE(7, 66, 0) + {"RETRY_AFTER", CURLINFO_RETRY_AFTER}, +#endif +#if NODE_LIBCURL_VER_GE(8, 2, 0) + {"CONN_ID", CURLINFO_CONN_ID}, + {"XFER_ID", CURLINFO_XFER_ID}, +#endif +#if NODE_LIBCURL_VER_GE(8, 6, 0) + {"QUEUE_TIME_T", CURLINFO_QUEUE_TIME_T}, +#endif +#if NODE_LIBCURL_VER_GE(8, 10, 0) + {"POSTTRANSFER_TIME_T", CURLINFO_POSTTRANSFER_TIME_T}, +#endif +#if NODE_LIBCURL_VER_GE(8, 11, 0) + {"EARLYDATA_SENT_T", CURLINFO_EARLYDATA_SENT_T}, +#endif +}; - {"PROXY_SSLCERT_BLOB", CURLOPT_PROXY_SSLCERT_BLOB}, - {"PROXY_SSLKEY_BLOB", CURLOPT_PROXY_SSLKEY_BLOB}, - {"SSLCERT_BLOB", CURLOPT_SSLCERT_BLOB}, - {"SSLKEY_BLOB", CURLOPT_SSLKEY_BLOB}, +const std::vector curlInfoSocket = { +#if NODE_LIBCURL_VER_GE(7, 45, 0) + {"ACTIVESOCKET", CURLINFO_ACTIVESOCKET}, #endif }; -static void ExportConstants(v8::Local obj, - const std::vector& optionGroup, - v8::PropertyAttribute attributes) { - Nan::HandleScope scope; +const std::vector curlInfoString = { +#if NODE_LIBCURL_VER_GE(7, 84, 0) + {"CAINFO", CURLINFO_CAINFO}, + {"CAPATH", CURLINFO_CAPATH}, +#endif - for (std::vector::const_iterator it = optionGroup.begin(), - end = optionGroup.end(); - it != end; ++it) { - Nan::DefineOwnProperty(obj, Nan::New(it->name).ToLocalChecked(), - Nan::New(static_cast(it->value)), attributes); - } -} + {"CONTENT_TYPE", CURLINFO_CONTENT_TYPE}, + {"EFFECTIVE_URL", CURLINFO_EFFECTIVE_URL}, -// Add Curl constructor to the module exports -NAN_MODULE_INIT(Initialize) { - Nan::HandleScope scope; - - v8::Local obj = Nan::New(); - - v8::PropertyAttribute attributes = - static_cast(v8::ReadOnly | v8::DontDelete); - v8::PropertyAttribute attributesDontEnum = - static_cast(v8::ReadOnly | v8::DontDelete | v8::DontEnum); - - // export options - v8::Local optionsObj = Nan::New(); - ExportConstants(optionsObj, curlOptionNotImplemented, attributesDontEnum); - ExportConstants(optionsObj, curlOptionString, attributes); - ExportConstants(optionsObj, curlOptionInteger, attributes); - ExportConstants(optionsObj, curlOptionFunction, attributes); - ExportConstants(optionsObj, curlOptionLinkedList, attributes); - ExportConstants(optionsObj, curlOptionSpecific, attributes); - ExportConstants(optionsObj, curlOptionBlob, attributes); - - // export infos - v8::Local infosObj = Nan::New(); - ExportConstants(infosObj, curlInfoNotImplemented, attributesDontEnum); - ExportConstants(infosObj, curlInfoString, attributes); - ExportConstants(infosObj, curlInfoOffT, attributes); - ExportConstants(infosObj, curlInfoDouble, attributes); - ExportConstants(infosObj, curlInfoInteger, attributes); - ExportConstants(infosObj, curlInfoSocket, attributes); - ExportConstants(infosObj, curlInfoLinkedList, attributes); - - // export Curl codes - v8::Local multiObj = Nan::New(); - ExportConstants(multiObj, curlMultiOptionNotImplemented, attributesDontEnum); - ExportConstants(multiObj, curlMultiOptionInteger, attributes); - ExportConstants(multiObj, curlMultiOptionStringArray, attributes); - ExportConstants(multiObj, curlMultiOptionFunction, attributes); - - // static members - Nan::DefineOwnProperty(obj, Nan::New("option").ToLocalChecked(), optionsObj, - attributes); - Nan::DefineOwnProperty(obj, Nan::New("info").ToLocalChecked(), infosObj, attributes); - Nan::DefineOwnProperty(obj, Nan::New("multi").ToLocalChecked(), multiObj, attributes); - - Nan::SetMethod(obj, "globalInit", GlobalInit); - Nan::SetMethod(obj, "globalCleanup", GlobalCleanup); - Nan::SetMethod(obj, "getVersion", GetVersion); - Nan::SetMethod(obj, "getCount", GetCount); - Nan::SetAccessor(obj, Nan::New("VERSION_NUM").ToLocalChecked(), GetterVersionNum, 0, - v8::Local(), v8::DEFAULT, attributes); - - Nan::Set(target, Nan::New("Curl").ToLocalChecked(), obj); -} +#if NODE_LIBCURL_VER_GE(7, 72, 0) + {"EFFECTIVE_METHOD", CURLINFO_EFFECTIVE_METHOD}, +#endif -int32_t IsInsideCurlConstantStruct(const std::vector& curlConstants, - const v8::Local& searchFor) { - Nan::HandleScope scope; + {"FTP_ENTRY_PATH", CURLINFO_FTP_ENTRY_PATH}, + {"LOCAL_IP", CURLINFO_LOCAL_IP}, + {"PRIMARY_IP", CURLINFO_PRIMARY_IP}, + {"REDIRECT_URL", CURLINFO_REDIRECT_URL}, - bool isString = searchFor->IsString(); - bool isInt = searchFor->IsInt32(); +#if NODE_LIBCURL_VER_GE(7, 76, 0) + {"REFERER", CURLINFO_REFERER}, +#endif - std::string optionName = ""; - int32_t optionId = -1; + {"RTSP_SESSION_ID", CURLINFO_RTSP_SESSION_ID}, - if (!isString && !isInt) { - return 0; - } +#if NODE_LIBCURL_VER_GE(7, 52, 0) + {"SCHEME", CURLINFO_SCHEME}, +#endif +}; - if (isString) { - Nan::Utf8String optionNameV8(searchFor); +// Helper function to add constants to an Node.js object. Private to this file. +static void AddConstants(Napi::Object obj, const std::vector& constants) { + Napi::Env env = obj.Env(); - optionName = std::string(*optionNameV8); + for (const auto& constant : constants) { + obj.DefineProperty(Napi::PropertyDescriptor::Value( + constant.name, Napi::Number::New(env, static_cast(constant.value)), + static_cast(napi_enumerable | napi_configurable))); + } +} - std::transform(optionName.begin(), optionName.end(), optionName.begin(), ::toupper); +Curl::Curl(Napi::Env env, Napi::Object exports) : env(env), addonAllocatedMemory(0) { + this->InitTLS(); - } else { // int - optionId = Nan::To(searchFor).FromJust(); - } + this->EasyConstructor = Napi::Persistent(Easy::Init(env, exports)); + this->MultiConstructor = Napi::Persistent(Multi::Init(env, exports)); + this->ShareConstructor = Napi::Persistent(Share::Init(env, exports)); + this->Http2PushFrameHeadersConstructor = + Napi::Persistent(Http2PushFrameHeaders::Init(env, exports)); - for (std::vector::const_iterator it = curlConstants.begin(), - end = curlConstants.end(); - it != end; ++it) { - if ((isString && it->name == optionName) || (isInt && it->value == optionId)) { - return static_cast(it->value); - } - } + // This is setup on moduleSetup.ts + this->CurlEasyErrorConstructor = Napi::Persistent(CurlError::InitCurlEasyError(env)); + this->CurlMultiErrorConstructor = Napi::Persistent(CurlError::InitCurlMultiError(env)); + this->CurlSharedErrorConstructor = Napi::Persistent(CurlError::InitCurlSharedError(env)); - return 0; + CurlVersionInfo::Init(env, exports); } -// based on https://github.com/libxmljs/libxmljs/blob/master/src/libxmljs.cc#L45 -void AdjustMemory(ssize_t diff) { - Nan::HandleScope scope; - - addonAllocatedMemory += diff; +Curl::~Curl() { + // Destructor implementation - cleanup handled by N-API automatically +} - // if v8 is no longer running, don't try to adjust memory +void Curl::InitTLS() { + // This is setup on moduleSetup.ts + Napi::Value maybeTls = env.Global().Get("__libcurlTls"); - // Return if no available Isolate - if (v8::Isolate::GetCurrent() == 0 || v8::Isolate::GetCurrent()->IsDead()) { + if (!(maybeTls.IsObject())) { return; } - Nan::AdjustExternalMemory(static_cast(diff)); -} + Napi::Object tls = maybeTls.ToObject(); -// Return human readable string with the version number of libcurl and some of its important -// components (like OpenSSL version). -NAN_METHOD(GetVersion) { - Nan::HandleScope scope; + // get CA certificates from Node.js's tls module and set them on the easy handle + // See: https://nodejs.org/api/tls.html#tlsgetcacertificatestype + Napi::Function getCACertificates = tls.Get("getCACertificates").As(); + Napi::Array caCertificates = + getCACertificates.Call({Napi::String::New(env, "default")}).As(); - const char* version = curl_version(); - - v8::Local versionObj = Nan::New(version).ToLocalChecked(); - - info.GetReturnValue().Set(versionObj); -} + std::vector certs; + for (uint32_t i = 0; i < caCertificates.Length(); i++) { + Napi::Value cert = caCertificates[i]; + if (cert.IsString()) { + certs.push_back(cert.As().Utf8Value()); + } + } -NAN_METHOD(GetCount) { - Nan::HandleScope scope; + // Join all certificates with newline + if (!certs.empty()) { + for (size_t i = 0; i < certs.size(); ++i) { + if (i > 0) { + this->caCertificatesData += "\n"; + } + this->caCertificatesData += certs[i]; + } - info.GetReturnValue().Set(Easy::currentOpenedHandles); + // Set up the curl_blob structure with CURL_BLOB_NOCOPY flag + // We use NOCOPY because the data is stored in this->caCertificatesData which persists + // for the lifetime of the Curl instance + this->caCertificatesBlob.data = const_cast(this->caCertificatesData.c_str()); + this->caCertificatesBlob.len = this->caCertificatesData.length(); + this->caCertificatesBlob.flags = CURL_BLOB_NOCOPY; + } } -// The following memory allocation wrappers are mostly the ones at -// https://github.com/gagern/libxmljs/blob/master/src/libxmljs.cc#L77 -// made by Martin von Gagern (https://github.com/gagern) -// Related code review at http://codereview.stackexchange.com/q/128547/10394 -struct MemWrapper { - size_t size; - curl_off_t data; -}; +void Curl::AdjustHandleMemory(CurlHandleType handleType, int delta) { + auto size = handleMemoryMap[handleType]; + auto usage = size * delta; + this->addonAllocatedMemory += usage; + Napi::MemoryManagement::AdjustExternalMemory(this->env, usage); -#define MEMWRAPPER_SIZE offsetof(MemWrapper, data) + this->activeHandleCount[handleType] += delta; -inline void* MemWrapperToClient(MemWrapper* memWrapper) { - return static_cast(reinterpret_cast(memWrapper) + MEMWRAPPER_SIZE); + // we used to have checks against v8 not running, as this was based on libxml: + // https://github.com/libxmljs/libxmljs/blob/master/src/libxmljs.cc + // We do not have that anymore. } -inline MemWrapper* ClientToMemWrapper(void* client) { - return reinterpret_cast(static_cast(client) - MEMWRAPPER_SIZE); -} - -void* MallocCallback(size_t size) { - size_t totalSize = size + MEMWRAPPER_SIZE; - MemWrapper* mem = static_cast(malloc(totalSize)); - if (!mem) return NULL; - mem->size = size; - AdjustMemory(totalSize); - return MemWrapperToClient(mem); -} - -void FreeCallback(void* p) { - if (!p) return; - MemWrapper* mem = ClientToMemWrapper(p); - ssize_t totalSize = mem->size + MEMWRAPPER_SIZE; - AdjustMemory(-totalSize); - free(mem); +void Curl::CleanupData(Napi::Env env, Curl* data) { + delete data; + curl_global_cleanup(); } -void* ReallocCallback(void* ptr, size_t size) { - if (!ptr) return MallocCallback(size); - MemWrapper* mem1 = ClientToMemWrapper(ptr); - ssize_t oldSize = mem1->size; - MemWrapper* mem2 = static_cast(realloc(mem1, size + MEMWRAPPER_SIZE)); - if (!mem2) return NULL; - mem2->size = size; - AdjustMemory(ssize_t(size) - oldSize); - return MemWrapperToClient(mem2); -} +// Initialize function +Napi::Object Curl::Init(Napi::Env env, Napi::Object exports) { + // We used to use curl_global_init_mem, as we would use it to adjust memory usage of the addon + // however when running with multiple environments, this would not make a lot of sense, as we + // would be unable to track which environment is responsible for the memory usage. + CURLcode code = curl_global_init(static_cast(CURL_GLOBAL_ALL)); -char* StrdupCallback(const char* str) { - size_t size = strlen(str) + 1; - char* res = static_cast(MallocCallback(size)); - if (res) memcpy(res, str, size); - return res; -} + if (code != CURLE_OK) { + throw Napi::Error::New( + env, "Failed to initialize libcurl: " + std::string(curl_easy_strerror(code))); + } -void* CallocCallback(size_t nmemb, size_t size) { - void* ptr = MallocCallback(nmemb * size); - if (!ptr) return NULL; - memset(ptr, 0, nmemb * size); // zero-fill - return ptr; + Curl* curl = new Curl(env, exports); + + // env.SetInstanceData(data, CleanupData); can be used to save data for future usage + // which can be retrieved using Napi::Env::GetInstanceData + // We may need to use that instead of this static reference, as otherwise this may not be thread + // safe see https://github.com/nodejs/node-addon-api/issues/550#issuecomment-3243637102 + env.SetInstanceData(curl); + + // Create Curl object to hold constants and methods + Napi::Object curlJs = Napi::Object::New(env); + + auto getVersion = Napi::PropertyDescriptor::Function( + "getVersion", Curl::GetVersion, static_cast(napi_enumerable)); + + auto getCount = Napi::PropertyDescriptor::Function( + "getCount", Curl::GetCount, static_cast(napi_enumerable)); + + auto versionNum = Napi::PropertyDescriptor::Accessor( + "VERSION_NUM", Curl::GetVersionNum, + static_cast(napi_enumerable | napi_configurable)); + + auto threadId = Napi::PropertyDescriptor::Accessor( + "THREAD_ID", Curl::GetThreadId, + static_cast(napi_enumerable | napi_configurable)); + + curlJs.DefineProperties({getVersion, getCount, versionNum, threadId}); + + // Create option object + Napi::Object curlOption = Napi::Object::New(env); + AddConstants(curlOption, curlOptionNotImplemented); + AddConstants(curlOption, curlOptionHttpPost); + AddConstants(curlOption, curlOptionBlob); + AddConstants(curlOption, curlOptionFunction); + AddConstants(curlOption, curlOptionInteger); + AddConstants(curlOption, curlOptionLinkedList); + AddConstants(curlOption, curlOptionSpecific); + AddConstants(curlOption, curlOptionString); + curlJs.Set("option", curlOption); + + // Create info object + Napi::Object curlInfo = Napi::Object::New(env); + AddConstants(curlInfo, curlInfoNotImplemented); + AddConstants(curlInfo, curlInfoDouble); + AddConstants(curlInfo, curlInfoInteger); + AddConstants(curlInfo, curlInfoLinkedList); + AddConstants(curlInfo, curlInfoOffT); + AddConstants(curlInfo, curlInfoSocket); + AddConstants(curlInfo, curlInfoString); + curlJs.Set("info", curlInfo); + + // Create multi option object + Napi::Object curlMultiOption = Napi::Object::New(env); + AddConstants(curlMultiOption, curlMultiOptionFunction); + AddConstants(curlMultiOption, curlMultiOptionInteger); + AddConstants(curlMultiOption, curlMultiOptionStringArray); + curlJs.Set("multi", curlMultiOption); + + // Add other curl constants (codes, etc.) + Napi::Object curlCode = Napi::Object::New(env); + curlCode.Set("CURLE_OK", Napi::Number::New(env, CURLE_OK)); + curlJs.Set("code", curlCode); + + // Export Curl object + exports.Set("Curl", curlJs); + + return exports; } -NAN_METHOD(GlobalInit) { - Nan::HandleScope scope; - - long flags = info[0]->IsUndefined() // NOLINT(runtime/int) - ? static_cast(Nan::To(info[0]).FromJust()) // NOLINT(runtime/int) - : CURL_GLOBAL_ALL; +Napi::Value Curl::GetVersion(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - curl_version_info_data* version = curl_version_info(CURLVERSION_NOW); - isLibcurlBuiltWithThreadedResolver = - (version->features & CURL_VERSION_ASYNCHDNS) == CURL_VERSION_ASYNCHDNS; + // Thread-safe lazy initialization of curl version string + // curl_version() uses a static buffer and is not thread-safe + static std::once_flag versionInitFlag; + static std::string cachedVersion; - CURLcode globalInitRetCode; + std::call_once(versionInitFlag, []() { cachedVersion = curl_version(); }); - // We only add the allloc wrappers if we are running libcurl without the threaded resolver - // that is because v8 AdjustAmountOfExternalAllocatedMemory must be called from the Node thread - if (!isLibcurlBuiltWithThreadedResolver) { - globalInitRetCode = curl_global_init_mem(flags, MallocCallback, FreeCallback, ReallocCallback, - StrdupCallback, CallocCallback); - } else { - globalInitRetCode = curl_global_init(flags); - } + return Napi::String::New(env, cachedVersion); +} - info.GetReturnValue().Set(globalInitRetCode); +Napi::Value Curl::GetCount(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + auto curl = info.Env().GetInstanceData(); + return Napi::Number::New(env, curl->activeHandleCount[CURL_HANDLE_TYPE_EASY]); } -NAN_METHOD(GlobalCleanup) { - Nan::HandleScope scope; +Napi::Value Curl::GetVersionNum(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + return Napi::Number::New(env, LIBCURL_VERSION_NUM); +} - curl_global_cleanup(); +Napi::Value Curl::GetThreadId(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + std::ostringstream oss; + oss << std::this_thread::get_id(); + return Napi::String::New(env, oss.str()); +} - info.GetReturnValue().Set(Nan::Undefined()); +// Helper methods implementation + +static std::once_flag curlConstantMapsInitFlag; + +void InitializeCurlConstantMaps() { + std::call_once(curlConstantMapsInitFlag, []() { + const std::vector* allConstantVectors[] = { + &curlOptionBlob, + &curlOptionFunction, + &curlOptionHttpPost, + &curlOptionInteger, + &curlOptionLinkedList, + &curlOptionNotImplemented, + &curlOptionSpecific, + &curlOptionString, + &curlInfoDouble, + &curlInfoInteger, + &curlInfoLinkedList, + &curlInfoNotImplemented, + &curlInfoOffT, + &curlInfoSocket, + &curlInfoString, + &curlMultiOptionFunction, + &curlMultiOptionInteger, + &curlMultiOptionNotImplemented, + &curlMultiOptionStringArray, + }; + + curlConstantsByName.reserve(500); + curlConstantsByValue.reserve(500); + + for (const auto* vec : allConstantVectors) { + for (const auto& constant : *vec) { + int32_t value = static_cast(constant.value); + + // Push entries to support duplicate names across different contexts + curlConstantsByName[constant.name].push_back({value, vec}); + curlConstantsByValue[constant.value].push_back({value, vec}); + } + } + }); } -// Return hexdecimal representation of the libcurl version. -NAN_GETTER(GetterVersionNum) { - Nan::HandleScope scope; +int32_t IsInsideCurlConstantStruct(const std::vector& curlConstants, + const Napi::Value& searchFor) { + int32_t ret = 0; // Return 0 (falsy) when no match found + + if (searchFor.IsString()) { + std::string optionName = searchFor.As().Utf8Value(); + std::transform(optionName.begin(), optionName.end(), optionName.begin(), ::toupper); - v8::Local version = Nan::New(LIBCURL_VERSION_NUM); + auto it = curlConstantsByName.find(optionName); + if (it != curlConstantsByName.end()) { + // Iterate through all entries with this name to find one matching the target vector + // This handles duplicate names across different contexts (e.g., CERTINFO as option and info) + for (const auto& lookup : it->second) { + if (lookup.sourceVector == &curlConstants) { + ret = lookup.value; + break; + } + } + } + } else if (searchFor.IsNumber()) { + int64_t searchForNumber = searchFor.As().Int64Value(); + + auto it = curlConstantsByValue.find(searchForNumber); + if (it != curlConstantsByValue.end()) { + // Iterate through all entries with this value to find one matching the target vector + for (const auto& lookup : it->second) { + if (lookup.sourceVector == &curlConstants) { + ret = lookup.value; + break; + } + } + } + } - info.GetReturnValue().Set(version); + return ret; } } // namespace NodeLibcurl diff --git a/src/Curl.h b/src/Curl.h index 3fa635b39..bf3f61676 100644 --- a/src/Curl.h +++ b/src/Curl.h @@ -4,76 +4,112 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#ifndef NODELIBCURL_H -#define NODELIBCURL_H +#pragma once -#include "macros.h" +#include "napi.h" #include -#include -#include +#include #include #include +#include #include -using Nan::ObjectWrap; - namespace NodeLibcurl { -// https://github.com/nodejs/nan/issues/461#issuecomment-140370028 -#define NODE_LIBCURL_ADJUST_MEM(size) \ - if (!isLibcurlBuiltWithThreadedResolver) AdjustMemory(size) - -// store mapping from the CURL[*] constants that can be used in js +// Store mapping from the CURL[*] constants that can be used in js struct CurlConstant { const char* name; int64_t value; }; -extern ssize_t addonAllocatedMemory; -extern bool isLibcurlBuiltWithThreadedResolver; +enum CurlHandleType { + CURL_HANDLE_TYPE_EASY = 1, + CURL_HANDLE_TYPE_MULTI = 2, + CURL_HANDLE_TYPE_SHARE = 3 +}; +// Template for deleted unique pointers template using deleted_unique_ptr = std::unique_ptr>; -extern const std::vector curlOptionNotImplemented; -extern const std::vector curlOptionInteger; -extern const std::vector curlOptionString; +// Global Constant Vectors - Thread safe as we never modify them. +extern const std::vector curlOptionBlob; extern const std::vector curlOptionFunction; -extern const std::vector curlOptionLinkedList; extern const std::vector curlOptionHttpPost; +extern const std::vector curlOptionInteger; +extern const std::vector curlOptionLinkedList; +extern const std::vector curlOptionNotImplemented; extern const std::vector curlOptionSpecific; -extern const std::vector curlOptionBlob; +extern const std::vector curlOptionString; -extern const std::vector curlInfoNotImplemented; -extern const std::vector curlInfoString; -extern const std::vector curlInfoOffT; extern const std::vector curlInfoDouble; extern const std::vector curlInfoInteger; -extern const std::vector curlInfoSocket; extern const std::vector curlInfoLinkedList; +extern const std::vector curlInfoNotImplemented; +extern const std::vector curlInfoOffT; +extern const std::vector curlInfoSocket; +extern const std::vector curlInfoString; -extern const std::vector curlMultiOptionNotImplemented; +extern const std::vector curlMultiOptionFunction; extern const std::vector curlMultiOptionInteger; +extern const std::vector curlMultiOptionNotImplemented; extern const std::vector curlMultiOptionStringArray; -extern const std::vector curlMultiOptionFunction; -// export Curl to js -NAN_MODULE_INIT(Initialize); +struct CurlConstantLookup { + int32_t value; + const std::vector* sourceVector; // Which vector contains this constant +}; + +// Thread-safe global hash maps for O(1) curl constant lookups +// These maps are initialized once via InitializeCurlConstantMaps() using std::call_once +// and are safe for concurrent reads after initialization completes. +// IMPORTANT: These maps must only be written to during initialization. +// Note: Maps store vectors to handle duplicate constant names across different contexts +// (e.g., CERTINFO exists as both CURLOPT_CERTINFO and CURLINFO_CERTINFO) +extern std::unordered_map> curlConstantsByName; +extern std::unordered_map> curlConstantsByValue; -// js exported Methods -NAN_METHOD(GlobalInit); -NAN_METHOD(GlobalCleanup); -NAN_METHOD(GetVersion); -NAN_METHOD(GetCount); -NAN_GETTER(GetterVersionNum); +void InitializeCurlConstantMaps(); -// helper methods +// Namespace helper methods int32_t IsInsideCurlConstantStruct(const std::vector& curlConstants, - const v8::Local& searchFor); -void ThrowError(const char* message, const char* reason = nullptr); -void AdjustMemory(ssize_t size); + const Napi::Value& searchFor); + +// This is our main class that holds our "global" state, per v8 Agent (environment) +class Curl { + public: + Curl(Napi::Env env, Napi::Object exports); + ~Curl(); + Napi::FunctionReference EasyConstructor; + Napi::FunctionReference MultiConstructor; + Napi::FunctionReference ShareConstructor; + Napi::FunctionReference Http2PushFrameHeadersConstructor; + Napi::FunctionReference CurlEasyErrorConstructor; + Napi::FunctionReference CurlMultiErrorConstructor; + Napi::FunctionReference CurlSharedErrorConstructor; + Napi::Env env; + + std::string caCertificatesData; + struct curl_blob caCertificatesBlob; + + void AdjustHandleMemory(CurlHandleType handleType, int delta); + + static Napi::Object Init(Napi::Env env, Napi::Object exports); + static void CleanupData(Napi::Env env, Curl* data); + + static Napi::Value GetVersion(const Napi::CallbackInfo& info); + static Napi::Value GetCount(const Napi::CallbackInfo& info); + static Napi::Value GetVersionNum(const Napi::CallbackInfo& info); + static Napi::Value GetThreadId(const Napi::CallbackInfo& info); + + private: + int64_t addonAllocatedMemory; + std::unordered_map activeHandleCount = { + {CURL_HANDLE_TYPE_EASY, 0}, {CURL_HANDLE_TYPE_MULTI, 0}, {CURL_HANDLE_TYPE_SHARE, 0}}; + + void InitTLS(); +}; } // namespace NodeLibcurl -#endif diff --git a/src/CurlError.cc b/src/CurlError.cc new file mode 100644 index 000000000..98a7418c5 --- /dev/null +++ b/src/CurlError.cc @@ -0,0 +1,104 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "CurlError.h" + +#include "Curl.h" +#include "curl/multi.h" + +#include + +#include +#include +#include +#include + +namespace NodeLibcurl { + +Napi::Error CurlError::New(Napi::Env env, const char* message, CURLcode code, bool autoAddSuffix) { + std::string fullMessage = message; + + if (autoAddSuffix) { + fullMessage += ": "; + fullMessage += curl_easy_strerror(code); + } + + auto curl = env.GetInstanceData(); + auto curlErrorInstance = curl->CurlEasyErrorConstructor.Value().New( + {Napi::String::New(env, fullMessage), Napi::Number::New(env, static_cast(code))}); + + Napi::Error error = Napi::Error(env, curlErrorInstance); + + return error; +} + +Napi::Error CurlError::New(Napi::Env env, const char* message, CURLMcode code, bool autoAddSuffix) { + std::string fullMessage = message; + + if (autoAddSuffix) { + fullMessage += ": "; + fullMessage += curl_multi_strerror(code); + } + + auto curl = env.GetInstanceData(); + auto curlErrorInstance = curl->CurlMultiErrorConstructor.Value().New( + {Napi::String::New(env, fullMessage), Napi::Number::New(env, static_cast(code))}); + + Napi::Error error = Napi::Error(env, curlErrorInstance); + + return error; +} + +Napi::Error CurlError::New(Napi::Env env, const char* message, CURLSHcode code, + bool autoAddSuffix) { + std::string fullMessage = message; + + if (autoAddSuffix) { + fullMessage += ": "; + fullMessage += curl_share_strerror(code); + } + + auto curl = env.GetInstanceData(); + auto curlErrorInstance = curl->CurlSharedErrorConstructor.Value().New( + {Napi::String::New(env, fullMessage), Napi::Number::New(env, static_cast(code))}); + + Napi::Error error = Napi::Error(env, curlErrorInstance); + + return error; +} + +Napi::Function CurlError::InitCurlEasyError(Napi::Env env) { + Napi::Value CurlEasyError = env.Global().Get("__libcurlCurlEasyError"); + // we fallback to the global Error object if __libcurlCurlEasyError is not set + // to keep supporting testpackage from pregyp, which just includes the .node addon directly. + if (!CurlEasyError.IsFunction()) { + CurlEasyError = env.Global().Get("Error"); + } + assert(CurlEasyError.IsFunction() && "__libcurlCurlEasyError must be an object"); + return CurlEasyError.As(); +} + +Napi::Function CurlError::InitCurlMultiError(Napi::Env env) { + Napi::Value CurlMultiError = env.Global().Get("__libcurlCurlMultiError"); + // see above + if (!CurlMultiError.IsFunction()) { + CurlMultiError = env.Global().Get("Error"); + } + assert(CurlMultiError.IsFunction() && "__libcurlCurlMultiError must be an object"); + return CurlMultiError.As(); +} + +Napi::Function CurlError::InitCurlSharedError(Napi::Env env) { + Napi::Value CurlSharedError = env.Global().Get("__libcurlCurlSharedError"); + // see above + if (!CurlSharedError.IsFunction()) { + CurlSharedError = env.Global().Get("Error"); + } + assert(CurlSharedError.IsFunction() && "__libcurlCurlSharedError must be an object"); + return CurlSharedError.As(); +} +} // namespace NodeLibcurl diff --git a/src/CurlError.h b/src/CurlError.h new file mode 100644 index 000000000..7e44a5491 --- /dev/null +++ b/src/CurlError.h @@ -0,0 +1,34 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +#include + +namespace NodeLibcurl { + +// Custom error class for libcurl errors with error code +class CurlError { + public: + static Napi::Error New(Napi::Env env, const char* message, CURLcode code, + bool autoAddSuffix = false); + static Napi::Error New(Napi::Env env, const char* message, CURLMcode code, + bool autoAddSuffix = false); + static Napi::Error New(Napi::Env env, const char* message, CURLSHcode code, + bool autoAddSuffix = false); + + static Napi::Function InitCurlEasyError(Napi::Env env); + static Napi::Function InitCurlMultiError(Napi::Env env); + static Napi::Function InitCurlSharedError(Napi::Env env); + + private: + CurlError(); +}; + +} // namespace NodeLibcurl diff --git a/src/CurlVersionInfo.cc b/src/CurlVersionInfo.cc index cad400d76..75697490e 100644 --- a/src/CurlVersionInfo.cc +++ b/src/CurlVersionInfo.cc @@ -1,8 +1,7 @@ #ifndef NOMINMAX -// Fix for: warning C4003: not enough arguments for function-like macro invocation 'max' -// [C:\projects\node-libcurl\build\node_libcurl.vcxproj] #define NOMINMAX #endif +#include "napi.h" /** * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. @@ -15,30 +14,8 @@ #include namespace NodeLibcurl { -namespace { -template -void SetObjPropertyToNullOrValue(v8::Local obj, std::string key, TValue value) { - Nan::Set(obj, Nan::New(key).ToLocalChecked(), Nan::New(value)); -} - -template <> -void SetObjPropertyToNullOrValue>(v8::Local obj, - std::string key, - v8::Local value) { - Nan::Set(obj, Nan::New(key).ToLocalChecked(), value); -} - -template <> -void SetObjPropertyToNullOrValue(v8::Local obj, std::string key, - const char* value) { - if (value == nullptr) { - Nan::Set(obj, Nan::New(key).ToLocalChecked(), Nan::Null()); - } else { - Nan::Set(obj, Nan::New(key).ToLocalChecked(), Nan::New(value).ToLocalChecked()); - } -} -} // namespace +// Static member definitions const std::vector CurlVersionInfo::features = { {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, {"Debug", CURL_VERSION_DEBUG}, @@ -85,80 +62,115 @@ const std::vector CurlVersionInfo::features = { const curl_version_info_data* CurlVersionInfo::versionInfo = curl_version_info(CURLVERSION_NOW); -NAN_MODULE_INIT(CurlVersionInfo::Initialize) { - Nan::HandleScope scope; - - if (!versionInfo) { - Nan::ThrowError("Failed to retrieve libcurl information using curl_version_info"); - return; - } - - v8::PropertyAttribute attributes = - static_cast(v8::ReadOnly | v8::DontDelete); +// Helper template implementations +template +void CurlVersionInfo::SetObjPropertyToNullOrValue(Napi::Object obj, const std::string& key, + TValue value) { + obj.Set(key, Napi::Value::From(obj.Env(), value)); +} - v8::Local obj = Nan::New(); +template <> +void CurlVersionInfo::SetObjPropertyToNullOrValue(Napi::Object obj, + const std::string& key, + Napi::Value value) { + obj.Set(key, value); +} - Nan::SetAccessor(obj, Nan::New("protocols").ToLocalChecked(), GetterProtocols, 0, - v8::Local(), v8::DEFAULT, attributes); - Nan::SetAccessor(obj, Nan::New("features").ToLocalChecked(), GetterFeatures, 0, - v8::Local(), v8::DEFAULT, attributes); - SetObjPropertyToNullOrValue(obj, "rawFeatures", versionInfo->features); +template <> +void CurlVersionInfo::SetObjPropertyToNullOrValue(Napi::Object obj, + const std::string& key, + const char* value) { + Napi::Env env = obj.Env(); + if (value == nullptr) { + obj.Set(key, env.Null()); + } else { + obj.Set(key, Napi::String::New(env, value)); + } +} - SetObjPropertyToNullOrValue(obj, "version", versionInfo->version); - SetObjPropertyToNullOrValue(obj, "versionNumber", versionInfo->version_num); +void CurlVersionInfo::Init(Napi::Env env, Napi::Object exports) { + if (!versionInfo) { + throw Napi::Error::New(env, "Failed to retrieve libcurl information using curl_version_info"); + } - SetObjPropertyToNullOrValue(obj, "sslVersion", versionInfo->ssl_version); - SetObjPropertyToNullOrValue(obj, "sslVersionNum", 0); - SetObjPropertyToNullOrValue(obj, "libzVersion", versionInfo->libz_version); - SetObjPropertyToNullOrValue(obj, "aresVersion", versionInfo->ares); - SetObjPropertyToNullOrValue(obj, "aresVersionNumber", versionInfo->ares_num); - SetObjPropertyToNullOrValue(obj, "libidnVersion", versionInfo->libidn); - SetObjPropertyToNullOrValue(obj, "iconvVersionNumber", versionInfo->iconv_ver_num); - SetObjPropertyToNullOrValue(obj, "libsshVersion", versionInfo->libssh_version); + Napi::Object obj = Napi::Object::New(env); + + napi_property_attributes attributes = + static_cast(napi_enumerable | napi_configurable); + + Napi::PropertyDescriptor protocols = + Napi::PropertyDescriptor::Accessor("protocols", attributes); + Napi::PropertyDescriptor features = + Napi::PropertyDescriptor::Accessor("features", attributes); + + obj.DefineProperties({protocols, features}); + + // Add static properties using Napi::String::New for all keys + obj.Set("rawFeatures", Napi::Number::New(env, static_cast(versionInfo->features))); + obj.Set("version", + versionInfo->version ? Napi::String::New(env, versionInfo->version) : env.Null()); + obj.Set("versionNumber", Napi::Number::New(env, static_cast(versionInfo->version_num))); + obj.Set("sslVersion", + versionInfo->ssl_version ? Napi::String::New(env, versionInfo->ssl_version) : env.Null()); + obj.Set("sslVersionNum", Napi::Number::New(env, 0)); + obj.Set("libzVersion", versionInfo->libz_version + ? Napi::String::New(env, versionInfo->libz_version) + : env.Null()); + obj.Set("aresVersion", + versionInfo->ares ? Napi::String::New(env, versionInfo->ares) : env.Null()); + obj.Set("aresVersionNumber", Napi::Number::New(env, static_cast(versionInfo->ares_num))); + obj.Set("libidnVersion", + versionInfo->libidn ? Napi::String::New(env, versionInfo->libidn) : env.Null()); + obj.Set("iconvVersionNumber", + Napi::Number::New(env, static_cast(versionInfo->iconv_ver_num))); + obj.Set("libsshVersion", versionInfo->libssh_version + ? Napi::String::New(env, versionInfo->libssh_version) + : env.Null()); + +// TODO(jonathan, changelog): possibly support only 7.78>= moving forward #if NODE_LIBCURL_VER_GE(7, 57, 0) - SetObjPropertyToNullOrValue(obj, "brotliVersionNumber", versionInfo->brotli_ver_num); - SetObjPropertyToNullOrValue(obj, "brotliVersion", versionInfo->brotli_version); + obj.Set("brotliVersionNumber", + Napi::Number::New(env, static_cast(versionInfo->brotli_ver_num))); + obj.Set("brotliVersion", versionInfo->brotli_version + ? Napi::String::New(env, versionInfo->brotli_version) + : env.Null()); #else - SetObjPropertyToNullOrValue(obj, "brotliVersionNumber", 0); - SetObjPropertyToNullOrValue(obj, "brotliVersion", Nan::Null()); + obj.Set("brotliVersionNumber", Napi::Number::New(env, 0)); + obj.Set("brotliVersion", env.Null()); #endif - Nan::Set(target, Nan::New("CurlVersionInfo").ToLocalChecked(), obj); + exports.Set("CurlVersionInfo", obj); } -NAN_GETTER(CurlVersionInfo::GetterProtocols) { - Nan::HandleScope scope; +Napi::Value CurlVersionInfo::GetProtocols(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); // const pointer to const char pointer const char* const* protocols = versionInfo->protocols; unsigned int i = 0; - std::vector vec; - - v8::Local protocolsResult = Nan::New(); + Napi::Array protocolsResult = Napi::Array::New(env); for (i = 0; *(protocols + i); i++) { - v8::Local protocol = Nan::New(*(protocols + i)).ToLocalChecked(); - Nan::Set(protocolsResult, i, protocol); + protocolsResult.Set(i, Napi::String::New(env, *(protocols + i))); } - info.GetReturnValue().Set(protocolsResult); + return protocolsResult; } -// basically a copy of https://github.com/curl/curl/blob/05a131eb7740e/src/tool_help.c#L579 -NAN_GETTER(CurlVersionInfo::GetterFeatures) { - Nan::HandleScope scope; +Napi::Value CurlVersionInfo::GetFeatures(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - v8::Local featuresResult = Nan::New(); + Napi::Array featuresResult = Napi::Array::New(env); unsigned int currentFeature = 0; for (auto const& feat : CurlVersionInfo::features) { if (versionInfo->features & feat.bitmask) { - v8::Local featureString = Nan::New(feat.name).ToLocalChecked(); - Nan::Set(featuresResult, currentFeature++, featureString); + featuresResult.Set(currentFeature++, Napi::String::New(env, feat.name)); } } - info.GetReturnValue().Set(featuresResult); + return featuresResult; } + } // namespace NodeLibcurl diff --git a/src/CurlVersionInfo.h b/src/CurlVersionInfo.h index 20466740e..c6f0cd164 100644 --- a/src/CurlVersionInfo.h +++ b/src/CurlVersionInfo.h @@ -4,39 +4,39 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#ifndef NODELIBCURL_CURLVERSIONINFO_H -#define NODELIBCURL_CURLVERSIONINFO_H +#pragma once -#include "Curl.h" +#include "macros.h" #include -#include -#include + +#include +#include +#include namespace NodeLibcurl { class CurlVersionInfo { - // instance methods - CurlVersionInfo(); - ~CurlVersionInfo(); - - CurlVersionInfo(const CurlVersionInfo& that); - CurlVersionInfo& operator=(const CurlVersionInfo& that); - + private: struct feature { const char* name; int bitmask; }; static const std::vector features; - static const curl_version_info_data* versionInfo; + // Helper function for setting properties + template + static void SetObjPropertyToNullOrValue(Napi::Object obj, const std::string& key, TValue value); + public: - static NAN_MODULE_INIT(Initialize); + // Initialize the CurlVersionInfo object for export + static void Init(Napi::Env env, Napi::Object exports); - static NAN_GETTER(GetterProtocols); - static NAN_GETTER(GetterFeatures); + // Property getters + static Napi::Value GetProtocols(const Napi::CallbackInfo& info); + static Napi::Value GetFeatures(const Napi::CallbackInfo& info); }; + } // namespace NodeLibcurl -#endif diff --git a/src/Easy.cc b/src/Easy.cc index 7f9b83103..040de93d7 100644 --- a/src/Easy.cc +++ b/src/Easy.cc @@ -1,25 +1,29 @@ #ifndef NOMINMAX -// Fix for: warning C4003: not enough arguments for function-like macro invocation 'max' -// [C:\projects\node-libcurl\build\node_libcurl.vcxproj] #define NOMINMAX #endif +#include "curl/curl.h" +#include "napi.h" + +#include + /** * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#include "Easy.h" - #include "Curl.h" +#include "CurlError.h" #include "CurlHttpPost.h" +#include "Easy.h" +#include "LocaleGuard.h" #include "Share.h" -#include "make_unique.h" +#include "macros.h" -#include +#include +#include #include -#include // 36055 was allocated on Win64 #define MEMORY_PER_HANDLE 30000 @@ -28,164 +32,150 @@ namespace NodeLibcurl { +// Static member initialization +std::atomic Easy::nextId = 0; + +const napi_type_tag EASY_TYPE_TAG = { + // this is basically a + 0xf641cc92779c4526, 0xaca73000a471ece6}; + +// ToFree class for memory management class Easy::ToFree { public: std::vector> str; std::vector slist; + std::vector mime; std::vector> post; ~ToFree() { - for (unsigned int i = 0; i < slist.size(); i++) { - curl_slist_free_all(slist[i]); + for (auto& list : slist) { + if (list) curl_slist_free_all(list); + } + for (auto& m : mime) { + if (m) curl_mime_free(m); } } }; -Nan::Persistent Easy::constructor; - -uint32_t Easy::counter = 0; -uint32_t Easy::currentOpenedHandles = 0; - -Easy::Easy() { - this->ch = curl_easy_init(); - assert(this->ch && "Could not initialize libcurl easy handle."); +// Constructor +Easy::Easy(const Napi::CallbackInfo& info) + : Napi::ObjectWrap(info), id(nextId++), toFree(std::make_shared()) { + NODE_LIBCURL_DEBUG_LOG(this, "Easy::Constructor", ""); + Napi::Env env = info.Env(); + + Curl* curl = env.GetInstanceData(); + + bool isFromDuplicate = false; + // Check constructor arguments to determine initialization mode + if (info.Length() > 0 && !info[0].IsUndefined()) { + isFromDuplicate = true; + // Case 1: Copy constructor from another Easy instance + if (info[0].IsObject()) { + auto easyConstructor = curl->EasyConstructor.Value(); + auto possiblyAnotherEasy = info[0].As(); + + if (!possiblyAnotherEasy.InstanceOf(easyConstructor)) { + throw CurlError::New(env, "Argument must be an instance of an Easy handle.", + CURLE_BAD_FUNCTION_ARGUMENT); + } - NODE_LIBCURL_ADJUST_MEM(MEMORY_PER_HANDLE); + Easy* orig = Easy::Unwrap(possiblyAnotherEasy); - this->toFree = std::make_shared(); + // Duplicate the handle + this->ch = curl_easy_duphandle(orig->ch); + assert(this->ch && "Failed to duplicate libcurl easy handle"); - this->ResetRequiredHandleOptions(); + this->CopyOtherData(orig); - ++Easy::currentOpenedHandles; -} + } else if (info[0].IsExternal()) { + // Case 2: From an external CURL handle (used internally by Multi) + auto maybeHandleExternal = info[0].As>(); -Easy::Easy(Easy* orig) { - assert(orig); - assert(orig != this); // should not duplicate itself + if (!maybeHandleExternal.CheckTypeTag(&EASY_TYPE_TAG)) { + throw CurlError::New(env, "Argument must be an external CURL handle.", + CURLE_BAD_FUNCTION_ARGUMENT); + } - this->ch = curl_easy_duphandle(orig->ch); - assert(this->ch && "Could not duplicate libcurl easy handle."); + CURL* curlEasyHandle = maybeHandleExternal.Data(); + this->ch = curlEasyHandle; - NODE_LIBCURL_ADJUST_MEM(MEMORY_PER_HANDLE); + // Get the original Easy instance from the handle's private data + char* origEasyPtr = nullptr; + CURLcode code = curl_easy_getinfo(curlEasyHandle, CURLINFO_PRIVATE, &origEasyPtr); - // copy the orig callbacks and async resources to the current handle - this->callbacks.insert(orig->callbacks.begin(), orig->callbacks.end()); + if (code == CURLE_OK && origEasyPtr != nullptr) { + Easy* orig = reinterpret_cast(origEasyPtr); + assert(orig && "Failed to get original Easy instance from the handle's private data"); + this->CopyOtherData(orig); + } - if (orig->cbOnSocketEvent) { - this->cbOnSocketEvent = orig->cbOnSocketEvent; + } else { + throw CurlError::New( + env, "Argument must be an instance of an Easy handle or external CURL handle.", + CURLE_BAD_FUNCTION_ARGUMENT); + } + } else { + // Case 3: Default constructor - create new handle + this->ch = curl_easy_init(); + if (!this->ch) { + throw CurlError::New(env, "Could not initialize libcurl easy handle.", CURLE_FAILED_INIT); + } } - // make sure to reset the *DATA options when duplicating a handle. We are - // setting all of them, even if they are not set. - curl_easy_setopt(this->ch, CURLOPT_CHUNK_DATA, this); - curl_easy_setopt(this->ch, CURLOPT_DEBUGDATA, this); - curl_easy_setopt(this->ch, CURLOPT_FNMATCH_DATA, this); - curl_easy_setopt(this->ch, CURLOPT_PROGRESSDATA, this); -#if NODE_LIBCURL_VER_GE(7, 32, 0) - curl_easy_setopt(this->ch, CURLOPT_XFERINFODATA, this); -#endif -#if NODE_LIBCURL_VER_GE(7, 64, 0) - curl_easy_setopt(this->ch, CURLOPT_TRAILERDATA, this); -#endif -#if NODE_LIBCURL_VER_GE(7, 74, 0) - curl_easy_setopt(this->ch, CURLOPT_HSTSREADDATA, this); - curl_easy_setopt(this->ch, CURLOPT_HSTSWRITEDATA, this); -#endif - // no need to reset the _DATA option for the READ, SEEK and WRITE callbacks, - // since they are reset on ResetRequiredHandleOptions() - - this->toFree = orig->toFree; - - this->ResetRequiredHandleOptions(); + curl->AdjustHandleMemory(CURL_HANDLE_TYPE_EASY, 1); - ++Easy::currentOpenedHandles; + // Common setup for all constructor modes + this->ResetRequiredHandleOptions(isFromDuplicate); } -// Create a new Easy instance using an existing curl handle -// This is the only constructor that is not private -// because it's used inside Multi -Easy::Easy(CURL* easy) { - this->ch = easy; - - char* origEasyPtr = nullptr; - - CURLcode code = curl_easy_getinfo(easy, CURLINFO_PRIVATE, &origEasyPtr); - // This cannot fail - assert(code == CURLE_OK); - - NODE_LIBCURL_ADJUST_MEM(MEMORY_PER_HANDLE); - - // We are creating a new Easy instance based in a easy curl handle - // that must be being used by another Easy instance. - // This is basically a copy - just like we have above - // If origEasyPtr is still null here, it means this is a new easy curl handle - // and this scenario should currently never happen - assert(origEasyPtr != nullptr && "CURLINFO_PRIVATE returned a nullptr which is invalid"); - - Easy* orig = reinterpret_cast(origEasyPtr); - - // copy the orig callbacks and async resources to the current handle - this->callbacks.insert(orig->callbacks.begin(), orig->callbacks.end()); - - if (orig->cbOnSocketEvent) { - this->cbOnSocketEvent = orig->cbOnSocketEvent; +// Destructor +Easy::~Easy() { + NODE_LIBCURL_DEBUG_LOG(this, "Easy::Destructor", "isOpen: " + std::to_string(this->isOpen)); + if (this->isOpen) { + this->Dispose(); } - - // make sure to reset the *DATA options when duplicating a handle. We are - // setting all of them, even if they are not set. - curl_easy_setopt(this->ch, CURLOPT_CHUNK_DATA, this); - curl_easy_setopt(this->ch, CURLOPT_DEBUGDATA, this); - curl_easy_setopt(this->ch, CURLOPT_FNMATCH_DATA, this); - curl_easy_setopt(this->ch, CURLOPT_PROGRESSDATA, this); -#if NODE_LIBCURL_VER_GE(7, 32, 0) - curl_easy_setopt(this->ch, CURLOPT_XFERINFODATA, this); -#endif -#if NODE_LIBCURL_VER_GE(7, 64, 0) - curl_easy_setopt(this->ch, CURLOPT_TRAILERDATA, this); -#endif -#if NODE_LIBCURL_VER_GE(7, 74, 0) - curl_easy_setopt(this->ch, CURLOPT_HSTSREADDATA, this); - curl_easy_setopt(this->ch, CURLOPT_HSTSWRITEDATA, this); -#endif - // no need to reset the _DATA option for the READ, SEEK and WRITE callbacks, - // since they are reset on ResetRequiredHandleOptions() - - this->toFree = orig->toFree; - - this->ResetRequiredHandleOptions(); - - ++Easy::currentOpenedHandles; } -v8::Local Easy::FromCURLHandle(CURL* handle) { - Nan::EscapableHandleScope scope; +// Dispose persistent objects and references stored during the life of this obj. +void Easy::Dispose() { + NODE_LIBCURL_DEBUG_LOG(this, "Easy::Dispose", ""); + // this call should only be done when the handle is still open + assert(this->isOpen && "This handle was already closed."); + assert(this->ch && "The curl handle ran away."); - // create a new js object using this one as the argument for the constructor. - const int argc = 1; - v8::Local curlEasyHandle = Nan::New(reinterpret_cast(handle)); + curl_easy_cleanup(this->ch); + this->ch = nullptr; + this->isOpen = false; - v8::Local argv[argc] = {curlEasyHandle}; - v8::Local cons = Nan::GetFunction(Nan::New(Easy::constructor)).ToLocalChecked(); + const auto curl = this->Env().GetInstanceData(); + curl->AdjustHandleMemory(CURL_HANDLE_TYPE_EASY, -1); - v8::Local newInstance = Nan::NewInstance(cons, argc, argv).ToLocalChecked(); + if (this->isMonitoringSockets) { + this->UnmonitorSockets(); + } - return scope.Escape(newInstance); + this->DisposeInternalData(); } -// Implementation of equality operator overload. -bool Easy::operator==(const Easy& other) const { return this->ch == other.ch; } +// This does not dispose the handle, just the internal data, keeping the handle alive. +void Easy::DisposeInternalData() { + this->callbacks.clear(); + this->hstsReadCache.clear(); -bool Easy::operator!=(const Easy& other) const { return !(*this == other); } + this->cbOnSocketEvent.Reset(); + this->callbackError.Reset(); -Easy::~Easy(void) { - if (this->isOpen) { - this->Dispose(); - } + // not clear! This is shared with other handles, so we cannot clear it. + this->cbOnSocketEventAsyncContext.reset(); + this->toFree.reset(); + + this->isCbProgressAlreadyAborted = false; + this->readDataFileDescriptor = -1; + this->readDataOffset = -1; } -void Easy::ResetRequiredHandleOptions() { - curl_easy_setopt(this->ch, CURLOPT_PRIVATE, - this); // to be used with Multi handle +void Easy::ResetRequiredHandleOptions(bool isFromDuplicate) { + curl_easy_setopt(this->ch, CURLOPT_PRIVATE, this); // to be used with Multi handle curl_easy_setopt(this->ch, CURLOPT_HEADERFUNCTION, Easy::HeaderFunction); curl_easy_setopt(this->ch, CURLOPT_HEADERDATA, this); @@ -198,27 +188,70 @@ void Easy::ResetRequiredHandleOptions() { curl_easy_setopt(this->ch, CURLOPT_WRITEFUNCTION, Easy::WriteFunction); curl_easy_setopt(this->ch, CURLOPT_WRITEDATA, this); + + // make sure to reset the *DATA options when duplicating a handle. We are + // setting all of them, even if they are not set. + if (isFromDuplicate) { + curl_easy_setopt(this->ch, CURLOPT_CHUNK_DATA, this); + curl_easy_setopt(this->ch, CURLOPT_DEBUGDATA, this); + curl_easy_setopt(this->ch, CURLOPT_FNMATCH_DATA, this); + curl_easy_setopt(this->ch, CURLOPT_PROGRESSDATA, this); +#if NODE_LIBCURL_VER_GE(7, 32, 0) + curl_easy_setopt(this->ch, CURLOPT_XFERINFODATA, this); +#endif +#if NODE_LIBCURL_VER_GE(7, 64, 0) + curl_easy_setopt(this->ch, CURLOPT_TRAILERDATA, this); +#endif +#if NODE_LIBCURL_VER_GE(7, 74, 0) + curl_easy_setopt(this->ch, CURLOPT_HSTSREADDATA, this); + curl_easy_setopt(this->ch, CURLOPT_HSTSWRITEDATA, this); +#endif + } + + // Set CURLOPT_CAINFO_BLOB with CA certificates from Node.js's tls module + // This provides default CA certificates for SSL/TLS connections + // Only available in libcurl >= 7.77.0 +#if NODE_LIBCURL_VER_GE(7, 77, 0) + const auto curl = this->Env().GetInstanceData(); + if (curl->caCertificatesBlob.data != nullptr && curl->caCertificatesBlob.len > 0) { + curl_easy_setopt(this->ch, CURLOPT_CAINFO_BLOB, &curl->caCertificatesBlob); + } +#endif } -// Dispose persistent objects and references stored during the life of this obj. -void Easy::Dispose() { - // this call should only be done when the handle is still open - assert(this->isOpen && "This handle was already closed."); - assert(this->ch && "The curl handle ran away."); +void Easy::CopyOtherData(Easy* orig) { + // Copy the orig callbacks to the current handle + for (auto& [option, callback] : orig->callbacks) { + if (!callback.IsEmpty()) { + this->callbacks[option] = Napi::Persistent(callback.Value()); + } + } - curl_easy_cleanup(this->ch); + if (!orig->cbOnSocketEvent.IsEmpty()) { + this->cbOnSocketEvent = Napi::Persistent(orig->cbOnSocketEvent.Value()); + // Share the same AsyncContext to preserve original context + this->cbOnSocketEventAsyncContext = orig->cbOnSocketEventAsyncContext; + } - NODE_LIBCURL_ADJUST_MEM(-MEMORY_PER_HANDLE); + // Copy shared ToFree data + this->toFree = orig->toFree; +} - if (this->isMonitoringSockets) { - this->UnmonitorSockets(); +void Easy::CallSocketEvent(int status, int events) { + if (this->cbOnSocketEvent.IsEmpty() || !this->cbOnSocketEventAsyncContext) { + return; } - this->isOpen = false; + const auto env = this->Env(); + Napi::HandleScope scope(env); - this->callbackError.Reset(); + auto err = env.Null(); + if (status < 0) { + err = Napi::Error::New(env, UV_ERROR_STRING(status)).Value(); + } - --Easy::currentOpenedHandles; + this->cbOnSocketEvent.MakeCallback(this->Value(), {err, Napi::Number::New(env, events)}, + *this->cbOnSocketEventAsyncContext); } void Easy::MonitorSockets() { @@ -227,17 +260,17 @@ void Easy::MonitorSockets() { int events = 0 | UV_READABLE | UV_WRITABLE; if (this->socketPollHandle) { - Nan::ThrowError("Already monitoring sockets!"); - return; + throw CurlError::New(this->Env(), "Already monitoring sockets!", CURLE_BAD_FUNCTION_ARGUMENT); } + // TODO(jonathan, migration): drop if defs if we stop supporting old libcurl versions #if NODE_LIBCURL_VER_GE(7, 45, 0) curl_socket_t socket; retCurl = curl_easy_getinfo(this->ch, CURLINFO_ACTIVESOCKET, &socket); if (socket == CURL_SOCKET_BAD) { - Nan::ThrowError("Received invalid socket from the current connection!"); - return; + throw CurlError::New(this->Env(), "Received invalid socket from the current connection!", + CURLE_BAD_FUNCTION_ARGUMENT); } #else long socket; // NOLINT(runtime/int) @@ -245,31 +278,34 @@ void Easy::MonitorSockets() { #endif if (retCurl != CURLE_OK) { - std::string errorMsg; - - errorMsg += std::string("Failed to receive socket. Reason: ") + curl_easy_strerror(retCurl); - - Nan::ThrowError(errorMsg.c_str()); - return; + throw CurlError::New(this->Env(), "Failed to receive socket", retCurl, true); } this->socketPollHandle = new uv_poll_t; - retUv = uv_poll_init_socket(uv_default_loop(), this->socketPollHandle, socket); + uv_loop_t* loop = nullptr; + auto napi_result = napi_get_uv_event_loop(this->Env(), &loop); + assert(napi_result == napi_ok && "Failed to get UV event loop"); - if (retUv < 0) { - std::string errorMsg; + // uv_default_loop is not thread safe, but this will run on the same thread as the current Node.js + // environment. + retUv = uv_poll_init_socket(loop, this->socketPollHandle, socket); - errorMsg += - std::string("Failed to poll on connection socket. Reason:") + UV_ERROR_STRING(retUv); + if (retUv < 0) { + std::string errorMsg = + std::string("Failed to poll on connection socket. Reason: ") + UV_ERROR_STRING(retUv); - Nan::ThrowError(errorMsg.c_str()); - return; + throw CurlError::New(this->Env(), errorMsg.c_str(), CURLE_INTERFACE_FAILED); } this->socketPollHandle->data = this; - retUv = uv_poll_start(this->socketPollHandle, events, Easy::OnSocket); + retUv = + uv_poll_start(this->socketPollHandle, events, [](uv_poll_t* handle, int status, int events) { + const auto obj = static_cast(handle->data); + assert(obj); + obj->CallSocketEvent(status, events); + }); this->isMonitoringSockets = true; } @@ -278,2270 +314,2142 @@ void Easy::UnmonitorSockets() { retUv = uv_poll_stop(this->socketPollHandle); if (retUv < 0) { - std::string errorMsg; - - errorMsg += std::string("Failed to stop polling on socket. Reason: ") + UV_ERROR_STRING(retUv); + std::string errorMsg = + std::string("Failed to stop polling on socket. Reason: ") + UV_ERROR_STRING(retUv); - Nan::ThrowError(errorMsg.c_str()); - return; + throw CurlError::New(this->Env(), errorMsg.c_str(), CURLE_INTERFACE_FAILED); } - uv_close(reinterpret_cast(this->socketPollHandle), Easy::OnSocketClose); + uv_close(reinterpret_cast(this->socketPollHandle), + [](uv_handle_t* handle) { delete handle; }); this->isMonitoringSockets = false; } -void Easy::OnSocket(uv_poll_t* handle, int status, int events) { - Easy* obj = static_cast(handle->data); - - assert(obj); - - obj->CallSocketEvent(status, events); -} - -void Easy::OnSocketClose(uv_handle_t* handle) { delete handle; } - -void Easy::CallSocketEvent(int status, int events) { - if (this->cbOnSocketEvent == nullptr) { - return; - } - - Nan::HandleScope scope; - - v8::Local err = Nan::Null(); +void inline Easy::throwErrorMultiInterfaceAware(const Napi::Error& error) noexcept { + Napi::HandleScope scope(this->Env()); - if (status < 0) { - err = Nan::Error(UV_ERROR_STRING(status)); + if (this->isInsideMultiHandle) { + this->callbackError.Reset(error.Value()); + } else { + error.ThrowAsJavaScriptException(); } - - const int argc = 2; - v8::Local argv[argc] = {err, Nan::New(events)}; - - // **(this->cbOnSocketEvent.get()) is the same than this->cbOnSocketEvent->GetFunction() - Nan::AsyncResource asyncResource("Easy::CallSocketEvent"); - asyncResource.runInAsyncScope(this->handle(), this->cbOnSocketEvent->GetFunction(), argc, argv); } -// Called by libcurl when some chunk of data (from body) is available -size_t Easy::WriteFunction(char* ptr, size_t size, size_t nmemb, void* userdata) { - Easy* obj = static_cast(userdata); - return obj->OnData(ptr, size, nmemb); +// Initialize the class for export +Napi::Function Easy::Init(Napi::Env env, Napi::Object exports) { + // DefineClass uses metaprogramming to infer the C++ class to use is this Easy class. + // (DefineClass is actually defined on the Napi::ObjectWrap class) + Napi::Function func = DefineClass( + env, "Easy", + {// Instance methods + InstanceMethod("debugLog", &Easy::DebugLog), InstanceMethod("getInfo", &Easy::GetInfo), + InstanceMethod("setOpt", &Easy::SetOpt), InstanceMethod("getInfo", &Easy::GetInfo), + InstanceMethod("send", &Easy::Send), InstanceMethod("recv", &Easy::Recv), + InstanceMethod("wsRecv", &Easy::WsRecv), InstanceMethod("wsSend", &Easy::WsSend), + InstanceMethod("wsMeta", &Easy::WsMeta), InstanceMethod("wsStartFrame", &Easy::WsStartFrame), + InstanceMethod("perform", &Easy::Perform), InstanceMethod("upkeep", &Easy::Upkeep), + InstanceMethod("pause", &Easy::Pause), InstanceMethod("reset", &Easy::Reset), + InstanceMethod("dupHandle", &Easy::DupHandle), + InstanceMethod("onSocketEvent", &Easy::OnSocketEvent), + InstanceMethod("monitorSocketEvents", &Easy::MonitorSocketEvents), + InstanceMethod("unmonitorSocketEvents", &Easy::UnmonitorSocketEvents), + InstanceMethod("close", &Easy::Close), + + // Static methods + StaticMethod("strError", &Easy::StrError), + + // Instance accessors + InstanceAccessor("id", &Easy::GetterId, nullptr), + InstanceAccessor("isInsideMultiHandle", &Easy::GetterIsInsideMultiHandle, nullptr), + InstanceAccessor("isMonitoringSockets", &Easy::GetterIsMonitoringSockets, nullptr), + InstanceAccessor("pauseFlags", &Easy::GetterPauseFlags, nullptr), + InstanceAccessor("isPausedSend", &Easy::GetterIsPausedSend, nullptr), + InstanceAccessor("isPausedRecv", &Easy::GetterIsPausedRecv, nullptr), + InstanceAccessor("isOpen", &Easy::GetterIsOpen, nullptr)}); + + exports.Set("Easy", func); + return func; } -// Called by libcurl when some chunk of data (from headers) is available -size_t Easy::HeaderFunction(char* ptr, size_t size, size_t nmemb, void* userdata) { - Easy* obj = static_cast(userdata); - return obj->OnHeader(ptr, size, nmemb); +// Getters +Napi::Value Easy::GetterId(const Napi::CallbackInfo& info) { + return Napi::Number::New(info.Env(), this->id); } -// Called by libcurl as soon as it needs to read data in order to send it to the -// peer -size_t Easy::ReadFunction(char* ptr, size_t size, size_t nmemb, void* userdata) { - uv_fs_t readReq; - - int32_t returnValue = CURL_READFUNC_ABORT; - - Easy* obj = static_cast(userdata); - int32_t fd = obj->readDataFileDescriptor; +Napi::Value Easy::GetterIsInsideMultiHandle(const Napi::CallbackInfo& info) { + return Napi::Boolean::New(info.Env(), this->isInsideMultiHandle); +} - size_t n = size * nmemb; +Napi::Value Easy::GetterIsMonitoringSockets(const Napi::CallbackInfo& info) { + return Napi::Boolean::New(info.Env(), this->isMonitoringSockets); +} - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_READFUNCTION); +Napi::Value Easy::GetterIsOpen(const Napi::CallbackInfo& info) { + return Napi::Boolean::New(info.Env(), this->isOpen); +} - // Read callback was set, use it instead - if (it != obj->callbacks.end()) { - Nan::HandleScope scope; - - v8::Local buf = Nan::NewBuffer(static_cast(n)).ToLocalChecked(); - v8::Local sizeArg = Nan::New(static_cast(size)); - v8::Local nmembArg = Nan::New(static_cast(nmemb)); - const int argc = 3; - v8::Local argv[argc] = { - buf, - sizeArg, - nmembArg, - }; - - Nan::TryCatch tryCatch; - Nan::AsyncResource asyncResource("Easy::ReadFunction"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); - - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; - } +Napi::Value Easy::GetterPauseFlags(const Napi::CallbackInfo& info) { + return Napi::Number::New(info.Env(), this->pauseState); +} - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the READ callback must be an integer."); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); - } - return returnValue; - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); - } +Napi::Value Easy::GetterIsPausedRecv(const Napi::CallbackInfo& info) { + return Napi::Boolean::New(info.Env(), (this->pauseState & CURLPAUSE_RECV) != 0); +} - char* data = node::Buffer::Data(buf); +Napi::Value Easy::GetterIsPausedSend(const Napi::CallbackInfo& info) { + return Napi::Boolean::New(info.Env(), (this->pauseState & CURLPAUSE_SEND) != 0); +} - bool hasData = !!data && returnValue > 0 && returnValue < CURL_READFUNC_ABORT; +Napi::Value Easy::DebugLog(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); - if (hasData) { - std::memcpy(ptr, data, returnValue); - } + if (info.Length() < 1) { + throw Napi::TypeError::New(env, "Wrong number of arguments."); + } - // otherwise use the default read callback - } else { - // abort early if we don't have a file descriptor - if (fd == -1) { - return CURL_READFUNC_ABORT; - } + NODE_LIBCURL_DEBUG_LOG(this, "Easy::DebugLog", info[0].ToString().Utf8Value()); - // get the offset - curl_off_t offset = obj->readDataOffset; - if (offset >= 0) { - // increment it for the next read - obj->readDataOffset += n; - } + return env.Null(); +} -#if UV_VERSION_MAJOR < 1 - returnValue = uv_fs_read(uv_default_loop(), &readReq, fd, ptr, n, offset, NULL); -#else - uv_buf_t uvbuf = uv_buf_init(ptr, (unsigned int)(n)); +// SetOpt method - simplified version +Napi::Value Easy::SetOpt(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + auto curl = env.GetInstanceData(); - returnValue = uv_fs_read(uv_default_loop(), &readReq, fd, &uvbuf, 1, offset, NULL); -#endif + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); } - if (returnValue < 0) { - return CURL_READFUNC_ABORT; + if (info.Length() < 2) { + throw Napi::TypeError::New(env, "Wrong number of arguments."); } - return static_cast(returnValue); -} + Napi::Value opt = info[0]; + Napi::Value value = info[1]; -size_t Easy::SeekFunction(void* userdata, curl_off_t offset, int origin) { - Easy* obj = static_cast(userdata); + CURLcode setOptRetCode = CURLE_UNKNOWN_OPTION; - int32_t returnValue = CURL_SEEKFUNC_FAIL; + int optionId; - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_READFUNCTION); + // See this: https://daniel.haxx.se/blog/2020/08/28/enabling-better-curl-bindings/ + // we probably could use these here for newer libcurl versions... - // Read callback was set, look for a seek callback - if (it != obj->callbacks.end()) { - it = obj->callbacks.find(CURLOPT_SEEKFUNCTION); - - // Seek callback was set, use it instead - if (it != obj->callbacks.end()) { - Nan::HandleScope scope; - - v8::Local offsetArg = Nan::New(static_cast(offset)); - v8::Local originArg = Nan::New(static_cast(origin)); - const int argc = 2; - v8::Local argv[argc] = { - offsetArg, - originArg, - }; - - Nan::TryCatch tryCatch; - Nan::AsyncResource asyncResource("Easy::SeekFunction"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); - - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); + if ((optionId = IsInsideCurlConstantStruct(curlOptionNotImplemented, opt))) { + throw CurlError::New(env, + "Unsupported option, probably because it's too complex to implement " + "using javascript or unecessary when using javascript (like the _DATA " + "options).", + CURLE_UNKNOWN_OPTION); + } else if ((optionId = IsInsideCurlConstantStruct(curlOptionSpecific, opt))) { + switch (optionId) { + case CURLOPT_SHARE: + if (value.IsNull()) { + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_SHARE, NULL); } else { - tryCatch.ReThrow(); - } - return returnValue; - } + if (!value.IsObject() || + !value.As().InstanceOf(curl->ShareConstructor.Value())) { + throw Napi::TypeError::New(env, + "Invalid value for the SHARE option. It must be a Share " + "instance."); + } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the SEEK callback must be an integer."); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); - } - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); - } + Share* share = Share::Unwrap(value.As()); - // otherwise we can't seek directly - } else { - returnValue = CURL_SEEKFUNC_CANTSEEK; + if (!share->isOpen) { + throw CurlError::New(env, "Share handle is already closed.", + CURLE_BAD_FUNCTION_ARGUMENT); + } + + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_SHARE, share->sh); + } + break; } + // linked list options + } else if ((optionId = IsInsideCurlConstantStruct(curlOptionLinkedList, opt))) { + if (value.IsNull()) { + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), NULL); + // HTTPPOST is a special case, since it's an array of objects. + } else if (optionId == CURLOPT_HTTPPOST) { + std::string invalidArrayMsg = "HTTPPOST option value should be an Array of Objects."; - // otherwise use the default seek callback - } else { - obj->readDataOffset = offset; - returnValue = CURL_SEEKFUNC_OK; - } + if (!value.IsArray()) { + throw Napi::TypeError::New(env, invalidArrayMsg.c_str()); + } - return returnValue; -} + Napi::Array rows = value.As(); + auto httpPost = std::make_unique(); -size_t Easy::OnData(char* data, size_t size, size_t nmemb) { - Nan::HandleScope scope; + // [{ key : val }] + for (uint32_t i = 0, len = rows.Length(); i < len; ++i) { + // not an array of objects + Napi::Value obj = rows.Get(i); - size_t dataLength = size * nmemb; + if (!obj.IsObject()) { + throw Napi::TypeError::New(env, invalidArrayMsg.c_str()); + } - CallbacksMap::iterator it = this->callbacks.find(CURLOPT_WRITEFUNCTION); + Napi::Object postData = obj.As(); + Napi::Array props = postData.GetPropertyNames(); + const uint32_t postDataLength = props.Length(); - bool hasWriteCallback = (it != this->callbacks.end()); + bool hasFile = false; + bool hasContentType = false; + bool hasContent = false; + bool hasName = false; + bool hasNewFileName = false; - // No callback is set - if (!hasWriteCallback) { - return dataLength; - } + // loop through the properties names, making sure they are valid. + for (uint32_t j = 0; j < postDataLength; ++j) { + int32_t httpPostId = -1; - // if this gets returned it will cause a CURLE_WRITE_ERROR - int32_t returnValue = -1; + Napi::Value postDataKey = props.Get(j); + Napi::Value postDataValue = postData.Get(postDataKey); - const int argc = 3; - v8::Local buf = - Nan::CopyBuffer(data, static_cast(dataLength)).ToLocalChecked(); - v8::Local sizeArg = Nan::New(static_cast(size)); - v8::Local nmembArg = Nan::New(static_cast(nmemb)); + // convert postDataKey to httppost id + std::string fieldName = postDataKey.As().Utf8Value(); + std::string optionName = fieldName; + std::transform(optionName.begin(), optionName.end(), optionName.begin(), ::toupper); - v8::Local argv[argc] = {buf, sizeArg, nmembArg}; + for (const auto& curlOpt : curlOptionHttpPost) { + if (curlOpt.name == optionName) { + httpPostId = static_cast(curlOpt.value); + } + } - Nan::TryCatch tryCatch; - Nan::AsyncResource asyncResource("Easy::OnData"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(this->handle(), it->second->GetFunction(), argc, argv); + switch (httpPostId) { + case CurlHttpPost::FILE: + hasFile = true; + break; + case CurlHttpPost::TYPE: + hasContentType = true; + break; + case CurlHttpPost::CONTENTS: + hasContent = true; + break; + case CurlHttpPost::NAME: + hasName = true; + break; + case CurlHttpPost::FILENAME: + hasNewFileName = true; + break; + case -1: // property not found + std::string errorMsg = "Invalid property given: \"" + optionName + + "\". Valid properties are file, type, contents, name " + "and filename."; + throw CurlError::New(env, errorMsg.c_str(), CURLE_BAD_FUNCTION_ARGUMENT); + } - if (tryCatch.HasCaught()) { - if (this->isInsideMultiHandle) { - this->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; - } - - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the WRITE callback must be an integer."); - if (this->isInsideMultiHandle) { - this->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); - } - return returnValue; - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); - } - - return returnValue; -} - -size_t Easy::OnHeader(char* data, size_t size, size_t nmemb) { - Nan::HandleScope scope; - - size_t dataLength = size * nmemb; + // check if value is a string. + if (!postDataValue.IsString()) { + std::string errorMsg = "Value for property \"" + optionName + "\" must be a string."; + throw Napi::TypeError::New(env, errorMsg.c_str()); + } + } - CallbacksMap::iterator it = this->callbacks.find(CURLOPT_HEADERFUNCTION); + if (!hasName) { + throw CurlError::New(env, "Missing field \"name\".", CURLE_BAD_FUNCTION_ARGUMENT); + } - bool hasHeaderCallback = (it != this->callbacks.end()); + std::string fieldName = postData.Get("name").As().Utf8Value(); + CURLFORMcode curlFormCode; - // No callback is set - if (!hasHeaderCallback) { - return dataLength; - } + if (hasFile) { + std::string file = postData.Get("file").As().Utf8Value(); - // if this gets returned it will cause a CURLE_WRITE_ERROR - int32_t returnValue = -1; + if (hasContentType) { + std::string contentType = postData.Get("type").As().Utf8Value(); - const int argc = 3; - v8::Local buf = - Nan::CopyBuffer(data, static_cast(dataLength)).ToLocalChecked(); - v8::Local sizeArg = Nan::New(static_cast(size)); - v8::Local nmembArg = Nan::New(static_cast(nmemb)); + if (hasNewFileName) { + std::string fileName = postData.Get("filename").As().Utf8Value(); + curlFormCode = httpPost->AddFile(fieldName.data(), fieldName.length(), file.data(), + contentType.data(), fileName.data()); + } else { + curlFormCode = httpPost->AddFile(fieldName.data(), fieldName.length(), file.data(), + contentType.data()); + } + } else { + curlFormCode = httpPost->AddFile(fieldName.data(), fieldName.length(), file.data()); + } - v8::Local argv[argc] = {buf, sizeArg, nmembArg}; + } else if (hasContent) { // if file is not set, the contents field MUST be set. + std::string fieldValue = postData.Get("contents").As().Utf8Value(); + curlFormCode = httpPost->AddField(fieldName.data(), fieldName.length(), fieldValue.data(), + fieldValue.length()); + } else { + throw CurlError::New(env, "Missing field \"contents\".", CURLE_BAD_FUNCTION_ARGUMENT); + } - Nan::TryCatch tryCatch; - Nan::AsyncResource asyncResource("Easy::OnHeader"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(this->handle(), it->second->GetFunction(), argc, argv); + if (curlFormCode != CURL_FORMADD_OK) { + std::string errorMsg = "Error while adding field \"" + fieldName + "\" to post data."; + throw CurlError::New(env, errorMsg.c_str(), CURLE_BAD_FUNCTION_ARGUMENT); + } + } - if (tryCatch.HasCaught()) { - if (this->isInsideMultiHandle) { - this->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; - } + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_HTTPPOST, httpPost->first); + if (setOptRetCode == CURLE_OK) { + this->toFree->post.push_back(std::move(httpPost)); + } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the HEADER callback must be an integer."); - if (this->isInsideMultiHandle) { - this->callbackError.Reset(typeError); } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); - } - return returnValue; - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); - } - - return returnValue; -} - -v8::Local NullValueIfInvalidString(char* str) { - Nan::EscapableHandleScope scope; - - v8::Local ret = Nan::Null(); - - if (str != NULL && str[0] != '\0') { - ret = Nan::New(str).ToLocalChecked(); - } - - return scope.Escape(ret); -} - -v8::Local Easy::CreateV8ObjectFromCurlFileInfo(curl_fileinfo* fileInfo) { - Nan::EscapableHandleScope scope; - - v8::Local fileName = Nan::New(fileInfo->filename).ToLocalChecked(); - v8::Local fileType = Nan::New(fileInfo->filetype); - v8::Local time = Nan::Null().As(); - - if (fileInfo->time != 0) - time = Nan::New(static_cast(fileInfo->time) * 1000) - .ToLocalChecked() - .As(); - - v8::Local perm = Nan::New(fileInfo->perm); - v8::Local uid = Nan::New(fileInfo->uid); - v8::Local gid = Nan::New(fileInfo->gid); - v8::Local size = Nan::New(static_cast(fileInfo->size)); - v8::Local hardLinks = Nan::New(static_cast(fileInfo->hardlinks)); - - v8::Local strings = Nan::New(); - Nan::Set(strings, Nan::New("time").ToLocalChecked(), - NullValueIfInvalidString(fileInfo->strings.time)); - Nan::Set(strings, Nan::New("perm").ToLocalChecked(), - NullValueIfInvalidString(fileInfo->strings.perm)); - Nan::Set(strings, Nan::New("user").ToLocalChecked(), - NullValueIfInvalidString(fileInfo->strings.user)); - Nan::Set(strings, Nan::New("group").ToLocalChecked(), - NullValueIfInvalidString(fileInfo->strings.group)); - Nan::Set(strings, Nan::New("target").ToLocalChecked(), - NullValueIfInvalidString(fileInfo->strings.target)); - - v8::Local obj = Nan::New(); - Nan::Set(obj, Nan::New("fileName").ToLocalChecked(), fileName); - Nan::Set(obj, Nan::New("fileType").ToLocalChecked(), fileType); - Nan::Set(obj, Nan::New("time").ToLocalChecked(), time); - Nan::Set(obj, Nan::New("perm").ToLocalChecked(), perm); - Nan::Set(obj, Nan::New("uid").ToLocalChecked(), uid); - Nan::Set(obj, Nan::New("gid").ToLocalChecked(), gid); - Nan::Set(obj, Nan::New("size").ToLocalChecked(), size); - Nan::Set(obj, Nan::New("hardLinks").ToLocalChecked(), hardLinks); - Nan::Set(obj, Nan::New("strings").ToLocalChecked(), strings); - - return scope.Escape(obj); -} - -v8::Local Easy::CreateV8ObjectFromCurlHstsEntry(struct curl_hstsentry* sts) { - Nan::EscapableHandleScope scope; - - auto hasExpire = !!sts->expire[0] && !!strcmp(sts->expire, TIME_IN_THE_FUTURE); - - v8::Local host = Nan::New(sts->name).ToLocalChecked(); - v8::Local includeSubDomains = Nan::New(!!sts->includeSubDomains); - v8::Local expire = hasExpire ? Nan::New(sts->expire).ToLocalChecked().As() - : Nan::Null().As(); + if (!value.IsArray()) { + throw Napi::TypeError::New(env, "Option value must be an Array."); + } - v8::Local obj = Nan::New(); - Nan::Set(obj, Nan::New("host").ToLocalChecked(), host); - Nan::Set(obj, Nan::New("includeSubDomains").ToLocalChecked(), includeSubDomains); - Nan::Set(obj, Nan::New("expire").ToLocalChecked(), expire); + // convert value to curl linked list (curl_slist) + curl_slist* slist = NULL; + Napi::Array array = value.As(); - return scope.Escape(obj); -} + for (uint32_t i = 0, len = array.Length(); i < len; ++i) { + std::string item = array.Get(i).As().Utf8Value(); + slist = curl_slist_append(slist, item.c_str()); + } -long Easy::CbChunkBgn(curl_fileinfo* transferInfo, void* ptr, int remains) { // NOLINT(runtime/int) - Easy* obj = static_cast(ptr); + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), slist); - assert(obj); + if (setOptRetCode == CURLE_OK) { + this->toFree->slist.push_back(slist); + } + } - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_CHUNK_BGN_FUNCTION); - assert(it != obj->callbacks.end() && "CHUNK_BGN callback not set."); + // check if option is string, and the value is correct + } else if ((optionId = IsInsideCurlConstantStruct(curlOptionString, opt))) { + if (value.IsNull()) { + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), NULL); + } else { + if (!value.IsString()) { + throw Napi::TypeError::New(env, "Option value must be a string."); + } - const int argc = 2; - v8::Local argv[argc] = {Easy::CreateV8ObjectFromCurlFileInfo(transferInfo), - Nan::New(remains)}; + std::string valueStr = value.As().Utf8Value(); - int32_t returnValue = CURL_CHUNK_BGN_FUNC_FAIL; + // libcurl makes a copy of the strings after version 7.17, CURLOPT_POSTFIELD + // is the only exception + if (static_cast(optionId) == CURLOPT_POSTFIELDS) { + std::vector valueChar(valueStr.begin(), valueStr.end()); + valueChar.push_back(0); - Nan::TryCatch tryCatch; + setOptRetCode = + curl_easy_setopt(this->ch, static_cast(optionId), &valueChar[0]); - Nan::AsyncResource asyncResource("Easy::CbChunkBgn"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); + if (setOptRetCode == CURLE_OK) { + this->toFree->str.push_back(std::move(valueChar)); + } - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); + } else { + setOptRetCode = + curl_easy_setopt(this->ch, static_cast(optionId), valueStr.c_str()); + } } - return returnValue; - } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the CHUNK_BGN callback must be an integer."); + // check if option is an integer, and the value is correct + } else if ((optionId = IsInsideCurlConstantStruct(curlOptionInteger, opt))) { + auto valueNumber = value.ToNumber(); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); + switch (optionId) { + case CURLOPT_BUFFERSIZE: { + auto bufferSize = static_cast(valueNumber.Int32Value()); + // See https://curl.se/libcurl/c/CURLOPT_BUFFERSIZE.html +#if NODE_LIBCURL_VER_GE(7, 88, 0) + constexpr long kMaxBufferSize = 10 * 1024 * 1024; +#else + constexpr long kMaxBufferSize = 512 * 1024; +#endif + constexpr long kMinBufferSize = 1024; + if (bufferSize < kMinBufferSize || bufferSize > kMaxBufferSize) { + std::string errMsg = "BUFFERSIZE must be between " + std::to_string(kMinBufferSize) + +#if NODE_LIBCURL_VER_GE(7, 88, 0) + " and 10485760 (10MB) for libcurl >= 7.88.0"; +#else + " and 524288 (512KB) for libcurl <= 7.88.0"; +#endif + throw Napi::RangeError::New(env, errMsg); + } + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_BUFFERSIZE, bufferSize); + break; + } + case CURLOPT_INFILESIZE_LARGE: + case CURLOPT_MAXFILESIZE_LARGE: + case CURLOPT_MAX_RECV_SPEED_LARGE: + case CURLOPT_MAX_SEND_SPEED_LARGE: + case CURLOPT_POSTFIELDSIZE_LARGE: + case CURLOPT_RESUME_FROM_LARGE: + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), + static_cast(valueNumber.DoubleValue())); + break; + // special case with READDATA, since we need to store the file descriptor + // and not overwrite the READDATA already set in the handle. + case CURLOPT_READDATA: + this->readDataFileDescriptor = valueNumber.Int32Value(); + setOptRetCode = CURLE_OK; + break; + default: + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), + static_cast(valueNumber.Int32Value())); + break; } - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); - } - return returnValue; -} - -long Easy::CbChunkEnd(void* ptr) { // NOLINT(runtime/int) - Easy* obj = static_cast(ptr); - - assert(obj); - - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_CHUNK_END_FUNCTION); - assert(it != obj->callbacks.end() && "CHUNK_END callback not set."); - - int32_t returnValue = CURL_CHUNK_END_FUNC_FAIL; - - Nan::TryCatch tryCatch; - - Nan::AsyncResource asyncResource("Easy::CbChunkEnd"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), 0, NULL); + // check if option is a function, and the value is correct + } else if ((optionId = IsInsideCurlConstantStruct(curlOptionFunction, opt))) { + bool isNull = value.IsNull(); - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); + if (!value.IsFunction() && !isNull) { + throw Napi::TypeError::New(env, "Option value must be a null or a function."); } - return returnValue; - } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the CHUNK_END callback must be an integer."); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); + switch (optionId) { + case CURLOPT_CHUNK_BGN_FUNCTION: + if (isNull) { + // only unset the CHUNK_DATA if CURLOPT_CHUNK_END_FUNCTION is not set. + if (!this->callbacks.count(CURLOPT_CHUNK_END_FUNCTION)) { + curl_easy_setopt(this->ch, CURLOPT_CHUNK_DATA, NULL); + } + this->callbacks.erase(CURLOPT_CHUNK_BGN_FUNCTION); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_CHUNK_BGN_FUNCTION, NULL); + } else { + // TODO(jonathan): Check if we should use .Reset instead, or if we should clear the value + // first. + this->callbacks[CURLOPT_CHUNK_BGN_FUNCTION] = + Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_CHUNK_DATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_CHUNK_BGN_FUNCTION, Easy::CbChunkBgn); + } + break; + case CURLOPT_CHUNK_END_FUNCTION: + if (isNull) { + // only unset the CHUNK_DATA if CURLOPT_CHUNK_BGN_FUNCTION is not set. + if (!this->callbacks.count(CURLOPT_CHUNK_BGN_FUNCTION)) { + curl_easy_setopt(this->ch, CURLOPT_CHUNK_DATA, NULL); + } + this->callbacks.erase(CURLOPT_CHUNK_END_FUNCTION); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_CHUNK_END_FUNCTION, NULL); + } else { + this->callbacks[CURLOPT_CHUNK_END_FUNCTION] = + Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_CHUNK_DATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_CHUNK_END_FUNCTION, Easy::CbChunkEnd); + } + break; + case CURLOPT_DEBUGFUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_DEBUGFUNCTION); + curl_easy_setopt(this->ch, CURLOPT_DEBUGDATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_DEBUGFUNCTION, NULL); + } else { + this->callbacks[CURLOPT_DEBUGFUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_DEBUGDATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_DEBUGFUNCTION, Easy::CbDebug); + } + break; + case CURLOPT_FNMATCH_FUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_FNMATCH_FUNCTION); + curl_easy_setopt(this->ch, CURLOPT_FNMATCH_DATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_FNMATCH_FUNCTION, NULL); + } else { + this->callbacks[CURLOPT_FNMATCH_FUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_FNMATCH_DATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_FNMATCH_FUNCTION, Easy::CbFnMatch); + } + break; + case CURLOPT_HEADERFUNCTION: + setOptRetCode = CURLE_OK; + if (isNull) { + this->callbacks.erase(CURLOPT_HEADERFUNCTION); + } else { + this->callbacks[CURLOPT_HEADERFUNCTION] = Napi::Persistent(value.As()); + } + break; +#if NODE_LIBCURL_VER_GE(7, 74, 0) + case CURLOPT_HSTSREADFUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_HSTSREADFUNCTION); + curl_easy_setopt(this->ch, CURLOPT_HSTSREADDATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_HSTSREADFUNCTION, NULL); + } else { + this->callbacks[CURLOPT_HSTSREADFUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_HSTSREADDATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_HSTSREADFUNCTION, Easy::CbHstsRead); + } + break; + case CURLOPT_HSTSWRITEFUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_HSTSWRITEFUNCTION); + curl_easy_setopt(this->ch, CURLOPT_HSTSWRITEDATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_HSTSWRITEFUNCTION, NULL); + } else { + this->callbacks[CURLOPT_HSTSWRITEFUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_HSTSWRITEDATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_HSTSWRITEFUNCTION, Easy::CbHstsWrite); + } + break; +#endif +#if NODE_LIBCURL_VER_GE(7, 80, 0) + case CURLOPT_PREREQFUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_PREREQFUNCTION); + curl_easy_setopt(this->ch, CURLOPT_PREREQDATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_PREREQFUNCTION, NULL); + } else { + this->callbacks[CURLOPT_PREREQFUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_PREREQDATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_PREREQFUNCTION, Easy::CbPreReq); + } + break; +#endif + case CURLOPT_PROGRESSFUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_PROGRESSFUNCTION); + curl_easy_setopt(this->ch, CURLOPT_PROGRESSDATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_PROGRESSFUNCTION, NULL); + } else { + this->callbacks[CURLOPT_PROGRESSFUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_PROGRESSDATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_PROGRESSFUNCTION, Easy::CbProgress); + } + break; + case CURLOPT_READFUNCTION: + setOptRetCode = CURLE_OK; + if (isNull) { + this->callbacks.erase(CURLOPT_READFUNCTION); + } else { + this->callbacks[CURLOPT_READFUNCTION] = Napi::Persistent(value.As()); + } + break; + case CURLOPT_SEEKFUNCTION: + setOptRetCode = CURLE_OK; + if (isNull) { + this->callbacks.erase(CURLOPT_SEEKFUNCTION); + } else { + this->callbacks[CURLOPT_SEEKFUNCTION] = Napi::Persistent(value.As()); + } + break; +#if NODE_LIBCURL_VER_GE(7, 64, 0) + case CURLOPT_TRAILERFUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_TRAILERFUNCTION); + curl_easy_setopt(this->ch, CURLOPT_TRAILERDATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_TRAILERFUNCTION, NULL); + } else { + this->callbacks[CURLOPT_TRAILERFUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_TRAILERDATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_TRAILERFUNCTION, Easy::CbTrailer); + } + break; +#endif +#if NODE_LIBCURL_VER_GE(7, 32, 0) + /* xferinfo was introduced in 7.32.0. + New libcurls will prefer the new callback and instead use that one even + if both callbacks are set. */ + case CURLOPT_XFERINFOFUNCTION: + if (isNull) { + this->callbacks.erase(CURLOPT_XFERINFOFUNCTION); + curl_easy_setopt(this->ch, CURLOPT_XFERINFODATA, NULL); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_XFERINFOFUNCTION, NULL); + } else { + this->callbacks[CURLOPT_XFERINFOFUNCTION] = Napi::Persistent(value.As()); + curl_easy_setopt(this->ch, CURLOPT_XFERINFODATA, this); + setOptRetCode = curl_easy_setopt(this->ch, CURLOPT_XFERINFOFUNCTION, Easy::CbXferinfo); + } + break; +#endif + case CURLOPT_WRITEFUNCTION: + setOptRetCode = CURLE_OK; + if (isNull) { + this->callbacks.erase(CURLOPT_WRITEFUNCTION); + } else { + this->callbacks[CURLOPT_WRITEFUNCTION] = Napi::Persistent(value.As()); + } + break; + } + // check if option is a blob, and the value is correct + } else if ((optionId = IsInsideCurlConstantStruct(curlOptionBlob, opt))) { +#if NODE_LIBCURL_VER_GE(7, 71, 0) + if (value.IsNull()) { + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), NULL); + } else if (value.IsString()) { + std::string stringValue = value.As().Utf8Value(); + size_t length = static_cast(stringValue.length()); + struct curl_blob blob; + blob.data = stringValue.data(); + blob.len = length; + blob.flags = CURL_BLOB_COPY; + // if we wanted to reduce copies, we could store the string in our toFree vector + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), &blob); + } else if (value.IsBuffer()) { + Napi::Buffer buffer = value.As>(); + struct curl_blob blob; + blob.data = buffer.Data(); + blob.len = buffer.Length(); + blob.flags = CURL_BLOB_COPY; + setOptRetCode = curl_easy_setopt(this->ch, static_cast(optionId), &blob); } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); + throw Napi::TypeError::New(env, "Option value must be a string or Buffer."); } - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); +#else + throw CurlError::New(env, "Blob options require curl 7.71 or newer.", CURLE_NOT_BUILT_IN); +#endif } - - return returnValue; + return Napi::Number::New(env, setOptRetCode); } -int Easy::CbDebug(CURL* handle, curl_infotype type, char* data, size_t size, void* userptr) { - Nan::HandleScope scope; - - Easy* obj = static_cast(userptr); - - assert(obj); - - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_DEBUGFUNCTION); - assert(it != obj->callbacks.end() && "DEBUG callback not set."); - - const int argc = 2; - v8::Local buf = Nan::CopyBuffer(data, static_cast(size)).ToLocalChecked(); - v8::Local argv[argc] = { - Nan::New(type), - buf, - }; - - int32_t returnValue = 1; - - Nan::TryCatch tryCatch; - - Nan::AsyncResource asyncResource("Easy::CbDebug"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); +// Template helper for GetInfo +template +Napi::Value Easy::GetInfoTmpl(const Easy* obj, int infoId) { + TResultType result; + CURLINFO info = static_cast(infoId); + CURLcode code = curl_easy_getinfo(obj->ch, info, &result); - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; + if (code != CURLE_OK) { + throw CurlError::New(obj->Env(), "Failed to get info", code, true); } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the DEBUG callback must be an integer."); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); + // Handle string case - if result is char* and null, return empty string + if constexpr (std::is_same_v) { + if (!result) { + return Napi::String::New(obj->Env(), ""); } + return Napi::String::New(obj->Env(), result); } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); + return Napi::Number::New(obj->Env(), static_cast(result)); } - - return returnValue; } -int Easy::CbFnMatch(void* ptr, const char* pattern, const char* string) { - Nan::HandleScope scope; - - Easy* obj = static_cast(ptr); - - assert(obj); - - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_FNMATCH_FUNCTION); - assert(it != obj->callbacks.end() && "FNMATCH callback not set."); - - const int argc = 2; - v8::Local argv[argc] = {Nan::New(pattern).ToLocalChecked(), - Nan::New(string).ToLocalChecked()}; - - int32_t returnValue = CURL_FNMATCHFUNC_FAIL; - - Nan::TryCatch tryCatch; +// GetInfo method +Napi::Value Easy::GetInfo(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - Nan::AsyncResource asyncResource("Easy::CbFnMatch"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); - - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the FNMATCH callback must be an integer."); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); - } - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); + if (info.Length() < 1) { + throw Napi::TypeError::New(env, "Wrong number of arguments"); } - return returnValue; -} - -int Easy::CbHstsRead(CURL* handle, struct curl_hstsentry* sts, void* userdata) { -#if NODE_LIBCURL_VER_GE(7, 74, 0) - Nan::HandleScope scope; - - Easy* obj = static_cast(userdata); - - assert(obj); - - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_HSTSREADFUNCTION); - assert(it != obj->callbacks.end() && "HSTSREADFUNCTION callback not set."); - - int32_t returnValue = CURLSTS_FAIL; - - Nan::TryCatch tryCatch; - v8::Local cacheEntryObject; - - v8::Local typeError = Nan::TypeError( - "Return value from the HSTSREADFUNCTION callback must be one of the following:\n" - " - Object matching the type CurlHstsEntry\n" - " - An array matching the type CurlHstsEntry[]\n" - " - null\n" - "Libcurl <= 7.79.0 does not stop requests from firing if there are errors in the HSTS " - "callback, thus you may be receiving an error while the request did in fact work. Please " - "fix " - "the HSTS callback to return the correct data to avoid this."); - - if (obj->hstsReadCache.size() > 0) { - auto persistentValue = obj->hstsReadCache.back(); - cacheEntryObject = Nan::New(obj->hstsReadCache.back()); - - // reset the persistent handler so we do not leak memory - persistentValue.Reset(); - // remove it from the stack - obj->hstsReadCache.pop_back(); - } else { - // if this is true, this means we got all the entries in the cache provided by the user - if (obj->wasHstsReadCacheSet) { - obj->wasHstsReadCacheSet = false; - return CURLSTS_DONE; - } - - Nan::AsyncResource asyncResource("Easy::CbHstsRead"); - Nan::MaybeLocal returnValueFromHstsReadCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), 0, NULL); + Napi::Value infoVal = info[0]; + Napi::Value retVal = env.Undefined(); + int infoId; + CURLINFO curlInfo; + CURLcode code = CURLE_OK; - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); + // Special case for unsupported info + if ((infoId = IsInsideCurlConstantStruct(curlInfoNotImplemented, infoVal))) { + throw CurlError::New(env, + "Unsupported info, probably because it's too complex to implement " + "using javascript or unecessary when using javascript.", + CURLE_UNKNOWN_OPTION); + } + + try { + // String + if ((infoId = IsInsideCurlConstantStruct(curlInfoString, infoVal))) { + retVal = Easy::GetInfoTmpl(this, infoId); + // curl_off_t + } else if ((infoId = IsInsideCurlConstantStruct(curlInfoOffT, infoVal))) { + retVal = Easy::GetInfoTmpl(this, infoId); + // Double + } else if ((infoId = IsInsideCurlConstantStruct(curlInfoDouble, infoVal))) { + retVal = Easy::GetInfoTmpl(this, infoId); + // Integer + } else if ((infoId = IsInsideCurlConstantStruct(curlInfoInteger, infoVal))) { + retVal = Easy::GetInfoTmpl(this, infoId); // NOLINT(runtime/int) + // ACTIVESOCKET and alike + } else if ((infoId = IsInsideCurlConstantStruct(curlInfoSocket, infoVal))) { +#if NODE_LIBCURL_VER_GE(7, 45, 0) + curl_socket_t socket; +#else + // this should never really used tho, as it's only possible to have + // an curlInfoSocket value with libcurl >= 7.45.0 + long socket; // NOLINT(runtime/int) +#endif + code = curl_easy_getinfo(this->ch, static_cast(infoId), &socket); + if (code == CURLE_OK) { + // curl_socket_t is of type SOCKET on Windows, + // casting it to int32_t can be dangerous, only if Microsoft ever decides + // to change the underlying architecture behind it. + // https://stackoverflow.com/a/26496808/710693 + retVal = Napi::Number::New(env, static_cast(socket)); } - return returnValue; - } + // Linked list + } else if ((infoId = IsInsideCurlConstantStruct(curlInfoLinkedList, infoVal))) { + curl_slist* linkedList; + curl_slist* curr; + curlInfo = static_cast(infoId); - if (returnValueFromHstsReadCallback.IsEmpty()) { - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) - return returnValue; - } + if (curlInfo == CURLINFO_CERTINFO) { + curl_certinfo* ci = nullptr; + code = curl_easy_getinfo(this->ch, curlInfo, &ci); - cacheEntryObject = returnValueFromHstsReadCallback.ToLocalChecked(); - } + if (code == CURLE_OK && ci != nullptr) { + Napi::Array arr = Napi::Array::New(env); - if (cacheEntryObject->IsNull()) { - return CURLSTS_DONE; - } else { - // returning an array from the callback can be used to avoid multiple - // context switches between v8 and js - if (cacheEntryObject->IsArray()) { - auto cacheArray = cacheEntryObject.As(); - auto cacheArrayLength = cacheArray->Length(); + for (int i = 0; i < ci->num_of_certs; i++) { + linkedList = ci->certinfo[i]; - if (cacheArrayLength == 0) { - return CURLSTS_DONE; - } + if (linkedList) { + curr = linkedList; - // inserting in reverse order as we are processing the hstsReadCache stack from back to front - for (int i = cacheArrayLength - 1; i >= 0; i--) { - auto idxValue = Nan::Get(cacheArray, i); - - assert(!idxValue.IsEmpty() && - "Value inside array could not be found - Process may be running out of memory"); - - auto idxValueChecked = idxValue.ToLocalChecked(); + while (curr) { + arr.Set(arr.Length(), Napi::String::New(env, curr->data)); + curr = curr->next; + } + } + } - // we check for an array here too to avoid passing a child array here. - // If that happens, the code would get to this condition again when we - // process this cache entry in a future iteration - if (!idxValueChecked->IsObject() || idxValueChecked->IsArray()) { - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) - return returnValue; + retVal = arr; } + } else { + code = curl_easy_getinfo(this->ch, curlInfo, &linkedList); - auto idxValueAsObject = idxValueChecked.As(); - - Nan::CopyablePersistentTraits::CopyablePersistent persistentValue; - - persistentValue.Reset(Nan::GetCurrentContext()->GetIsolate(), idxValueAsObject); - - obj->hstsReadCache.push_back(persistentValue); - } - - auto persistentValue = obj->hstsReadCache.back(); - cacheEntryObject = Nan::New(obj->hstsReadCache.back()); - - persistentValue.Reset(); - obj->hstsReadCache.pop_back(); - obj->wasHstsReadCacheSet = true; - } - - if (cacheEntryObject->IsObject()) { - // napi would make this so much cleaner... - - auto cacheEntry = cacheEntryObject.As(); - - auto hostPropertyStr = Nan::New("host").ToLocalChecked(); - auto includeSubDomainsPropertyStr = Nan::New("includeSubDomains").ToLocalChecked(); - auto expirePropertyStr = Nan::New("expire").ToLocalChecked(); - - auto hostPropertyValue = Nan::Get(cacheEntry, hostPropertyStr); - auto includeSubDomainsPropertyValue = Nan::Get(cacheEntry, includeSubDomainsPropertyStr); - auto expirePropertyValue = Nan::Get(cacheEntry, expirePropertyStr); - - if (hostPropertyValue.IsEmpty() || includeSubDomainsPropertyValue.IsEmpty() || - expirePropertyValue.IsEmpty()) { - assert("Process ran out of memory - fields returned from HSTSREADFUNCTION were empty"); - } - - auto hostPropertyValueChecked = hostPropertyValue.ToLocalChecked(); - auto includeSubDomainsPropertyValueChecked = includeSubDomainsPropertyValue.ToLocalChecked(); - auto expirePropertyValueChecked = expirePropertyValue.ToLocalChecked(); - - // the validation here is pretty basic, and we are not really validating - // the format of the expire string - libcurl should do that - - // make sure the provided data is valid - if (!hostPropertyValueChecked->IsString() || - (!includeSubDomainsPropertyValueChecked->IsNullOrUndefined() && - !includeSubDomainsPropertyValueChecked->IsBoolean()) || - (!expirePropertyValueChecked->IsNullOrUndefined() && - !expirePropertyValueChecked->IsString())) { - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) - return returnValue; - } - - Nan::Utf8String hostStrValue(hostPropertyValueChecked); - - // make sure str len is inside the given max length - if (static_cast(hostStrValue.length()) > sts->namelen) { - v8::Local typeError = Nan::TypeError( - "The host property value returned from the HSTSREADFUNCTION callback function was " - "invalid. The host string is too long.\n" - "Libcurl <= 7.79.0 does not stop requests from firing if there are errors in the HSTS " - "callback, thus you may be receiving an error while the request did in fact work. " - "Please fix the HSTS callback to return the correct data to avoid this."); - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) - - return returnValue; - } + if (code == CURLE_OK) { + Napi::Array arr = Napi::Array::New(env); - sts->name = *hostStrValue; - sts->includeSubDomains = Nan::To(includeSubDomainsPropertyValueChecked).FromJust(); + if (linkedList) { + curr = linkedList; - if (expirePropertyValueChecked->IsString()) { - // make sure expire length is one expected by libcurl - // YYYYMMDD HH:MM:SS [null-terminated] - size_t currentSize = - static_cast(expirePropertyValueChecked.As()->Length()); - size_t expectedSize = sizeof(sts->expire) / sizeof(sts->expire[0]) - 1; + while (curr) { + arr.Set(arr.Length(), Napi::String::New(env, curr->data)); + curr = curr->next; + } - if (currentSize != expectedSize) { - v8::Local typeError = Nan::TypeError( - "The expire property value returned from the HSTSREADFUNCTION callback function was " - "invalid. String is either too long, or too short.\n" - "Libcurl <= 7.79.0 does not stop requests from firing if there are errors in the " - "HSTS " - "callback, thus you may be receiving an error while the request did in fact work. " - "Please fix the HSTS callback to return the correct data to avoid this."); - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) + curl_slist_free_all(linkedList); + } - return returnValue; + retVal = arr; } - - Nan::Utf8String expireStrValue(expirePropertyValueChecked); - auto expireCharValue = *expireStrValue; - - strcpy(sts->expire, expireCharValue); - } else { - // TODO(jonathan): libcurl <= 7.79 has a bug when expire is not set, see: - // https://github.com/curl/curl/issues/7720 - to avoid this bug we are setting it manually - // to a future date here - strcpy(sts->expire, TIME_IN_THE_FUTURE); } - returnValue = CURLSTS_OK; - } else { - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) } - } - - return returnValue; -#else - return 0; -#endif + } catch (const std::exception& e) { + // Inside Easy::GetInfoImpl we throw an exception with the error code + // so we can get it here and set the code to the correct value + std::string errMsg = e.what(); + std::string errCode; + std::copy_if(errMsg.begin(), errMsg.end(), std::back_inserter(errCode), ::isdigit); + code = static_cast(errCode.length() > 0 ? std::stoi(errCode) + : CURLE_BAD_FUNCTION_ARGUMENT); + } + + Napi::Object ret = Napi::Object::New(env); + ret.Set("code", Napi::Number::New(env, static_cast(code))); + ret.Set("data", retVal); + return ret; } -int Easy::CbHstsWrite(CURL* handle, struct curl_hstsentry* sts, struct curl_index* count, - void* userdata) { -#if NODE_LIBCURL_VER_GE(7, 74, 0) - Nan::HandleScope scope; - - Easy* obj = static_cast(userdata); - - assert(obj); - - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_HSTSWRITEFUNCTION); - assert(it != obj->callbacks.end() && "HSTSWRITEFUNCTION callback not set."); - - int32_t returnValue = CURLSTS_FAIL; - - Nan::TryCatch tryCatch; - v8::Local value; - - v8::Local typeError = - Nan::TypeError("Return value from the HSTSWRITEFUNCTION callback must be an integer."); - - // TODO(jonathan): give the option to receive an array directly? +Napi::Value Easy::Perform(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - v8::Local countObj = Nan::New(); - v8::Local index = Nan::New(static_cast(count->index)); - v8::Local total = Nan::New(static_cast(count->total)); - Nan::Set(countObj, Nan::New("index").ToLocalChecked(), index); - Nan::Set(countObj, Nan::New("total").ToLocalChecked(), total); - - const int argc = 2; - v8::Local argv[argc] = {Easy::CreateV8ObjectFromCurlHstsEntry(sts), countObj}; - - Nan::AsyncResource asyncResource("Easy::CbHstsWrite"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); - - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; + if (!this->isOpen) { + throw Napi::TypeError::New(env, "Curl handle is closed"); } - if (returnValueCallback.IsEmpty()) { - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) - return returnValue; - } - - value = returnValueCallback.ToLocalChecked(); - - if (!value->IsNumber()) { - THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) - return returnValue; - } + NODE_LIBCURL_DEBUG_LOG(this, "Easy::Perform", "performing request"); - returnValue = Nan::To(value).FromJust(); + LocaleGuard localeGuard; + CURLcode code = curl_easy_perform(this->ch); - return returnValue; -#else - return 0; -#endif + return Napi::Number::New(env, static_cast(code)); } -int Easy::CbPreReq(void* clientp, char* conn_primary_ip, char* conn_local_ip, int conn_primary_port, - int conn_local_port) { -#if NODE_LIBCURL_VER_GE(7, 80, 0) - Nan::HandleScope scope; +Napi::Value Easy::Reset(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - Easy* obj = static_cast(clientp); + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed", CURLE_BAD_FUNCTION_ARGUMENT); + } - assert(obj); + NODE_LIBCURL_DEBUG_LOG(this, "Easy::Reset", "resetting request"); - CallbacksMap::iterator it; + curl_easy_reset(this->ch); - // make sure the callback was set - it = obj->callbacks.find(CURLOPT_PREREQFUNCTION); - assert(it != obj->callbacks.end() && "Pre req callback not set."); + // reset the URL, + // https://github.com/bagder/curl/commit/ac6da721a3740500cc0764947385eb1c22116b83 + curl_easy_setopt(this->ch, CURLOPT_URL, ""); - Nan::TryCatch tryCatch; + this->DisposeInternalData(); - auto connPrimaryIp = Nan::New(conn_primary_ip).ToLocalChecked(); - auto connLocalIp = Nan::New(conn_local_ip).ToLocalChecked(); - auto connPrimaryPort = Nan::New(conn_primary_port); - auto conLocalPort = Nan::New(conn_local_port); + // the above will reset toFree, thus we need to recreate it + this->toFree = std::make_shared(); - const int argc = 4; - v8::Local argv[argc] = {connPrimaryIp, connLocalIp, connPrimaryPort, conLocalPort}; + this->ResetRequiredHandleOptions(false); - Nan::AsyncResource asyncResource("Easy::CbPreReq"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); + return info.This(); +} - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return CURL_PREREQFUNC_ABORT; +Napi::Value Easy::Close(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle already closed.", CURLE_BAD_FUNCTION_ARGUMENT); } - v8::Local returnValueCbTypeError = - Nan::TypeError("Return value from the PREREQ callback must be a number."); + if (this->isInsideMultiHandle) { + throw CurlError::New(env, "Curl handle is inside a Multi instance, you must remove it first.", + CURLE_BAD_FUNCTION_ARGUMENT); + } - bool isInvalid = - returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsNumber(); + this->Dispose(); + return env.Undefined(); +} - if (isInvalid) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(returnValueCbTypeError); - } else { - Nan::ThrowError(returnValueCbTypeError); - tryCatch.ReThrow(); - } +Napi::Value Easy::StrError(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - return CURL_PREREQFUNC_ABORT; + if (info.Length() < 1 || !info[0].IsNumber()) { + throw Napi::TypeError::New(env, "Invalid errCode passed to Easy.strError."); } - v8::Local returnValueCallbackChecked = returnValueCallback.ToLocalChecked(); - int returnValue = Nan::To(returnValueCallbackChecked).FromJust(); - return returnValue; -#else - return 0; -#endif -} + int32_t errorCode = info[0].As().Int32Value(); + const char* errorMsg = curl_easy_strerror(static_cast(errorCode)); -int Easy::CbProgress(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow) { - Nan::HandleScope scope; + return Napi::String::New(env, errorMsg); +} - Easy* obj = static_cast(clientp); +// Stub implementations for now +Napi::Value Easy::Send(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - assert(obj); + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); + } - int32_t returnValue = 1; + if (info.Length() == 0) { + throw CurlError::New(env, "Missing buffer argument.", CURLE_BAD_FUNCTION_ARGUMENT); + } - // See the thread here for explanation on why this flag is needed - // https://curl.haxx.se/mail/lib-2014-06/0062.html - // This was fixed here - // https://github.com/curl/curl/commit/907520c4b93616bddea15757bbf0bfb45cde8101 - if (obj->isCbProgressAlreadyAborted) { - return returnValue; + Napi::Value buf = info[0]; + if (!buf.IsBuffer()) { + throw CurlError::New(env, "Invalid Buffer instance given.", CURLE_BAD_FUNCTION_ARGUMENT); } - CallbacksMap::iterator it = obj->callbacks.find(CURLOPT_PROGRESSFUNCTION); - assert(it != obj->callbacks.end() && "PROGRESS callback not set."); + Napi::Buffer buffer = buf.As>(); + const char* bufContent = buffer.Data(); + size_t bufLength = buffer.Length(); + size_t n = 0; - const int argc = 4; - v8::Local argv[argc] = {Nan::New(static_cast(dltotal)), - Nan::New(static_cast(dlnow)), - Nan::New(static_cast(ultotal)), - Nan::New(static_cast(ulnow))}; + CURLcode curlRet = curl_easy_send(this->ch, bufContent, bufLength, &n); - Nan::TryCatch tryCatch; + Napi::Object ret = Napi::Object::New(env); + ret.Set("code", Napi::Number::New(env, static_cast(curlRet))); + ret.Set("bytesSent", Napi::Number::New(env, static_cast(n))); - Nan::AsyncResource asyncResource("Easy::CbProgress"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); + return ret; +} - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; +Napi::Value Easy::Recv(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the PROGRESS callback must be an integer."); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); - } - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); + if (info.Length() == 0) { + throw CurlError::New(env, "Missing buffer argument.", CURLE_BAD_FUNCTION_ARGUMENT); } -#if NODE_LIBCURL_VER_GE(7, 68, 0) - if (returnValue && returnValue != CURL_PROGRESSFUNC_CONTINUE) { -#else - if (returnValue) { -#endif - obj->isCbProgressAlreadyAborted = true; + Napi::Value buf = info[0]; + if (!buf.IsBuffer()) { + throw CurlError::New(env, "Invalid Buffer instance given.", CURLE_BAD_FUNCTION_ARGUMENT); } - return returnValue; -} + Napi::Buffer buffer = buf.As>(); + char* bufContent = buffer.Data(); + size_t bufLength = buffer.Length(); + size_t n = 0; -int Easy::CbTrailer(struct curl_slist** headerList, void* userdata) { -#if NODE_LIBCURL_VER_GE(7, 64, 0) - Nan::HandleScope scope; + CURLcode curlRet = curl_easy_recv(this->ch, bufContent, bufLength, &n); - Easy* obj = static_cast(userdata); + Napi::Object ret = Napi::Object::New(env); + ret.Set("code", Napi::Number::New(env, static_cast(curlRet))); + ret.Set("bytesReceived", Napi::Number::New(env, static_cast(n))); - assert(obj); + return ret; +} - CallbacksMap::iterator it; +Napi::Value Easy::WsRecv(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - // make sure the callback was set - it = obj->callbacks.find(CURLOPT_TRAILERFUNCTION); - assert(it != obj->callbacks.end() && "Trailer callback not set."); + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); + } - Nan::TryCatch tryCatch; +#if NODE_LIBCURL_VER_GE(7, 86, 0) + if (info.Length() == 0) { + throw CurlError::New(env, "Missing buffer argument.", CURLE_BAD_FUNCTION_ARGUMENT); + } - Nan::AsyncResource asyncResource("Easy::CbTrailer"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), 0, NULL); + Napi::Value buf = info[0]; + if (!buf.IsBuffer()) { + throw CurlError::New(env, "Invalid Buffer instance given.", CURLE_BAD_FUNCTION_ARGUMENT); + } - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return CURL_TRAILERFUNC_ABORT; + Napi::Buffer buffer = buf.As>(); + char* bufContent = buffer.Data(); + size_t bufLength = buffer.Length(); + size_t n = 0; + const struct curl_ws_frame* metaPtr = nullptr; + + CURLcode curlRet = curl_ws_recv(this->ch, bufContent, bufLength, &n, &metaPtr); + + Napi::Object ret = Napi::Object::New(env); + ret.Set("code", Napi::Number::New(env, static_cast(curlRet))); + ret.Set("bytesReceived", Napi::Number::New(env, static_cast(n))); + + // Create frame metadata object if available + if (metaPtr) { + Napi::Object meta = Napi::Object::New(env); + meta.Set("age", Napi::Number::New(env, metaPtr->age)); + meta.Set("flags", Napi::Number::New(env, metaPtr->flags)); + meta.Set("offset", Napi::Number::New(env, static_cast(metaPtr->offset))); + meta.Set("bytesleft", Napi::Number::New(env, static_cast(metaPtr->bytesleft))); + meta.Set("len", Napi::Number::New(env, metaPtr->len)); + ret.Set("meta", meta); + } else { + ret.Set("meta", env.Null()); } - v8::Local returnValueCbTypeError = Nan::TypeError( - "Return value from the Trailer callback must be an array of strings or false."); + return ret; +#else + throw CurlError::New(env, "WebSocket support requires libcurl >= 7.86.0", CURLE_NOT_BUILT_IN); +#endif +} - bool isInvalid = - returnValueCallback.IsEmpty() || (!returnValueCallback.ToLocalChecked()->IsArray() && - !returnValueCallback.ToLocalChecked()->IsFalse()); +Napi::Value Easy::WsSend(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - if (isInvalid) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(returnValueCbTypeError); - } else { - Nan::ThrowError(returnValueCbTypeError); - tryCatch.ReThrow(); - } + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); + } - return CURL_TRAILERFUNC_ABORT; +#if NODE_LIBCURL_VER_GE(7, 86, 0) + if (info.Length() < 2) { + throw CurlError::New(env, "Missing buffer and/or flags arguments.", + CURLE_BAD_FUNCTION_ARGUMENT); } - v8::Local returnValueCallbackChecked = returnValueCallback.ToLocalChecked(); + Napi::Value buf = info[0]; + if (!buf.IsBuffer()) { + throw CurlError::New(env, "Invalid Buffer instance given.", CURLE_BAD_FUNCTION_ARGUMENT); + } - if (returnValueCallbackChecked->IsFalse()) { - return CURL_TRAILERFUNC_ABORT; + if (!info[1].IsNumber()) { + throw CurlError::New(env, "Flags argument must be a number.", CURLE_BAD_FUNCTION_ARGUMENT); } - v8::Local rows = v8::Local::Cast(returnValueCallbackChecked); + Napi::Buffer buffer = buf.As>(); + const char* bufContent = buffer.Data(); + size_t bufLength = buffer.Length(); + size_t n = 0; + unsigned int flags = info[1].As().Uint32Value(); + curl_off_t fragsize = 0; - // [headerStr1, headerStr2] - for (uint32_t i = 0, len = rows->Length(); i < len; ++i) { - // not an array of objects - v8::Local headerStrValue = Nan::Get(rows, i).ToLocalChecked(); - if (!headerStrValue->IsString()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(returnValueCbTypeError); - } else { - Nan::ThrowError(returnValueCbTypeError); - tryCatch.ReThrow(); - } + // Optional fragsize parameter for CURLWS_OFFSET mode + if (info.Length() >= 3 && info[2].IsNumber()) { + fragsize = static_cast(info[2].As().Int64Value()); + } - return CURL_TRAILERFUNC_ABORT; - } + CURLcode curlRet = curl_ws_send(this->ch, bufContent, bufLength, &n, fragsize, flags); - *headerList = curl_slist_append(*headerList, *Nan::Utf8String(headerStrValue)); - } + Napi::Object ret = Napi::Object::New(env); + ret.Set("code", Napi::Number::New(env, static_cast(curlRet))); + ret.Set("bytesSent", Napi::Number::New(env, static_cast(n))); - return CURL_TRAILERFUNC_OK; + return ret; #else - return 0; + throw CurlError::New(env, "WebSocket support requires libcurl >= 7.86.0", CURLE_NOT_BUILT_IN); #endif } -int Easy::CbXferinfo(void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, - curl_off_t ulnow) { - Nan::HandleScope scope; - - Easy* obj = static_cast(clientp); +Napi::Value Easy::WsMeta(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - assert(obj); + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); + } - int32_t returnValue = 1; +#if NODE_LIBCURL_VER_GE(7, 86, 0) + const struct curl_ws_frame* metaPtr = curl_ws_meta(this->ch); - // same check than above, see it for comments. - if (obj->isCbProgressAlreadyAborted) { - return returnValue; + if (!metaPtr) { + return env.Null(); } - CallbacksMap::iterator it; + Napi::Object meta = Napi::Object::New(env); + meta.Set("age", Napi::Number::New(env, metaPtr->age)); + meta.Set("flags", Napi::Number::New(env, metaPtr->flags)); + meta.Set("offset", Napi::Number::New(env, static_cast(metaPtr->offset))); + meta.Set("bytesleft", Napi::Number::New(env, static_cast(metaPtr->bytesleft))); + meta.Set("len", Napi::Number::New(env, metaPtr->len)); - // make sure the callback was set -#if NODE_LIBCURL_VER_GE(7, 32, 0) - it = obj->callbacks.find(CURLOPT_XFERINFOFUNCTION); + return meta; #else - // just to make it compile ¯\_(ツ)_/¯ - it = obj->callbacks.end(); + throw CurlError::New(env, "WebSocket support requires libcurl >= 7.86.0", CURLE_NOT_BUILT_IN); #endif - assert(it != obj->callbacks.end() && "XFERINFO callback not set."); - - const int argc = 4; - v8::Local argv[argc] = {Nan::New(static_cast(dltotal)), - Nan::New(static_cast(dlnow)), - Nan::New(static_cast(ultotal)), - Nan::New(static_cast(ulnow))}; - - Nan::TryCatch tryCatch; +} - Nan::AsyncResource asyncResource("Easy::CbXferinfo"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); +Napi::Value Easy::WsStartFrame(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - if (tryCatch.HasCaught()) { - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(tryCatch.Exception()); - } else { - tryCatch.ReThrow(); - } - return returnValue; + if (!this->isOpen) { + throw CurlError::New(env, "Curl handle is closed.", CURLE_BAD_FUNCTION_ARGUMENT); } - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - v8::Local typeError = - Nan::TypeError("Return value from the XFERINFO callback must be an integer."); - if (obj->isInsideMultiHandle) { - obj->callbackError.Reset(typeError); - } else { - Nan::ThrowError(typeError); - tryCatch.ReThrow(); - } - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); +#if NODE_LIBCURL_VER_GE(7, 86, 0) + if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsNumber()) { + throw CurlError::New(env, "Missing flags and/or frame length arguments.", + CURLE_BAD_FUNCTION_ARGUMENT); } -#if NODE_LIBCURL_VER_GE(7, 68, 0) - if (returnValue && returnValue != CURL_PROGRESSFUNC_CONTINUE) { + unsigned int flags = info[0].As().Uint32Value(); + curl_off_t frameLength = static_cast(info[1].As().Int64Value()); + + CURLcode result = curl_ws_start_frame(this->ch, flags, frameLength); + return Napi::Number::New(env, static_cast(result)); #else - if (returnValue) { + throw CurlError::New(env, "WebSocket support requires libcurl >= 7.86.0", CURLE_NOT_BUILT_IN); #endif - obj->isCbProgressAlreadyAborted = true; +} + +Napi::Value Easy::Upkeep(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + if (!this->isOpen) { + throw Napi::TypeError::New(env, "Curl handle is closed"); } - return returnValue; +#if NODE_LIBCURL_VER_GE(7, 62, 0) + CURLcode code = curl_easy_upkeep(this->ch); + return Napi::Number::New(env, static_cast(code)); +#else + throw CurlError::New(env, "Upkeep requires libcurl >= 7.62.0", CURLE_NOT_BUILT_IN); +#endif } -NAN_MODULE_INIT(Easy::Initialize) { - Nan::HandleScope scope; - - // Easy js "class" function template initialization - v8::Local tmpl = Nan::New(Easy::New); - tmpl->SetClassName(Nan::New("Easy").ToLocalChecked()); - tmpl->InstanceTemplate()->SetInternalFieldCount(1); - v8::Local proto = tmpl->PrototypeTemplate(); - - // prototype methods - Nan::SetPrototypeMethod(tmpl, "setOpt", Easy::SetOpt); - Nan::SetPrototypeMethod(tmpl, "getInfo", Easy::GetInfo); - Nan::SetPrototypeMethod(tmpl, "send", Easy::Send); - Nan::SetPrototypeMethod(tmpl, "recv", Easy::Recv); - Nan::SetPrototypeMethod(tmpl, "perform", Easy::Perform); - Nan::SetPrototypeMethod(tmpl, "upkeep", Easy::Upkeep); - Nan::SetPrototypeMethod(tmpl, "pause", Easy::Pause); - Nan::SetPrototypeMethod(tmpl, "reset", Easy::Reset); - Nan::SetPrototypeMethod(tmpl, "dupHandle", Easy::DupHandle); - Nan::SetPrototypeMethod(tmpl, "onSocketEvent", Easy::OnSocketEvent); - Nan::SetPrototypeMethod(tmpl, "monitorSocketEvents", Easy::MonitorSocketEvents); - Nan::SetPrototypeMethod(tmpl, "unmonitorSocketEvents", Easy::UnmonitorSocketEvents); - Nan::SetPrototypeMethod(tmpl, "close", Easy::Close); - - // static methods - Nan::SetMethod(tmpl, "strError", Easy::StrError); - - // Instance accessors - Nan::SetAccessor(proto, Nan::New("id").ToLocalChecked(), Easy::IdGetter, 0, - v8::Local(), v8::DEFAULT, v8::ReadOnly); - Nan::SetAccessor(proto, Nan::New("isInsideMultiHandle").ToLocalChecked(), - Easy::IsInsideMultiHandleGetter, 0, v8::Local(), v8::DEFAULT, - v8::ReadOnly); - Nan::SetAccessor(proto, Nan::New("isMonitoringSockets").ToLocalChecked(), - Easy::IsMonitoringSocketsGetter, 0, v8::Local(), v8::DEFAULT, - v8::ReadOnly); - Nan::SetAccessor(proto, Nan::New("isOpen").ToLocalChecked(), Easy::IsOpenGetter, 0, - v8::Local(), v8::DEFAULT, v8::ReadOnly); - - Easy::constructor.Reset(tmpl); - - Nan::Set(target, Nan::New("Easy").ToLocalChecked(), Nan::GetFunction(tmpl).ToLocalChecked()); -} +Napi::Value Easy::Pause(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); -NAN_METHOD(Easy::New) { - if (!info.IsConstructCall()) { - Nan::ThrowError("You must use \"new\" to instantiate this object."); + if (!this->isOpen) { + throw Napi::TypeError::New(env, "Curl handle is closed"); } - v8::Local jsHandle = info[0]; - Easy* obj = nullptr; + if (info.Length() < 1 || !info[0].IsNumber()) { + throw Napi::TypeError::New(env, "Argument must be a bitmask"); + } - // Copy constructor, used when duplicating handles. - if (!jsHandle->IsUndefined()) { - if (!jsHandle->IsExternal() && - (!jsHandle->IsObject() || !Nan::New(Easy::constructor)->HasInstance(jsHandle))) { - Nan::ThrowError(Nan::TypeError("Argument must be an instance of an Easy handle.")); - return; - } + int32_t bitmask = info[0].As().Int32Value(); + this->pauseState = bitmask; - // This is the case when calling with a curl easy handle directly - if (jsHandle->IsExternal()) { - CURL* curlEasyHandle = reinterpret_cast(info[0].As()->Value()); - obj = new Easy(curlEasyHandle); - } else { - Easy* orig = Nan::ObjectWrap::Unwrap(Nan::To(info[0]).ToLocalChecked()); - obj = new Easy(orig); - } + CURLcode code = curl_easy_pause(this->ch, bitmask); - } else { - obj = new Easy(); - } + return Napi::Number::New(env, static_cast(code)); +} - if (obj) { - obj->Wrap(info.This()); - info.GetReturnValue().Set(info.This()); +Napi::Value Easy::DupHandle(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + if (!this->isOpen) { + throw Napi::TypeError::New(env, "Curl handle is closed"); } + + // Create a new Easy instance using this instance as constructor argument + // This leverages our copy constructor logic + auto curl = env.GetInstanceData(); + return curl->EasyConstructor.New({info.This()}); } -NAN_GETTER(Easy::IdGetter) { - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); +Napi::Value Easy::OnSocketEvent(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - info.GetReturnValue().Set(Nan::New(obj->id)); -} + if (info.Length() == 0) { + throw CurlError::New(env, "You must specify the callback function.", + CURLE_BAD_FUNCTION_ARGUMENT); + } + + Napi::Value arg = info[0]; + + // null means clear the existing callback if any + if (arg.IsNull()) { + this->cbOnSocketEvent.Reset(); + this->cbOnSocketEventAsyncContext.reset(); + return info.This(); + } -NAN_GETTER(Easy::IsInsideMultiHandleGetter) { - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + if (!arg.IsFunction()) { + throw Napi::TypeError::New(env, "Invalid callback given."); + } + + // If we were using Napi::TypedThreadSafeFunction<> here we would not need to keep track of + // context but that feels like a not needed complexity, as libuv will always be running on the + // same thread as the current Node.js environment. + this->cbOnSocketEvent = Napi::Persistent(arg.As()); + this->cbOnSocketEventAsyncContext = + std::make_shared(env, "Easy::OnSocketEvent"); - info.GetReturnValue().Set(Nan::New(obj->isInsideMultiHandle)); + return info.This(); } -NAN_GETTER(Easy::IsMonitoringSocketsGetter) { - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); +Napi::Value Easy::MonitorSocketEvents(const Napi::CallbackInfo& info) { + this->MonitorSockets(); + return info.This(); +} - info.GetReturnValue().Set(Nan::New(obj->isMonitoringSockets)); +Napi::Value Easy::UnmonitorSocketEvents(const Napi::CallbackInfo& info) { + this->UnmonitorSockets(); + return info.This(); } -NAN_GETTER(Easy::IsOpenGetter) { - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); +size_t Easy::WriteFunction(char* ptr, size_t size, size_t nmemb, void* userdata) { + Easy* obj = static_cast(userdata); + return obj->OnData(ptr, size, nmemb); +} - info.GetReturnValue().Set(Nan::New(obj->isOpen)); +size_t Easy::HeaderFunction(char* ptr, size_t size, size_t nmemb, void* userdata) { + Easy* obj = static_cast(userdata); + return obj->OnHeader(ptr, size, nmemb); } -NAN_METHOD(Easy::SetOpt) { - Nan::HandleScope scope; +size_t Easy::OnData(char* data, size_t size, size_t nmemb) { + NODE_LIBCURL_DEBUG_LOG(this, "Easy::OnData", "received data"); - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + Napi::Env env = Env(); + Napi::HandleScope scope(env); - if (!obj->isOpen) { - Nan::ThrowError("Curl handle is closed."); - return; - } + size_t dataLength = size * nmemb; - v8::Local opt = info[0]; - v8::Local value = info[1]; + auto it = this->callbacks.find(CURLOPT_WRITEFUNCTION); + if (it == this->callbacks.end() || it->second.IsEmpty()) { + // No callback set, return data length to continue + return dataLength; + } - CURLcode setOptRetCode = CURLE_UNKNOWN_OPTION; + // If this gets returned it will cause a CURLE_WRITE_ERROR + int32_t returnValue = -1; - int optionId; + try { + Napi::Function cb = it->second.Value(); - // See this: https://daniel.haxx.se/blog/2020/08/28/enabling-better-curl-bindings/ - // we probably could use these here for newer libcurl versions... + Napi::Buffer buffer = Napi::Buffer::Copy(env, data, dataLength); - if ((optionId = IsInsideCurlConstantStruct(curlOptionNotImplemented, opt))) { - Nan::ThrowError( - "Unsupported option, probably because it's too complex to implement " - "using javascript or unecessary when using javascript (like the _DATA " - "options)."); - return; - } else if ((optionId = IsInsideCurlConstantStruct(curlOptionSpecific, opt))) { - switch (optionId) { - case CURLOPT_SHARE: - if (value->IsNull()) { - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_SHARE, NULL); - } else { - if (!value->IsObject() || !Nan::New(Share::constructor)->HasInstance(value)) { - Nan::ThrowTypeError( - "Invalid value for the SHARE option. It must be a Share " - "instance."); - return; - } + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::OnData"); - Share* share = Nan::ObjectWrap::Unwrap(value.As()); + Napi::Value result = cb.MakeCallback( + this->Value(), {buffer, Napi::Number::New(env, size), Napi::Number::New(env, nmemb)}, + asyncContext); - if (!share->isOpen) { - Nan::ThrowError("Share handle is already closed."); - return; - } + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_SHARE, share->sh); - } - break; + this->throwErrorMultiInterfaceAware(error); + return returnValue; } - // linked list options - } else if ((optionId = IsInsideCurlConstantStruct(curlOptionLinkedList, opt))) { - if (value->IsNull()) { - setOptRetCode = curl_easy_setopt(obj->ch, static_cast(optionId), NULL); - // HTTPPOST is a special case, since it's an array of objects. - } else if (optionId == CURLOPT_HTTPPOST) { - std::string invalidArrayMsg = "HTTPPOST option value should be an Array of Objects."; + if (!result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the WRITE callback must be an integer."); - if (!value->IsArray()) { - Nan::ThrowTypeError(invalidArrayMsg.c_str()); - return; - } + this->throwErrorMultiInterfaceAware(typeError); + return returnValue; + } - v8::Local rows = v8::Local::Cast(value); + returnValue = result.As().Int32Value(); + } catch (const Napi::Error& e) { + this->throwErrorMultiInterfaceAware(e); + return returnValue; + } - std::unique_ptr httpPost = std::make_unique(); + if (returnValue == CURL_WRITEFUNC_PAUSE) { + this->pauseState |= CURLPAUSE_RECV; + } - // [{ key : val }] - for (uint32_t i = 0, len = rows->Length(); i < len; ++i) { - // not an array of objects - v8::Local obj = Nan::Get(rows, i).ToLocalChecked(); - if (!obj->IsObject()) { - Nan::ThrowTypeError(invalidArrayMsg.c_str()); - return; - } + return returnValue; +} - v8::Local postData = v8::Local::Cast(obj); +size_t Easy::OnHeader(char* data, size_t size, size_t nmemb) { + Napi::Env env = Env(); + Napi::HandleScope scope(env); - const v8::Local props = Nan::GetPropertyNames(postData).ToLocalChecked(); - const uint32_t postDataLength = props->Length(); + size_t dataLength = size * nmemb; - bool hasFile = false; - bool hasContentType = false; - bool hasContent = false; - bool hasName = false; - bool hasNewFileName = false; + auto it = this->callbacks.find(CURLOPT_HEADERFUNCTION); + if (it == this->callbacks.end() || it->second.IsEmpty()) { + // No callback set, return data length to continue + return dataLength; + } - // loop through the properties names, making sure they are valid. - for (uint32_t j = 0; j < postDataLength; ++j) { - int32_t httpPostId = -1; + // If this gets returned it will cause a CURLE_WRITE_ERROR + int32_t returnValue = -1; - const v8::Local postDataKey = Nan::Get(props, j).ToLocalChecked(); - const v8::Local postDataValue = - Nan::Get(postData, postDataKey).ToLocalChecked(); + try { + Napi::Function cb = it->second.Value(); - // convert postDataKey to httppost id - Nan::Utf8String fieldName(postDataKey); - std::string optionName = std::string(*fieldName); - std::transform(optionName.begin(), optionName.end(), optionName.begin(), ::toupper); + // Create buffer from data + Napi::Buffer buffer = Napi::Buffer::Copy(env, data, dataLength); - for (std::vector::const_iterator it = curlOptionHttpPost.begin(), - end = curlOptionHttpPost.end(); - it != end; ++it) { - if (it->name == optionName) { - httpPostId = static_cast(it->value); - } - } + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::OnHeader"); + Napi::Value result = cb.MakeCallback( + this->Value(), {buffer, Napi::Number::New(env, size), Napi::Number::New(env, nmemb)}, + asyncContext); - switch (httpPostId) { - case CurlHttpPost::FILE: - hasFile = true; - break; - case CurlHttpPost::TYPE: - hasContentType = true; - break; - case CurlHttpPost::CONTENTS: - hasContent = true; - break; - case CurlHttpPost::NAME: - hasName = true; - break; - case CurlHttpPost::FILENAME: - hasNewFileName = true; - break; - case -1: // property not found - std::string errorMsg; + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); - errorMsg += std::string("Invalid property given: \"") + optionName + - "\". Valid properties are file, type, contents, name " - "and filename."; - Nan::ThrowError(errorMsg.c_str()); - return; - } + this->throwErrorMultiInterfaceAware(error); + return returnValue; + } - // check if value is a string. - if (!postDataValue->IsString()) { - std::string errorMsg; + if (!result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the HEADER callback must be an integer."); - errorMsg += std::string("Value for property \"") + optionName + "\" must be a string."; - Nan::ThrowTypeError(errorMsg.c_str()); - return; - } - } + this->throwErrorMultiInterfaceAware(typeError); + return returnValue; + } - if (!hasName) { - Nan::ThrowError("Missing field \"name\"."); - return; - } + returnValue = result.As().Int32Value(); - Nan::Utf8String fieldName( - Nan::Get(postData, Nan::New("name").ToLocalChecked()).ToLocalChecked()); - CURLFORMcode curlFormCode; + } catch (const Napi::Error& e) { + this->throwErrorMultiInterfaceAware(e); + return returnValue; + } - if (hasFile) { - Nan::Utf8String file( - Nan::Get(postData, Nan::New("file").ToLocalChecked()).ToLocalChecked()); + return returnValue; +} - if (hasContentType) { - Nan::Utf8String contentType( - Nan::Get(postData, Nan::New("type").ToLocalChecked()).ToLocalChecked()); +// Called by libcurl as soon as it needs to read data in order to send it to the +// peer +size_t Easy::ReadFunction(char* ptr, size_t size, size_t nmemb, void* userdata) { + Easy* obj = static_cast(userdata); - if (hasNewFileName) { - Nan::Utf8String fileName( - Nan::Get(postData, Nan::New("filename").ToLocalChecked()) - .ToLocalChecked()); - curlFormCode = - httpPost->AddFile(*fieldName, fieldName.length(), *file, *contentType, *fileName); - } else { - curlFormCode = httpPost->AddFile(*fieldName, fieldName.length(), *file, *contentType); - } - } else { - curlFormCode = httpPost->AddFile(*fieldName, fieldName.length(), *file); - } + int32_t returnValue = CURL_READFUNC_ABORT; + int32_t fd = obj->readDataFileDescriptor; + size_t n = size * nmemb; - } else if (hasContent) { // if file is not set, the contents field MUST - // be set. + auto it = obj->callbacks.find(CURLOPT_READFUNCTION); - Nan::Utf8String fieldValue( - Nan::Get(postData, Nan::New("contents").ToLocalChecked()) - .ToLocalChecked()); + // Read callback was set, use it instead + if (it != obj->callbacks.end() && !it->second.IsEmpty()) { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - curlFormCode = - httpPost->AddField(*fieldName, fieldName.length(), *fieldValue, fieldValue.length()); + try { + Napi::Function cb = it->second.Value(); - } else { - Nan::ThrowError("Missing field \"contents\"."); - return; - } + Napi::Buffer buffer = Napi::Buffer::New(env, static_cast(n)); - if (curlFormCode != CURL_FORMADD_OK) { - std::string errorMsg; + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::ReadFunction"); - errorMsg += std::string("Error while adding field \"") + *fieldName + "\" to post data."; - Nan::ThrowError(errorMsg.c_str()); - return; - } - } + Napi::Value result = cb.MakeCallback( + obj->Value(), {buffer, Napi::Number::New(env, size), Napi::Number::New(env, nmemb)}, + asyncContext); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_HTTPPOST, httpPost->first); + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); - if (setOptRetCode == CURLE_OK) { - obj->toFree->post.push_back(std::move(httpPost)); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; } - } else { - if (!value->IsArray()) { - Nan::ThrowTypeError("Option value must be an Array."); - return; + if (!result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the READ callback must be an integer."); + + obj->throwErrorMultiInterfaceAware(typeError); + return returnValue; } - // convert value to curl linked list (curl_slist) - curl_slist* slist = NULL; - v8::Local array = v8::Local::Cast(value); + returnValue = result.As().Int32Value(); + + char* data = buffer.Data(); + bool hasData = !!data && returnValue > 0 && returnValue < CURL_READFUNC_ABORT; - for (uint32_t i = 0, len = array->Length(); i < len; ++i) { - slist = curl_slist_append(slist, *Nan::Utf8String(Nan::Get(array, i).ToLocalChecked())); + if (hasData) { + std::memcpy(ptr, data, returnValue); } - setOptRetCode = curl_easy_setopt(obj->ch, static_cast(optionId), slist); + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; + } - if (setOptRetCode == CURLE_OK) { - obj->toFree->slist.push_back(slist); - } + } else { + // abort early if we don't have a file descriptor + if (fd == -1) { + return CURL_READFUNC_ABORT; } - // check if option is string, and the value is correct - } else if ((optionId = IsInsideCurlConstantStruct(curlOptionString, opt))) { - if (value->IsNull()) { - setOptRetCode = curl_easy_setopt(obj->ch, static_cast(optionId), NULL); - } else { - if (!value->IsString()) { - Nan::ThrowTypeError("Option value must be a string."); - return; - } - Nan::Utf8String value(info[1]); + // get the offset + curl_off_t offset = obj->readDataOffset; + if (offset >= 0) { + obj->readDataOffset += n; + } - size_t length = static_cast(value.length()); + uv_fs_t readReq; - std::string valueStr = std::string(*value, length); + uv_loop_t* loop = nullptr; + auto napi_result = napi_get_uv_event_loop(obj->Env(), &loop); - // libcurl makes a copy of the strings after version 7.17, CURLOPT_POSTFIELD - // is the only exception - if (static_cast(optionId) == CURLOPT_POSTFIELDS) { - std::vector valueChar = std::vector(valueStr.begin(), valueStr.end()); - valueChar.push_back(0); + if (napi_result != napi_ok) { + return CURL_READFUNC_ABORT; + } - setOptRetCode = curl_easy_setopt(obj->ch, static_cast(optionId), &valueChar[0]); +#if UV_VERSION_MAJOR < 1 + returnValue = uv_fs_read(loop, &readReq, fd, ptr, n, offset, NULL); +#else + uv_buf_t uvbuf = uv_buf_init(ptr, (unsigned int)(n)); - if (setOptRetCode == CURLE_OK) { - obj->toFree->str.push_back(std::move(valueChar)); - } + returnValue = uv_fs_read(loop, &readReq, fd, &uvbuf, 1, offset, NULL); +#endif + uv_fs_req_cleanup(&readReq); + } - } else { - setOptRetCode = - curl_easy_setopt(obj->ch, static_cast(optionId), valueStr.c_str()); - } - } + if (returnValue < 0) { + return CURL_READFUNC_ABORT; + } - // check if option is an integer, and the value is correct - } else if ((optionId = IsInsideCurlConstantStruct(curlOptionInteger, opt))) { - switch (optionId) { - case CURLOPT_INFILESIZE_LARGE: - case CURLOPT_MAXFILESIZE_LARGE: - case CURLOPT_MAX_RECV_SPEED_LARGE: - case CURLOPT_MAX_SEND_SPEED_LARGE: - case CURLOPT_POSTFIELDSIZE_LARGE: - case CURLOPT_RESUME_FROM_LARGE: - setOptRetCode = - curl_easy_setopt(obj->ch, static_cast(optionId), - static_cast(Nan::To(value).FromJust())); - break; - // special case with READDATA, since we need to store the file descriptor - // and not overwrite the READDATA already set in the handle. - case CURLOPT_READDATA: - obj->readDataFileDescriptor = Nan::To(value).FromJust(); - setOptRetCode = CURLE_OK; - break; - default: - setOptRetCode = curl_easy_setopt( - obj->ch, static_cast(optionId), - static_cast(Nan::To(value).FromJust())); // NOLINT(runtime/int) - break; - } + if (returnValue == CURL_READFUNC_PAUSE) { + obj->pauseState |= CURLPAUSE_SEND; + } - // check if option is a function, and the value is correct - } else if ((optionId = IsInsideCurlConstantStruct(curlOptionFunction, opt))) { - bool isNull = value->IsNull(); + return static_cast(returnValue); +} - if (!value->IsFunction() && !isNull) { - Nan::ThrowTypeError("Option value must be a null or a function."); - return; - } +size_t Easy::SeekFunction(void* userdata, curl_off_t offset, int origin) { + Easy* obj = static_cast(userdata); - switch (optionId) { - case CURLOPT_CHUNK_BGN_FUNCTION: + int32_t returnValue = CURL_SEEKFUNC_FAIL; - if (isNull) { - // only unset the CHUNK_DATA if CURLOPT_CHUNK_END_FUNCTION is not set. - if (!obj->callbacks.count(CURLOPT_CHUNK_END_FUNCTION)) { - curl_easy_setopt(obj->ch, CURLOPT_CHUNK_DATA, NULL); - } + auto readIt = obj->callbacks.find(CURLOPT_READFUNCTION); - obj->callbacks.erase(CURLOPT_CHUNK_BGN_FUNCTION); + // Read callback was set, look for a seek callback + if (readIt != obj->callbacks.end()) { + auto seekIt = obj->callbacks.find(CURLOPT_SEEKFUNCTION); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_CHUNK_BGN_FUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_CHUNK_BGN_FUNCTION].reset( - new Nan::Callback(value.As())); + if (seekIt != obj->callbacks.end() && !seekIt->second.IsEmpty()) { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - curl_easy_setopt(obj->ch, CURLOPT_CHUNK_DATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_CHUNK_BGN_FUNCTION, Easy::CbChunkBgn); - } + try { + Napi::Function cb = seekIt->second.Value(); - break; + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::SeekFunction"); - case CURLOPT_CHUNK_END_FUNCTION: + Napi::Value result = + cb.MakeCallback(obj->Value(), + {Napi::Number::New(env, static_cast(offset)), + Napi::Number::New(env, static_cast(origin))}, + asyncContext); - if (isNull) { - // only unset the CHUNK_DATA if CURLOPT_CHUNK_BGN_FUNCTION is not set. - if (!obj->callbacks.count(CURLOPT_CHUNK_BGN_FUNCTION)) { - curl_easy_setopt(obj->ch, CURLOPT_CHUNK_DATA, NULL); - } + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); - obj->callbacks.erase(CURLOPT_CHUNK_END_FUNCTION); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_CHUNK_END_FUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_CHUNK_END_FUNCTION].reset( - new Nan::Callback(value.As())); + if (!result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the SEEK callback must be an integer."); - curl_easy_setopt(obj->ch, CURLOPT_CHUNK_DATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_CHUNK_END_FUNCTION, Easy::CbChunkEnd); + obj->throwErrorMultiInterfaceAware(typeError); + return returnValue; } - break; + returnValue = result.As().Int32Value(); - case CURLOPT_DEBUGFUNCTION: + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; + } - if (isNull) { - obj->callbacks.erase(CURLOPT_DEBUGFUNCTION); + } else { + // otherwise we can't seek directly + returnValue = CURL_SEEKFUNC_CANTSEEK; + } - curl_easy_setopt(obj->ch, CURLOPT_DEBUGDATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_DEBUGFUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_DEBUGFUNCTION].reset(new Nan::Callback(value.As())); + } else { + // default implementation + obj->readDataOffset = offset; + returnValue = CURL_SEEKFUNC_OK; + } - curl_easy_setopt(obj->ch, CURLOPT_DEBUGDATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_DEBUGFUNCTION, Easy::CbDebug); - } + return returnValue; +} - break; +long Easy::CbChunkBgn(curl_fileinfo* transferInfo, void* ptr, int remains) { + Easy* obj = static_cast(ptr); - case CURLOPT_FNMATCH_FUNCTION: + assert(obj); - if (isNull) { - obj->callbacks.erase(CURLOPT_FNMATCH_FUNCTION); + // Check if we have a CHUNK_BGN callback + auto it = obj->callbacks.find(CURLOPT_CHUNK_BGN_FUNCTION); + assert(it != obj->callbacks.end() && "CHUNK_BGN callback not set."); - curl_easy_setopt(obj->ch, CURLOPT_FNMATCH_DATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_FNMATCH_FUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_FNMATCH_FUNCTION].reset( - new Nan::Callback(value.As())); + int32_t returnValue = CURL_CHUNK_BGN_FUNC_FAIL; - curl_easy_setopt(obj->ch, CURLOPT_FNMATCH_DATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_FNMATCH_FUNCTION, Easy::CbFnMatch); - } - break; + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - case CURLOPT_HEADERFUNCTION: + Napi::Function cb = it->second.Value(); - setOptRetCode = CURLE_OK; + Napi::Object fileInfoObj = CreateV8ObjectFromCurlFileInfo(env, transferInfo); + Napi::Number remainsArg = Napi::Number::New(env, remains); - if (isNull) { - obj->callbacks.erase(CURLOPT_HEADERFUNCTION); - } else { - obj->callbacks[CURLOPT_HEADERFUNCTION].reset(new Nan::Callback(value.As())); - } + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbChunkBgn"); - break; + Napi::Value result = cb.MakeCallback(obj->Value(), {fileInfoObj, remainsArg}, asyncContext); -#if NODE_LIBCURL_VER_GE(7, 74, 0) - case CURLOPT_HSTSREADFUNCTION: - if (isNull) { - obj->callbacks.erase(CURLOPT_HSTSREADFUNCTION); + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - curl_easy_setopt(obj->ch, CURLOPT_HSTSREADDATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_HSTSREADFUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_HSTSREADFUNCTION].reset( - new Nan::Callback(value.As())); + if (result.IsEmpty() || !result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the CHUNK_BGN callback must be an integer."); + obj->throwErrorMultiInterfaceAware(typeError); + } else { + returnValue = result.As().Int32Value(); + } - curl_easy_setopt(obj->ch, CURLOPT_HSTSREADDATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_HSTSREADFUNCTION, Easy::CbHstsRead); - } + return returnValue; - break; - case CURLOPT_HSTSWRITEFUNCTION: - if (isNull) { - obj->callbacks.erase(CURLOPT_HSTSWRITEFUNCTION); + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; + } +} - curl_easy_setopt(obj->ch, CURLOPT_HSTSWRITEDATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_HSTSWRITEFUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_HSTSWRITEFUNCTION].reset( - new Nan::Callback(value.As())); +long Easy::CbChunkEnd(void* ptr) { + Easy* obj = static_cast(ptr); - curl_easy_setopt(obj->ch, CURLOPT_HSTSWRITEDATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_HSTSWRITEFUNCTION, Easy::CbHstsWrite); - } + assert(obj); - break; -#endif + // Check if we have a CHUNK_END callback + auto it = obj->callbacks.find(CURLOPT_CHUNK_END_FUNCTION); + assert(it != obj->callbacks.end() && "CHUNK_END callback not set."); -#if NODE_LIBCURL_VER_GE(7, 80, 0) - case CURLOPT_PREREQFUNCTION: + int32_t returnValue = CURL_CHUNK_END_FUNC_FAIL; - if (isNull) { - obj->callbacks.erase(CURLOPT_PREREQFUNCTION); + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - curl_easy_setopt(obj->ch, CURLOPT_PREREQDATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_PREREQFUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_PREREQFUNCTION].reset(new Nan::Callback(value.As())); + Napi::Function cb = it->second.Value(); - curl_easy_setopt(obj->ch, CURLOPT_PREREQDATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_PREREQFUNCTION, Easy::CbPreReq); - } + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbChunkEnd"); - break; -#endif + Napi::Value result = cb.MakeCallback(obj->Value(), {}, asyncContext); - case CURLOPT_PROGRESSFUNCTION: + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - if (isNull) { - obj->callbacks.erase(CURLOPT_PROGRESSFUNCTION); + if (result.IsEmpty() || !result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the CHUNK_END callback must be an integer."); + obj->throwErrorMultiInterfaceAware(typeError); + } else { + returnValue = result.As().Int32Value(); + } - curl_easy_setopt(obj->ch, CURLOPT_PROGRESSDATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_PROGRESSFUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_PROGRESSFUNCTION].reset( - new Nan::Callback(value.As())); + return returnValue; - curl_easy_setopt(obj->ch, CURLOPT_PROGRESSDATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_PROGRESSFUNCTION, Easy::CbProgress); - } + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; + } +} - break; +int Easy::CbDebug(CURL* handle, curl_infotype type, char* data, size_t size, void* userptr) { + Easy* obj = static_cast(userptr); - case CURLOPT_READFUNCTION: + assert(obj); - setOptRetCode = CURLE_OK; + // Check if we have a DEBUG callback + auto it = obj->callbacks.find(CURLOPT_DEBUGFUNCTION); + assert(it != obj->callbacks.end() && "DEBUG callback not set."); - if (isNull) { - obj->callbacks.erase(CURLOPT_READFUNCTION); - } else { - obj->callbacks[CURLOPT_READFUNCTION].reset(new Nan::Callback(value.As())); - } + int32_t returnValue = 1; - break; + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - case CURLOPT_SEEKFUNCTION: + Napi::Function cb = it->second.Value(); - setOptRetCode = CURLE_OK; + Napi::Number typeArg = Napi::Number::New(env, static_cast(type)); + Napi::Buffer bufferArg = Napi::Buffer::Copy(env, data, size); - if (isNull) { - obj->callbacks.erase(CURLOPT_SEEKFUNCTION); - } else { - obj->callbacks[CURLOPT_SEEKFUNCTION].reset(new Nan::Callback(value.As())); - } + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbDebug"); - break; + Napi::Value result = cb.MakeCallback(obj->Value(), {typeArg, bufferArg}, asyncContext); -#if NODE_LIBCURL_VER_GE(7, 64, 0) - case CURLOPT_TRAILERFUNCTION: + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - if (isNull) { - obj->callbacks.erase(CURLOPT_TRAILERFUNCTION); + if (result.IsEmpty() || !result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the DEBUG callback must be an integer."); + obj->throwErrorMultiInterfaceAware(typeError); + } else { + returnValue = result.As().Int32Value(); + } - curl_easy_setopt(obj->ch, CURLOPT_TRAILERDATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_TRAILERFUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_TRAILERFUNCTION].reset( - new Nan::Callback(value.As())); + return returnValue; - curl_easy_setopt(obj->ch, CURLOPT_TRAILERDATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_TRAILERFUNCTION, Easy::CbTrailer); - } + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; + } +} - break; -#endif +int Easy::CbFnMatch(void* ptr, const char* pattern, const char* string) { + Easy* obj = static_cast(ptr); -#if NODE_LIBCURL_VER_GE(7, 32, 0) - /* xferinfo was introduced in 7.32.0. - New libcurls will prefer the new callback and instead use that one even - if both callbacks are set. */ - case CURLOPT_XFERINFOFUNCTION: + assert(obj); - if (isNull) { - obj->callbacks.erase(CURLOPT_XFERINFOFUNCTION); + // Check if we have a FNMATCH callback + auto it = obj->callbacks.find(CURLOPT_FNMATCH_FUNCTION); + assert(it != obj->callbacks.end() && "FNMATCH callback not set."); - curl_easy_setopt(obj->ch, CURLOPT_XFERINFODATA, NULL); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_XFERINFOFUNCTION, NULL); - } else { - obj->callbacks[CURLOPT_XFERINFOFUNCTION].reset( - new Nan::Callback(value.As())); + int32_t returnValue = CURL_FNMATCHFUNC_FAIL; - curl_easy_setopt(obj->ch, CURLOPT_XFERINFODATA, obj); - setOptRetCode = curl_easy_setopt(obj->ch, CURLOPT_XFERINFOFUNCTION, Easy::CbXferinfo); - } + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - break; -#endif + Napi::Function cb = it->second.Value(); - case CURLOPT_WRITEFUNCTION: + Napi::String patternStr = Napi::String::New(env, pattern); + Napi::String stringStr = Napi::String::New(env, string); - setOptRetCode = CURLE_OK; + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbFnMatch"); - if (isNull) { - obj->callbacks.erase(CURLOPT_WRITEFUNCTION); - } else { - obj->callbacks[CURLOPT_WRITEFUNCTION].reset(new Nan::Callback(value.As())); - } + Napi::Value result = cb.MakeCallback(obj->Value(), {patternStr, stringStr}, asyncContext); - break; + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; } - // check if option is a blob, and the value is correct - } else if ((optionId = IsInsideCurlConstantStruct(curlOptionBlob, opt))) { -#if NODE_LIBCURL_VER_GE(7, 71, 0) - if (value->IsNull()) { - setOptRetCode = curl_easy_setopt(obj->ch, static_cast(optionId), NULL); - } else if (value->IsString()) { - Nan::Utf8String utf8StringValue(value); + if (result.IsEmpty() || !result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the FNMATCH callback must be an integer."); + obj->throwErrorMultiInterfaceAware(typeError); + } else { + returnValue = result.As().Int32Value(); + } - size_t length = static_cast(utf8StringValue.length()); + return returnValue; - struct curl_blob blob; - blob.data = *utf8StringValue; - blob.len = length; - blob.flags = CURL_BLOB_COPY; + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; + } +} - setOptRetCode = curl_easy_setopt(obj->ch, static_cast(optionId), &blob); - } else if (node::Buffer::HasInstance(value)) { - struct curl_blob blob; - blob.data = node::Buffer::Data(value); - blob.len = node::Buffer::Length(value); - blob.flags = CURL_BLOB_COPY; +int Easy::CbProgress(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow) { + Easy* obj = static_cast(clientp); + assert(obj); - setOptRetCode = curl_easy_setopt(obj->ch, static_cast(optionId), &blob); - } else { - Nan::ThrowTypeError("Option value must be a string or Buffer."); - return; - } -#else - Nan::ThrowError("Blob options require curl 7.71 or newer."); - return; -#endif + // default return of 1 will cause a CURLE_ABORTED_BY_CALLBACK. + int32_t returnValue = 1; + + // See the thread here for explanation on why this flag is needed + // https://curl.haxx.se/mail/lib-2014-06/0062.html + // This was fixed here + // https://github.com/curl/curl/commit/907520c4b93616bddea15757bbf0bfb45cde8101 + if (obj->isCbProgressAlreadyAborted) { + return returnValue; } - info.GetReturnValue().Set(setOptRetCode); -} - -// traits class to determine if we need to check for null pointer first -template -struct ResultTypeIsChar : std::false_type {}; -template <> -struct ResultTypeIsChar : std::true_type {}; + // Check if we have a progress callback + auto it = obj->callbacks.find(CURLOPT_PROGRESSFUNCTION); + if (it == obj->callbacks.end() || it->second.IsEmpty()) { + return 0; + } -template -v8::Local Easy::GetInfoTmpl(const Easy* obj, int infoId) { - Nan::EscapableHandleScope scope; + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - TResultType result; + Napi::Function cb = it->second.Value(); - CURLINFO info = static_cast(infoId); - CURLcode code = curl_easy_getinfo(obj->ch, info, &result); + // async context + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbProgress"); - v8::Local retVal = Nan::Undefined(); + Napi::Value result = + cb.MakeCallback(obj->Value(), + {Napi::Number::New(env, dltotal), Napi::Number::New(env, dlnow), + Napi::Number::New(env, ultotal), Napi::Number::New(env, ulnow)}, + asyncContext); - if (code != CURLE_OK) { - std::string str = std::to_string(static_cast(code)); + // Check if an exception occurred during callback execution + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); - Nan::ThrowError(str.c_str()); - } else { - // is string - if (ResultTypeIsChar::value && !result) { - retVal = Nan::MakeMaybe(Nan::EmptyString()).ToLocalChecked(); - } else { - retVal = Nan::MakeMaybe(Nan::New(result)).ToLocalChecked(); + obj->throwErrorMultiInterfaceAware(error); + } else if (result.IsNumber()) { + returnValue = result.As().Int32Value(); + } else if (!result.IsUndefined()) { + Napi::TypeError typeError = Napi::TypeError::New( + env, "Return value from the PROGRESS callback must be an integer or undefined."); + obj->throwErrorMultiInterfaceAware(typeError); } + + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + } + +#if NODE_LIBCURL_VER_GE(7, 68, 0) + if (returnValue && returnValue != CURL_PROGRESSFUNC_CONTINUE) { +#else + if (returnValue) { +#endif + obj->isCbProgressAlreadyAborted = true; } - return scope.Escape(retVal); + return returnValue; } -NAN_METHOD(Easy::GetInfo) { - Nan::HandleScope scope; +int Easy::CbXferinfo(void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, + curl_off_t ulnow) { + Easy* obj = static_cast(clientp); + assert(obj); - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + // default return of 1 will cause a CURLE_ABORTED_BY_CALLBACK. + int32_t returnValue = 1; - if (!obj->isOpen) { - Nan::ThrowError("Curl handle is closed."); - return; + // same check than above, see it for comments. + if (obj->isCbProgressAlreadyAborted) { + return returnValue; } - v8::Local infoVal = info[0]; - - v8::Local retVal = Nan::Undefined(); + // Check if we have a xferinfo callback +#if NODE_LIBCURL_VER_GE(7, 32, 0) + auto it = obj->callbacks.find(CURLOPT_XFERINFOFUNCTION); +#else + // just to make it compile ¯\_(ツ)_/¯ + auto it = obj->callbacks.end(); +#endif - int infoId; + assert(it != obj->callbacks.end() && "XFERINFO callback not set."); - CURLINFO curlInfo; - CURLcode code = CURLE_OK; + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); + + Napi::Function cb = it->second.Value(); + + // async context + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbXferinfo"); + + // Call the callback with proper error handling + Napi::Value result = cb.MakeCallback(obj->Value(), + {Napi::Number::New(env, static_cast(dltotal)), + Napi::Number::New(env, static_cast(dlnow)), + Napi::Number::New(env, static_cast(ultotal)), + Napi::Number::New(env, static_cast(ulnow))}, + asyncContext); + + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + } else if (result.IsEmpty() || !result.IsNumber()) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the XFERINFO callback must be an integer."); + obj->throwErrorMultiInterfaceAware(typeError); + } else { + returnValue = result.As().Int32Value(); + } - // Special case for unsupported info - if ((infoId = IsInsideCurlConstantStruct(curlInfoNotImplemented, infoVal))) { - Nan::ThrowError( - "Unsupported info, probably because it's too complex to implement " - "using javascript or unecessary when using javascript."); - return; + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); } - Nan::TryCatch tryCatch; - - // String - if ((infoId = IsInsideCurlConstantStruct(curlInfoString, infoVal))) { - retVal = Easy::GetInfoTmpl(obj, infoId); - // curl_off_t - } else if ((infoId = IsInsideCurlConstantStruct(curlInfoOffT, infoVal))) { - retVal = Easy::GetInfoTmpl(obj, infoId); - // Double - } else if ((infoId = IsInsideCurlConstantStruct(curlInfoDouble, infoVal))) { - retVal = Easy::GetInfoTmpl(obj, infoId); - // Integer - } else if ((infoId = IsInsideCurlConstantStruct(curlInfoInteger, infoVal))) { - retVal = Easy::GetInfoTmpl(obj, infoId); // NOLINT(runtime/int) - // ACTIVESOCKET and alike - } else if ((infoId = IsInsideCurlConstantStruct(curlInfoSocket, infoVal))) { -#if NODE_LIBCURL_VER_GE(7, 45, 0) - curl_socket_t socket; +#if NODE_LIBCURL_VER_GE(7, 68, 0) + if (returnValue && returnValue != CURL_PROGRESSFUNC_CONTINUE) { #else - // this should never really used tho, as it's only possible to have - // an curlInfoSocket value with libcurl >= 7.45.0 - long socket; // NOLINT(runtime/int) + if (returnValue) { #endif - code = curl_easy_getinfo(obj->ch, static_cast(infoId), &socket); - - if (code == CURLE_OK) { - // curl_socket_t is of type SOCKET on Windows, - // casting it to int32_t can be dangerous, only if Microsoft ever decides - // to change the underlying architecture behind it. - // https://stackoverflow.com/a/26496808/710693 - retVal = Nan::New(static_cast(socket)); - } + obj->isCbProgressAlreadyAborted = true; + } - // Linked list - } else if ((infoId = IsInsideCurlConstantStruct(curlInfoLinkedList, infoVal))) { - curl_slist* linkedList; - curl_slist* curr; + return returnValue; +} - curlInfo = static_cast(infoId); - if (curlInfo == CURLINFO_CERTINFO) { - curl_certinfo* ci = NULL; - code = curl_easy_getinfo(obj->ch, curlInfo, &ci); +int Easy::CbHstsRead(CURL* handle, struct curl_hstsentry* sts, void* userdata) { +#if NODE_LIBCURL_VER_GE(7, 74, 0) + Easy* obj = static_cast(userdata); - if (code == CURLE_OK) { - v8::Local arr = Nan::New(); - bool isValid = true; + assert(obj); - for (int i = 0; i < ci->num_of_certs; i++) { - linkedList = ci->certinfo[i]; + // Check if we have a HSTS read callback + auto it = obj->callbacks.find(CURLOPT_HSTSREADFUNCTION); + assert(it != obj->callbacks.end() && "HSTSREADFUNCTION callback not set."); - if (linkedList) { - curr = linkedList; + int32_t returnValue = CURLSTS_FAIL; - while (curr) { - auto value = - Nan::Set(arr, arr->Length(), Nan::New(curr->data).ToLocalChecked()); - if (value.IsJust()) { - curr = curr->next; - } else { - curr = NULL; - isValid = false; - } - } + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - // stop the loop if we found an invalid value - if (!isValid) { - break; - } - } - } + Napi::Value cacheEntryObject; - if (isValid) { - retVal = arr; - } else { - Nan::ThrowError("Something went wrong while trying to retrieve info from curl slist"); - } - } + const std::string typeError = + "Return value from the HSTSREADFUNCTION callback must be one of the following:\n" + " - Object matching the type CurlHstsEntry\n" + " - An array matching the type CurlHstsEntry[]\n" + " - null\n" + "Libcurl <= 7.79.0 does not stop requests from firing if there are errors in the HSTS " + "callback, thus you may be receiving an error while the request did in fact work. Please " + "fix the HSTS callback to return the correct data to avoid this."; + + if (obj->hstsReadCache.size() > 0) { + cacheEntryObject = obj->hstsReadCache.back().Value(); + + // Reset and remove the cached entry + obj->hstsReadCache.back().Reset(); + obj->hstsReadCache.pop_back(); } else { - code = curl_easy_getinfo(obj->ch, curlInfo, &linkedList); + // If this is true, we got all entries in cache provided by user + if (obj->wasHstsReadCacheSet) { + obj->wasHstsReadCacheSet = false; + return CURLSTS_DONE; + } - if (code == CURLE_OK) { - v8::Local arr = Nan::New(); - bool isValid = true; + Napi::Function cb = it->second.Value(); - if (linkedList) { - curr = linkedList; + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbHstsRead"); - while (curr) { - auto value = - Nan::Set(arr, arr->Length(), Nan::New(curr->data).ToLocalChecked()); - if (value.IsJust()) { - curr = curr->next; - } else { - curr = NULL; - isValid = false; - } - } + Napi::Object cbArg = Napi::Object::New(env); + cbArg.Set("maxHostLengthBytes", Napi::Number::New(env, sts->namelen)); - curl_slist_free_all(linkedList); - } + Napi::Value result = cb.MakeCallback(obj->Value(), {cbArg}, asyncContext); - if (isValid) { - retVal = arr; - } else { - Nan::ThrowError("Something went wrong while trying to retrieve info from curl slist"); - } + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; } - } - } - if (tryCatch.HasCaught()) { - Nan::Utf8String msg(tryCatch.Message()->Get()); + if (result.IsEmpty()) { + Napi::TypeError error = Napi::TypeError::New(env, typeError); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - std::string errCode = std::string(*msg); - // based on this interesting answer - // https://stackoverflow.com/a/27538478/710693 - errCode.erase(std::remove_if(errCode.begin(), errCode.end(), - [](unsigned char c) { return !std::isdigit(c); }), - errCode.end()); + cacheEntryObject = result; + } - // 43 is CURLE_BAD_FUNCTION_ARGUMENT - code = static_cast(std::stoi(errCode.length() > 0 ? errCode : "43")); - } + // Handle null return (indicates done) + if (cacheEntryObject.IsNull()) { + return CURLSTS_DONE; + } - v8::Local ret = Nan::New(); - Nan::Set(ret, Nan::New("code").ToLocalChecked(), Nan::New(static_cast(code))); - Nan::Set(ret, Nan::New("data").ToLocalChecked(), retVal); + // returning an array from the callback can be used to avoid multiple + // context switches between v8 and js + if (cacheEntryObject.IsArray()) { + Napi::Array cacheArray = cacheEntryObject.As(); + uint32_t cacheArrayLength = cacheArray.Length(); - info.GetReturnValue().Set(ret); -} + if (cacheArrayLength == 0) { + return CURLSTS_DONE; + } -NAN_METHOD(Easy::Send) { - Nan::HandleScope scope; + // Insert in reverse order as we process the hstsReadCache stack from back to front + for (int i = cacheArrayLength - 1; i >= 0; i--) { + Napi::Value idxValue = cacheArray[static_cast(i)]; - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + // Check for array within array (not allowed) + if (!idxValue.IsObject() || idxValue.IsArray()) { + Napi::TypeError error = Napi::TypeError::New(env, typeError); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - if (!obj->isOpen) { - Nan::ThrowError("Curl handle is closed."); - return; - } + Napi::Reference persistentValue = + Napi::Persistent(idxValue.As()); + obj->hstsReadCache.push_back(std::move(persistentValue)); + } - if (info.Length() == 0) { - Nan::ThrowError("Missing buffer argument."); - return; - } + cacheEntryObject = obj->hstsReadCache.back().Value(); + obj->hstsReadCache.back().Reset(); + obj->hstsReadCache.pop_back(); + obj->wasHstsReadCacheSet = true; + } - v8::Local buf = info[0]; + // Process single object entry + if (cacheEntryObject.IsObject()) { + Napi::Object cacheEntry = cacheEntryObject.As(); + + Napi::Value hostProperty = cacheEntry.Get("host"); + Napi::Value includeSubDomainsProperty = cacheEntry.Get("includeSubDomains"); + Napi::Value expireProperty = cacheEntry.Get("expire"); + + // Validate property types + if (!hostProperty.IsString() || + (!includeSubDomainsProperty.IsUndefined() && !includeSubDomainsProperty.IsNull() && + !includeSubDomainsProperty.IsBoolean()) || + (!expireProperty.IsUndefined() && !expireProperty.IsNull() && + !expireProperty.IsString())) { + Napi::TypeError error = Napi::TypeError::New(env, typeError); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - if (!buf->IsObject() || !node::Buffer::HasInstance(buf)) { - Nan::ThrowError("Invalid Buffer instance given."); - return; - } + std::string hostStrValue = hostProperty.As().Utf8Value(); - const char* bufContent = node::Buffer::Data(buf); - size_t bufLength = node::Buffer::Length(buf); + if (hostStrValue.length() > sts->namelen) { + std::string lengthError = + "The host property value returned from the HSTSREADFUNCTION callback function was " + "invalid. The host string is too long.\n" + "Libcurl <= 7.79.0 does not stop requests from firing if there are errors in the HSTS " + "callback, thus you may be receiving an error while the request did in fact work. " + "Please fix the HSTS callback to return the correct data to avoid this."; + Napi::TypeError error = Napi::TypeError::New(env, lengthError); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - size_t n = 0; - CURLcode curlRet = curl_easy_send(obj->ch, bufContent, bufLength, &n); + // Set host name + strncpy(sts->name, hostStrValue.c_str(), sts->namelen); + sts->name[sts->namelen - 1] = '\0'; // Ensure null termination - v8::Local ret = Nan::New(); - Nan::Set(ret, Nan::New("code").ToLocalChecked(), Nan::New(static_cast(curlRet))); - Nan::Set(ret, Nan::New("bytesSent").ToLocalChecked(), Nan::New(static_cast(n))); + // Set includeSubDomains + if (!includeSubDomainsProperty.IsUndefined() && !includeSubDomainsProperty.IsNull()) { + sts->includeSubDomains = includeSubDomainsProperty.As().Value() ? 1 : 0; + } - info.GetReturnValue().Set(ret); -} + // Handle expire property + if (expireProperty.IsString()) { + // make sure expire length is one expected by libcurl + // YYYYMMDD HH:MM:SS [null-terminated] + std::string expireStrValue = expireProperty.As().Utf8Value(); + size_t expectedSize = sizeof(sts->expire) / sizeof(sts->expire[0]) - 1; + + if (expireStrValue.length() != expectedSize) { + std::string expireError = + "The expire property value returned from the HSTSREADFUNCTION callback function was " + "invalid. String is either too long, or too short.\n" + "Libcurl <= 7.79.0 does not stop requests from firing if there are errors in the " + "HSTS " + "callback, thus you may be receiving an error while the request did in fact work. " + "Please fix the HSTS callback to return the correct data to avoid this."; + Napi::TypeError error = Napi::TypeError::New(env, expireError); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } -NAN_METHOD(Easy::Recv) { - Nan::HandleScope scope; + strcpy(sts->expire, expireStrValue.c_str()); + } else { + // TODO(jonathan): libcurl <= 7.79 has a bug when expire is not set, see: + // https://github.com/curl/curl/issues/7720 - to avoid this bug we are setting it manually + // to a future date here + strcpy(sts->expire, TIME_IN_THE_FUTURE); + } - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + returnValue = CURLSTS_OK; + } else { + Napi::TypeError error = Napi::TypeError::New(env, typeError); + obj->throwErrorMultiInterfaceAware(error); + } - if (!obj->isOpen) { - Nan::ThrowError("Curl handle is closed."); - return; - } + return returnValue; - if (info.Length() == 0) { - Nan::ThrowError("Missing buffer argument."); - return; + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; } +#else + return 0; +#endif +} - v8::Local buf = info[0]; +int Easy::CbHstsWrite(CURL* handle, struct curl_hstsentry* sts, struct curl_index* count, + void* userdata) { +#if NODE_LIBCURL_VER_GE(7, 74, 0) + Easy* obj = static_cast(userdata); - if (!buf->IsObject() || !node::Buffer::HasInstance(buf)) { - Nan::ThrowError("Invalid Buffer instance given."); - return; - } + assert(obj); - char* bufContent = node::Buffer::Data(buf); - size_t bufLength = node::Buffer::Length(buf); + // Check if we have a HSTS write callback + auto it = obj->callbacks.find(CURLOPT_HSTSWRITEFUNCTION); + assert(it != obj->callbacks.end() && "HSTSWRITEFUNCTION callback not set."); - size_t n = 0; - CURLcode curlRet = curl_easy_recv(obj->ch, bufContent, bufLength, &n); + int32_t returnValue = CURLSTS_FAIL; - v8::Local ret = Nan::New(); - Nan::Set(ret, Nan::New("code").ToLocalChecked(), Nan::New(static_cast(curlRet))); - Nan::Set(ret, Nan::New("bytesReceived").ToLocalChecked(), Nan::New(static_cast(n))); + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - info.GetReturnValue().Set(ret); -} + Napi::Function cb = it->second.Value(); -// exec this handle -NAN_METHOD(Easy::Perform) { - Nan::HandleScope scope; + // Create the count object + Napi::Object countObj = Napi::Object::New(env); + countObj.Set("index", Napi::Number::New(env, static_cast(count->index))); + countObj.Set("total", Napi::Number::New(env, static_cast(count->total))); - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + Napi::Object hstsEntry = CreateV8ObjectFromCurlHstsEntry(env, sts); - if (!obj->isOpen) { - Nan::ThrowError("Curl handle is closed."); - return; - } + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbHstsWrite"); - SETLOCALE_WRAPPER(CURLcode code = curl_easy_perform(obj->ch);); + Napi::Value result = cb.MakeCallback(obj->Value(), {hstsEntry, countObj}, asyncContext); - v8::Local ret = Nan::New(static_cast(code)); + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return returnValue; + } - info.GetReturnValue().Set(ret); -} + bool isInvalid = result.IsEmpty() || !result.IsNumber(); -NAN_METHOD(Easy::Upkeep) { - Nan::HandleScope scope; + if (isInvalid) { + Napi::TypeError typeError = Napi::TypeError::New( + env, "Return value from the HSTSWRITEFUNCTION callback must be an integer."); + obj->throwErrorMultiInterfaceAware(typeError); + return returnValue; + } - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + returnValue = result.As().Int32Value(); + return returnValue; - if (!obj->isOpen) { - Nan::ThrowError("Curl handle is closed."); - return; + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return returnValue; } - -#if NODE_LIBCURL_VER_GE(7, 62, 0) - CURLcode code = curl_easy_upkeep(obj->ch); #else - CURLcode code = CURLE_FUNCTION_NOT_FOUND; - Nan::ThrowError( - "The addon was built against a libcurl version that does not support upkeep. It requires " - "libcurl >= 7.62"); - return; + return 0; #endif - - v8::Local ret = Nan::New(static_cast(code)); - - info.GetReturnValue().Set(ret); } -NAN_METHOD(Easy::Pause) { - Nan::HandleScope scope; - - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); - - if (!obj->isOpen) { - Nan::ThrowError("Curl handle is closed."); - return; - } - - if (!info[0]->IsUint32()) { - Nan::ThrowTypeError("Bitmask value must be an integer."); - return; - } +int Easy::CbPreReq(void* clientp, char* conn_primary_ip, char* conn_local_ip, int conn_primary_port, + int conn_local_port) { +#if NODE_LIBCURL_VER_GE(7, 80, 0) + Easy* obj = static_cast(clientp); - uint32_t bitmask = Nan::To(info[0]).FromJust(); + assert(obj); - CURLcode code = curl_easy_pause(obj->ch, static_cast(bitmask)); + // Check if we have a prereq callback + auto it = obj->callbacks.find(CURLOPT_PREREQFUNCTION); + assert(it != obj->callbacks.end() && "Pre req callback not set."); - info.GetReturnValue().Set(static_cast(code)); -} + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); -NAN_METHOD(Easy::Reset) { - Nan::HandleScope scope; + Napi::Function cb = it->second.Value(); - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + Napi::String connPrimaryIp = Napi::String::New(env, conn_primary_ip); + Napi::String connLocalIp = Napi::String::New(env, conn_local_ip); + Napi::Number connPrimaryPort = Napi::Number::New(env, conn_primary_port); + Napi::Number connLocalPort = Napi::Number::New(env, conn_local_port); - if (!obj->isOpen) { - Nan::ThrowError("Curl handle closed."); - return; - } + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbPreReq"); - curl_easy_reset(obj->ch); + Napi::Value result = cb.MakeCallback( + obj->Value(), {connPrimaryIp, connLocalIp, connPrimaryPort, connLocalPort}, asyncContext); - // reset the URL, - // https://github.com/bagder/curl/commit/ac6da721a3740500cc0764947385eb1c22116b83 - curl_easy_setopt(obj->ch, CURLOPT_URL, ""); + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return CURL_PREREQFUNC_ABORT; + } - obj->callbacks.clear(); - obj->ResetRequiredHandleOptions(); + // Validate return value - should be a number + bool isInvalid = result.IsEmpty() || !result.IsNumber(); - obj->toFree = nullptr; - obj->toFree = std::make_shared(); + if (isInvalid) { + Napi::TypeError typeError = + Napi::TypeError::New(env, "Return value from the PREREQ callback must be a number."); + obj->throwErrorMultiInterfaceAware(typeError); + return CURL_PREREQFUNC_ABORT; + } - obj->readDataFileDescriptor = -1; - obj->readDataOffset = -1; + int returnValue = result.As().Int32Value(); + return returnValue; - info.GetReturnValue().Set(info.This()); + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return CURL_PREREQFUNC_ABORT; + } +#else + return 0; +#endif } -NAN_METHOD(Easy::DupHandle) { - Nan::HandleScope scope; - - // create a new js object using this one as the argument for the constructor. - const int argc = 1; - v8::Local argv[argc] = {info.This()}; - v8::Local cons = Nan::GetFunction(Nan::New(Easy::constructor)).ToLocalChecked(); - - v8::Local newInstance = Nan::NewInstance(cons, argc, argv).ToLocalChecked(); +int Easy::CbTrailer(struct curl_slist** headerList, void* userdata) { +#if NODE_LIBCURL_VER_GE(7, 64, 0) + Easy* obj = static_cast(userdata); - info.GetReturnValue().Set(newInstance); -} + assert(obj); -NAN_METHOD(Easy::OnSocketEvent) { - Nan::HandleScope scope; + // Check if we have a trailer callback + auto it = obj->callbacks.find(CURLOPT_TRAILERFUNCTION); + assert(it != obj->callbacks.end() && "Trailer callback not set."); - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + try { + Napi::Env env = obj->Env(); + Napi::HandleScope scope(env); - if (!info.Length()) { - Nan::ThrowError("You must specify the callback function."); - return; - } + Napi::Function cb = it->second.Value(); - v8::Local arg = info[0]; + // TODO(jonathan, migration): capture this when perform is called (either on Easy or Multi) + Napi::AsyncContext asyncContext(env, "Easy::CbTrailer"); - if (arg->IsNull()) { - obj->cbOnSocketEvent = nullptr; + Napi::Value result = cb.MakeCallback(obj->Value(), {}, asyncContext); - info.GetReturnValue().Set(info.This()); - return; - } + // This is in theory not needed, as we have exceptions enabled + if (env.IsExceptionPending()) { + Napi::Error error = env.GetAndClearPendingException(); + obj->throwErrorMultiInterfaceAware(error); + return CURL_TRAILERFUNC_ABORT; + } - if (!arg->IsFunction()) { - Nan::ThrowTypeError("Invalid callback given."); - return; - } + // Validate return value - should be array of strings or false + bool isInvalid = result.IsEmpty() || (!result.IsArray() && !result.IsBoolean()); - v8::Local callback = arg.As(); + if (isInvalid) { + Napi::TypeError typeError = Napi::TypeError::New( + env, "Return value from the Trailer callback must be an array of strings or false."); + obj->throwErrorMultiInterfaceAware(typeError); + return CURL_TRAILERFUNC_ABORT; + } - obj->cbOnSocketEvent.reset(new Nan::Callback(callback)); + // If callback returns false, abort + if (result.IsBoolean() && result.As().Value() == false) { + return CURL_TRAILERFUNC_ABORT; + } - info.GetReturnValue().Set(info.This()); -} + // Process array of header strings + if (result.IsArray()) { + Napi::Array headers = result.As(); + uint32_t length = headers.Length(); -NAN_METHOD(Easy::MonitorSocketEvents) { - Nan::HandleScope scope; + for (uint32_t i = 0; i < length; ++i) { + Napi::Value headerValue = headers[i]; - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + if (!headerValue.IsString()) { + Napi::TypeError typeError = Napi::TypeError::New( + env, "Return value from the Trailer callback must be an array of strings or false."); + obj->throwErrorMultiInterfaceAware(typeError); + return CURL_TRAILERFUNC_ABORT; + } - Nan::TryCatch tryCatch; + std::string headerStr = headerValue.As().Utf8Value(); + *headerList = curl_slist_append(*headerList, headerStr.c_str()); + } + } - obj->MonitorSockets(); + return CURL_TRAILERFUNC_OK; - if (tryCatch.HasCaught()) { - tryCatch.ReThrow(); - return; + } catch (const Napi::Error& e) { + obj->throwErrorMultiInterfaceAware(e); + return CURL_TRAILERFUNC_ABORT; } - - info.GetReturnValue().Set(info.This()); +#else + return 0; +#endif } -NAN_METHOD(Easy::UnmonitorSocketEvents) { - Nan::HandleScope scope; +Napi::Object Easy::FromCURLHandle(Napi::Env env, CURL* handle) { + // this is a static method possibly called from outside a Node.js callstack + // thus we need to properly handle the scopes. + Napi::EscapableHandleScope scope(env); - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); + Napi::External curlEasyHandle = Napi::External::New(env, handle); - Nan::TryCatch tryCatch; + auto curl = env.GetInstanceData(); + auto newInstance = curl->EasyConstructor.New({curlEasyHandle}); - obj->UnmonitorSockets(); - - if (tryCatch.HasCaught()) { - tryCatch.ReThrow(); - return; - } - - info.GetReturnValue().Set(info.This()); + return scope.Escape(newInstance).ToObject(); } -NAN_METHOD(Easy::Close) { - // check https://github.com/php/php-src/blob/master/ext/curl/interface.c#L3196 - Nan::HandleScope scope; +#if NODE_LIBCURL_VER_GE(7, 74, 0) - Easy* obj = Nan::ObjectWrap::Unwrap(info.This()); +Napi::Object Easy::CreateV8ObjectFromCurlHstsEntry(Napi::Env env, struct curl_hstsentry* sts) { + Napi::EscapableHandleScope scope(env); - if (!obj->isOpen) { - Nan::ThrowError("Curl handle already closed."); - return; - } + auto hasExpire = !!sts->expire[0] && !!strcmp(sts->expire, TIME_IN_THE_FUTURE); - if (obj->isInsideMultiHandle) { - Nan::ThrowError("Curl handle is inside a Multi instance, you must remove it first."); - return; - } + Napi::String host = Napi::String::New(env, sts->name); + Napi::Boolean includeSubDomains = Napi::Boolean::New(env, !!sts->includeSubDomains); + Napi::Value expire = hasExpire ? Napi::String::New(env, sts->expire).As() + : env.Null().As(); - obj->Dispose(); + Napi::Object obj = Napi::Object::New(env); + obj.Set("host", host); + obj.Set("includeSubDomains", includeSubDomains); + obj.Set("expire", expire); - return; + return scope.Escape(obj).ToObject(); } +#endif + +Napi::Object Easy::CreateV8ObjectFromCurlFileInfo(Napi::Env env, curl_fileinfo* fileInfo) { + Napi::EscapableHandleScope scope(env); -NAN_METHOD(Easy::StrError) { - Nan::HandleScope scope; + auto nullValueIfInvalidString = [&env](char* str) -> Napi::Value { + return (str && str[0] != '\0') ? Napi::String::New(env, str) : env.Null().As(); + }; - v8::Local errCode = info[0]; + Napi::Object obj = Napi::Object::New(env); - if (!errCode->IsInt32()) { - Nan::ThrowTypeError("Invalid errCode passed to Easy.strError."); - return; - } + obj.Set("filename", nullValueIfInvalidString(fileInfo->filename)); + obj.Set("filetype", Napi::Number::New(env, fileInfo->filetype)); + + obj.Set("time", fileInfo->time != 0 + ? Napi::Date::New(env, static_cast(fileInfo->time) * 1000) + : env.Null()); + obj.Set("perm", Napi::Number::New(env, fileInfo->perm)); + obj.Set("uid", Napi::Number::New(env, fileInfo->uid)); + obj.Set("gid", Napi::Number::New(env, fileInfo->gid)); + obj.Set("size", Napi::Number::New(env, static_cast(fileInfo->size))); + obj.Set("hardlinks", Napi::Number::New(env, fileInfo->hardlinks)); - const char* errorMsg = - curl_easy_strerror(static_cast(Nan::To(errCode).FromJust())); + Napi::Object strings = Napi::Object::New(env); + strings.Set("time", nullValueIfInvalidString(fileInfo->strings.time)); + strings.Set("perm", nullValueIfInvalidString(fileInfo->strings.perm)); + strings.Set("user", nullValueIfInvalidString(fileInfo->strings.user)); + strings.Set("group", nullValueIfInvalidString(fileInfo->strings.group)); + strings.Set("target", nullValueIfInvalidString(fileInfo->strings.target)); - v8::Local ret = Nan::New(errorMsg).ToLocalChecked(); + obj.Set("strings", strings); - info.GetReturnValue().Set(ret); + return scope.Escape(obj).ToObject(); } } // namespace NodeLibcurl diff --git a/src/Easy.h b/src/Easy.h index ce8092c03..c05373cc8 100644 --- a/src/Easy.h +++ b/src/Easy.h @@ -4,141 +4,158 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#ifndef NODELIBCURL_EASY_H -#define NODELIBCURL_EASY_H +#pragma once -#include "Multi.h" -#include "libcurl_compat.h" +#include "macros.h" #include -#include -#include +#include +#include #include #include +#include +#include +#include namespace NodeLibcurl { -class Easy : public Nan::ObjectWrap { - class ToFree; - - Easy(); - explicit Easy(Easy* orig); - explicit Easy(CURL* easy); +extern const napi_type_tag EASY_TYPE_TAG; - Easy(const Easy& that); - Easy& operator=(const Easy& that); +// Forward declaration +class Multi; +class Easy : public Napi::ObjectWrap { + public: + Easy(const Napi::CallbackInfo& info); ~Easy(); - // instance methods + static Napi::Function Init(Napi::Env env, Napi::Object exports); + + Napi::Value DebugLog(const Napi::CallbackInfo& info); + Napi::Value SetOpt(const Napi::CallbackInfo& info); + Napi::Value GetInfo(const Napi::CallbackInfo& info); + Napi::Value Send(const Napi::CallbackInfo& info); + Napi::Value Recv(const Napi::CallbackInfo& info); + Napi::Value WsRecv(const Napi::CallbackInfo& info); + Napi::Value WsSend(const Napi::CallbackInfo& info); + Napi::Value WsMeta(const Napi::CallbackInfo& info); + Napi::Value WsStartFrame(const Napi::CallbackInfo& info); + Napi::Value Perform(const Napi::CallbackInfo& info); + Napi::Value Upkeep(const Napi::CallbackInfo& info); + Napi::Value Pause(const Napi::CallbackInfo& info); + Napi::Value Reset(const Napi::CallbackInfo& info); + Napi::Value DupHandle(const Napi::CallbackInfo& info); + Napi::Value OnSocketEvent(const Napi::CallbackInfo& info); + Napi::Value MonitorSocketEvents(const Napi::CallbackInfo& info); + Napi::Value UnmonitorSocketEvents(const Napi::CallbackInfo& info); + Napi::Value Close(const Napi::CallbackInfo& info); + + static Napi::Value StrError(const Napi::CallbackInfo& info); + + // Debug support + uint64_t GetDebugId() const { return id; } + + // Getters + Napi::Value GetterId(const Napi::CallbackInfo& info); + Napi::Value GetterIsInsideMultiHandle(const Napi::CallbackInfo& info); + Napi::Value GetterIsMonitoringSockets(const Napi::CallbackInfo& info); + Napi::Value GetterIsOpen(const Napi::CallbackInfo& info); + Napi::Value GetterPauseFlags(const Napi::CallbackInfo& info); + Napi::Value GetterIsPausedRecv(const Napi::CallbackInfo& info); + Napi::Value GetterIsPausedSend(const Napi::CallbackInfo& info); + + // Public members + CURL* ch; + bool isInsideMultiHandle = false; + bool isOpen = true; + int32_t pauseState = 0; + uint64_t id; + + // Callback error for Multi interface + Napi::ObjectReference callbackError; + + // Helper to create Easy from CURL handle + static Napi::Object FromCURLHandle(Napi::Env env, CURL* handle); + + private: + // Internal class for cleanup management + class ToFree; + + // Private methods void Dispose(); - void ResetRequiredHandleOptions(); + void DisposeInternalData(); + void ResetRequiredHandleOptions(bool isFromDuplicate); + void CopyOtherData(Easy* orig); void CallSocketEvent(int status, int events); void MonitorSockets(); void UnmonitorSockets(); + void inline throwErrorMultiInterfaceAware(const Napi::Error& error) noexcept; size_t OnData(char* data, size_t size, size_t nmemb); size_t OnHeader(char* data, size_t size, size_t nmemb); - // static members - static uint32_t counter; - - // callbacks - typedef std::map> CallbacksMap; - CallbacksMap callbacks = CallbacksMap{}; - std::shared_ptr - cbOnSocketEvent; // still required since it's not related to any CURLOption + // Callback management + typedef std::map CallbacksMap; + CallbacksMap callbacks; + Napi::FunctionReference cbOnSocketEvent; + std::shared_ptr cbOnSocketEventAsyncContext; - // members - std::vector::CopyablePersistent> hstsReadCache; - uint32_t wasHstsReadCacheSet = false; + // Members for socket monitoring uv_poll_t* socketPollHandle = nullptr; + bool isMonitoringSockets = false; + + // Members for progress callback + bool isCbProgressAlreadyAborted = false; + + // File operations + int32_t readDataFileDescriptor = -1; + curl_off_t readDataOffset = -1; + + // Memory management std::shared_ptr toFree = nullptr; - bool isCbProgressAlreadyAborted = - false; // we need this flag because of - // https://github.com/curl/curl/commit/907520c4b93616bddea15757bbf0bfb45cde8101 - bool isMonitoringSockets = false; + // HSTS cache + std::vector> hstsReadCache; + bool wasHstsReadCacheSet = false; - int32_t readDataFileDescriptor = -1; // READDATA sets that - curl_off_t readDataOffset = -1; // SEEKDATA sets that - uint32_t id = counter++; + // Static members + static std::atomic nextId; - // static methods - template - static v8::Local GetInfoTmpl(const Easy* obj, int infoId); - static v8::Local CreateV8ObjectFromCurlFileInfo(curl_fileinfo* fileInfo); - static v8::Local CreateV8ObjectFromCurlHstsEntry(struct curl_hstsentry* sts); - - // js available methods - static NAN_METHOD(New); - static NAN_GETTER(IdGetter); - static NAN_GETTER(IsInsideMultiHandleGetter); - static NAN_GETTER(IsMonitoringSocketsGetter); - static NAN_GETTER(IsOpenGetter); - static NAN_METHOD(SetOpt); - static NAN_METHOD(GetInfo); - static NAN_METHOD(Send); - static NAN_METHOD(Recv); - static NAN_METHOD(Perform); - static NAN_METHOD(Upkeep); - static NAN_METHOD(Pause); - static NAN_METHOD(Reset); - static NAN_METHOD(DupHandle); - static NAN_METHOD(OnSocketEvent); - static NAN_METHOD(MonitorSocketEvents); - static NAN_METHOD(UnmonitorSocketEvents); - static NAN_METHOD(Close); - static NAN_METHOD(StrError); - - // cURL callbacks + // Static cURL callbacks static size_t ReadFunction(char* ptr, size_t size, size_t nmemb, void* userdata); static size_t SeekFunction(void* userdata, curl_off_t offset, int origin); static size_t HeaderFunction(char* ptr, size_t size, size_t nmemb, void* userdata); static size_t WriteFunction(char* ptr, size_t size, size_t nmemb, void* userdata); - static long CbChunkBgn(curl_fileinfo* transferInfo, // NOLINT(runtime/int) - void* ptr, int remains); - static long CbChunkEnd(void* ptr); // NOLINT(runtime/int) + static long CbChunkBgn(curl_fileinfo* transferInfo, void* ptr, int remains); + static long CbChunkEnd(void* ptr); static int CbDebug(CURL* handle, curl_infotype type, char* data, size_t size, void* userptr); static int CbFnMatch(void* ptr, const char* pattern, const char* string); + static int CbProgress(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow); + static int CbXferinfo(void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, + curl_off_t ulnow); static int CbHstsRead(CURL* handle, struct curl_hstsentry* sts, void* userdata); static int CbHstsWrite(CURL* handle, struct curl_hstsentry* sts, struct curl_index* count, void* userdata); static int CbPreReq(void* clientp, char* conn_primary_ip, char* conn_local_ip, int conn_primary_port, int conn_local_port); - static int CbProgress(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow); - static int CbTrailer(struct curl_slist** list, void* userdata); - static int CbXferinfo(void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, - curl_off_t ulnow); + static int CbTrailer(struct curl_slist** headerList, void* userdata); // libuv callbacks static void OnSocket(uv_poll_t* handle, int status, int events); static void OnSocketClose(uv_handle_t* handle); - public: - // operators - bool operator==(const Easy& easy) const; - bool operator!=(const Easy& other) const; - - static v8::Local FromCURLHandle(CURL* handle); - - // js object constructor template - static Nan::Persistent constructor; - - // members - CURL* ch; - bool isInsideMultiHandle = false; - bool isOpen = true; - - // used to return callback errors when inside Multi interface - Nan::Persistent callbackError; - - // static members - static uint32_t currentOpenedHandles; + // Helper methods + template + static Napi::Value GetInfoTmpl(const Easy* obj, int infoId); + static Napi::Object CreateV8ObjectFromCurlFileInfo(Napi::Env env, curl_fileinfo* fileInfo); +#if NODE_LIBCURL_VER_GE(7, 74, 0) + static Napi::Object CreateV8ObjectFromCurlHstsEntry(Napi::Env env, struct curl_hstsentry* sts); +#endif - // export Easy to js - static NAN_MODULE_INIT(Initialize); + // Prevent copying + Easy(const Easy& that) = delete; + Easy& operator=(const Easy& that) = delete; }; + } // namespace NodeLibcurl -#endif diff --git a/src/Http2PushFrameHeaders.cc b/src/Http2PushFrameHeaders.cc index 07d95d12d..9436c064b 100644 --- a/src/Http2PushFrameHeaders.cc +++ b/src/Http2PushFrameHeaders.cc @@ -1,6 +1,4 @@ #ifndef NOMINMAX -// Fix for: warning C4003: not enough arguments for function-like macro invocation 'max' -// [C:\projects\node-libcurl\build\node_libcurl.vcxproj] #define NOMINMAX #endif @@ -12,102 +10,104 @@ */ #include "Http2PushFrameHeaders.h" -#include - namespace NodeLibcurl { -Nan::Persistent Http2PushFrameHeaders::objectTemplate; - -Http2PushFrameHeaders::Http2PushFrameHeaders(struct curl_pushheaders* headers, - size_t numberOfHeaders) { - this->headers = headers; - this->numberOfHeaders = numberOfHeaders; -} - -v8::Local Http2PushFrameHeaders::NewInstance(struct curl_pushheaders* headers, - size_t numberOfHeaders) { - Nan::EscapableHandleScope scope; - - v8::Local jsObj = Nan::NewInstance(Nan::New(objectTemplate)).ToLocalChecked(); +const napi_type_tag HTTP2_PUSH_FRAME_HEADERS_TYPE_TAG = {0x3ddda65f5bf2445c, 0xbdcd5768faf8210d}; - Http2PushFrameHeaders* cppObj = new Http2PushFrameHeaders(headers, numberOfHeaders); - cppObj->Wrap(jsObj); +Http2PushFrameHeaders::Http2PushFrameHeaders(const Napi::CallbackInfo& info) + : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); - return scope.Escape(jsObj); -} - -NAN_METHOD(Http2PushFrameHeaders::GetByIndex) { - Nan::HandleScope scope; - - v8::Local value = info[0]; + if (info.Length() < 2) { + throw Napi::TypeError::New(env, "Http2PushFrameHeaders requires headers and numberOfHeaders"); + } - if (!value->IsUint32()) { - Nan::ThrowTypeError("Index must be a non-negative integer"); - return; + // Expect external object wrapping curl_pushheaders* as first arg + if (!info[0].IsExternal()) { + throw Napi::TypeError::New(env, + "First argument must be an external pointer to curl_pushheaders"); } - Http2PushFrameHeaders* obj = Nan::ObjectWrap::Unwrap(info.This()); - uint32_t val = Nan::To(value).FromJust(); + // Expect number of headers as second arg + if (!info[1].IsNumber()) { + throw Napi::TypeError::New(env, "Second argument must be the number of headers"); + } - char* result = curl_pushheader_bynum(obj->headers, static_cast(val)); + auto maybeHeadersExternal = info[0].As>(); - v8::Local returnValue = - result == NULL ? Nan::Null().As() - : Nan::New(result).ToLocalChecked().As(); + if (!maybeHeadersExternal.CheckTypeTag(&HTTP2_PUSH_FRAME_HEADERS_TYPE_TAG)) { + throw Napi::TypeError::New(env, "Argument must be an external curl_pushheaders handle."); + } - info.GetReturnValue().Set(returnValue); + this->headers = maybeHeadersExternal.Data(); + this->numberOfHeaders = info[1].As().Uint32Value(); } -NAN_METHOD(Http2PushFrameHeaders::GetByName) { - Nan::HandleScope scope; +Napi::Function Http2PushFrameHeaders::Init(Napi::Env env, Napi::Object exports) { + // Define the class but don't export it + // This class is only created internally + Napi::Function func = DefineClass( + env, "Http2PushFrameHeaders", + {// Instance methods + InstanceMethod("getByIndex", &Http2PushFrameHeaders::GetByIndex), + InstanceMethod("getByName", &Http2PushFrameHeaders::GetByName), + + // Property accessors + InstanceAccessor( + "numberOfHeaders", &Http2PushFrameHeaders::GetNumberOfHeaders, nullptr, + static_cast(napi_enumerable | napi_configurable))}); + return func; +} - v8::Local value = info[0]; +Napi::Value Http2PushFrameHeaders::GetByIndex(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - if (!value->IsString()) { - Nan::ThrowTypeError("Name must be a string"); - return; + if (info.Length() < 1) { + throw Napi::TypeError::New(env, "Wrong number of arguments"); } - Http2PushFrameHeaders* obj = Nan::ObjectWrap::Unwrap(info.This()); + Napi::Value value = info[0]; - Nan::Utf8String utf8String(value); + if (!value.IsNumber()) { + throw Napi::TypeError::New(env, "Index must be a non-negative integer"); + } - char* result = curl_pushheader_byname(obj->headers, *utf8String); + uint32_t index = value.As().Uint32Value(); + char* result = curl_pushheader_bynum(this->headers, static_cast(index)); - v8::Local returnValue = - result == NULL ? Nan::Null().As() - : Nan::New(result).ToLocalChecked().As(); + if (result == nullptr) { + return env.Null(); + } - info.GetReturnValue().Set(returnValue); + return Napi::String::New(env, result); } -NAN_GETTER(Http2PushFrameHeaders::GetterNumberOfHeaders) { - Nan::HandleScope scope; - - Http2PushFrameHeaders* obj = Nan::ObjectWrap::Unwrap(info.This()); - - info.GetReturnValue().Set(Nan::New(static_cast(obj->numberOfHeaders))); -} +Napi::Value Http2PushFrameHeaders::GetByName(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); -NAN_MODULE_INIT(Http2PushFrameHeaders::Initialize) { - Nan::HandleScope scope; + if (info.Length() < 1) { + throw Napi::TypeError::New(env, "Wrong number of arguments"); + } - v8::Local objTmpl = Nan::New(); - objTmpl->SetInternalFieldCount(1); + Napi::Value value = info[0]; - v8::PropertyAttribute attributes = - static_cast(v8::ReadOnly | v8::DontDelete); + if (!value.IsString()) { + throw Napi::TypeError::New(env, "Name must be a string"); + } - Nan::SetAccessor(objTmpl, Nan::New("numberOfHeaders").ToLocalChecked(), - Http2PushFrameHeaders::GetterNumberOfHeaders, 0, v8::Local(), - v8::DEFAULT, attributes); + std::string name = value.As().Utf8Value(); + char* result = curl_pushheader_byname(this->headers, name.c_str()); - Nan::SetMethod(objTmpl, "getByIndex", Http2PushFrameHeaders::GetByIndex); - Nan::SetMethod(objTmpl, "getByName", Http2PushFrameHeaders::GetByName); + if (result == nullptr) { + return env.Null(); + } - Http2PushFrameHeaders::objectTemplate.Reset(objTmpl); + return Napi::String::New(env, result); +} - // this is not exported +Napi::Value Http2PushFrameHeaders::GetNumberOfHeaders(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + return Napi::Number::New(env, static_cast(this->numberOfHeaders)); } } // namespace NodeLibcurl diff --git a/src/Http2PushFrameHeaders.h b/src/Http2PushFrameHeaders.h index a39e2b439..d6016206e 100644 --- a/src/Http2PushFrameHeaders.h +++ b/src/Http2PushFrameHeaders.h @@ -4,39 +4,39 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#ifndef NODELIBCURL_HTTP_2_PUSH_FRAME_HEADERS_H -#define NODELIBCURL_HTTP_2_PUSH_FRAME_HEADERS_H +#pragma once #include -#include -#include + +#include namespace NodeLibcurl { -class Http2PushFrameHeaders : public Nan::ObjectWrap { - // Private as this can only be created using NewInstance - Http2PushFrameHeaders(struct curl_pushheaders* headers, size_t numberOfHeaders); - // Copy constructors cannot be used. - Http2PushFrameHeaders(const Http2PushFrameHeaders& that); - Http2PushFrameHeaders& operator=(const Http2PushFrameHeaders& that); +// Type tag for curl_pushheaders external +extern const napi_type_tag HTTP2_PUSH_FRAME_HEADERS_TYPE_TAG; - struct curl_pushheaders* headers; - size_t numberOfHeaders; +class Http2PushFrameHeaders : public Napi::ObjectWrap { + public: + static Napi::Function Init(Napi::Env env, Napi::Object exports); - // js object template - static Nan::Persistent objectTemplate; + // Constructor - must be public for ObjectWrap + Http2PushFrameHeaders(const Napi::CallbackInfo& info); - // js available Methods - static NAN_METHOD(GetByIndex); - static NAN_METHOD(GetByName); - static NAN_GETTER(GetterNumberOfHeaders); + private: + // Copy constructors cannot be used + Http2PushFrameHeaders(const Http2PushFrameHeaders& that) = delete; + Http2PushFrameHeaders& operator=(const Http2PushFrameHeaders& that) = delete; - public: - static v8::Local NewInstance(struct curl_pushheaders* headers, - size_t numberOfHeaders); + // Instance methods + Napi::Value GetByIndex(const Napi::CallbackInfo& info); + Napi::Value GetByName(const Napi::CallbackInfo& info); + + // Property getters + Napi::Value GetNumberOfHeaders(const Napi::CallbackInfo& info); - static NAN_MODULE_INIT(Initialize); + // Members + struct curl_pushheaders* headers; + size_t numberOfHeaders; }; } // namespace NodeLibcurl -#endif diff --git a/src/LocaleGuard.h b/src/LocaleGuard.h new file mode 100644 index 000000000..a2358ca7f --- /dev/null +++ b/src/LocaleGuard.h @@ -0,0 +1,107 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +#ifndef NODELIBCURL_LOCALEGUARD_H +#define NODELIBCURL_LOCALEGUARD_H + +#if !defined(NODE_LIBCURL_NO_SETLOCALE) && !defined(_WIN32) + +#include +#include +#include + +// RAII wrapper for thread-safe locale handling +// +// Background: Libcurl, when built with libidn2, calls `idn2_lookup_ul` to retrieve +// a punycode representation of a domain. This function internally uses libunistring's +// `u8_strconv_from_encoding`, which expects an existing locale being set: +// https://github.com/libidn/libidn2/blob/02a3127d21f8a99042a8ae82f1513b3ffc0170f2/lib/lookup.c#L536 +// +// Node.js (correctly) does not set any locale by default, and when this function gets +// called without a locale, an error is returned and libcurl bails out with a MALFORMED +// URL error. +// +// Solution: Instead of setting locale globally (which would impact all addon users), +// we use LocaleGuard to set locale per-thread using POSIX uselocale(). This: +// - Sets locale once per thread on first curl operation (lazy initialization) +// - Keeps the locale active for the thread's lifetime (no setup/teardown overhead) +// - Is completely thread-safe (each thread has its own locale state) +// - Can be disabled at build time with `node_libcurl_no_setlocale` option +class LocaleGuard { + private: + // Thread-safe one-time check if global locale is "C" + static bool ShouldSetLocale() { + static std::once_flag checkFlag; + static bool needsLocale = false; + + std::call_once(checkFlag, []() { + // setlocale(LC_ALL, NULL) is not thread-safe, but safe inside call_once + const char* globalLocaleName = setlocale(LC_ALL, NULL); + needsLocale = (globalLocaleName && strcmp(globalLocaleName, "C") == 0); + }); + + return needsLocale; + } + + struct ThreadLocaleState { + locale_t threadLocale = (locale_t)0; + bool isInitialized = false; + + ~ThreadLocaleState() { + if (threadLocale != (locale_t)0) { + freelocale(threadLocale); + } + } + }; + + static ThreadLocaleState& GetThreadState() { + thread_local ThreadLocaleState state; + return state; + } + + public: + LocaleGuard() { + if (!ShouldSetLocale()) { + return; + } + + ThreadLocaleState& state = GetThreadState(); + + // Only set up locale once per thread + if (!state.isInitialized) { + locale_t currentLocale = uselocale((locale_t)0); + + // and only if thread is using global locale + if (currentLocale == LC_GLOBAL_LOCALE) { + state.threadLocale = newlocale(LC_ALL_MASK, "", (locale_t)0); + if (state.threadLocale) { + uselocale(state.threadLocale); + state.isInitialized = true; + } + } + } + } + + ~LocaleGuard() {} + + LocaleGuard(const LocaleGuard&) = delete; + LocaleGuard& operator=(const LocaleGuard&) = delete; +}; + +#else + +// No-op implementation for Windows and when NODE_LIBCURL_NO_SETLOCALE is defined +class LocaleGuard { + public: + LocaleGuard() {} + ~LocaleGuard() {} + LocaleGuard(const LocaleGuard&) = delete; + LocaleGuard& operator=(const LocaleGuard&) = delete; +}; + +#endif + +#endif // NODELIBCURL_LOCALEGUARD_H diff --git a/src/Multi.cc b/src/Multi.cc index 375451616..b4027d483 100644 --- a/src/Multi.cc +++ b/src/Multi.cc @@ -1,647 +1,893 @@ #ifndef NOMINMAX -// Fix for: warning C4003: not enough arguments for function-like macro invocation 'max' -// [C:\projects\node-libcurl\build\node_libcurl.vcxproj] #define NOMINMAX +#include #endif +#include "curl/multi.h" +#include "macros.h" +#include "napi.h" +#include "uv.h" + +#include + /** * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#include "Multi.h" - +#include "Curl.h" +#include "CurlError.h" #include "Easy.h" #include "Http2PushFrameHeaders.h" +#include "LocaleGuard.h" +#include "Multi.h" +#include "js_native_api.h" +#include "napi.h" +#include #include #include +#include // 85233 was allocated on Win64 #define MEMORY_PER_HANDLE 60000 namespace NodeLibcurl { -Nan::Persistent Multi::constructor; +std::atomic Multi::nextId = 0; -Multi::Multi() { - // init uv timer to be used with HandleTimeout - this->timeout = deleted_unique_ptr(new uv_timer_t, [&](uv_timer_t* timerhandl) { - uv_close(reinterpret_cast(timerhandl), Multi::OnTimerClose); - }); +// Constructor +Multi::Multi(const Napi::CallbackInfo& info) : Napi::ObjectWrap(info), id(nextId++) { + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Constructor", ""); + Napi::Env env = info.Env(); + auto curl = env.GetInstanceData(); - int timerStatus = uv_timer_init(uv_default_loop(), this->timeout.get()); - assert(timerStatus == 0 && "Could not initialize libuv timer"); +#if NODE_LIBCURL_VER_GE(8, 17, 0) + bool shouldUseNotificationsApi = true; +#else + bool shouldUseNotificationsApi = false; +#endif - this->timeout->data = this; + if (info.Length() >= 1 && info[0].IsObject()) { + Napi::Object options = info[0].As(); + if (options.Has("shouldUseNotificationsApi")) { + Napi::Value value = options.Get("shouldUseNotificationsApi"); + if (value.IsBoolean()) { + shouldUseNotificationsApi = value.As().Value(); + } + } + } + // Initialize multi handle this->mh = curl_multi_init(); - assert(this->mh && "Could not initialize libcurl multi handle."); + assert(this->mh && "Failed to initialize multi handle"); - NODE_LIBCURL_ADJUST_MEM(MEMORY_PER_HANDLE); - - // set curl_multi cb to use libuv + // Set default options curl_multi_setopt(this->mh, CURLMOPT_SOCKETFUNCTION, Multi::HandleSocket); curl_multi_setopt(this->mh, CURLMOPT_SOCKETDATA, this); curl_multi_setopt(this->mh, CURLMOPT_TIMERFUNCTION, Multi::HandleTimeout); curl_multi_setopt(this->mh, CURLMOPT_TIMERDATA, this); + + uv_loop_t* loop = nullptr; + auto napi_result = napi_get_uv_event_loop(env, &loop); + assert(napi_result == napi_ok && "Failed to get UV event loop"); + + uv_timer_init(loop, &this->timeout); + this->timeout.data = this; + // We need to keep the reference alive for the duration of the timer. + this->Ref(); + + // Enable notification API if requested and supported + if (shouldUseNotificationsApi) { +#if NODE_LIBCURL_VER_GE(8, 17, 0) + // Enable notification callback + curl_multi_setopt(this->mh, CURLMOPT_NOTIFYFUNCTION, Multi::NotifyCallback); + curl_multi_setopt(this->mh, CURLMOPT_NOTIFYDATA, this); + + // Enable INFO_READ notifications + CURLMcode code = curl_multi_notify_enable(this->mh, CURLMNOTIFY_INFO_READ); + if (code == CURLM_OK) { + this->useNotificationsApi = true; + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Constructor", "Notification API enabled"); + } else { + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Constructor", + "Failed to enable notifications, falling back to ProcessMessages"); + } +#else + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Constructor", + "shouldUseNotificationsApi enabled but compiled against " + "libcurl < 8.17, falling back to ProcessMessages"); +#endif + } + + napi_add_async_cleanup_hook(env, Multi::CleanupHookAsync, this, &removeHandle); + + curl->AdjustHandleMemory(CURL_HANDLE_TYPE_MULTI, 1); +} + +void Multi::CleanupHookAsync(napi_async_cleanup_hook_handle handle, void* data) { + Multi* multi = static_cast(data); + NODE_LIBCURL_DEBUG_LOG(multi, "Multi::CleanupHookAsync", ""); + + multi->CloseTimerAsync(); +} + +void Multi::CloseTimerAsync() { + if (this->timerClosed) { + return; + } + + uv_handle_t* timeoutHandle = reinterpret_cast(&this->timeout); + if (!uv_is_closing(timeoutHandle)) { + NODE_LIBCURL_DEBUG_LOG(this, "Multi::CloseTimer", "closing timer handle"); + + // Stop the timer if it was started; safe to call even if it wasn't. + uv_timer_stop(&this->timeout); + uv_close(timeoutHandle, [](uv_handle_t* handle) { + uv_timer_t* timer = reinterpret_cast(handle); + Multi* multi = static_cast(timer->data); + napi_remove_async_cleanup_hook(multi->removeHandle); + NODE_LIBCURL_DEBUG_LOG(multi, "Multi::CloseTimerAsync", "removed async cleanup hook"); + multi->Unref(); + }); + this->timerClosed = true; + } else { + NODE_LIBCURL_DEBUG_LOG(this, "Multi::CloseTimer", "timer handle is already closing"); + } } +// Destructor Multi::~Multi() { + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Destructor", "isOpen: " + std::to_string(this->isOpen)); if (this->isOpen) { this->Dispose(); } } void Multi::Dispose() { - assert(this->isOpen); + if (!this->isOpen) return; + + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Dispose", ""); this->isOpen = false; + // no point on running the timer anymore + uv_timer_stop(&this->timeout); + + auto curl = this->Env().GetInstanceData(); + + // Clear callbacks + this->callbacks.clear(); + this->cbOnMessage.Reset(); + + // Clean up multi handle if (this->mh) { CURLMcode code = curl_multi_cleanup(this->mh); assert(code == CURLM_OK); - - NODE_LIBCURL_ADJUST_MEM(-MEMORY_PER_HANDLE); + this->mh = nullptr; } - uv_timer_stop(this->timeout.get()); + curl->AdjustHandleMemory(CURL_HANDLE_TYPE_MULTI, -1); } -// The curl_multi_socket_action(3) function informs the application about -// updates -// in the socket (file descriptor) status by doing none, one, or multiple calls -// to this function -int Multi::HandleSocket(CURL* easy, curl_socket_t s, int action, void* userp, void* socketp) { - CurlSocketContext* ctx = nullptr; - Multi* obj = static_cast(userp); +// Debug logging methods removed - now using NODE_LIBCURL_DEBUG_LOG macros - if (action == CURL_POLL_IN || action == CURL_POLL_OUT || action == CURL_POLL_INOUT || - action == CURL_POLL_NONE) { - // create ctx if it doesn't exists and assign it to the current socket, - if (socketp) { - ctx = static_cast(socketp); - } else { - ctx = Multi::CreateCurlSocketContext(s, obj); - curl_multi_assign(obj->mh, s, static_cast(ctx)); - } +void Multi::StopTimer() { uv_timer_stop(&this->timeout); } - // set event based on the current action - int events = 0; +// Initialize the class for export +Napi::Function Multi::Init(Napi::Env env, Napi::Object exports) { + NODE_LIBCURL_DEBUG_LOG_STATIC(static_cast(env), "Multi::Init"); - switch (action) { - case CURL_POLL_IN: - events |= UV_READABLE; - break; - case CURL_POLL_OUT: - events |= UV_WRITABLE; - break; - case CURL_POLL_INOUT: - events |= UV_READABLE | UV_WRITABLE; - break; - } + Napi::Function func = DefineClass( + env, "Multi", + {// Instance methods + InstanceMethod("setOpt", &Multi::SetOpt), InstanceMethod("addHandle", &Multi::AddHandle), + InstanceMethod("removeHandle", &Multi::RemoveHandle), + InstanceMethod("perform", &Multi::Perform), InstanceMethod("onMessage", &Multi::OnMessage), + InstanceMethod("getCount", &Multi::GetCount), InstanceMethod("close", &Multi::Close), - // start polling the socket. - return uv_poll_start(&ctx->pollHandle, events, Multi::OnSocket); - } + // Instance accessors + InstanceAccessor("id", &Multi::GetterId, nullptr), + + // Static methods + StaticMethod("strError", &Multi::StrError)}); - if (action == CURL_POLL_REMOVE && socketp) { - ctx = static_cast(socketp); + exports.Set("Multi", func); - uv_poll_stop(&ctx->pollHandle); - Multi::DestroyCurlSocketContext(ctx); + return func; +} - curl_multi_assign(obj->mh, s, NULL); +Napi::Value Multi::SetOpt(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - return 0; + if (!this->isOpen) { + throw CurlError::New(env, "Multi handle is closed", CURLM_BAD_HANDLE); } - return -1; -} + if (info.Length() < 2) { + throw Napi::TypeError::New(env, "Wrong number of arguments"); + } -// This function will be called when the timeout value changes from libcurl. -// The timeout value is at what latest time the application should call one of -// the "performing" functions of the multi interface (curl_multi_socket_action -// and curl_multi_perform) - to allow libcurl to keep timeouts and retries etc -// to work. -int Multi::HandleTimeout(CURLM* multi, - long timeoutMs, // NOLINT(runtime/int) - void* userp) { - Multi* obj = static_cast(userp); + Napi::Value opt = info[0]; + Napi::Value value = info[1]; - int uvStop = uv_timer_stop(obj->timeout.get()); + CURLMcode setOptRetCode = CURLM_UNKNOWN_OPTION; - if (uvStop < 0) { - return uvStop; - } + int optionId; - // we should not call libcurl functions directly from this callback - // see https://github.com/curl/curl/issues/3537 - if (timeoutMs >= 0) { - return uv_timer_start(obj->timeout.get(), Multi::OnTimeout, timeoutMs, 0); - } + // array of strings option + if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionNotImplemented, opt))) { + throw Napi::TypeError::New(env, + "Unsupported option, probably because it's too complex to implement " + "using javascript or unecessary when using javascript."); + } else if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionStringArray, opt))) { + if (value.IsNull()) { + setOptRetCode = curl_multi_setopt(this->mh, static_cast(optionId), nullptr); - return 0; -} + } else { + if (!value.IsArray()) { + throw CurlError::New(env, "Option value must be an Array.", CURLM_BAD_FUNCTION_ARGUMENT); + } -// called when there is activity in the socket. -void Multi::OnSocket(uv_poll_t* handle, int status, int events) { - int flags = 0; + Napi::Array array = value.As(); + uint32_t arrayLength = array.Length(); + std::vector strings; + std::vector cStrings; - CURLMcode code; + for (uint32_t i = 0; i < arrayLength; ++i) { + Napi::Value element = array.Get(i); - if (status < 0) flags = CURL_CSELECT_ERR; - if (events & UV_READABLE) flags |= CURL_CSELECT_IN; - if (events & UV_WRITABLE) flags |= CURL_CSELECT_OUT; + if (!element.IsString()) { + throw CurlError::New(env, "Option value must be an Array of Strings.", + CURLM_BAD_FUNCTION_ARGUMENT); + } - Multi::CurlSocketContext* ctx = static_cast(handle->data); + strings.push_back(element.As().Utf8Value()); + cStrings.push_back(strings.back().c_str()); + } - // Check comment on node_libcurl.cc - SETLOCALE_WRAPPER( - // Before version 7.20.0: If you receive CURLM_CALL_MULTI_PERFORM, this - // basically means that you should call curl_multi_socket_action again - // before you wait for more actions on libcurl's sockets. - // You don't have to do it immediately, but the return code means that - // libcurl - // may have more data available to return or that there may be more data - // to send off before it is "satisfied". - do { - code = curl_multi_socket_action(ctx->multi->mh, ctx->sockfd, flags, - &ctx->multi->runningHandles); - } while (code == CURLM_CALL_MULTI_PERFORM);); // NOLINT(whitespace/newline) + cStrings.push_back(nullptr); - if (code != CURLM_OK) { - std::string errorMsg; + setOptRetCode = curl_multi_setopt(this->mh, static_cast(optionId), &cStrings[0]); + } - errorMsg += - std::string("curl_multi_socket_action failed. Reason: ") + curl_multi_strerror(code); + // check if option is integer, and the value is correct + } else if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionInteger, opt))) { + // If not an integer, throw error + if (!value.IsNumber()) { + throw CurlError::New(env, "Option value must be an integer.", CURLM_BAD_FUNCTION_ARGUMENT); + } - Nan::ThrowError(errorMsg.c_str()); - return; - } + int32_t val = value.As().Int32Value(); - ctx->multi->ProcessMessages(); -} + setOptRetCode = curl_multi_setopt(this->mh, static_cast(optionId), val); + } else if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionFunction, opt))) { + bool isNull = value.IsNull(); -// function called when the previous timeout set reaches 0 -UV_TIMER_CB(Multi::OnTimeout) { - Multi* obj = static_cast(timer->data); + if (!value.IsFunction() && !isNull) { + throw CurlError::New(env, "Option value must be null or a function.", + CURLM_BAD_FUNCTION_ARGUMENT); + } - // Check comment on node_libcurl.cc - SETLOCALE_WRAPPER(CURLMcode code = curl_multi_socket_action( - obj->mh, CURL_SOCKET_TIMEOUT, 0, - &obj->runningHandles);); // NOLINT(whitespace/newline) + switch (optionId) { +#if NODE_LIBCURL_VER_GE(7, 44, 0) + case CURLMOPT_PUSHFUNCTION: - if (code != CURLM_OK) { - std::string errorMsg; + if (isNull) { + this->callbacks.erase(CURLMOPT_PUSHFUNCTION); - errorMsg += - std::string("curl_multi_socket_action failed. Reason: ") + curl_multi_strerror(code); + curl_multi_setopt(this->mh, CURLMOPT_PUSHDATA, nullptr); + setOptRetCode = curl_multi_setopt(this->mh, CURLMOPT_PUSHFUNCTION, nullptr); + } else { + this->callbacks[CURLMOPT_PUSHFUNCTION] = Napi::Persistent(value.As()); - Nan::ThrowError(errorMsg.c_str()); - return; + curl_multi_setopt(this->mh, CURLMOPT_PUSHDATA, this); + setOptRetCode = curl_multi_setopt(this->mh, CURLMOPT_PUSHFUNCTION, Multi::CbPushFunction); + } + + break; +#endif + } } - obj->ProcessMessages(); + return Napi::Number::New(env, setOptRetCode); } -void Multi::OnTimerClose(uv_handle_t* handle) { delete handle; } +Napi::Value Multi::AddHandle(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + auto curl = env.GetInstanceData(); -void Multi::ProcessMessages() { - CURLMsg* msg = NULL; - int pending = 0; + if (!this->isOpen) { + throw CurlError::New(env, "Multi handle is closed", CURLM_BAD_HANDLE); + } - while ((msg = curl_multi_info_read(this->mh, &pending))) { - if (msg->msg == CURLMSG_DONE) { - CURLcode statusCode = msg->data.result; + if (info.Length() < 1) { + throw CurlError::New(env, "Wrong number of arguments", CURLM_BAD_FUNCTION_ARGUMENT); + } - this->CallOnMessageCallback(msg->easy_handle, statusCode); - } + if (!info[0].IsObject() || + !info[0].As().InstanceOf(curl->EasyConstructor.Value())) { + throw CurlError::New(env, "Argument must be an Easy instance", CURLM_BAD_FUNCTION_ARGUMENT); } -} -// Creates a Context to be used to store data between events -Multi::CurlSocketContext* Multi::CreateCurlSocketContext(curl_socket_t sockfd, Multi* multi) { - int r; - Multi::CurlSocketContext* ctx = NULL; + Napi::Object obj = info[0].As(); + Easy* easy = Napi::ObjectWrap::Unwrap(obj); - ctx = static_cast(malloc(sizeof(*ctx))); - assert(ctx && "Not enough memory to allocate a new Multi::CurlSocketContext."); + if (!easy || !easy->isOpen) { + throw CurlError::New(env, "Easy handle is closed or invalid", CURLM_BAD_EASY_HANDLE); + } - ctx->sockfd = sockfd; - ctx->multi = multi; + if (easy->isInsideMultiHandle) { + throw CurlError::New(env, "Easy handle is already inside a multi handle", CURLM_ADDED_ALREADY); + } - // uv_poll simply watches file descriptors using the operating system - // notification mechanism - // whenever the OS notices a change of state in file descriptors being - // polled, libuv will invoke the associated callback. - r = uv_poll_init_socket(uv_default_loop(), &ctx->pollHandle, sockfd); + NODE_LIBCURL_DEBUG_LOG(this, "Multi::AddHandle", "adding handle " + std::to_string(easy->id)); - assert(r == 0); + // reset callback error in case it is set + easy->callbackError.Reset(); - ctx->pollHandle.data = ctx; + // Check comment on node_libcurl.cc + LocaleGuard localeGuard; + CURLMcode code = curl_multi_add_handle(this->mh, easy->ch); - return ctx; -} + if (code != CURLM_OK) { + throw CurlError::New(env, "Could not add easy handle to the multi handle.", code, true); + } -// called when libcurl thinks the socket can be destroyed -void Multi::DestroyCurlSocketContext(Multi::CurlSocketContext* ctx) { - uv_handle_t* handle = reinterpret_cast(&ctx->pollHandle); + ++this->amountOfHandles; + easy->isInsideMultiHandle = true; - uv_close(handle, Multi::OnSocketClose); + return Napi::Number::New(env, static_cast(code)); } -void Multi::OnSocketClose(uv_handle_t* handle) { - Multi::CurlSocketContext* ctx = static_cast(handle->data); - free(ctx); -} +Napi::Value Multi::RemoveHandle(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + auto curl = env.GetInstanceData(); -void Multi::CallOnMessageCallback(CURL* easy, CURLcode statusCode) { - Nan::HandleScope scope; + if (!this->isOpen) { + throw CurlError::New(env, "Multi handle is closed", CURLM_BAD_HANDLE); + } - // we don't have an on message callback, just return. - if (this->cbOnMessage == nullptr) { - return; + if (info.Length() < 1) { + throw CurlError::New(env, "Wrong number of arguments", CURLM_BAD_FUNCTION_ARGUMENT); } - // From https://curl.haxx.se/libcurl/c/CURLINFO_PRIVATE.html - // > Please note that for internal reasons, the value is returned as a char - // pointer, although effectively being a 'void *'. - char* ptr = nullptr; - CURLcode code = curl_easy_getinfo(easy, CURLINFO_PRIVATE, &ptr); - if (code != CURLE_OK) { - Nan::ThrowError("Error retrieving current handle instance."); - return; + if (!info[0].IsObject() || + !info[0].As().InstanceOf(curl->EasyConstructor.Value())) { + throw CurlError::New(env, "Argument must be an Easy instance", CURLM_BAD_FUNCTION_ARGUMENT); } - assert(ptr != nullptr && "Invalid handle returned from CURLINFO_PRIVATE."); - Easy* obj = reinterpret_cast(ptr); + Napi::Object obj = info[0].As(); + Easy* easy = Napi::ObjectWrap::Unwrap(obj); - bool hasError = !obj->callbackError.IsEmpty(); + if (!easy || !easy->isOpen) { + throw CurlError::New(env, "Easy handle is closed or invalid", CURLM_BAD_EASY_HANDLE); + } - v8::Local easyArg = obj->handle(); + NODE_LIBCURL_DEBUG_LOG(this, "Multi::RemoveHandle", + "removing handle " + std::to_string(easy->id)); - v8::Local err = Nan::Null(); - v8::Local errCode = Nan::New(static_cast( - statusCode == CURLE_OK && hasError ? CURLE_ABORTED_BY_CALLBACK : statusCode)); + CURLMcode code = curl_multi_remove_handle(this->mh, easy->ch); - if (statusCode != CURLE_OK || hasError) { - err = hasError ? Nan::New(obj->callbackError) : Nan::Error(curl_easy_strerror(statusCode)); + if (code != CURLM_OK) { + throw CurlError::New(env, "Could not remove easy handle from multi handle.", code, true); } - v8::Local argv[] = {err, easyArg, errCode}; - const int argc = 3; + --this->amountOfHandles; + easy->isInsideMultiHandle = false; - Nan::AsyncResource asyncResource("Multi::CallOnMessageCallback"); - asyncResource.runInAsyncScope(obj->handle(), this->cbOnMessage->GetFunction(), argc, argv); + return Napi::Number::New(env, static_cast(code)); } -// User set multi_opt callbacks +Napi::Value Multi::Perform(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + auto curl = env.GetInstanceData(); -int Multi::CbPushFunction(CURL* parent, CURL* child, size_t numberOfHeaders, // NOLINT(runtime/int) - struct curl_pushheaders* headers, void* userPtr) { - // Note: - // We cannot throw js errors inside this callback - // as there is no way to signal libcurl to mark this request as failed - // and stop calling this callback for this connection (in case there are more pushes) - // this means that we must not rethrow errors we catch from user land. - // doing so would cause the whole library code to fall apart as it would not be safe to - // use other v8 objects. - Nan::HandleScope scope; + if (!this->isOpen) { + throw CurlError::New(env, "Multi handle is closed", CURLM_BAD_HANDLE); + } - int returnValue = -1; + if (info.Length() < 1) { + throw CurlError::New(env, "Wrong number of arguments", CURLM_BAD_FUNCTION_ARGUMENT); + } - Multi* obj = static_cast(userPtr); - assert(obj); - assert(obj->isOpen); + if (!info[0].IsObject() || + !info[0].As().InstanceOf(curl->EasyConstructor.Value())) { + throw CurlError::New(env, "Argument must be an Easy instance", CURLM_BAD_FUNCTION_ARGUMENT); + } - CallbacksMap::iterator it = obj->callbacks.find(CURLMOPT_PUSHFUNCTION); - assert(it != obj->callbacks.end() && "PUSHFUNCTION callback not set."); + Napi::Object obj = info[0].As(); + Easy* easy = Napi::ObjectWrap::Unwrap(obj); - char* parentEasyPtr = nullptr; - CURLcode code = curl_easy_getinfo(parent, CURLINFO_PRIVATE, &parentEasyPtr); - assert(code == CURLE_OK && - "It was not possible to retrieve the current Easy instance from the libcurl easy handle"); - assert(parentEasyPtr != nullptr && "Invalid handle returned from CURLINFO_PRIVATE."); + if (!easy || !easy->isOpen) { + throw CurlError::New(env, "Easy handle is closed or invalid", CURLM_BAD_EASY_HANDLE); + } - Easy* parentEasyObj = reinterpret_cast(parentEasyPtr); - assert(parentEasyObj->isOpen && - "The Easy instance doing the current request was closed prematurely"); + if (easy->isInsideMultiHandle) { + throw CurlError::New(env, "Easy handle is already inside a multi handle", CURLM_ADDED_ALREADY); + } - v8::Local parentEasyJsObj = obj->handle(); + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Perform", "adding handle " + std::to_string(easy->id)); - // create new Easy instance to be used with the easy curl handle passed - // as second parameter - v8::Local childEasyJsObj = Easy::FromCURLHandle(child); + // Create deferred promise + auto deferred = Napi::Promise::Deferred::New(env); - auto http2PushFrameJsObj = Http2PushFrameHeaders::NewInstance(headers, numberOfHeaders); + // reset callback error in case it is set + easy->callbackError.Reset(); - const int argc = 3; - v8::Local argv[argc] = { - parentEasyJsObj, - childEasyJsObj, - http2PushFrameJsObj, - }; + // Check comment on node_libcurl.cc + LocaleGuard localeGuard; + CURLMcode code = curl_multi_add_handle(this->mh, easy->ch); - Nan::TryCatch tryCatch; + if (code != CURLM_OK) { + throw CurlError::New(env, "Could not add easy handle to the multi handle.", code, true); + } - Nan::AsyncResource asyncResource("Multi::CbPushFunction"); - Nan::MaybeLocal returnValueCallback = - asyncResource.runInAsyncScope(obj->handle(), it->second->GetFunction(), argc, argv); + ++this->amountOfHandles; + easy->isInsideMultiHandle = true; - if (tryCatch.HasCaught()) { - // See the note at the top of this function, we must not rethrow this error. - // Show some Debug message? - return returnValue; - } + // Store the deferred promise for this handle + this->handlePromiseMap[easy->ch] = std::make_shared(std::move(deferred)); - if (returnValueCallback.IsEmpty() || !returnValueCallback.ToLocalChecked()->IsInt32()) { - // Nothing we can do - Let's just ignore it - // v8::Local typeError = - // Nan::TypeError("Return value from the PUSHFUNCTION callback must be an integer."); - // Nan::ThrowError(typeError); - } else { - returnValue = Nan::To(returnValueCallback.ToLocalChecked()).FromJust(); + // Return the promise + return this->handlePromiseMap[easy->ch]->Promise(); +} + +Napi::Value Multi::OnMessage(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + if (!info.Length()) { + throw CurlError::New(env, + "You must specify the callback function. If you want to remove the " + "current one you can pass null.", + CURLM_BAD_FUNCTION_ARGUMENT); } - return returnValue; -} + Napi::Value arg = info[0]; + bool isNull = arg.IsNull(); -// Add Curl constructor to the module exports -NAN_MODULE_INIT(Multi::Initialize) { - Nan::HandleScope scope; + if (!arg.IsFunction() && !isNull) { + throw CurlError::New(env, + "Argument must be a Function. If you want to remove the current one " + "you can pass null.", + CURLM_BAD_FUNCTION_ARGUMENT); + } - // Multi js "class" function template initialization - v8::Local tmpl = Nan::New(Multi::New); - tmpl->SetClassName(Nan::New("Multi").ToLocalChecked()); - tmpl->InstanceTemplate()->SetInternalFieldCount(1); + if (isNull) { + this->cbOnMessage.Reset(); + } else { + this->cbOnMessage = Napi::Persistent(arg.As()); + } - // prototype methods - Nan::SetPrototypeMethod(tmpl, "setOpt", Multi::SetOpt); - Nan::SetPrototypeMethod(tmpl, "addHandle", Multi::AddHandle); - Nan::SetPrototypeMethod(tmpl, "onMessage", Multi::OnMessage); - Nan::SetPrototypeMethod(tmpl, "removeHandle", Multi::RemoveHandle); - Nan::SetPrototypeMethod(tmpl, "getCount", Multi::GetCount); - Nan::SetPrototypeMethod(tmpl, "close", Multi::Close); + return info.This(); +} - // static methods - Nan::SetMethod(tmpl, "strError", Multi::StrError); +Napi::Value Multi::GetCount(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - Multi::constructor.Reset(tmpl); + if (!this->isOpen) { + throw CurlError::New(env, "Multi handle is closed", CURLM_BAD_HANDLE); + } - Nan::Set(target, Nan::New("Multi").ToLocalChecked(), Nan::GetFunction(tmpl).ToLocalChecked()); + return Napi::Number::New(env, this->amountOfHandles); } -NAN_METHOD(Multi::New) { - if (!info.IsConstructCall()) { - Nan::ThrowError("You must use \"new\" to instantiate this object."); +Napi::Value Multi::Close(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + if (!this->isOpen) { + throw CurlError::New(env, "Multi handle already closed.", CURLM_BAD_HANDLE); } - Multi* obj = new Multi(); + NODE_LIBCURL_DEBUG_LOG(this, "Multi::Close", ""); - obj->Wrap(info.This()); + this->Dispose(); - info.GetReturnValue().Set(info.This()); + return env.Undefined(); } -NAN_METHOD(Multi::SetOpt) { - Nan::HandleScope scope; +Napi::Value Multi::GetterId(const Napi::CallbackInfo& info) { + return Napi::Number::New(info.Env(), this->id); +} - Multi* obj = Nan::ObjectWrap::Unwrap(info.This()); +Napi::Value Multi::StrError(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); - if (!obj->isOpen) { - Nan::ThrowError("Multi handle is closed."); - return; + if (info.Length() < 1 || !info[0].IsNumber()) { + throw CurlError::New(env, "Argument must be an error code", CURLM_BAD_FUNCTION_ARGUMENT); } - v8::Local opt = info[0]; - v8::Local value = info[1]; + int32_t errorCode = info[0].As().Int32Value(); + const char* errorMsg = curl_multi_strerror(static_cast(errorCode)); - CURLMcode setOptRetCode = CURLM_UNKNOWN_OPTION; + return Napi::String::New(env, errorMsg); +} - int optionId; +void Multi::ProcessMessages() { + NODE_LIBCURL_DEBUG_LOG(this, "Multi::ProcessMessages", "isOpen: " + std::to_string(this->isOpen)); + if (!this->isOpen) return; - // array of strings option - if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionNotImplemented, opt))) { - Nan::ThrowError( - "Unsupported option, probably because it's too complex to implement " - "using javascript or unecessary when using javascript."); - return; - } else if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionStringArray, opt))) { - if (value->IsNull()) { - setOptRetCode = curl_multi_setopt(obj->mh, static_cast(optionId), NULL); + int msgsLeft = 0; + CURLMsg* msg = nullptr; - } else { - if (!value->IsArray()) { - Nan::ThrowTypeError("Option value must be an Array."); - return; - } + while (this->isOpen && (msg = curl_multi_info_read(this->mh, &msgsLeft))) { + NODE_LIBCURL_DEBUG_LOG( + this, "Multi::ProcessMessages", + "msg->msg: " + std::to_string(msg->msg) + " isOpen: " + std::to_string(this->isOpen)); + if (msg->msg == CURLMSG_DONE) { + CURL* easy = msg->easy_handle; + CURLcode result = msg->data.result; - v8::Local array = v8::Local::Cast(value); - uint32_t arrayLength = array->Length(); - std::vector strings; + this->CallOnMessageCallback(easy, result); + } + } +} - for (uint32_t i = 0; i < arrayLength; ++i) { - strings.push_back(*Nan::Utf8String(Nan::Get(array, i).ToLocalChecked())); - } +void Multi::CallOnMessageCallback(CURL* easy, CURLcode handleCode) { + if (!this->isOpen) return; - strings.push_back(NULL); + Napi::Env env = Env(); + Napi::HandleScope scope(env); - setOptRetCode = curl_multi_setopt(obj->mh, static_cast(optionId), &strings[0]); - } + // From https://curl.haxx.se/libcurl/c/CURLINFO_PRIVATE.html + // > Please note that for internal reasons, the value is returned as a char + // pointer, although effectively being a 'void *'. + char* ptr = nullptr; + CURLcode code = curl_easy_getinfo(easy, CURLINFO_PRIVATE, &ptr); + assert(code == CURLE_OK && "Error retrieving current handle instance."); - // check if option is integer, and the value is correct - } else if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionInteger, opt))) { - // If not an integer, throw error - if (!value->IsInt32()) { - Nan::ThrowTypeError("Option value must be an integer."); - return; + assert(ptr != nullptr && "Invalid handle returned from CURLINFO_PRIVATE."); + Easy* easyObj = reinterpret_cast(ptr); + + bool hasError = !easyObj->callbackError.IsEmpty(); + + // Determine the final status code + CURLcode statusCode = handleCode == CURLE_OK && hasError ? CURLE_ABORTED_BY_CALLBACK : handleCode; + + // Handle promise-based perform() if exists + auto promiseIt = this->handlePromiseMap.find(easy); + if (promiseIt != this->handlePromiseMap.end()) { + NODE_LIBCURL_DEBUG_LOG( + this, "Multi::CallOnMessageCallback", + "resolving/rejecting promise for handle, statusCode: " + std::to_string(statusCode)); + + auto deferred = promiseIt->second; + + if (statusCode != CURLE_OK || hasError) { + // Reject the promise with Error + if (hasError) { + Napi::Error error = + CurlError::New(env, "Request was aborted by a callback", CURLE_ABORTED_BY_CALLBACK); + + auto errorValue = error.Value(); + errorValue.Set("cause", easyObj->callbackError.Value()); + deferred->Reject(errorValue); + } else { + auto error = CurlError::New(env, "Request failed", statusCode, true); + deferred->Reject(error.Value()); + } + } else { + // Resolve the promise with the Easy instance + deferred->Resolve(easyObj->Value()); } - int32_t val = Nan::To(value).FromJust(); + // Clean up the promise reference + this->handlePromiseMap.erase(promiseIt); + return; + } - setOptRetCode = curl_multi_setopt(obj->mh, static_cast(optionId), val); - } else if ((optionId = IsInsideCurlConstantStruct(curlMultiOptionFunction, opt))) { - bool isNull = value->IsNull(); + Napi::Function callback = this->cbOnMessage.Value(); - if (!value->IsFunction() && !isNull) { - Nan::ThrowTypeError("Option value must be null or a function."); - return; - } + // Create arguments: error (null or Error object), Easy instance + Napi::Value error = env.Null(); + Napi::Number errorCode = Napi::Number::New(env, static_cast(statusCode)); - switch (optionId) { -#if NODE_LIBCURL_VER_GE(7, 44, 0) - case CURLMOPT_PUSHFUNCTION: + if (statusCode != CURLE_OK || hasError) { + error = hasError ? easyObj->callbackError.Value() + : CurlError::New(env, "Request failed", statusCode, true).Value(); + } - if (isNull) { - obj->callbacks.erase(CURLMOPT_PUSHFUNCTION); + NODE_LIBCURL_DEBUG_LOG(this, "Multi::CallOnMessageCallback", + "calling onMessage callback, statusCode: " + std::to_string(statusCode)); - curl_multi_setopt(obj->mh, CURLMOPT_PUSHDATA, NULL); - setOptRetCode = curl_multi_setopt(obj->mh, CURLMOPT_PUSHFUNCTION, NULL); - } else { - obj->callbacks[CURLMOPT_PUSHFUNCTION].reset(new Nan::Callback(value.As())); + try { + callback.Call(this->Value(), {error, easyObj->Value(), errorCode}); - curl_multi_setopt(obj->mh, CURLMOPT_PUSHDATA, obj); - setOptRetCode = curl_multi_setopt(obj->mh, CURLMOPT_PUSHFUNCTION, Multi::CbPushFunction); - } - - break; -#endif - } + } catch (const Napi::Error&) { + // ignore any and all errors } - info.GetReturnValue().Set(setOptRetCode); + // Some re-entrant calls may have closed the Multi handle, it is not safe to continue + if (!this->isOpen) return; } -NAN_METHOD(Multi::OnMessage) { - Nan::HandleScope scope; +// Socket context management +Multi::CurlSocketContext* Multi::CreateCurlSocketContext(curl_socket_t sockfd, + Multi* multi) noexcept { + auto it = multi->socketContextMap.find(sockfd); + + // calling uv_poll_init_socket multiple times for the same socket will return UV_EEXIST + // which would cause libcurl to be stuck. This happens because libcurl is calling the Socket + // callback with an empty socketp for an existing socket. + // This only happens with libcurl <= 7.81, but we are keeping it for all + // versions. + if (it != multi->socketContextMap.end()) { + NODE_LIBCURL_DEBUG_LOG(multi, "Multi::CreateCurlSocketContext", + "Socket context already exists for socket: " + std::to_string(sockfd)); + return it->second; + } - Multi* obj = Nan::ObjectWrap::Unwrap(info.This()); + CurlSocketContext* ctx = new (std::nothrow) CurlSocketContext(); + // not enough memory to allocate the ctx + assert(ctx && "Multi::CreateCurlSocketContext - Failed to create socket context"); - if (!info.Length()) { - Nan::ThrowError( - "You must specify the callback function. If you want to remove the " - "current one you can pass null."); - return; + ctx->sockfd = sockfd; + ctx->multi = multi; + + uv_loop_t* loop = nullptr; + auto napi_result = napi_get_uv_event_loop(multi->Env(), &loop); + assert(napi_result == napi_ok && "Multi::CreateCurlSocketContext - Failed to get UV event loop"); + + // uv_poll simply watches file descriptors using the operating system + // notification mechanism + // whenever the OS notices a change of state in file descriptors being + // polled, libuv will invoke the associated callback. + int result = uv_poll_init_socket(loop, &ctx->pollHandle, sockfd); + if (result != 0) { + auto errorMessage = "Multi::CreateCurlSocketContext Failed to initialize socket: " + + std::string(uv_err_name(result)); + std::cerr << errorMessage << std::endl; + // TODO(jonathan): this fails on libcurl <= 7.81, works on >= 7.82 + // looks like there is a extra call to SocketFunction to delete a socket with socketp 0 on + // <=7.81 + assert(false && + "Multi::CreateCurlSocketContext - failed to initialize socket - See message above"); } - v8::Local arg = info[0]; + NODE_LIBCURL_DEBUG_LOG(multi, "Multi::CreateCurlSocketContext", + "Initialized socket: " + std::to_string(sockfd)); - bool isNull = arg->IsNull(); + ctx->pollHandle.data = ctx; + multi->socketContextMap[sockfd] = ctx; - if (!arg->IsFunction() && !isNull) { - Nan::ThrowTypeError( - "Argument must be a Function. If you want to remove the current one " - "you can pass null."); - return; - } + return ctx; +} - if (isNull) { - obj->cbOnMessage = nullptr; - } else { - obj->cbOnMessage.reset(new Nan::Callback(arg.As())); +void Multi::DestroyCurlSocketContext(CurlSocketContext* ctx) { + auto handle = reinterpret_cast(&ctx->pollHandle); + + auto it = ctx->multi->socketContextMap.find(ctx->sockfd); + if (it != ctx->multi->socketContextMap.end()) { + ctx->multi->socketContextMap.erase(it); } - info.GetReturnValue().Set(info.This()); + if (!uv_is_closing(handle)) { + uv_close(handle, [](uv_handle_t* handle) { + auto ctx = static_cast(handle->data); + NODE_LIBCURL_DEBUG_LOG(ctx->multi, "Multi::DestroyCurlSocketContext", + "Closed socket context for socket: " + std::to_string(ctx->sockfd)); + delete ctx; + }); + } } -NAN_METHOD(Multi::AddHandle) { - Nan::HandleScope scope; +// libcurl callback implementations +int Multi::HandleSocket(CURL* easy, curl_socket_t s, int action, void* userp, void* socketp) { + CurlSocketContext* ctx = nullptr; + Multi* obj = static_cast(userp); - Multi* obj = Nan::ObjectWrap::Unwrap(info.This()); + if (action == CURL_POLL_IN || action == CURL_POLL_OUT || action == CURL_POLL_INOUT || + action == CURL_POLL_NONE) { + // create ctx if it doesn't exists and assign it to the current socket, + if (socketp) { + ctx = static_cast(socketp); + } else { + ctx = Multi::CreateCurlSocketContext(s, obj); + } - if (!obj->isOpen) { - Nan::ThrowError("Multi handle is closed."); - return; - } + assert(ctx && "Multi::HandleSocket - Failed to create socket context"); - v8::Local handle = info[0]; + curl_multi_assign(obj->mh, s, static_cast(ctx)); - if (!handle->IsObject() || !Nan::New(Easy::constructor)->HasInstance(handle)) { - Nan::ThrowError(Nan::TypeError("Argument must be an instance of an Easy handle.")); - return; - } else { - Easy* easy = Nan::ObjectWrap::Unwrap(handle.As()); + // set event based on the current action + int events = 0; - if (!easy->isOpen) { - Nan::ThrowError("Cannot add an Easy handle that is closed."); - return; - } + if (action != CURL_POLL_IN) events |= UV_WRITABLE; + if (action != CURL_POLL_OUT) events |= UV_READABLE; - // reset callback error in case it is set - easy->callbackError.Reset(); + NODE_LIBCURL_DEBUG_LOG(obj, "Multi::HandleSocket", + "Starting poll for socket: " + std::to_string(s) + + " with events: " + std::to_string(events)); + return uv_poll_start(&ctx->pollHandle, events, Multi::OnSocket); + } - // Check comment on node_libcurl.cc - SETLOCALE_WRAPPER(CURLMcode code = - curl_multi_add_handle(obj->mh, easy->ch);); // NOLINT(whitespace/newline) + if (action == CURL_POLL_REMOVE) { + if (socketp) { + ctx = static_cast(socketp); - if (code != CURLM_OK) { - Nan::ThrowError(Nan::TypeError("Could not add easy handle to the multi handle.")); - return; - } + NODE_LIBCURL_DEBUG_LOG(obj, "Multi::HandleSocket", + "Stopping poll for socket: " + std::to_string(s)); - ++obj->amountOfHandles; - easy->isInsideMultiHandle = true; + uv_poll_stop(&ctx->pollHandle); - v8::Local ret = Nan::New(static_cast(code)); + Multi::DestroyCurlSocketContext(ctx); + curl_multi_assign(obj->mh, s, nullptr); + } - info.GetReturnValue().Set(ret); + return 0; } + + // see this: https://github.com/curl/curl/issues/14860#issuecomment-2452663239 + return -1; } +// This function will be called when the timeout value changes from libcurl. +// The timeout value is at what latest time the application should call one of +// the "performing" functions of the multi interface (curl_multi_socket_action +// and curl_multi_perform) - to allow libcurl to keep timeouts and retries etc +// to work. +int Multi::HandleTimeout(CURLM* multi, + long timeoutMs, // NOLINT(runtime/int) + void* userp) { + Multi* obj = static_cast(userp); -NAN_METHOD(Multi::RemoveHandle) { - Nan::HandleScope scope; + if (obj->timerClosed) { + return 0; + } - Multi* obj = Nan::ObjectWrap::Unwrap(info.This()); + if (timeoutMs < 0) { + int uvStop = uv_timer_stop(&obj->timeout); + return uvStop; + } - if (!obj->isOpen) { - Nan::ThrowError("Multi handle is closed."); - return; + // we should not call libcurl functions directly from this callback + // see https://github.com/curl/curl/issues/3537 + if (timeoutMs >= 0) { + return uv_timer_start(&obj->timeout, Multi::OnTimeout, timeoutMs, 0); } - v8::Local handle = info[0]; + return 0; +} - if (!handle->IsObject() || !Nan::New(Easy::constructor)->HasInstance(handle)) { - Nan::ThrowError(Nan::TypeError("Argument must be an instance of an Easy handle.")); - return; - } else { - Easy* easy = Nan::ObjectWrap::Unwrap(handle.As()); +int Multi::CbPushFunction(CURL* parent, CURL* child, size_t numberOfHeaders, + struct curl_pushheaders* headers, void* userPtr) { + // Note: + // We cannot throw js errors inside this callback + // as there is no way to signal libcurl to mark this request as failed + // and stop calling this callback for this connection (in case there are more pushes) + // this means that we must not rethrow errors we catch from user land. + // doing so would cause the whole library code to fall apart as it would not be safe to + // use other v8 objects. + int returnValue = CURL_PUSH_DENY; - CURLMcode code = curl_multi_remove_handle(obj->mh, easy->ch); + Multi* obj = static_cast(userPtr); + assert(obj); + assert(obj->isOpen); - if (code != CURLM_OK) { - Nan::ThrowError(Nan::TypeError("Could not remove easy handle from multi handle.")); - return; - } + auto it = obj->callbacks.find(CURLMOPT_PUSHFUNCTION); + assert(it != obj->callbacks.end() && "PUSHFUNCTION callback not set."); - --obj->amountOfHandles; - easy->isInsideMultiHandle = false; + if (it->second.IsEmpty()) { + return CURL_PUSH_DENY; + } - v8::Local ret = Nan::New(static_cast(code)); + char* parentEasyPtr = nullptr; + CURLcode code = curl_easy_getinfo(parent, CURLINFO_PRIVATE, &parentEasyPtr); + assert(code == CURLE_OK && + "It was not possible to retrieve the current Easy instance from the libcurl easy handle"); + assert(parentEasyPtr != nullptr && "Invalid handle returned from CURLINFO_PRIVATE."); - info.GetReturnValue().Set(ret); + Easy* parentEasyObj = reinterpret_cast(parentEasyPtr); + assert(parentEasyObj->isOpen && + "The Easy instance doing the current request was closed prematurely"); + + Napi::Env env = it->second.Env(); + Napi::HandleScope scope(env); + auto curl = env.GetInstanceData(); + + try { + Napi::Object parentEasyJsObj = parentEasyObj->Value(); + Napi::Object childEasyJsObj = Easy::FromCURLHandle(env, child); + + auto headersExternal = Napi::External::New(env, headers); + headersExternal.TypeTag(&HTTP2_PUSH_FRAME_HEADERS_TYPE_TAG); + + auto http2PushFrameJsObj = curl->Http2PushFrameHeadersConstructor.New({ + headersExternal, + Napi::Number::New(env, numberOfHeaders), + }); + + Napi::Function callback = it->second.Value(); + // TODO(jonathan, migration): capture this when perform is called or similar (either on Easy or + // Multi) + Napi::AsyncContext asyncContext(env, "Multi::CbPushFunction"); + + Napi::Value returnValueCallback = callback.MakeCallback(obj->Value(), + { + parentEasyJsObj, + childEasyJsObj, + http2PushFrameJsObj, + }, + asyncContext); + + if (!returnValueCallback.IsEmpty() && returnValueCallback.IsNumber()) { + returnValue = returnValueCallback.As().Int32Value(); + } + } catch (const Napi::Error&) { + // See the note at the top of this function, we must not rethrow this error. + // Show some Debug message? + return returnValue; } -} -NAN_METHOD(Multi::GetCount) { - Nan::HandleScope scope; + return returnValue; +} - Multi* obj = Nan::ObjectWrap::Unwrap(info.This()); +#if NODE_LIBCURL_VER_GE(8, 17, 0) +void Multi::NotifyCallback(CURLM* multi, unsigned int notification, CURL* easy, void* notifyp) { + Multi* obj = static_cast(notifyp); + assert(obj && "Multi::NotifyCallback - Invalid Multi instance"); - v8::Local ret = Nan::New(static_cast(obj->amountOfHandles)); + NODE_LIBCURL_DEBUG_LOG(obj, "Multi::NotifyCallback", + "notification: " + std::to_string(notification)); - info.GetReturnValue().Set(ret); + if (notification == CURLMNOTIFY_INFO_READ) { + obj->ProcessMessages(); + } } +#endif -NAN_METHOD(Multi::Close) { - Nan::HandleScope scope; +// function called when the previous timeout set reaches 0 +UV_TIMER_CB(Multi::OnTimeout) { + Multi* obj = static_cast(timer->data); - Multi* obj = Nan::ObjectWrap::Unwrap(info.This()); + NODE_LIBCURL_DEBUG_LOG(obj, "Multi::OnTimeout", ""); - if (!obj->isOpen) { - Nan::ThrowError("Multi handle already closed."); - return; - } + // Check comment on node_libcurl.cc + LocaleGuard localeGuard; + CURLMcode code = curl_multi_socket_action(obj->mh, CURL_SOCKET_TIMEOUT, 0, &obj->runningHandles); + + assert((CURLM_OK == code || true) && + "Calling curl_multi_socket_action from within Multi::OnTimeout failed. This is possibly a " + "bug on node-libcurl or libcurl itself. Please report this issue to node-libcurl."); - obj->Dispose(); + // When notifications are enabled, libcurl will call our NotifyCallback when needed + if (!obj->useNotificationsApi) { + obj->ProcessMessages(); + } } -NAN_METHOD(Multi::StrError) { - Nan::HandleScope scope; +void Multi::OnSocket(uv_poll_t* handle, int status, int events) { + int flags = 0; - v8::Local errCode = info[0]; + CURLMcode code; - if (!errCode->IsInt32()) { - Nan::ThrowTypeError("Invalid errCode passed to Multi.strError."); - return; - } + if (status < 0) flags = CURL_CSELECT_ERR; + if (events & UV_READABLE) flags |= CURL_CSELECT_IN; + if (events & UV_WRITABLE) flags |= CURL_CSELECT_OUT; - const char* errorMsg = - curl_multi_strerror(static_cast(Nan::To(errCode).FromJust())); + Multi::CurlSocketContext* ctx = static_cast(handle->data); - v8::Local ret = Nan::New(errorMsg).ToLocalChecked(); + NODE_LIBCURL_DEBUG_LOG(ctx->multi, "Multi::OnSocket", "events: " + std::to_string(events)); - info.GetReturnValue().Set(ret); + // Check comment on node_libcurl.cc + LocaleGuard localeGuard; + // Before version 7.20.0: If you receive CURLM_CALL_MULTI_PERFORM, this + // basically means that you should call curl_multi_socket_action again + // before you wait for more actions on libcurl's sockets. + // You don't have to do it immediately, but the return code means that + // libcurl may have more data available to return or that there may be more data + // to send off before it is "satisfied". + do { + code = + curl_multi_socket_action(ctx->multi->mh, ctx->sockfd, flags, &ctx->multi->runningHandles); + } while (code == CURLM_CALL_MULTI_PERFORM); + + assert(code == CURLM_OK && "curl_multi_socket_action failed"); + + // When notifications are enabled, libcurl will call our NotifyCallback when needed + if (!ctx->multi->useNotificationsApi) { + ctx->multi->ProcessMessages(); + } } + } // namespace NodeLibcurl diff --git a/src/Multi.h b/src/Multi.h index 30a0ee09f..a8e5250fd 100644 --- a/src/Multi.h +++ b/src/Multi.h @@ -4,89 +4,117 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#ifndef NODELIBCURL_MULTI_H -#define NODELIBCURL_MULTI_H +#pragma once -#include "Curl.h" #include "macros.h" -#include "make_unique.h" #include -#include -#include +#include #include +#include +#include +#include namespace NodeLibcurl { -class Multi : public Nan::ObjectWrap { - // instance methods - Multi(); +// Forward declaration +class Easy; + +class Multi : public Napi::ObjectWrap { + public: + // Constructor and destructor + Multi(const Napi::CallbackInfo& info); ~Multi(); - Multi(const Multi& that); - Multi& operator=(const Multi& that); + // Static methods for JS class initialization + static Napi::Function Init(Napi::Env env, Napi::Object exports); - void Dispose(); - void ProcessMessages(); - void CallOnMessageCallback(CURL* easy, CURLcode statusCode); + // Instance methods exposed to JS + Napi::Value SetOpt(const Napi::CallbackInfo& info); + Napi::Value AddHandle(const Napi::CallbackInfo& info); + Napi::Value RemoveHandle(const Napi::CallbackInfo& info); + Napi::Value Perform(const Napi::CallbackInfo& info); + Napi::Value OnMessage(const Napi::CallbackInfo& info); + Napi::Value GetCount(const Napi::CallbackInfo& info); + Napi::Value Close(const Napi::CallbackInfo& info); + Napi::Value GetterId(const Napi::CallbackInfo& info); - // context used with curl_multi_assign to create a relationship between the - // socket being used and the poll handle. - struct CurlSocketContext { - uv_mutex_t mutex; - uv_poll_t pollHandle; - curl_socket_t sockfd; - Multi* multi; - }; + // Static methods + static Napi::Value StrError(const Napi::CallbackInfo& info); - // members + // Debug support + uint64_t GetDebugId() const { return id; } + + // Public members CURLM* mh; bool isOpen = true; int amountOfHandles = 0; int runningHandles = 0; - // callbacks - typedef std::map> CallbacksMap; - CallbacksMap callbacks = CallbacksMap{}; - // required as it's not specific to a single message - std::shared_ptr cbOnMessage; + private: + // Context for socket operations + struct CurlSocketContext { + uv_poll_t pollHandle; + curl_socket_t sockfd; + Multi* multi; + }; - deleted_unique_ptr timeout; + // Private methods + void StopTimer(); + void CloseTimerAsync(); + void Dispose(); + void ProcessMessages(); + void CallOnMessageCallback(CURL* easy, CURLcode statusCode); - // static helper methods - static CurlSocketContext* CreateCurlSocketContext(curl_socket_t sockfd, Multi* multi); + // Socket context helpers + static CurlSocketContext* CreateCurlSocketContext(curl_socket_t sockfd, Multi* multi) noexcept; static void DestroyCurlSocketContext(CurlSocketContext* ctx); - // js object constructor template - static Nan::Persistent constructor; - - // js available Methods - static NAN_METHOD(New); - static NAN_METHOD(SetOpt); - static NAN_METHOD(AddHandle); - static NAN_METHOD(OnMessage); - static NAN_METHOD(RemoveHandle); - static NAN_METHOD(GetCount); - static NAN_METHOD(Close); - static NAN_METHOD(StrError); - - // libcurl multi_setopt callbacks + + // Callback management + typedef std::map CallbacksMap; + CallbacksMap callbacks; + Napi::FunctionReference cbOnMessage; + + // Promise-based perform tracking + std::map> handlePromiseMap; + + // Timer for timeout handling + uv_timer_t timeout; + bool timerClosed = false; + napi_async_cleanup_hook_handle removeHandle; + uint64_t id; + + std::map socketContextMap; + + // Notification API support (libcurl >= 8.17.0) + bool useNotificationsApi = false; + + // Static members + static std::atomic nextId; + + // libcurl multi callbacks static int HandleSocket(CURL* easy, curl_socket_t s, int action, void* userp, void* socketp); - static int HandleTimeout(CURLM* multi, long timeoutMs, void* userp); // NOLINT(runtime/int) - static int CbPushFunction(CURL* parent, CURL* child, - size_t numberOfHeaders, // NOLINT(runtime/int) + static int HandleTimeout(CURLM* multi, long timeoutMs, void* userp); + static int CbPushFunction(CURL* parent, CURL* child, size_t numberOfHeaders, struct curl_pushheaders* headers, void* userPtr); - // libuv events - static UV_TIMER_CB(OnTimeout); - static void OnTimerClose(uv_handle_t* handle); + // libuv event callbacks + static void OnTimeout(uv_timer_t* timer); static void OnSocket(uv_poll_t* handle, int status, int events); - static void OnSocketClose(uv_handle_t* handle); + static void CleanupHook(void* data); + static void CleanupHookAsync(napi_async_cleanup_hook_handle handle, void* data); - public: - // export Multi to js - static NAN_MODULE_INIT(Initialize); +#if NODE_LIBCURL_VER_GE(8, 17, 0) + // libcurl notification callback (available since 8.17.0) + static void NotifyCallback(CURLM* multi, unsigned int notification, CURL* easy, void* notifyp); +#endif + + // Debug logging removed - now using NODE_LIBCURL_DEBUG_LOG macros + + // Prevent copying + Multi(const Multi& that) = delete; + Multi& operator=(const Multi& that) = delete; }; } // namespace NodeLibcurl -#endif diff --git a/src/Share.cc b/src/Share.cc index 07e780d98..53874d80c 100644 --- a/src/Share.cc +++ b/src/Share.cc @@ -1,6 +1,4 @@ #ifndef NOMINMAX -// Fix for: warning C4003: not enough arguments for function-like macro invocation 'max' -// [C:\projects\node-libcurl\build\node_libcurl.vcxproj] #define NOMINMAX #endif @@ -13,6 +11,10 @@ #include "Share.h" +#include "Curl.h" +#include "CurlError.h" + +#include #include // 464 was allocated on Win64 @@ -21,88 +23,93 @@ namespace NodeLibcurl { -Nan::Persistent Share::constructor; +// Static member initialization +std::atomic Share::nextId = 0; + +Share::Share(const Napi::CallbackInfo& info) + : Napi::ObjectWrap(info), isOpen(true), id(nextId++) { + NODE_LIBCURL_DEBUG_LOG(this, "Share::Constructor", ""); + Napi::Env env = info.Env(); + auto curl = this->Env().GetInstanceData(); + + // Check if called with 'new' + if (!info.IsConstructCall()) { + throw Napi::TypeError::New(env, "You must use \"new\" to instantiate this object."); + } -Share::Share() : isOpen(true) { this->sh = curl_share_init(); - assert(this->sh); + if (!this->sh) { + throw CurlError::New(env, "Failed to initialize share handle", CURLSHE_NOMEM); + } + + curl->AdjustHandleMemory(CURL_HANDLE_TYPE_SHARE, 1); } -Share::~Share(void) { +Share::~Share() { + NODE_LIBCURL_DEBUG_LOG(this, "Share::Destructor", "isOpen: " + std::to_string(this->isOpen)); if (this->isOpen) { this->Dispose(); } } void Share::Dispose() { + NODE_LIBCURL_DEBUG_LOG(this, "Share::Dispose", ""); assert(this->isOpen && "This handle was already closed."); assert(this->sh && "The share handle ran away."); + this->isOpen = false; + CURLSHcode code = curl_share_cleanup(this->sh); assert(code == CURLSHE_OK); - this->isOpen = false; + auto curl = this->Env().GetInstanceData(); + curl->AdjustHandleMemory(CURL_HANDLE_TYPE_SHARE, -1); } -NAN_MODULE_INIT(Share::Initialize) { - Nan::HandleScope scope; +Napi::Function Share::Init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); - // Easy js "class" function template initialization - v8::Local tmpl = Nan::New(Share::New); - tmpl->SetClassName(Nan::New("Share").ToLocalChecked()); - tmpl->InstanceTemplate()->SetInternalFieldCount(1); + // Define the class + Napi::Function func = + DefineClass(env, "Share", + {// Instance methods + InstanceMethod("setOpt", &Share::SetOpt), InstanceMethod("close", &Share::Close), - // prototype methods - Nan::SetPrototypeMethod(tmpl, "setOpt", Share::SetOpt); - Nan::SetPrototypeMethod(tmpl, "close", Share::Close); + // Static methods + StaticMethod("strError", &Share::StrError)}); - // static methods - Nan::SetMethod(tmpl, "strError", Share::StrError); - - Share::constructor.Reset(tmpl); - - Nan::Set(target, Nan::New("Share").ToLocalChecked(), Nan::GetFunction(tmpl).ToLocalChecked()); + exports.Set("Share", func); + return func; } -NAN_METHOD(Share::New) { - if (!info.IsConstructCall()) { - Nan::ThrowError("You must use \"new\" to instantiate this object."); - } - - Share* obj = new Share(); +Napi::Value Share::SetOpt(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); - obj->Wrap(info.This()); - info.GetReturnValue().Set(info.This()); -} + if (!this->isOpen) { + throw CurlError::New(env, "Share handle is closed.", CURLSHE_INVALID); + } -NAN_METHOD(Share::SetOpt) { - Nan::HandleScope scope; + if (info.Length() < 2) { + throw Napi::TypeError::New(env, "Wrong number of arguments"); + } - Share* obj = Nan::ObjectWrap::Unwrap(info.This()); + Napi::Value opt = info[0]; + Napi::Value value = info[1]; - if (!obj->isOpen) { - Nan::ThrowError("Share handle is closed."); - return; + if (!value.IsNumber()) { + throw Napi::TypeError::New(env, "Option value must be an integer."); } - v8::Local opt = info[0]; - v8::Local value = info[1]; - CURLSHcode setOptRetCode = CURLSHE_BAD_OPTION; int32_t optionId = -1; - if (!value->IsInt32()) { - Nan::ThrowError("Option value must be an integer."); - return; - } - - if (opt->IsInt32()) { - optionId = Nan::To(opt).FromJust(); - } else if (opt->IsString()) { - Nan::Utf8String option(opt); - - std::string optionString(*option); + // Handle option as either integer or string + if (opt.IsNumber()) { + optionId = opt.As().Int32Value(); + } else if (opt.IsString()) { + std::string optionString = opt.As().Utf8Value(); if (optionString == "SHARE") { optionId = static_cast(CURLSHOPT_SHARE); @@ -111,43 +118,43 @@ NAN_METHOD(Share::SetOpt) { } } - setOptRetCode = curl_share_setopt(obj->sh, static_cast(optionId), - Nan::To(value).FromJust()); + int32_t optionValue = value.As().Int32Value(); + setOptRetCode = curl_share_setopt(this->sh, static_cast(optionId), optionValue); - info.GetReturnValue().Set(setOptRetCode); + return Napi::Number::New(env, setOptRetCode); } -NAN_METHOD(Share::Close) { - Nan::HandleScope scope; - - Share* obj = Nan::ObjectWrap::Unwrap(info.This()); +Napi::Value Share::Close(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); - if (!obj->isOpen) { - Nan::ThrowError("Share handle already closed."); - return; + if (!this->isOpen) { + throw CurlError::New(env, "Share handle already closed.", CURLSHE_INVALID); } - obj->Dispose(); + this->Dispose(); - return; + return env.Undefined(); } -NAN_METHOD(Share::StrError) { - Nan::HandleScope scope; +Napi::Value Share::StrError(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); - v8::Local errCode = info[0]; - - if (!errCode->IsInt32()) { - Nan::ThrowTypeError("Invalid errCode passed to Share.strError."); - return; + if (info.Length() < 1) { + throw Napi::TypeError::New(env, "Wrong number of arguments"); } - const char* errorMsg = - curl_share_strerror(static_cast(Nan::To(errCode).FromJust())); + Napi::Value errCode = info[0]; + + if (!errCode.IsNumber()) { + throw Napi::TypeError::New(env, "Invalid errCode passed to Share.strError."); + } - v8::Local ret = Nan::New(errorMsg).ToLocalChecked(); + int32_t code = errCode.As().Int32Value(); + const char* errorMsg = curl_share_strerror(static_cast(code)); - info.GetReturnValue().Set(ret); + return Napi::String::New(env, errorMsg); } } // namespace NodeLibcurl diff --git a/src/Share.h b/src/Share.h index 3c04943f7..b2226a962 100644 --- a/src/Share.h +++ b/src/Share.h @@ -5,42 +5,54 @@ * LICENSE file in the root directory of this source tree. */ -#ifndef NODELIBCURL_SHARE_H -#define NODELIBCURL_SHARE_H +#pragma once + +#include "macros.h" #include -#include -#include + +#include +#include namespace NodeLibcurl { -class Share : public Nan::ObjectWrap { - Share(); +// Forward declaration +class Easy; - Share(const Share& that); - Share& operator=(const Share& that); +class Share : public Napi::ObjectWrap { + friend class Easy; + public: + // Constructor for JS object creation + static Napi::Function Init(Napi::Env env, Napi::Object exports); + Share(const Napi::CallbackInfo& info); ~Share(); - // instance methods - void Dispose(); + // Instance methods + Napi::Value SetOpt(const Napi::CallbackInfo& info); + Napi::Value Close(const Napi::CallbackInfo& info); - public: - // js object constructor template - static Nan::Persistent constructor; + // Static methods + static Napi::Value StrError(const Napi::CallbackInfo& info); - // members + // Debug support + uint64_t GetDebugId() const { return id; } + + private: + // Private methods + void Dispose(); + + // Members CURLSH* sh; bool isOpen; + uint64_t id; - // export Easy to js - static NAN_MODULE_INIT(Initialize); + // Static members + static std::atomic nextId; - // js available methods - static NAN_METHOD(New); - static NAN_METHOD(SetOpt); - static NAN_METHOD(Close); - static NAN_METHOD(StrError); + // Prevent copying + Share(const Share& that) = delete; + Share& operator=(const Share& that) = delete; }; + } // namespace NodeLibcurl -#endif diff --git a/src/libcurl_compat.h b/src/libcurl_compat.h index eb435abc2..5cff98855 100644 --- a/src/libcurl_compat.h +++ b/src/libcurl_compat.h @@ -4,8 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -#ifndef NODELIBCURL_LIBCURL_COMPAT_H -#define NODELIBCURL_LIBCURL_COMPAT_H +#pragma once #include "macros.h" @@ -22,5 +21,3 @@ struct curl_index { size_t total; /* total number of entries to save */ }; #endif - -#endif diff --git a/src/macros.h b/src/macros.h index 0c12ae23f..24488b5ed 100644 --- a/src/macros.h +++ b/src/macros.h @@ -40,19 +40,6 @@ #define NODE_LIBCURL_VER_LE(MAJ, MIN, PAT) \ (LIBCURL_VERSION_NUM <= NODE_LIBCURL_MAKE_VERSION(MAJ, MIN, PAT)) -#if !defined(NODE_LIBCURL_NO_SETLOCALE) && !defined(_WIN32) -#define SETLOCALE_WRAPPER(code) \ - std::string localeOriginal = setlocale(LC_ALL, NULL); \ - bool hasLocaleChanged = false; \ - if (localeOriginal == "C") { \ - hasLocaleChanged = true; \ - setlocale(LC_ALL, ""); \ - } \ - code if (hasLocaleChanged) { setlocale(LC_ALL, localeOriginal.c_str()); } -#else -#define SETLOCALE_WRAPPER(code) code -#endif - #define THROW_ERROR_OR_SET_MULTI_CALLBACK_ERROR_IF_INSIDE_MULTI(typeError) \ if (obj->isInsideMultiHandle) { \ obj->callbackError.Reset(typeError); \ @@ -60,4 +47,36 @@ Nan::ThrowError(typeError); \ tryCatch.ReThrow(); \ } + +// Debug logging macros with zero runtime overhead when disabled +#ifdef NODE_LIBCURL_DEBUG +#include +#include +#include +#define NODE_LIBCURL_DEBUG_LOG(obj, message, extra) \ + do { \ + std::cout << "[thread: " << std::this_thread::get_id() \ + << "] [env: " << static_cast((obj)->Env()) \ + << "] [id: " << (obj)->GetDebugId() << "] " << message; \ + std::string extra_str(extra); \ + if (!extra_str.empty()) { \ + std::cout << " - " << extra_str; \ + } \ + std::cout << std::endl; \ + } while (0) + +#define NODE_LIBCURL_DEBUG_LOG_STATIC(env, message) \ + do { \ + std::cout << "[thread: " << std::this_thread::get_id() << "] [env: " << env << "] " << message \ + << std::endl; \ + } while (0) +#else +#define NODE_LIBCURL_DEBUG_LOG(obj, message, extra) \ + do { \ + } while (0) +#define NODE_LIBCURL_DEBUG_LOG_STATIC(env, message) \ + do { \ + } while (0) +#endif + #endif diff --git a/src/make_unique.h b/src/make_unique.h deleted file mode 100644 index 65f4d54a2..000000000 --- a/src/make_unique.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef NODELIBCURL_MAKEUNIQUE_H // NOLINT(legal/copyright) -#define NODELIBCURL_MAKEUNIQUE_H -#if defined(_MSC_VER) && _MSC_VER < 1800 - -// http://stackoverflow.com/a/13883981/710693 -#include // brings in TEMPLATE macros. - -#define _MAKE_UNIQUE(TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, X1, X2, X3, X4) \ - \ - template \ - inline std::unique_ptr make_unique(LIST(_TYPE_REFREF_ARG)) { \ - return std::unique_ptr(new T(LIST(_FORWARD_ARG))); \ - } - -_VARIADIC_EXPAND_0X(_MAKE_UNIQUE, , , , ) -#undef _MAKE_UNIQUE - -#elif __cplusplus == 201103L - -// http://isocpp.org/files/papers/N3656.txt -#include -#include -#include -#include - -namespace std { -template -struct _Unique_if { - typedef unique_ptr _Single_object; -}; - -template -struct _Unique_if { - typedef unique_ptr _Unknown_bound; -}; - -template -struct _Unique_if { - typedef void _Known_bound; -}; - -template -typename _Unique_if::_Single_object make_unique(Args&&... args) { - return unique_ptr(new T(std::forward(args)...)); -} - -template -typename _Unique_if::_Unknown_bound make_unique(size_t n) { - typedef typename remove_extent::type U; - return unique_ptr(new U[n]()); -} - -template -typename _Unique_if::_Known_bound make_unique(Args&&...) = delete; -} // namespace std - -#endif -#endif diff --git a/src/node_libcurl.cc b/src/node_libcurl.cc index 57f0a0d35..65fa9f3ae 100644 --- a/src/node_libcurl.cc +++ b/src/node_libcurl.cc @@ -1,6 +1,4 @@ #ifndef NOMINMAX -// Fix for: warning C4003: not enough arguments for function-like macro invocation 'max' -// [C:\projects\node-libcurl\build\node_libcurl.vcxproj] #define NOMINMAX #endif @@ -11,65 +9,31 @@ * LICENSE file in the root directory of this source tree. */ #include "Curl.h" -#include "CurlVersionInfo.h" -#include "Easy.h" -#include "Http2PushFrameHeaders.h" -#include "Multi.h" -#include "Share.h" +#include "macros.h" #include -#include -#include #include +#include +#include namespace NodeLibcurl { -static void AtExitCallback(void* arg) { - (void)arg; +// Module initialization function +Napi::Object InitAll(Napi::Env env, Napi::Object exports) { + // Note: Locale handling is done per-thread via LocaleGuard (see LocaleGuard.h) + // This ensures libcurl's libidn2 integration works without setting global locale. + // setlocale(AC_ALL, "") - curl_global_cleanup(); -} + NODE_LIBCURL_DEBUG_LOG_STATIC(static_cast(env), "NodeLibcurl::InitAll"); -NAN_MODULE_INIT(Init) { - // Some background story on this commented code and other usages of setlocale - // elsewhere on the addon: Libcurl, when built with libidn2, calls function - // `idn2_lookup_ul` to retrieve a punycode representation - // of a domain. This function internally uses libunistring - // `u8_strconv_from_encoding`, which expects an existing locale being set: - // https://github.com/libidn/libidn2/blob/02a3127d21f8a99042a8ae82f1513b3ffc0170f2/lib/lookup.c#L536 - // Node.js (correctly) does not set any locale by default, and so when this - // function gets called - // an error is returned, and libcurl bails out with MALFORMED URL error. - // We could just call setlocale here, like the commented code, and it would - // work, however this would - // impact addon users that, in some way, use locale. - // (I've opened this issue to make sure - // https://github.com/nodejs/help/issues/1878) Instead of doing that, we are - // instead calling setlocale on some specific parts of the code, to be - // more specific, on Easy#SetPerform, Multi#AddHandle and Multi#OnSocket - // That code is behind a DEFINE guard, which the user can disable by passing - // `node_libcurl_no_setlocale` option when building, this will define - // NODE_LIBCURL_NO_SETLOCALE. - // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=vs-2019 - // setlocale(AC_ALL, "") - Initialize(target); - Easy::Initialize(target); - Multi::Initialize(target); - Share::Initialize(target); - CurlVersionInfo::Initialize(target); - Http2PushFrameHeaders::Initialize(target); + InitializeCurlConstantMaps(); -#if NODE_VERSION_AT_LEAST(11, 0, 0) - auto context = Nan::GetCurrentContext(); - node::AtExit(node::GetCurrentEnvironment(context), AtExitCallback, NULL); -#else -// this will stay until Node.js v10 support is dropped -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - node::AtExit(AtExitCallback, NULL); -#pragma GCC diagnostic pop -#endif + Curl::Init(env, exports); + return exports; } -NODE_MODULE(node_libcurl, Init); +// Register the module with N-API +NODE_API_MODULE(node_libcurl, InitAll) + } // namespace NodeLibcurl diff --git a/test/curl/callbacks.spec.ts b/test/curl/callbacks.spec.ts index a0775b872..d85bd4051 100644 --- a/test/curl/callbacks.spec.ts +++ b/test/curl/callbacks.spec.ts @@ -5,8 +5,7 @@ * LICENSE file in the root directory of this source tree. */ import { createServer } from '../helper/server' -import { Curl, CurlCode } from '../../lib' -import { CurlPreReqFunc } from '../../lib/enum/CurlPreReqFunc' +import { Curl, CurlCode, CurlEasyError, CurlPreReqFunc } from '../../lib' import { describe, beforeAll, @@ -132,9 +131,18 @@ describe('Callbacks', () => { reject(new Error('end called - request was not aborted by request')) }) - curl.on('error', (error) => { - expect(error).toBeInstanceOf(TypeError) - resolve() + curl.on('error', (error: CurlEasyError, errorCode) => { + try { + expect(error).toBeInstanceOf(CurlEasyError) + expect((error.cause as Error).message).toMatch( + /Return value from the (.*) callback must be an integer/, + ) + expect(error.code).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + expect(error.code).toBe(errorCode) + resolve() + } catch (error) { + reject(error) + } }) curl.perform() @@ -168,25 +176,29 @@ describe('Callbacks', () => { await new Promise((resolve, reject) => { curl.on('end', (statusCode, body) => { - if (isFirstCall) { - expect(wasCalled).toBe(true) - expect(statusCode).toBe(200) - - curl.setOpt('URL', `${serverInstance.url}/trailers`) - curl.setOpt('UPLOAD', 0) - curl.setOpt('HTTPHEADER', null) - curl.setOpt('TRAILERFUNCTION', null) - - isFirstCall = false - wasCalled = false - - curl.perform() - } else { - expect(wasCalled).toBe(false) - expect( - JSON.parse(body as string).trailers['x-random-header'], - ).toBe('random-value2') - resolve() + try { + if (isFirstCall) { + expect(wasCalled).toBe(true) + expect(statusCode).toBe(200) + + curl.setOpt('URL', `${serverInstance.url}/trailers`) + curl.setOpt('UPLOAD', 0) + curl.setOpt('HTTPHEADER', null) + curl.setOpt('TRAILERFUNCTION', null) + + isFirstCall = false + wasCalled = false + + curl.perform() + } else { + expect(wasCalled).toBe(false) + expect( + JSON.parse(body as string).trailers['x-random-header'], + ).toBe('random-value2') + resolve() + } + } catch (error) { + reject(error) } }) @@ -219,8 +231,12 @@ describe('Callbacks', () => { }) curl.on('error', (error, errorCode) => { - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - resolve() + try { + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + resolve() + } catch (error) { + reject(error) + } }) curl.perform() @@ -250,10 +266,18 @@ describe('Callbacks', () => { reject(new Error('end called - request was not aborted by request')) }) - curl.on('error', (error, errorCode) => { - expect(error.message).toBe('thrown error inside callback') - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - resolve() + curl.on('error', (error: CurlEasyError, errorCode) => { + try { + expect(error).toBeInstanceOf(CurlEasyError) + expect((error.cause as Error).message).toBe( + 'thrown error inside callback', + ) + expect(error.code).toBe(errorCode) + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + resolve() + } catch (error) { + reject(error) + } }) curl.perform() @@ -283,12 +307,18 @@ describe('Callbacks', () => { reject(new Error('end called - request was not aborted by request')) }) - curl.on('error', (error, errorCode) => { - expect(error.message).toBe( - 'Return value from the Trailer callback must be an array of strings or false.', - ) - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - resolve() + curl.on('error', (error: CurlEasyError, errorCode) => { + try { + expect(error).toBeInstanceOf(CurlEasyError) + expect((error.cause as Error).message).toBe( + 'Return value from the Trailer callback must be an array of strings or false.', + ) + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + expect(error.code).toBe(errorCode) + resolve() + } catch (error) { + reject(error) + } }) curl.perform() @@ -311,8 +341,12 @@ describe('Callbacks', () => { await new Promise((resolve, reject) => { curl.on('end', () => { - expect(wasCalled).toBe(true) - resolve() + try { + expect(wasCalled).toBe(true) + resolve() + } catch (error) { + reject(error) + } }) curl.on('error', reject) @@ -336,9 +370,13 @@ describe('Callbacks', () => { }) curl.on('error', (_error, errorCode) => { - expect(wasCalled).toBe(true) - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - resolve() + try { + expect(wasCalled).toBe(true) + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + resolve() + } catch (error) { + reject(error) + } }) curl.perform() @@ -347,11 +385,12 @@ describe('Callbacks', () => { it('should rethrow error thrown inside callback', async () => { let wasCalled = false - + let errorObject!: Error curl.setOpt('URL', `${serverInstance.url}/headers`) curl.setOpt('PREREQFUNCTION', () => { wasCalled = true - throw new Error('thrown error inside callback') + errorObject = new Error('thrown error inside callback') + throw errorObject }) await new Promise((resolve, reject) => { @@ -359,11 +398,17 @@ describe('Callbacks', () => { reject(new Error('end called - request was not aborted by request')) }) - curl.on('error', (error, errorCode) => { - expect(wasCalled).toBe(true) - expect(error.message).toBe('thrown error inside callback') - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - resolve() + curl.on('error', (error: CurlEasyError, errorCode) => { + try { + expect(wasCalled).toBe(true) + expect(error).toBeInstanceOf(CurlEasyError) + expect(error.cause).toBe(errorObject) + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + expect(error.code).toBe(errorCode) + resolve() + } catch (error) { + reject(error) + } }) curl.perform() @@ -386,12 +431,17 @@ describe('Callbacks', () => { }) curl.on('error', (error, errorCode) => { - expect(wasCalled).toBe(true) - expect(error.message).toBe( - 'Return value from the PREREQ callback must be a number.', - ) - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - resolve() + try { + expect(wasCalled).toBe(true) + expect(error).toBeInstanceOf(CurlEasyError) + expect((error.cause as Error).message).toBe( + 'Return value from the PREREQ callback must be a number.', + ) + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + resolve() + } catch (error) { + reject(error) + } }) curl.perform() diff --git a/test/curl/curly.spec.ts b/test/curl/curly.spec.ts index cf670e658..3ee5707b6 100644 --- a/test/curl/curly.spec.ts +++ b/test/curl/curly.spec.ts @@ -10,6 +10,7 @@ import { curly } from '../../lib' import { createServer } from '../helper/server' import { allMethodsWithMultipleReqResTypes } from '../helper/commonRoutes' import { withCommonTestOptions } from '../helper/commonOptions' +import { CurlEasyError } from '../../lib/CurlEasyError' let serverInstance: ReturnType @@ -308,7 +309,9 @@ describe('curly', () => { curly.get(`${serverInstance.url}/abc`, { failOnError: true, }), - ).rejects.toThrow(/^HTTP response code said error/) + ).rejects.toThrowError( + new CurlEasyError('Request failed: HTTP response code said error', 22), + ) }) }) }) diff --git a/test/curl/dupHandle.spec.ts b/test/curl/dupHandle.spec.ts index 9534a915f..3963109b4 100644 --- a/test/curl/dupHandle.spec.ts +++ b/test/curl/dupHandle.spec.ts @@ -65,8 +65,8 @@ describe('dupHandle()', () => { }) afterEach(() => { - curl && curl.close() - duplicatedCurl && duplicatedCurl.close() + if (curl) curl.close() + if (duplicatedCurl) duplicatedCurl.close() }) beforeAll(async () => { diff --git a/test/curl/easy.spec.ts b/test/curl/easy.spec.ts index 9743c3b73..36da14987 100644 --- a/test/curl/easy.spec.ts +++ b/test/curl/easy.spec.ts @@ -4,24 +4,18 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -import { describe, beforeEach, afterEach, it, expect } from 'vitest' +import { describe, beforeEach, afterEach, it, expect, inject } from 'vitest' import { Curl, CurlCode, Easy, CurlHttpVersion } from '../../lib' import { withCommonTestOptions } from '../helper/commonOptions' -const url = 'http://example.com/' - -// This is the only test that does not uses a express server -// It makes a request to a live server, which can cause issues if there are network problems -// @TODO Run a server side by side with the test suite to remove the need to make a external request - let curl: Easy describe('easy', () => { beforeEach(() => { curl = new Easy() withCommonTestOptions(curl) - curl.setOpt('URL', url) + curl.setOpt('URL', inject('httpServerUrl')) }) afterEach(async () => { @@ -74,7 +68,7 @@ describe('easy', () => { it('READFUNCTION - should rethrow error', () => { const msg = `Error thrown on callback: ${Date.now()}` - curl.setOpt('URL', 'https://httpbin.org/put') + curl.setOpt('URL', inject('httpsServerUrl') + '/put') curl.setOpt('SSL_VERIFYPEER', false) curl.setOpt('UPLOAD', true) // @ts-ignore @@ -85,7 +79,7 @@ describe('easy', () => { }) it('READFUNCTION - should throw error if has invalid return type', () => { - curl.setOpt('URL', 'https://httpbin.org/put') + curl.setOpt('URL', inject('httpsServerUrl') + '/put') curl.setOpt('SSL_VERIFYPEER', false) curl.setOpt('UPLOAD', true) // @ts-ignore @@ -101,7 +95,7 @@ describe('easy', () => { 'TRAILERFUNCTION - should rethrow error', () => { const msg = `Error thrown on callback: ${Date.now()}` - curl.setOpt('URL', 'https://httpbin.org/put') + curl.setOpt('URL', inject('httpsServerUrl') + '/put') curl.setOpt('SSL_VERIFYPEER', false) curl.setOpt('UPLOAD', true) curl.setOpt('HTTPHEADER', ['x-random-header: random-value']) @@ -126,7 +120,7 @@ describe('easy', () => { it.runIf(Curl.isVersionGreaterOrEqualThan(7, 64, 0))( 'TRAILERFUNCTION - should throw error if has invalid return type', () => { - curl.setOpt('URL', 'https://httpbin.org/put') + curl.setOpt('URL', inject('httpsServerUrl') + '/put') curl.setOpt('SSL_VERIFYPEER', false) curl.setOpt('UPLOAD', true) curl.setOpt('HTTPHEADER', ['x-random-header: random-value']) diff --git a/test/curl/hsts.spec.ts b/test/curl/hsts.spec.ts index 5023c8ea7..099e83b47 100644 --- a/test/curl/hsts.spec.ts +++ b/test/curl/hsts.spec.ts @@ -5,11 +5,11 @@ * LICENSE file in the root directory of this source tree. */ import { describe, beforeEach, afterEach, it, expect } from 'vitest' -import tls from 'tls' import { Curl, CurlCode, + CurlEasyError, CurlHsts, CurlHstsCallback, CurlHstsCacheEntry, @@ -52,11 +52,6 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { curl = new Curl() withCommonTestOptions(curl) curl.setOpt('URL', url) - if (process.version.startsWith('v10.')) { - curl.setOpt('SSL_VERIFYPEER', false) - } else { - curl.setOpt('CAINFO_BLOB', tls.rootCertificates.join('\n')) - } }) afterEach(() => { @@ -138,9 +133,13 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { await new Promise((resolve, reject) => { curl.on('end', () => { - expect(cache).toHaveLength(0) - expect(hstsReadFunctionCallCount).toBe(initialCacheLength + 1) - resolve() + try { + expect(cache).toHaveLength(0) + expect(hstsReadFunctionCallCount).toBe(initialCacheLength + 1) + resolve() + } catch (error) { + reject(error) + } }) curl.on('error', reject) @@ -165,23 +164,31 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { await new Promise((resolve, reject) => { curl.on('end', () => { - const dupHandle = curl.dupHandle(false) - - // kill the original just to make sure we are not relying on memory from it - curl.close() - - dupHandle.on('end', () => { - // first two calls will be true, as it is realted for the first instance: - // 1: perform - // 2: duphandle - // the third call will be false, as the instance will not be === curl.handle, but === dupHandle.handle - expect(callsToHstsReadFunction).toEqual([true, true, false]) - - resolve() - }) - dupHandle.on('error', reject) - - dupHandle.perform() + try { + const dupHandle = curl.dupHandle(false) + + // kill the original just to make sure we are not relying on memory from it + curl.close() + + dupHandle.on('end', () => { + try { + // first two calls will be true, as it is realted for the first instance: + // 1: perform + // 2: duphandle + // the third call will be false, as the instance will not be === curl.handle, but === dupHandle.handle + expect(callsToHstsReadFunction).toEqual([true, true, false]) + + resolve() + } catch (error) { + reject(error) + } + }) + dupHandle.on('error', reject) + + dupHandle.perform() + } catch (error) { + reject(error) + } }) curl.on('error', reject) @@ -215,41 +222,45 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { await new Promise((resolve, reject) => { curl.on('end', () => { - // kill the handle so the cache is saved - this is a sync operation so everything will happen in a synchronous way - curl.close() - - expect(savedHstsCache).toHaveLength(originalHstsCache.length) - - // cache is already updated here - savedHstsCache.forEach((value, index) => { - const matchingHstsCache = originalHstsCache[index] - - expect(value.host).toBe(matchingHstsCache.host) - - // this one should be equal, as it should have been updated - if (value.host.indexOf('owasp') !== -1) { - expect(value.expire).toBeDefined() - expect(value.expire).not.toBe(matchingHstsCache.expire) - // should be false as this is what is returned from the domain - expect(value.includeSubDomains).toBe(true) - } else { - expect(value.expire).toBe(matchingHstsCache.expire || null) - expect(value.includeSubDomains).toBe( - matchingHstsCache.includeSubDomains || false, - ) - } - }) - - expect(savedCount).toEqual( - new Array(originalHstsCache.length) - .fill(null) - .map((_v, index, arr) => ({ - index, - total: arr.length, - })), - ) + try { + // kill the handle so the cache is saved - this is a sync operation so everything will happen in a synchronous way + curl.close() + + expect(savedHstsCache).toHaveLength(originalHstsCache.length) + + // cache is already updated here + savedHstsCache.forEach((value, index) => { + const matchingHstsCache = originalHstsCache[index] + + expect(value.host).toBe(matchingHstsCache.host) + + // this one should be equal, as it should have been updated + if (value.host.indexOf('owasp') !== -1) { + expect(value.expire).toBeDefined() + expect(value.expire).not.toBe(matchingHstsCache.expire) + // should be false as this is what is returned from the domain + expect(value.includeSubDomains).toBe(true) + } else { + expect(value.expire).toBe(matchingHstsCache.expire || null) + expect(value.includeSubDomains).toBe( + matchingHstsCache.includeSubDomains || false, + ) + } + }) + + expect(savedCount).toEqual( + new Array(originalHstsCache.length) + .fill(null) + .map((_v, index, arr) => ({ + index, + total: arr.length, + })), + ) - resolve() + resolve() + } catch (error) { + reject(error) + } }) curl.on('error', reject) @@ -279,17 +290,28 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { expire: false, }, { - host: 'a'.repeat(1024), + host: '{{TOO_LONG}}', }, ] const initialValuesLength = values.length // @ts-expect-error this should give an error because the values we are returning are not the ones HSTSREADFUNCTION expects - curl.setOpt('HSTSREADFUNCTION', function () { + curl.setOpt('HSTSREADFUNCTION', function ({ maxHostLengthBytes }) { hstsReadFunctionCallCount++ - return values.pop() ?? null + const result = values.pop() ?? null + + if ( + !!result && + typeof result === 'object' && + typeof result.host === 'string' && + result.host.includes('{{TOO_LONG}}') + ) { + result.host = 'a'.repeat(maxHostLengthBytes + 1) + } + + return result }) await new Promise((resolve, reject) => { @@ -317,12 +339,17 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { return } - expect(error.message).toMatch(/fix the HSTS callback/) - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - - expect(hstsReadFunctionCallCount).toBe(onErrorCallCount) + try { + expect((error.cause as Error).message).toMatch( + /fix the HSTS callback/, + ) + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + expect(hstsReadFunctionCallCount).toBe(onErrorCallCount) - curl.perform() + curl.perform() + } catch (error) { + reject(error) + } }) curl.perform() @@ -333,12 +360,12 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { curl.setOpt('HSTS_CTRL', CurlHsts.Enable) let hstsReadFunctionCallCount = 0 - - const errorMessage = 'Something went wrong' + let errorObject!: Error curl.setOpt('HSTSREADFUNCTION', function () { if (hstsReadFunctionCallCount++ === 0) { - throw new Error(errorMessage) + errorObject = new Error('Something went wrong') + throw errorObject } // this should never get here as the cb should not be called again if we find an error @@ -351,12 +378,17 @@ describe.runIf(Curl.isVersionGreaterOrEqualThan(7, 74, 0))('Callbacks', () => { }) curl.on('error', (error, errorCode) => { - expect(error.message).toBe(errorMessage) - expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + try { + expect(error).toBeInstanceOf(CurlEasyError) + expect(error.cause).toBe(errorObject) + expect(errorCode).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) - expect(hstsReadFunctionCallCount).toBe(1) + expect(hstsReadFunctionCallCount).toBe(1) - resolve() + resolve() + } catch (error) { + reject(error) + } }) curl.perform() diff --git a/test/curl/putUpload.spec.ts b/test/curl/putUpload.spec.ts index 19ce8f3c8..d1dbf8e1f 100644 --- a/test/curl/putUpload.spec.ts +++ b/test/curl/putUpload.spec.ts @@ -86,7 +86,9 @@ describe('Put Upload', () => { afterEach(() => { curl.close() - fs.unlinkSync(fileName) + if (fs.existsSync(fileName)) { + fs.unlinkSync(fileName) + } if (fs.existsSync(uploadLocation)) { fs.unlinkSync(uploadLocation) } diff --git a/test/curl/setOpt.spec.ts b/test/curl/setOpt.spec.ts index 0f61741a0..ab365aca6 100644 --- a/test/curl/setOpt.spec.ts +++ b/test/curl/setOpt.spec.ts @@ -84,7 +84,7 @@ describe('setOpt()', () => { try { // @ts-expect-error curl.setOpt(...optionTuple) - } catch (error) { + } catch { errorsCaught += 1 } } @@ -192,7 +192,7 @@ describe('setOpt()', () => { try { // @ts-ignore curl.setOpt('HTTPPOST', [{ name: arg }]) - } catch (error) { + } catch { invalidArgs = [...invalidArgs, arg === null ? 'null' : typeof arg] } } diff --git a/test/curl/streams.spec.ts b/test/curl/streams.spec.ts index 502a5b053..fc87011c8 100644 --- a/test/curl/streams.spec.ts +++ b/test/curl/streams.spec.ts @@ -9,7 +9,7 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' import { Readable } from 'stream' import crypto from 'crypto' -import { Curl, CurlCode, curly } from '../../lib' +import { Curl, CurlCode, CurlEasyError, curly } from '../../lib' import { createServer } from '../helper/server' import { allMethodsWithMultipleReqResTypes } from '../helper/commonRoutes' @@ -22,7 +22,8 @@ interface GetReadableStreamForBufferOptions { // @ts-ignore const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) -// 1mb +const UPLOAD_STREAM_HIGH_WATER_MARK = 1 * 1024 + const getRandomBuffer = (size: number = 1024 * 1024) => crypto.randomBytes(size) const getReadableStreamForBuffer = ( @@ -36,7 +37,7 @@ const getReadableStreamForBuffer = ( let canRead = true const stream = new Readable({ // this defaults to 16kb - highWaterMark: 4 * 1024, + highWaterMark: UPLOAD_STREAM_HIGH_WATER_MARK, async read(size) { if (!canRead) return @@ -90,11 +91,13 @@ const getUploadOptions = (curlyStreamUpload: Readable) => { return options } -const getDownloadOptions = () => ({ +/** + * The highWaterMark defaults to undefined, which means using the Node.js default value of 16kb. + * Here we are explicitly setting it to 4kb. + */ +const getDownloadOptions = (highWaterMark = 4 * 1024) => ({ curlyStreamResponse: true, - // This defaults to undefined, which means using the Node.js default value of 16kb. - // Here we are explicitly setting it to 4kb. - curlyStreamResponseHighWaterMark: 4 * 1024, + curlyStreamResponseHighWaterMark: highWaterMark, }) let randomBuffer: Buffer @@ -119,15 +122,40 @@ describe('streams', () => { describe('curly', () => { // libcurl versions older than this are not really reliable for streams usage. - it.runIf(Curl.isVersionGreaterOrEqualThan(7, 69, 1))( - 'works for uploading and downloading', - async () => { - const curlyStreamUpload = getReadableStreamForBuffer(randomBuffer, { + it.runIf(Curl.isVersionGreaterOrEqualThan(7, 69, 1)).each([ + { + highWaterMark: 1024 * 4, + bufferSize: 1024 * 32, + }, + { + highWaterMark: 1024 * 16, + bufferSize: 1024 * 16, + }, + { + highWaterMark: 1024 * 8, + bufferSize: 1024 * 1024, + }, + { + highWaterMark: 1024 * 4, + bufferSize: 'same', + }, + ])( + 'works for uploading and downloading with highWaterMark: $highWaterMark, bufferSize: $bufferSize', + async ({ highWaterMark, bufferSize }) => { + const bufferToUse = + bufferSize === 'same' + ? randomBuffer + : getRandomBuffer(bufferSize as number) + const path = + bufferSize === 'same' + ? '/all?type=put-upload' + : `/all?type=put-return-read` + const curlyStreamUpload = getReadableStreamForBuffer(bufferToUse, { filterDataToPush: async (pushIteration, data) => { - // we are waiting 1200 ms at the 5th iteration just to cause + // we are waiting a few ms on the 5th iteration just to cause // some pauses in the READFUNCTION if (pushIteration === 5) { - await sleep(1200) + await sleep(600) } return data @@ -139,10 +167,10 @@ describe('streams', () => { data: downloadStream, headers, } = await curly.put( - `${serverInstance.url}/all?type=put-upload`, + `${serverInstance.url}${path}`, withCommonTestOptions({ ...getUploadOptions(curlyStreamUpload), - ...getDownloadOptions(), + ...getDownloadOptions(highWaterMark), curlyProgressCallback() { return 0 }, @@ -150,12 +178,11 @@ describe('streams', () => { ) expect(statusCode).toBe(200) - expect(headers[headers.length - 1]['x-is-same-buffer']).toBe('0') - - // TODO: add snapshot testing for headers + if (bufferSize === 'same') { + expect(headers[headers.length - 1]['x-is-same-buffer']).toBe('true') + } // we cannot use async iterators here because we need to support Node.js v8 - return new Promise((resolve, reject) => { const acc: Buffer[] = [] let iteration = 0 @@ -164,10 +191,13 @@ describe('streams', () => { // some pauses in the PUSHFUNCTION downloadStream.on('data', (data) => { acc.push(data) + expect(data.length).toBeLessThanOrEqual(highWaterMark) if (iteration++ === 2) { downloadStream.pause() - setTimeout(() => downloadStream.resume(), 1200) + setTimeout(() => { + downloadStream.resume() + }, 1000) } }) @@ -176,9 +206,14 @@ describe('streams', () => { }) downloadStream.on('end', () => { - const finalBuffer = Buffer.concat(acc) - const result = finalBuffer.compare(randomBuffer) - expect(result).toBe(0) + try { + const finalBuffer = Buffer.concat(acc) + expect(finalBuffer.byteLength).toBe(bufferToUse.byteLength) + const result = finalBuffer.compare(bufferToUse) + expect(result).toBe(0) + } catch (error) { + reject(error) + } resolve(undefined) }) @@ -214,9 +249,13 @@ describe('streams', () => { }) downloadStream.on('end', () => { - const finalBuffer = Buffer.concat(acc) - expect(finalBuffer.byteLength).toBe(0) - resolve(undefined) + try { + const finalBuffer = Buffer.concat(acc) + expect(finalBuffer.byteLength).toBe(0) + resolve(undefined) + } catch (error) { + reject(error) + } }) downloadStream.on('error', (error) => { @@ -250,9 +289,13 @@ describe('streams', () => { }) downloadStream.on('end', () => { - const finalBuffer = Buffer.concat(acc) - expect(finalBuffer.byteLength).toBe(0) - resolve(undefined) + try { + const finalBuffer = Buffer.concat(acc) + expect(finalBuffer.byteLength).toBe(0) + resolve(undefined) + } catch (error) { + reject(error) + } }) downloadStream.on('error', (error) => { @@ -263,26 +306,28 @@ describe('streams', () => { it('returns an error when the upload stream throws an error', async () => { const errorMessage = 'custom error' + let errorObject!: Error const curlyStreamUpload = getReadableStreamForBuffer(randomBuffer, { async filterDataToPush(iteration, buffer) { if (iteration === 5) { - throw new Error(errorMessage) + errorObject = new Error(errorMessage) + throw errorObject } return buffer }, }) - await expect( - curly.put( + const error = await curly + .put( `${serverInstance.url}/all?type=put-upload`, withCommonTestOptions(getUploadOptions(curlyStreamUpload)), - ), - ).rejects.toMatchObject({ - message: errorMessage, - isCurlError: true, - code: CurlCode.CURLE_ABORTED_BY_CALLBACK, - }) + ) + .catch((error) => error) + + expect(error).toBeInstanceOf(CurlEasyError) + expect(error.cause).toBe(errorObject) + expect(error.code).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) }) it('returns an error when the upload stream is destroyed unexpectedly', async () => { @@ -296,40 +341,44 @@ describe('streams', () => { }, }) - await expect( - curly.put( + const error = await curly + .put( `${serverInstance.url}/all?type=put-upload`, withCommonTestOptions(getUploadOptions(curlyStreamUpload)), - ), - ).rejects.toMatchObject({ - message: 'Curl upload stream was unexpectedly destroyed', - isCurlError: true, - code: CurlCode.CURLE_ABORTED_BY_CALLBACK, - }) + ) + .catch((error) => error) + + expect(error).toBeInstanceOf(CurlEasyError) + expect(error.cause).toMatchInlineSnapshot( + `[Error: Curl upload stream was unexpectedly destroyed]`, + ) + expect(error.code).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) }) it('returns an error when the upload stream is destroyed unexpectedly with a specific error', async () => { const errorMessage = 'Custom error message' + let errorObject!: Error const curlyStreamUpload = getReadableStreamForBuffer(randomBuffer, { async filterDataToPush(iteration, buffer) { if (iteration === 5) { - curlyStreamUpload.destroy(new Error(errorMessage)) + errorObject = new Error(errorMessage) + curlyStreamUpload.destroy(errorObject) } return buffer }, }) - await expect( - curly.put( + const error = await curly + .put( `${serverInstance.url}/all?type=put-upload`, withCommonTestOptions(getUploadOptions(curlyStreamUpload)), - ), - ).rejects.toMatchObject({ - message: errorMessage, - isCurlError: true, - code: CurlCode.CURLE_ABORTED_BY_CALLBACK, - }) + ) + .catch((error) => error) + + expect(error).toBeInstanceOf(CurlEasyError) + expect(error.cause).toBe(errorObject) + expect(error.code).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) }) it('emits an error when the download stream is destroyed unexpectedly', async () => { @@ -355,13 +404,17 @@ describe('streams', () => { ) }) - downloadStream.on('error', (error) => { - expect(error).toMatchObject({ - message: 'Curl response stream was unexpectedly destroyed', - isCurlError: true, - code: CurlCode.CURLE_ABORTED_BY_CALLBACK, - }) - resolve(undefined) + downloadStream.on('error', (error: CurlEasyError) => { + try { + expect(error).toBeInstanceOf(CurlEasyError) + expect(error.cause).toMatchInlineSnapshot( + `[Error: Curl response stream was unexpectedly destroyed]`, + ) + expect(error.code).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + resolve(undefined) + } catch (error) { + reject(error) + } }) }) }) @@ -383,8 +436,10 @@ describe('streams', () => { // we cannot use async iterators here because we need to support Node.js v8 return new Promise((resolve, reject) => { + let errorObject!: Error downloadStream.on('data', () => { - downloadStream.destroy(new Error(errorMessage)) + errorObject = new Error(errorMessage) + downloadStream.destroy(errorObject) }) downloadStream.on('end', () => { @@ -393,13 +448,16 @@ describe('streams', () => { ) }) - downloadStream.on('error', (error) => { - expect(error).toMatchObject({ - message: errorMessage, - isCurlError: true, - code: CurlCode.CURLE_ABORTED_BY_CALLBACK, - }) - resolve(undefined) + downloadStream.on('error', (error: CurlEasyError) => { + try { + expect(error).toBeInstanceOf(CurlEasyError) + expect(error.cause).toBe(errorObject) + expect(error.code).toBe(CurlCode.CURLE_ABORTED_BY_CALLBACK) + + resolve(undefined) + } catch (error) { + reject(error) + } }) }) }) diff --git a/test/curl/websocket.spec.ts b/test/curl/websocket.spec.ts new file mode 100644 index 000000000..b5c244a77 --- /dev/null +++ b/test/curl/websocket.spec.ts @@ -0,0 +1,646 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** + * NOTE: These tests require the 'ws' package to be installed as a devDependency: + * pnpm add -D ws @types/ws + */ +import { describe, it, assert, expect, inject } from 'vitest' + +import { + Curl, + CurlCode, + Easy, + Multi, + CurlWs, + SocketState, + CurlReadFunc, + CurlPause, +} from '../../lib' +import { withCommonTestOptions } from '../helper/commonOptions' +import { setTimeout } from 'node:timers/promises' + +// WebSocket tests require libcurl >= 7.86.0 +const isWebSocketSupported = Curl.isVersionGreaterOrEqualThan(7, 86, 0) + +describe.runIf(isWebSocketSupported)( + 'WebSocket', + () => { + const getWsUrl = () => inject('wsServerUrl') + + describe('CONNECT_ONLY Mode', () => { + it('should send and receive text frames', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) // 2 for WebSocket + + // Establish connection + const performCode = easy.perform() + expect(performCode).toBe(CurlCode.CURLE_OK) + + // Send text frame + const message = Buffer.from('Hello WebSocket!') + const sendResult = easy.wsSend(message, CurlWs.Text) + + expect(sendResult.code).toBe(CurlCode.CURLE_OK) + expect(sendResult.bytesSent).toBe(message.length) + + // Receive echo response + const recvBuffer = Buffer.alloc(1024) + + let recvResult: ReturnType + + while (true) { + recvResult = easy.wsRecv(recvBuffer) + if (recvResult.code !== CurlCode.CURLE_AGAIN) { + break + } + await setTimeout(10) + } + + expect(recvResult.code).toBe(CurlCode.CURLE_OK) + expect(recvResult.bytesReceived).toBeGreaterThan(0) + expect(recvResult.meta).not.toBeNull() + + if (recvResult.meta) { + expect(recvResult.meta.flags & CurlWs.Text).not.toBe(0) + expect(recvResult.meta.bytesleft).toBe(0) // Complete frame + } + + const received = recvBuffer.toString( + 'utf8', + 0, + recvResult.bytesReceived, + ) + expect(received).toBe('Hello WebSocket!') + + easy.close() + }) + + it('should send and receive binary frames', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + + const performCode = easy.perform() + expect(performCode).toBe(CurlCode.CURLE_OK) + + // Send binary frame + const binaryData = Buffer.from([0x00, 0x01, 0x02, 0x03, 0xff]) + const sendResult = easy.wsSend(binaryData, CurlWs.Binary) + + expect(sendResult.code).toBe(CurlCode.CURLE_OK) + expect(sendResult.bytesSent).toBe(binaryData.length) + + // Receive echo + const recvBuffer = Buffer.alloc(1024) + let recvResult: ReturnType + while (true) { + recvResult = easy.wsRecv(recvBuffer) + if (recvResult.code !== CurlCode.CURLE_AGAIN) { + break + } + await setTimeout(10) + } + + expect(recvResult.code).toBe(CurlCode.CURLE_OK) + expect(recvResult.meta).not.toBeNull() + + if (recvResult.meta) { + expect(recvResult.meta.flags & CurlWs.Binary).not.toBe(0) + } + + const received = recvBuffer.slice(0, recvResult.bytesReceived) + expect(received).toEqual(binaryData) + + easy.close() + }) + + it('should handle close frames', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + + const performCode = easy.perform() + expect(performCode).toBe(CurlCode.CURLE_OK) + + // Send close frame + const closeResult = easy.wsSend(Buffer.alloc(0), CurlWs.Close) + expect(closeResult.code).toBe(CurlCode.CURLE_OK) + + easy.close() + }) + + it('should handle ping/pong frames', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + + const performCode = easy.perform() + expect(performCode).toBe(CurlCode.CURLE_OK) + + // Send ping frame + const pingData = Buffer.from('ping') + const sendResult = easy.wsSend(pingData, CurlWs.Ping) + expect(sendResult.code).toBe(CurlCode.CURLE_OK) + + // Note: libcurl may handle pong frames automatically + // We just verify that sending a ping doesn't cause errors + // The server will respond with a pong, but libcurl might handle it internally + + easy.close() + }) + + it('should provide correct frame metadata', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + + easy.perform() + + const message = Buffer.from('Test metadata') + easy.wsSend(message, CurlWs.Text) + + const recvBuffer = Buffer.alloc(1024) + await setTimeout(10) + + let recvResult: ReturnType + while (true) { + recvResult = easy.wsRecv(recvBuffer) + if (recvResult.code !== CurlCode.CURLE_AGAIN) { + break + } + await setTimeout(10) + } + + expect(recvResult.code).toBe(CurlCode.CURLE_OK) + expect(recvResult.meta).not.toBeNull() + expect(recvResult.meta).toMatchInlineSnapshot(` + { + "age": 0, + "bytesleft": 0, + "flags": 1, + "len": 13, + "offset": 0, + } + `) + + easy.close() + }) + + it('should handle fragmented messages with bytesleft', async () => { + // Create a large message that will be fragmented + const largeMessage = 'A'.repeat(100000) // 100KB message + + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + + const performCode = easy.perform() + expect(performCode).toBe(CurlCode.CURLE_OK) + + // Send large text frame + const message = Buffer.from(largeMessage) + const sendResult = easy.wsSend(message, CurlWs.Text) + expect(sendResult.code).toBe(CurlCode.CURLE_OK) + + // Receive fragmented response + const chunks: Buffer[] = [] + let totalBytesReceived = 0 + let fragmentCount = 0 + let lastBytesleft = -1 + + // Use a smaller buffer to force fragmentation handling + const recvBuffer = Buffer.alloc(16384) // 16KB buffer + + while (true) { + const recvResult = easy.wsRecv(recvBuffer) + + if (recvResult.code === CurlCode.CURLE_AGAIN) { + await setTimeout(10) + continue + } + + if (recvResult.code === CurlCode.CURLE_GOT_NOTHING) { + break + } + + expect(recvResult.code).toBe(CurlCode.CURLE_OK) + expect(recvResult.meta).not.toBeNull() + + if (recvResult.meta) { + fragmentCount++ + const bytesleft = recvResult.meta.bytesleft + + // bytesleft should decrease as we receive more fragments + if (lastBytesleft !== -1 && bytesleft > 0) { + expect(bytesleft).toBeLessThan(lastBytesleft) + } + lastBytesleft = bytesleft + + // Add received chunk + chunks.push( + Buffer.from(recvBuffer.slice(0, recvResult.bytesReceived)), + ) + totalBytesReceived += recvResult.bytesReceived + + // Last fragment should have bytesleft === 0 + if (bytesleft === 0) { + expect(recvResult.meta.flags & CurlWs.Text).not.toBe(0) + break + } + } + } + + // Verify we received the complete message + const reconstructed = Buffer.concat(chunks).toString('utf8') + expect(reconstructed).toBe(largeMessage) + expect(totalBytesReceived).toBe(message.length) + + // We should have received multiple fragments + expect(fragmentCount).toBeGreaterThan(1) + + easy.close() + }) + + it('should work with Multi handle', () => { + const easy = new Easy() + const multi = new Multi() + + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + + let connectionEstablished = false + let messageSent = false + let messageReceived = false + + return new Promise((resolve, reject) => { + // Handle socket events for async I/O + easy.onSocketEvent((error, events) => { + if (error) { + reject(error) + return + } + + const isWritable = events & SocketState.Writable + const isReadable = events & SocketState.Readable + + // Send when writable + if (isWritable && connectionEstablished && !messageSent) { + const message = Buffer.from('Multi test') + const sendResult = easy.wsSend(message, CurlWs.Text) + + expect(sendResult.code).toBe(CurlCode.CURLE_OK) + expect(sendResult.bytesSent).toBe(message.length) + messageSent = true + } + + // Receive when readable + if (isReadable && messageSent && !messageReceived) { + const buffer = Buffer.alloc(1024) + const recvResult = easy.wsRecv(buffer) + + expect(recvResult.code).toBe(CurlCode.CURLE_OK) + expect(recvResult.bytesReceived).toBeGreaterThan(0) + expect(recvResult.meta).not.toBeNull() + + const received = buffer.toString( + 'utf8', + 0, + recvResult.bytesReceived, + ) + expect(received).toBe('Multi test') + + messageReceived = true + + // Clean up + easy.unmonitorSocketEvents() + multi.removeHandle(easy) + multi.close() + easy.close() + + resolve() + } + }) + + // Handle connection + multi.onMessage((error) => { + if (error) { + reject(error) + return + } + + connectionEstablished = true + easy.monitorSocketEvents() + }) + + // Start connection + multi.addHandle(easy) + }) + }) + }) + + describe('wsMeta() in WRITEFUNCTION', () => { + it('should provide frame metadata in callback', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', `${getWsUrl()}/close-immediately`) + easy.setOpt('UPLOAD', 1) + easy.setOpt('CONNECT_ONLY', 0) + + const flags = [CurlWs.Text, CurlWs.Close] + + easy.setOpt('WRITEFUNCTION', (buffer, size, nmemb) => { + const meta = easy.wsMeta() + + assert(meta) + + expect(meta.flags).toBe(flags.shift()) + expect(meta.bytesleft).toBe(0) + + if (meta.flags & CurlWs.Close) { + easy.wsSend(Buffer.alloc(0), CurlWs.Close) + } + + return size * nmemb + }) + + easy.setOpt('READFUNCTION', () => { + return 0 + }) + + const performCode = easy.perform() + expect(performCode).toBe(CurlCode.CURLE_OK) + }) + + it('should work with Multi handle', () => { + const multi = new Multi() + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('UPLOAD', 1) + easy.setOpt('CONNECT_ONLY', 0) + + const flags = [ + // these are the messages we have below + CurlWs.Binary, + CurlWs.Binary, + // we send the third one as a Text! + CurlWs.Text, + // final closing frame + CurlWs.Close, + ] + + const messagesToSend = [ + Buffer.from('Hello'), + Buffer.from('World'), + Buffer.from('!'), + ] + + let shouldSendNextMessage = true + + easy.setOpt('WRITEFUNCTION', (buffer, size, nmemb) => { + const meta = easy.wsMeta() + + assert(meta) + + expect(meta.flags).toBe(flags.shift()) + expect(meta.bytesleft).toBe(0) + + if (messagesToSend.length > 0) { + setTimeout(10).then(() => { + easy.pause(CurlPause.Send) + }) + } + + return size * nmemb + }) + + easy.setOpt('READFUNCTION', (data) => { + if (!shouldSendNextMessage) { + return CurlReadFunc.Pause + } + + const message = messagesToSend.shift() + if (!message) { + shouldSendNextMessage = false + easy.wsStartFrame(CurlWs.Close, 0) + return 0 + } + + if (messagesToSend.length === 0) { + easy.wsStartFrame(CurlWs.Text, message.length) + } + + message.copy(data) + return message.length + }) + + return new Promise((resolve, reject) => { + multi.onMessage((error) => { + if (error) { + reject(error) + } + + resolve() + }) + + multi.addHandle(easy) + }) + }) + + it('should return null when not in WebSocket context', () => { + const easy = new Easy() + withCommonTestOptions(easy) + + // Not a WebSocket connection + const meta = easy.wsMeta() + expect(meta).toBeNull() + + easy.close() + }) + }) + + describe('Error handling', () => { + it('should handle closed handle', () => { + const easy = new Easy() + easy.close() + + expect(() => { + easy.wsSend(Buffer.from('test'), CurlWs.Text) + }).toThrow('Curl handle is closed') + + expect(() => { + easy.wsRecv(Buffer.alloc(100)) + }).toThrow('Curl handle is closed') + + expect(() => { + easy.wsMeta() + }).toThrow('Curl handle is closed') + }) + + it('should validate wsSend arguments', () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + easy.perform() + + // Missing arguments + expect(() => { + // @ts-expect-error - testing invalid args + easy.wsSend() + }).toThrow('Missing buffer') + + // Invalid buffer + expect(() => { + // @ts-expect-error - testing invalid args + easy.wsSend('not a buffer', CurlWs.Text) + }).toThrow('Invalid Buffer') + + // Missing flags + expect(() => { + // @ts-expect-error - testing invalid args + easy.wsSend(Buffer.from('test')) + }).toThrow('Missing') + + // Invalid flags type + expect(() => { + // @ts-expect-error - testing invalid args + easy.wsSend(Buffer.from('test'), 'not a number') + }).toThrow('must be a number') + + easy.close() + }) + + it('should validate wsRecv arguments', () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + easy.perform() + + // Missing buffer + expect(() => { + // @ts-expect-error - testing invalid args + easy.wsRecv() + }).toThrow('Missing buffer') + + // Invalid buffer + expect(() => { + // @ts-expect-error - testing invalid args + easy.wsRecv('not a buffer') + }).toThrow('Invalid Buffer') + + easy.close() + }) + + it('calling wsStartFrame outside of READFUNCTION is undefined behavior', () => { + const easy = new Easy() + const result = easy.wsStartFrame(CurlWs.Text, 0) + expect(result).not.toBe(CurlCode.CURLE_OK) + }) + }) + + describe('Frame types', () => { + it('should correctly identify text frames', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + easy.perform() + + easy.wsSend(Buffer.from('request'), CurlWs.Text) + + const buffer = Buffer.alloc(1024) + let result: ReturnType + while (true) { + result = easy.wsRecv(buffer) + if (result.code !== CurlCode.CURLE_AGAIN) { + break + } + await setTimeout(10) + } + + expect(result.meta).not.toBeNull() + if (result.meta) { + const isText = (result.meta.flags & CurlWs.Text) !== 0 + const isBinary = (result.meta.flags & CurlWs.Binary) !== 0 + + expect(isText).toBe(true) + expect(isBinary).toBe(false) + } + + easy.close() + }) + + it('should correctly identify binary frames', async () => { + const easy = new Easy() + withCommonTestOptions(easy) + easy.setOpt('URL', getWsUrl()) + easy.setOpt('CONNECT_ONLY', 2) + easy.perform() + + // Send binary data + const binaryData = Buffer.from([1, 2, 3, 4]) + easy.wsSend(binaryData, CurlWs.Binary) + + const buffer = Buffer.alloc(1024) + let result: ReturnType + while (true) { + result = easy.wsRecv(buffer) + if (result.code !== CurlCode.CURLE_AGAIN) { + break + } + await setTimeout(10) + } + + expect(result.meta).not.toBeNull() + if (result.meta) { + const isText = (result.meta.flags & CurlWs.Text) !== 0 + const isBinary = (result.meta.flags & CurlWs.Binary) !== 0 + + expect(isText).toBe(false) + expect(isBinary).toBe(true) + } + + easy.close() + }) + }) + }, + 10000, +) + +describe.skipIf(isWebSocketSupported)( + 'WebSocket - Version Check', + () => { + it('should throw error on old libcurl versions', () => { + const easy = new Easy() + + expect(() => { + easy.wsSend(Buffer.from('test'), CurlWs.Text) + }).toThrow('WebSocket support requires libcurl >= 7.86.0') + + expect(() => { + easy.wsRecv(Buffer.alloc(100)) + }).toThrow('WebSocket support requires libcurl >= 7.86.0') + + expect(() => { + easy.wsMeta() + }).toThrow('WebSocket support requires libcurl >= 7.86.0') + + easy.close() + }) + }, + 5000, +) diff --git a/test/globalSetup.ts b/test/globalSetup.ts new file mode 100644 index 000000000..011ef64d0 --- /dev/null +++ b/test/globalSetup.ts @@ -0,0 +1,88 @@ +/** + * Copyright (c) Jonathan Cardoso Machado. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import { + createServer, + createHttpsServer, + createWebSocketServer, +} from './helper/server' +import type { TestProject } from 'vitest/node' +let teardown = false + +export default async function setup({ provide }: TestProject) { + // Create HTTP server + const httpServer = createServer() + httpServer.app.get('/', (_req, res) => { + res.send('Hello World!') + }) + httpServer.app.put('/put', (req, res) => { + res.json({ success: true }) + }) + + // Create HTTPS server + const httpsServer = createHttpsServer() + httpsServer.app.get('/', (_req, res) => { + res.send('Hello World!') + }) + httpsServer.app.put('/put', (req, res) => { + res.json({ success: true }) + }) + + // Create WebSocket server with echo functionality + const wsServer = createWebSocketServer() + + // Setup WebSocket server to echo all messages with proper frame types + wsServer.wss!.on('connection', (ws, req) => { + const url = req.url + const fullUrl = `ws://${req.headers.host}${url}` + + if (fullUrl.includes('/close-immediately')) { + ws.send('Hello!') + ws.close() + return + } + + ws.on('message', (data, isBinary) => { + ws.send(data, { binary: isBinary }) + }) + + ws.on('ping', (data) => { + ws.pong(data) + }) + }) + + // Start servers + const httpPort = await httpServer.listen() + const httpsPort = await httpsServer.listen() + const wsPort = await wsServer.listen() + + // Provide server URLs to tests + provide('httpServerUrl', `http://localhost:${httpPort}`) + provide('httpsServerUrl', `https://localhost:${httpsPort}`) + provide('wsServerUrl', `ws://localhost:${wsPort}`) + + // Return teardown function + return async () => { + if (teardown) { + throw new Error('teardown called twice') + } + teardown = true + + await Promise.all([ + httpServer.close(), + httpsServer.close(), + wsServer.close(), + ]) + } +} + +declare module 'vitest' { + export interface ProvidedContext { + httpServerUrl: string + httpsServerUrl: string + wsServerUrl: string + } +} diff --git a/test/helper/commonRoutes.ts b/test/helper/commonRoutes.ts index 0acdfcb31..d24dbfb07 100644 --- a/test/helper/commonRoutes.ts +++ b/test/helper/commonRoutes.ts @@ -19,6 +19,20 @@ export const allMethodsWithMultipleReqResTypes = ( return res.redirect(301, '/all?type=redirect-a') case 'redirect-a': return res.redirect(301, '/all?type=json') + case 'put-return-read': + req.on('data', (chunk) => { + dataAcc.push(chunk) + }) + req.on('end', () => { + const data = Buffer.concat(dataAcc) + res + .set({ + 'content-type': 'application/octet-stream', + }) + .send(data) + .end() + }) + break case 'put-upload': req.on('data', (chunk) => { dataAcc.push(chunk) @@ -29,7 +43,7 @@ export const allMethodsWithMultipleReqResTypes = ( res .set({ 'content-type': 'application/octet-stream', - 'x-is-same-buffer': Buffer.compare(data, putUploadBuffer), + 'x-is-same-buffer': Buffer.compare(data, putUploadBuffer) === 0, }) .send(putUploadBuffer) .end() diff --git a/test/helper/server.ts b/test/helper/server.ts index 8e49ba2f1..05fb00ef5 100644 --- a/test/helper/server.ts +++ b/test/helper/server.ts @@ -14,6 +14,7 @@ import { AddressInfo } from 'net' import express from 'express' import cookieParser from 'cookie-parser' +import { WebSocketServer } from 'ws' const DEFAULT_HOST = 'localhost' @@ -41,6 +42,7 @@ export interface ServerInstance { path: (path: string) => string url: string port: number + wss?: WebSocketServer } function _createServer< @@ -124,3 +126,14 @@ export const createHttp2Server = (): ServerInstance => { return _createServer(app, server) } + +export const createWebSocketServer = (): ServerInstance => { + const app = createApp() + const server = http.createServer(app) + const wss = new WebSocketServer({ server }) + + const instance = _createServer(app, server) + instance.wss = wss + + return instance +} diff --git a/tools/.eslintrc b/tools/.eslintrc deleted file mode 100644 index 7753f32e7..000000000 --- a/tools/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "no-console": 0 - } -} diff --git a/tsan-suppressions.txt b/tsan-suppressions.txt new file mode 100644 index 000000000..d1669d777 --- /dev/null +++ b/tsan-suppressions.txt @@ -0,0 +1,26 @@ +# Suppress known false positives in V8/Node.js internals +# These are benign data races in V8's JIT compiler and garbage collector +# that are intentionally allowed for performance reasons + +# Broad V8 suppressions - catches all V8 internals and base libraries +race:^v8::internal:: +race:^v8::base:: + +# Specific V8 subsystems (kept for documentation) +race:^v8::internal::Scavenger +race:^v8::internal::ScavengerCollector +race:^v8::internal::baseline::BaselineBatchCompiler +race:^v8::internal::Malloced +race:^v8::base::RegionAllocator + +# V8 heap management +race:heap::base::Worklist + +# V8 cppgc (C++ garbage collector) heap registry +race:cppgc::internal::HeapRegistry + +# libuv thread creation +race:uv_thread_create + +# libuv worker threads +race:uv_thread_create_ex diff --git a/tsconfig.json b/tsconfig.json index b32171790..220704514 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,18 +4,15 @@ "paths": { "*": ["types/external/*"] }, "incremental": true, "module": "commonjs", - // Node.js >= 19 supports almost 100% of ES2018 (https://node.green/#ES2018) - "target": "es2018", - "lib": [ - "es2018", - // error Cannot find name 'AsyncIterable'. - "esnext.asynciterable" - ], + // Node.js >= 22 supports almost 100% of ES2024 (https://node.green/#ES2024) + "target": "esnext", + "lib": ["esnext"], "esModuleInterop": true, "declaration": true, "declarationMap": true, + "resolveJsonModule": true, "rootDir": "lib", - "outDir": "dist", + "outDir": "./dist", "sourceMap": true, "strict": true, "allowSyntheticDefaultImports": true, diff --git a/vcpkg b/vcpkg new file mode 160000 index 000000000..50c0cb48a --- /dev/null +++ b/vcpkg @@ -0,0 +1 @@ +Subproject commit 50c0cb48a0cf2f6fc5c7b2c0d2bafbe26d0a7ca2 diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json new file mode 100644 index 000000000..fc1c06a6f --- /dev/null +++ b/vcpkg-configuration.json @@ -0,0 +1,8 @@ +{ + "default-registry": { + "kind": "git", + "repository": "https://github.com/microsoft/vcpkg", + "baseline": "50c0cb48a0cf2f6fc5c7b2c0d2bafbe26d0a7ca2" + }, + "overlay-ports": ["./overlays"] +} diff --git a/vcpkg.template.json b/vcpkg.template.json new file mode 100644 index 000000000..7bdf18732 --- /dev/null +++ b/vcpkg.template.json @@ -0,0 +1,32 @@ +{ + "name": "node-libcurl", + "version-string": "$$NODE_LIBCURL_VERSION$$", + "dependencies": [ + { + "name": "curl", + "version>=": "8.17.0", + "features": [ + "brotli", + "c-ares", + "http2", + "http3", + "ldap", + "gsasl", + "idn", + "idn2", + "openssl", + "ssh", + "sspi", + "websockets", + "zstd", + "tool" + ] + } + ], + "overrides": [ + { + "name": "openssl", + "version": "$$OPENSSL_VERSION$$" + } + ] +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 000000000..492ac8d2b --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globalSetup: ['./test/globalSetup.ts'], + testTimeout: 60000, + }, +}) diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index f65f217b1..000000000 --- a/yarn.lock +++ /dev/null @@ -1,8766 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@babel/code-frame@7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/code-frame@^7.0.0": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.22.13": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/core@^7.7.5": - version "7.11.6" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" - integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.6" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.5" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.5" - "@babel/types" "^7.11.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.11.5", "@babel/generator@^7.11.6": - version "7.11.6" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" - integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== - dependencies: - "@babel/types" "^7.11.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== - dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.10.4", "@babel/parser@^7.11.5": - version "7.11.5" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" - integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== - -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5": - version "7.11.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" - integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.5" - "@babel/types" "^7.11.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5": - version "7.11.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" - integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@bconnorwhite/module@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@bconnorwhite/module/-/module-2.0.2.tgz#557846110bb89412e9689ac778358bc2b1af0c4a" - integrity sha512-ck1me5WMgZKp06gnJrVKEkytpehTTQbvsAMbF1nGPeHri/AZNhj87++PSE2LOxmZqM0EtGMaqeLdx7Lw7SUnTA== - dependencies: - find-up "^5.0.0" - read-json-safe "^1.0.5" - types-pkg-json "^1.1.0" - -"@commitlint/cli@18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.4.3.tgz#5b6112035f2cb17b76244cde5f1587ab853c2365" - integrity sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww== - dependencies: - "@commitlint/format" "^18.4.3" - "@commitlint/lint" "^18.4.3" - "@commitlint/load" "^18.4.3" - "@commitlint/read" "^18.4.3" - "@commitlint/types" "^18.4.3" - execa "^5.0.0" - lodash.isfunction "^3.0.9" - resolve-from "5.0.0" - resolve-global "1.0.0" - yargs "^17.0.0" - -"@commitlint/config-validator@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-18.4.3.tgz#cf71d36383cd5241e3b74097e7110514d5d43860" - integrity sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA== - dependencies: - "@commitlint/types" "^18.4.3" - ajv "^8.11.0" - -"@commitlint/ensure@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-18.4.3.tgz#1193a6418fe05edc8d5eff91f3129db345fa1d38" - integrity sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg== - dependencies: - "@commitlint/types" "^18.4.3" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - lodash.snakecase "^4.1.1" - lodash.startcase "^4.4.0" - lodash.upperfirst "^4.3.1" - -"@commitlint/execute-rule@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-18.4.3.tgz#4dca5412dc8fdeb4210432961f209d9eb65008f5" - integrity sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q== - -"@commitlint/format@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-18.4.3.tgz#3478bc2980eb178e13881834e290f12362ec6357" - integrity sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ== - dependencies: - "@commitlint/types" "^18.4.3" - chalk "^4.1.0" - -"@commitlint/is-ignored@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-18.4.3.tgz#443e1791af9a13a62299c54f836ad25da42f2663" - integrity sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg== - dependencies: - "@commitlint/types" "^18.4.3" - semver "7.5.4" - -"@commitlint/lint@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-18.4.3.tgz#1c5a912c2c3785e21d499821c4b70c58ff9a2cfb" - integrity sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA== - dependencies: - "@commitlint/is-ignored" "^18.4.3" - "@commitlint/parse" "^18.4.3" - "@commitlint/rules" "^18.4.3" - "@commitlint/types" "^18.4.3" - -"@commitlint/load@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-18.4.3.tgz#de156698ddf6e9719ecc49159890834490f61bff" - integrity sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q== - dependencies: - "@commitlint/config-validator" "^18.4.3" - "@commitlint/execute-rule" "^18.4.3" - "@commitlint/resolve-extends" "^18.4.3" - "@commitlint/types" "^18.4.3" - "@types/node" "^18.11.9" - chalk "^4.1.0" - cosmiconfig "^8.3.6" - cosmiconfig-typescript-loader "^5.0.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - resolve-from "^5.0.0" - -"@commitlint/message@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-18.4.3.tgz#1e0985ae7c751a620f01b2cfe8f0e875354805e2" - integrity sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how== - -"@commitlint/parse@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-18.4.3.tgz#f96515b0fa9b7a05dca52be8b214ab50eadfd9c9" - integrity sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA== - dependencies: - "@commitlint/types" "^18.4.3" - conventional-changelog-angular "^7.0.0" - conventional-commits-parser "^5.0.0" - -"@commitlint/read@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-18.4.3.tgz#269fb814bb914bf23c8719690bd01c9ad4a6c09a" - integrity sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ== - dependencies: - "@commitlint/top-level" "^18.4.3" - "@commitlint/types" "^18.4.3" - fs-extra "^11.0.0" - git-raw-commits "^2.0.11" - minimist "^1.2.6" - -"@commitlint/resolve-extends@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-18.4.3.tgz#741c42381ea48f4624209bfc0da0a15b5fba75b5" - integrity sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw== - dependencies: - "@commitlint/config-validator" "^18.4.3" - "@commitlint/types" "^18.4.3" - import-fresh "^3.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - resolve-global "^1.0.0" - -"@commitlint/rules@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-18.4.3.tgz#2ae1f16ea1ede20e01ca81ad187fdc65ccc9a5f1" - integrity sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA== - dependencies: - "@commitlint/ensure" "^18.4.3" - "@commitlint/message" "^18.4.3" - "@commitlint/to-lines" "^18.4.3" - "@commitlint/types" "^18.4.3" - execa "^5.0.0" - -"@commitlint/to-lines@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-18.4.3.tgz#b6cac1eff3d93f0791791a9f8db7b13c6136a350" - integrity sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ== - -"@commitlint/top-level@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-18.4.3.tgz#f4c6fb8ab98de9240c3ed3e4b330d8c50a0fee3a" - integrity sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw== - dependencies: - find-up "^5.0.0" - -"@commitlint/types@^18.4.3": - version "18.4.3" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-18.4.3.tgz#bb50de49330ddff2adcc8ccabb840c8e660336b3" - integrity sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA== - dependencies: - chalk "^4.1.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@electron/get@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" - integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^11.8.5" - progress "^2.0.3" - semver "^6.2.0" - sumchecker "^3.0.1" - optionalDependencies: - global-agent "^3.0.0" - -"@electron/node-gyp@https://github.com/electron/node-gyp#06b29aafb7708acef8b3669835c8a7857ebc92d2": - version "10.2.0-electron.1" - resolved "https://github.com/electron/node-gyp#06b29aafb7708acef8b3669835c8a7857ebc92d2" - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^8.1.0" - graceful-fs "^4.2.6" - make-fetch-happen "^10.2.1" - nopt "^6.0.0" - proc-log "^2.0.1" - semver "^7.3.5" - tar "^6.2.1" - which "^2.0.2" - -"@electron/rebuild@^3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.7.1.tgz#27ed124f7f1dbed92b222aabe68c0e4a3e6c5cea" - integrity sha512-sKGD+xav4Gh25+LcLY0rjIwcCFTw+f/HU1pB48UVbwxXXRGaXEqIH0AaYKN46dgd/7+6kuiDXzoyAEvx1zCsdw== - dependencies: - "@electron/node-gyp" "https://github.com/electron/node-gyp#06b29aafb7708acef8b3669835c8a7857ebc92d2" - "@malept/cross-spawn-promise" "^2.0.0" - chalk "^4.0.0" - debug "^4.1.1" - detect-libc "^2.0.1" - fs-extra "^10.0.0" - got "^11.7.0" - node-abi "^3.45.0" - node-api-version "^0.2.0" - ora "^5.1.0" - read-binary-file-arch "^1.0.6" - semver "^7.3.5" - tar "^6.0.5" - yargs "^17.0.1" - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.55.0.tgz#b721d52060f369aa259cf97392403cb9ce892ec6" - integrity sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA== - -"@fimbul/bifrost@^0.21.0": - version "0.21.0" - resolved "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.21.0.tgz#d0fafa25938fda475657a6a1e407a21bbe02c74e" - integrity sha512-ou8VU+nTmOW1jeg+FT+sn+an/M0Xb9G16RucrfhjXGWv1Q97kCoM5CG9Qj7GYOSdu7km72k7nY83Eyr53Bkakg== - dependencies: - "@fimbul/ymir" "^0.21.0" - get-caller-file "^2.0.0" - tslib "^1.8.1" - tsutils "^3.5.0" - -"@fimbul/ymir@^0.21.0": - version "0.21.0" - resolved "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.21.0.tgz#8525726787aceeafd4e199472c0d795160b5d4a1" - integrity sha512-T/y7WqPsm4n3zhT08EpB5sfdm2Kvw3gurAxr2Lr5dQeLi8ZsMlNT/Jby+ZmuuAAd1PnXYzKp+2SXgIkQIIMCUg== - dependencies: - inversify "^5.0.0" - reflect-metadata "^0.1.12" - tslib "^1.8.1" - -"@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@gerrit0/mini-shiki@^1.24.0": - version "1.24.4" - resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-1.24.4.tgz#e5328ca0dccc094460c03701d62158137a5a2eda" - integrity sha512-YEHW1QeAg6UmxEmswiQbOVEg1CW22b1XUD/lNTliOsu0LD0wqoyleFMnmbTp697QE0pcadQiR5cVtbbAPncvpw== - dependencies: - "@shikijs/engine-oniguruma" "^1.24.2" - "@shikijs/types" "^1.24.2" - "@shikijs/vscode-textmate" "^9.3.1" - -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== - dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@ljharb/through@^2.3.11": - version "2.3.11" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.11.tgz#783600ff12c06f21a76cc26e33abd0b1595092f9" - integrity sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w== - dependencies: - call-bind "^1.0.2" - -"@malept/cross-spawn-promise@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" - integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== - dependencies: - cross-spawn "^7.0.1" - -"@mapbox/node-pre-gyp@1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" - integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - -"@microsoft/api-documenter@7.23.12": - version "7.23.12" - resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.23.12.tgz#ca01da3c790709220fb9a9158ba7ec8148ca2e54" - integrity sha512-ZFQGHNs8fSe3KoSCNa+jt/HLTN8IdTRGd0TZqmSeHpz2cSvUYHJeyQKhv8s7yi2flr1LezBq5/ig65ITZPSSqw== - dependencies: - "@microsoft/api-extractor-model" "7.28.2" - "@microsoft/tsdoc" "0.14.2" - "@rushstack/node-core-library" "3.61.0" - "@rushstack/ts-command-line" "4.17.1" - colors "~1.2.1" - js-yaml "~3.13.1" - resolve "~1.22.1" - -"@microsoft/api-extractor-model@7.28.2": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.28.2.tgz#91c66dd820ccc70e0c163e06b392d8363f1b9269" - integrity sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig== - dependencies: - "@microsoft/tsdoc" "0.14.2" - "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.61.0" - -"@microsoft/api-extractor@7.38.3": - version "7.38.3" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.38.3.tgz#2b0157d166c1a23642e22d139c7b7b39ad6340fd" - integrity sha512-xt9iYyC5f39281j77JTA9C3ISJpW1XWkCcnw+2vM78CPnro6KhPfwQdPDfwS5JCPNuq0grm8cMdPUOPvrchDWw== - dependencies: - "@microsoft/api-extractor-model" "7.28.2" - "@microsoft/tsdoc" "0.14.2" - "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.61.0" - "@rushstack/rig-package" "0.5.1" - "@rushstack/ts-command-line" "4.17.1" - colors "~1.2.1" - lodash "~4.17.15" - resolve "~1.22.1" - semver "~7.5.4" - source-map "~0.6.1" - typescript "~5.0.4" - -"@microsoft/tsdoc-config@~0.16.1": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz#b786bb4ead00d54f53839a458ce626c8548d3adf" - integrity sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw== - dependencies: - "@microsoft/tsdoc" "0.14.2" - ajv "~6.12.6" - jju "~1.4.0" - resolve "~1.19.0" - -"@microsoft/tsdoc@0.14.2": - version "0.14.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" - integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== - dependencies: - "@nodelib/fs.scandir" "2.1.3" - fastq "^1.6.0" - -"@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/agent@^2.0.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.0.tgz#e81f00fdb2a670750ff7731bbefb47ecbf0ccf44" - integrity sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q== - dependencies: - agent-base "^7.1.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.1" - lru-cache "^10.0.1" - socks-proxy-agent "^8.0.1" - -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== - dependencies: - "@gar/promisify" "^1.1.3" - semver "^7.3.5" - -"@npmcli/fs@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" - integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== - dependencies: - semver "^7.3.5" - -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@octokit/auth-token@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" - integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== - -"@octokit/core@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.2.tgz#ae7c5d61fdd98ba348a27c3cc510879a130b1234" - integrity sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg== - dependencies: - "@octokit/auth-token" "^4.0.0" - "@octokit/graphql" "^7.0.0" - "@octokit/request" "^8.0.2" - "@octokit/request-error" "^5.0.0" - "@octokit/types" "^12.0.0" - before-after-hook "^2.2.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^9.0.0": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.4.tgz#8afda5ad1ffc3073d08f2b450964c610b821d1ea" - integrity sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw== - dependencies: - "@octokit/types" "^12.0.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^7.0.0": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.0.2.tgz#3df14b9968192f9060d94ed9e3aa9780a76e7f99" - integrity sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q== - dependencies: - "@octokit/request" "^8.0.1" - "@octokit/types" "^12.0.0" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^19.1.0": - version "19.1.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" - integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== - -"@octokit/plugin-paginate-rest@^9.0.0": - version "9.1.5" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz#1705bcef4dcde1f4015ee58a63dc61b68648f480" - integrity sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg== - dependencies: - "@octokit/types" "^12.4.0" - -"@octokit/plugin-request-log@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz#260fa6970aa97bbcbd91f99f3cd812e2b285c9f1" - integrity sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA== - -"@octokit/plugin-rest-endpoint-methods@^10.0.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz#eeaa4de97a2ae26404dea30ce3e17b11928e027c" - integrity sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q== - dependencies: - "@octokit/types" "^12.3.0" - -"@octokit/request-error@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.1.tgz#277e3ce3b540b41525e07ba24c5ef5e868a72db9" - integrity sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ== - dependencies: - "@octokit/types" "^12.0.0" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^8.0.1", "@octokit/request@^8.0.2": - version "8.1.6" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.6.tgz#a76a859c30421737a3918b40973c2ff369009571" - integrity sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ== - dependencies: - "@octokit/endpoint" "^9.0.0" - "@octokit/request-error" "^5.0.0" - "@octokit/types" "^12.0.0" - universal-user-agent "^6.0.0" - -"@octokit/rest@^20.0.2": - version "20.0.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.0.2.tgz#5cc8871ba01b14604439049e5f06c74b45c99594" - integrity sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ== - dependencies: - "@octokit/core" "^5.0.0" - "@octokit/plugin-paginate-rest" "^9.0.0" - "@octokit/plugin-request-log" "^4.0.0" - "@octokit/plugin-rest-endpoint-methods" "^10.0.0" - -"@octokit/types@^12.0.0", "@octokit/types@^12.3.0", "@octokit/types@^12.4.0": - version "12.4.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.4.0.tgz#8f97b601e91ce6b9776ed8152217e77a71be7aac" - integrity sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ== - dependencies: - "@octokit/openapi-types" "^19.1.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pkgr/utils@^2.3.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" - -"@pnpm/config.env-replace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" - integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== - -"@pnpm/network.ca-file@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" - integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== - dependencies: - graceful-fs "4.2.10" - -"@pnpm/npm-conf@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== - dependencies: - "@pnpm/config.env-replace" "^1.1.0" - "@pnpm/network.ca-file" "^1.0.1" - config-chain "^1.1.11" - -"@rollup/rollup-android-arm-eabi@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz#462e7ecdd60968bc9eb95a20d185e74f8243ec1b" - integrity sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ== - -"@rollup/rollup-android-arm64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz#78a2b8a8a55f71a295eb860a654ae90a2b168f40" - integrity sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA== - -"@rollup/rollup-darwin-arm64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz#5b783af714f434f1e66e3cdfa3817e0b99216d84" - integrity sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q== - -"@rollup/rollup-darwin-x64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz#f72484e842521a5261978034e18e20f778a2850d" - integrity sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w== - -"@rollup/rollup-freebsd-arm64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz#3c919dff72b2fe344811a609c674a8347b033f62" - integrity sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ== - -"@rollup/rollup-freebsd-x64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz#b62a3a8365b363b3fdfa6da11a9188b6ab4dca7c" - integrity sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA== - -"@rollup/rollup-linux-arm-gnueabihf@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz#0d02cc55bd229bd8ca5c54f65f916ba5e0591c94" - integrity sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w== - -"@rollup/rollup-linux-arm-musleabihf@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz#c51d379263201e88a60e92bd8e90878f0c044425" - integrity sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg== - -"@rollup/rollup-linux-arm64-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz#93ce2addc337b5cfa52b84f8e730d2e36eb4339b" - integrity sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg== - -"@rollup/rollup-linux-arm64-musl@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz#730af6ddc091a5ba5baac28a3510691725dc808b" - integrity sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz#b5565aac20b4de60ca1e557f525e76478b5436af" - integrity sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ== - -"@rollup/rollup-linux-riscv64-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz#d488290bf9338bad4ae9409c4aa8a1728835a20b" - integrity sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g== - -"@rollup/rollup-linux-s390x-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz#eb2e3f3a06acf448115045c11a5a96868c95a556" - integrity sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw== - -"@rollup/rollup-linux-x64-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz#065952ef2aea7e837dc7e02aa500feeaff4fc507" - integrity sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw== - -"@rollup/rollup-linux-x64-musl@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz#3435d484d05f5c4d1ffd54541b4facce2887103a" - integrity sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw== - -"@rollup/rollup-win32-arm64-msvc@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz#69682a2a10d9fedc334f87583cfca83c39c08077" - integrity sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg== - -"@rollup/rollup-win32-ia32-msvc@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz#b64470f9ac79abb386829c56750b9a4711be3332" - integrity sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A== - -"@rollup/rollup-win32-x64-msvc@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz#cb313feef9ac6e3737067fdf34f42804ac65a6f2" - integrity sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ== - -"@rushstack/node-core-library@3.61.0": - version "3.61.0" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.61.0.tgz#7441a0d2ae5268b758a7a49588a78cd55af57e66" - integrity sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ== - dependencies: - colors "~1.2.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.22.1" - semver "~7.5.4" - z-schema "~5.0.2" - -"@rushstack/rig-package@0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.1.tgz#6c9c283cc96b5bb1eae9875946d974ac5429bb21" - integrity sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA== - dependencies: - resolve "~1.22.1" - strip-json-comments "~3.1.1" - -"@rushstack/ts-command-line@4.17.1": - version "4.17.1" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz#c78db928ce5b93f2e98fd9e14c24f3f3876e57f1" - integrity sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg== - dependencies: - "@types/argparse" "1.0.38" - argparse "~1.0.9" - colors "~1.2.1" - string-argv "~0.3.1" - -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== - dependencies: - any-observable "^0.3.0" - -"@shikijs/engine-oniguruma@^1.24.2": - version "1.24.4" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.4.tgz#6adc430ddf247eeed155d8a41883e36160f302cf" - integrity sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw== - dependencies: - "@shikijs/types" "1.24.4" - "@shikijs/vscode-textmate" "^9.3.1" - -"@shikijs/types@1.24.4", "@shikijs/types@^1.24.2": - version "1.24.4" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.24.4.tgz#06ec8975732b68508f8423b01a5649eef8d9cea3" - integrity sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA== - dependencies: - "@shikijs/vscode-textmate" "^9.3.1" - "@types/hast" "^3.0.4" - -"@shikijs/vscode-textmate@^9.3.1": - version "9.3.1" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz#afda31f8f42cab70a26f3603f52eae3f1c35d2f7" - integrity sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g== - -"@sindresorhus/is@^4.0.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@sindresorhus/is@^5.2.0", "@sindresorhus/is@^5.3.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" - integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/argparse@1.0.38": - version "1.0.38" - resolved "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" - integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== - -"@types/body-parser@*": - version "1.19.0" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" - integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/body-parser@1.19.5": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/cacheable-request@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" - integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "*" - "@types/node" "*" - "@types/responselike" "*" - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/connect@*": - version "3.4.33" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" - integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== - dependencies: - "@types/node" "*" - -"@types/cookie-parser@1.4.8": - version "1.4.8" - resolved "https://registry.yarnpkg.com/@types/cookie-parser/-/cookie-parser-1.4.8.tgz#d2215e7915f624fbfe4233da8f063f511679f1f3" - integrity sha512-l37JqFrOJ9yQfRQkljb41l0xVphc7kg5JTjjr+pLRZ0IyZ49V4BQ8vbF4Ut2C2e+WH4al3xD3ZwYwIUfnbT4NQ== - -"@types/estree@1.0.6", "@types/estree@^1.0.0": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/express-serve-static-core@*": - version "4.17.3" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.3.tgz#dc8068ee3e354d7fba69feb86b3dfeee49b10f09" - integrity sha512-sHEsvEzjqN+zLbqP+8OXTipc10yH1QLR+hnr5uw29gi9AhCAAAdri8ClNV7iMdrJrIzXIQtlkPvq8tJGhj3QJQ== - dependencies: - "@types/node" "*" - "@types/range-parser" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.17.39" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" - integrity sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@4.17.21": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/formidable@3.4.5": - version "3.4.5" - resolved "https://registry.yarnpkg.com/@types/formidable/-/formidable-3.4.5.tgz#8e45c053cac5868e2b71cc7410e2bd92872f6b9c" - integrity sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ== - dependencies: - "@types/node" "*" - -"@types/hast@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/http-cache-semantics@*": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" - integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== - -"@types/http-cache-semantics@^4.0.2": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - -"@types/json-schema@^7.0.12": - version "7.0.14" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" - integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/keyv@*": - version "3.1.1" - resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" - integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== - dependencies: - "@types/node" "*" - -"@types/mime@*": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" - integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== - -"@types/mime@^1": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" - integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== - -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= - -"@types/node@*": - version "13.11.0" - resolved "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" - integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== - -"@types/node@20.10.3": - version "20.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.3.tgz#4900adcc7fc189d5af5bb41da8f543cea6962030" - integrity sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg== - dependencies: - undici-types "~5.26.4" - -"@types/node@^18.11.9": - version "18.19.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.2.tgz#865107157bda220eef9fa8c2173152d6559a41ae" - integrity sha512-6wzfBdbWpe8QykUkXBjtmO3zITA0A3FIjoy+in0Y2K4KrCiRhNYJIdwAPDffZ3G6GnaKaSLSEa9ZuORLfEoiwg== - dependencies: - undici-types "~5.26.4" - -"@types/node@^20.9.0": - version "20.17.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.10.tgz#3f7166190aece19a0d1d364d75c8b0b5778c1e18" - integrity sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA== - dependencies: - undici-types "~6.19.2" - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/normalize-package-data@^2.4.3": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/qs@*": - version "6.9.1" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz#937fab3194766256ee09fcd40b781740758617e7" - integrity sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw== - -"@types/range-parser@*": - version "1.2.3" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== - -"@types/responselike@*": - version "1.0.0" - resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - -"@types/responselike@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" - integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== - dependencies: - "@types/node" "*" - -"@types/semver@^7.5.0": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" - integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== - -"@types/send@*": - version "0.17.3" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" - integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.13.3" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1" - integrity sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g== - dependencies: - "@types/express-serve-static-core" "*" - "@types/mime" "*" - -"@types/unist@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/yauzl@^2.9.1": - version "2.10.3" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" - integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz#f98bd887bf95551203c917e734d113bf8d527a0c" - integrity sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/type-utils" "6.13.1" - "@typescript-eslint/utils" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.4" - natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/parser@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.13.1.tgz#29d6d4e5fab4669e58bc15f6904b67da65567487" - integrity sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ== - dependencies: - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/typescript-estree" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz#58c7c37c6a957d3d9f59bc4f64c2888e0cac1d70" - integrity sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - -"@typescript-eslint/type-utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz#e6e5885e387841cae9c38fc0638fd8b7561973d6" - integrity sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ== - dependencies: - "@typescript-eslint/typescript-estree" "6.13.1" - "@typescript-eslint/utils" "6.13.1" - debug "^4.3.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/types@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.13.1.tgz#b56f26130e7eb8fa1e429c75fb969cae6ad7bb5c" - integrity sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg== - -"@typescript-eslint/typescript-estree@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz#d01dda78d2487434d1c503853fa00291c566efa4" - integrity sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.13.1.tgz#925b3a2453a71ada914ae329b7bb7e7d96634b2f" - integrity sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/typescript-estree" "6.13.1" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz#c4b692dcc23a4fc60685b718f10fde789d65a540" - integrity sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vitest/expect@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" - integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== - dependencies: - "@vitest/spy" "2.1.8" - "@vitest/utils" "2.1.8" - chai "^5.1.2" - tinyrainbow "^1.2.0" - -"@vitest/mocker@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" - integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== - dependencies: - "@vitest/spy" "2.1.8" - estree-walker "^3.0.3" - magic-string "^0.30.12" - -"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" - integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== - dependencies: - tinyrainbow "^1.2.0" - -"@vitest/runner@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" - integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== - dependencies: - "@vitest/utils" "2.1.8" - pathe "^1.1.2" - -"@vitest/snapshot@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" - integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== - dependencies: - "@vitest/pretty-format" "2.1.8" - magic-string "^0.30.12" - pathe "^1.1.2" - -"@vitest/spy@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" - integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== - dependencies: - tinyspy "^3.0.2" - -"@vitest/utils@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" - integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== - dependencies: - "@vitest/pretty-format" "2.1.8" - loupe "^3.1.2" - tinyrainbow "^1.2.0" - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abbrev@1, abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== - -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== - dependencies: - debug "^4.3.4" - -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -aggregate-error@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" - integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== - dependencies: - clean-stack "^4.0.0" - indent-string "^5.0.0" - -ajv@^6.12.4: - version "6.12.5" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" - integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.11.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@~6.12.6: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -all-package-names@^2.0.2: - version "2.0.787" - resolved "https://registry.yarnpkg.com/all-package-names/-/all-package-names-2.0.787.tgz#0831ff2d8d8489d63b29666d476fea73fe09961c" - integrity sha512-OqqOikS5pngZYkQRleWa9OW7jXJiPnGWsbJMGkg+6tSqhX8Sd2Nbpig0KXiQ9dXodCIzzxvbH7F6EI0dgRcMPA== - dependencies: - commander-version "^1.1.0" - p-lock "^2.0.0" - parse-json-object "^2.0.1" - progress "^2.0.3" - types-json "^1.2.2" - -ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - -ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" - -ansi-escapes@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" - integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== - dependencies: - type-fest "^3.0.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - -apache-crypt@^1.1.2: - version "1.2.4" - resolved "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.4.tgz#fc0aacb7877d64d26420cadf923bcd53e79fb34e" - integrity sha512-Icze5ny5W5uv3xgMgl8U+iGmRCC0iIDrb2PVPuRBtL3Zy1Y5TMewXP1Vtc4r5X9eNNBEk7KYPu0Qby9m/PmcHg== - dependencies: - unix-crypt-td-js "^1.1.4" - -apache-md5@^1.0.6: - version "1.1.5" - resolved "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.5.tgz#5d6365ece2ccc32b612f886b2b292e1c96ff3ffb" - integrity sha512-sbLEIMQrkV7RkIruqTPXxeCMkAAycv4yzTkBzRgOR1BrR5UB7qZtupqxkersTJSf0HZ3sbaNRrNV80TnnM7cUw== - -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -are-we-there-yet@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz#05a6fc0e5f70771b673e82b0f915616e0ace8fd3" - integrity sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA== - dependencies: - delegates "^1.0.0" - readable-stream "^4.1.0" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7, argparse@~1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= - -array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== - 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" - -array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcryptjs@^2.4.3: - version "2.4.3" - resolved "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= - -before-after-hook@^2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" - integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -boolean@^3.0.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" - integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== - -boxen@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" - integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== - dependencies: - ansi-align "^3.0.1" - camelcase "^7.0.1" - chalk "^5.2.0" - cli-boxes "^3.0.0" - string-width "^5.1.2" - type-fest "^2.13.0" - widest-line "^4.0.1" - wrap-ansi "^8.1.0" - -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= - -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^2.0.0" - -cacache@^18.0.0: - version "18.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.1.tgz#b026d56ad569e4f73cc07c813b3c66707d0fb142" - integrity sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^10.0.1" - minipass "^7.0.3" - minipass-collect "^2.0.1" - 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" - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-lookup@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" - integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== - -cacheable-request@^10.2.8: - version "10.2.14" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" - integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== - dependencies: - "@types/http-cache-semantics" "^4.0.2" - get-stream "^6.0.1" - http-cache-semantics "^4.1.1" - keyv "^4.5.3" - mimic-response "^4.0.0" - normalize-url "^8.0.0" - responselike "^3.0.0" - -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - -call-bind-apply-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" - integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== - dependencies: - function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" - -call-bound@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" - integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== - dependencies: - call-bind-apply-helpers "^1.0.1" - get-intrinsic "^1.2.6" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -callsites@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" - integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" - integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== - -chai@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" - integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk-template@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" - integrity sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg== - dependencies: - chalk "^5.2.0" - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - 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" - -chalk@5.3.0, chalk@^5.2.0, chalk@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chalk@^1.0.0, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -cheerio@1.0.0-rc.3: - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.1" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -clang-format@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.8.0.tgz#7779df1c5ce1bc8aac1b0b02b4e479191ef21d46" - integrity sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw== - dependencies: - async "^3.2.3" - glob "^7.0.0" - resolve "^1.1.6" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -clean-stack@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" - integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== - dependencies: - escape-string-regexp "5.0.0" - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= - dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" - -cli-truncate@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" - integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== - dependencies: - slice-ansi "^5.0.0" - string-width "^7.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-support@^1.1.2, color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -colors@~1.2.1: - version "1.2.5" - resolved "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" - integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== - -commander-version@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/commander-version/-/commander-version-1.1.0.tgz#fbfaea4632921a42f8f855f96bcaa3d9920a6296" - integrity sha512-9aNW4N6q6EPDUszLRH6k9IwO6OoGYh3HRgUF/fA7Zs+Mz1v1x5akSqT7QGB8JsGY7AG7qMA7oRRB/4yyn33FYA== - dependencies: - "@bconnorwhite/module" "^2.0.2" - commander "^6.1.0" - -commander@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -configstore@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" - integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== - dependencies: - dot-prop "^6.0.1" - graceful-fs "^4.2.6" - unique-string "^3.0.0" - write-file-atomic "^3.0.3" - xdg-basedir "^5.0.1" - -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -conventional-changelog-angular@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" - integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== - dependencies: - compare-func "^2.0.0" - -conventional-commits-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" - integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== - dependencies: - JSONStream "^1.3.5" - is-text-path "^2.0.0" - meow "^12.0.1" - split2 "^4.0.0" - -convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -cookie-parser@1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.7.tgz#e2125635dfd766888ffe90d60c286404fa0e7b26" - integrity sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw== - dependencies: - cookie "0.7.2" - cookie-signature "1.0.6" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - -cookie@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -cosmiconfig-typescript-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" - integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== - dependencies: - jiti "^1.19.1" - -cosmiconfig@^8.3.6: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0: - version "7.0.2" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^7.0.1: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" - integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== - dependencies: - type-fest "^1.0.1" - -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-what@2.1: - version "2.1.3" - resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - -date-fns@^1.27.2: - version "1.30.1" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@4.3.4, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== - dependencies: - ms "2.1.2" - -debug@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@^4.3.3: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -debug@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -default-require-extensions@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" - integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== - dependencies: - strip-bom "^4.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -defer-to-connect@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" - integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== - -defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-7.1.0.tgz#0de0044d556b649ff05387f1fa7c885e155fd1b6" - integrity sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg== - dependencies: - globby "^13.1.2" - graceful-fs "^4.2.10" - is-glob "^4.0.3" - is-path-cwd "^3.0.0" - is-path-inside "^4.0.0" - p-map "^5.5.0" - rimraf "^3.0.2" - slash "^4.0.0" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -deprecation@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25" - integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g== - -detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - -detect-libc@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -detect-newline@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23" - integrity sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -dezalgo@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@0.7.2: - version "0.7.2" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" - integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM= - dependencies: - esutils "^1.1.6" - isarray "0.0.1" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@~0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - -dot-prop@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-7.2.0.tgz#468172a3529779814d21a779c1ba2f6d76609809" - integrity sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA== - dependencies: - type-fest "^2.11.2" - -dunder-proto@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron@33.2.1: - version "33.2.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-33.2.1.tgz#d0d7bba7a7abf4f14881d0a6e03c498b301a2d5f" - integrity sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg== - dependencies: - "@electron/get" "^2.0.0" - "@types/node" "^20.9.0" - extract-zip "^2.0.1" - -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= - -emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== - -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -env-paths@2.2.0, env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.12" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - 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" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" - -es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" - integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== - dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-error@^4.0.1, es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-goat@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" - integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== - -eslint-formatter-friendly@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint-formatter-friendly/-/eslint-formatter-friendly-7.0.0.tgz#32a4998ababa0a39994aed629b831fda7dabc864" - integrity sha512-WXg2D5kMHcRxIZA3ulxdevi8/BGTXu72pfOO5vXHqcAfClfIWDSlOljROjCSOCcKvilgmHz1jDWbvFCZHjMQ5w== - dependencies: - "@babel/code-frame" "7.0.0" - chalk "2.4.2" - extend "3.0.2" - strip-ansi "5.2.0" - text-table "0.2.0" - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" - integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - 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" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.14.2" - -eslint-plugin-prettier@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515" - integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg== - dependencies: - prettier-linter-helpers "^1.0.0" - synckit "^0.8.5" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@8.55.0: - version "8.55.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.55.0.tgz#078cb7b847d66f2c254ea1794fa395bf8e7e03f8" - integrity sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.55.0" - "@humanwhocodes/config-array" "^0.11.13" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" - integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U= - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@8.0.1, execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -exit-hook@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-4.0.0.tgz#c1e16ebd03d3166f837b1502dac755bb5c460d58" - integrity sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ== - -expect-type@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" - integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== - -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - -express@4.21.2: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.12" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3, external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extract-zip@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== - -fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== - dependencies: - reusify "^1.0.4" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-5.0.0.tgz#126cd055052dea699f8a54e8c9450e6ecfc44d5f" - integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg== - dependencies: - escape-string-regexp "^5.0.0" - is-unicode-supported "^1.2.0" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.2.0: - version "3.3.1" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up-simple@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" - integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data-encoder@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" - integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== - -formidable@3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-3.5.2.tgz#207c33fecdecb22044c82ba59d0c63a12fb81d77" - integrity sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg== - dependencies: - dezalgo "^1.0.4" - hexoid "^2.0.0" - once "^1.4.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fromentries@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d" - integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw== - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^11.0.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" - integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@~7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^2.0.0, fs-minipass@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-minipass@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" - integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== - dependencies: - minipass "^7.0.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - -gauge@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" - integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== - 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" - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -get-caller-file@^2.0.0, get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== - dependencies: - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" - integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== - dependencies: - call-bind-apply-helpers "^1.0.1" - dunder-proto "^1.0.0" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - function-bind "^1.1.2" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.0.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stdin@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" - integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== - -get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -git-hooks-list@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.1.0.tgz#386dc531dcc17474cf094743ff30987a3d3e70fc" - integrity sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA== - -git-raw-commits@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== - dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -github-url-from-git@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" - integrity sha1-+YX+3MCpqledyI16/waNVcxiUaA= - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.2.2, glob@^10.3.10, glob@^10.3.7: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - 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" - -glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.1, glob@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -global-agent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" - integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== - dependencies: - boolean "^3.0.1" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== - dependencies: - ini "2.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -got@^11.7.0, got@^11.8.5: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -got@^12.1.0: - version "12.6.1" - resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" - integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== - dependencies: - "@sindresorhus/is" "^5.2.0" - "@szmarczak/http-timer" "^5.0.1" - cacheable-lookup "^7.0.0" - cacheable-request "^10.2.8" - decompress-response "^6.0.0" - form-data-encoder "^2.1.2" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^3.0.0" - -graceful-fs@4.2.10, graceful-fs@^4.2.6: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.1.15: - version "4.2.4" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -graceful-fs@^4.2.10: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== - dependencies: - get-intrinsic "^1.2.2" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has-yarn@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" - integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasha@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" - integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== - dependencies: - function-bind "^1.1.2" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hexoid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-2.0.0.tgz#fb36c740ebbf364403fa1ec0c7efd268460ec5b9" - integrity sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw== - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -hosted-git-info@^7.0.0, hosted-git-info@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" - integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== - dependencies: - lru-cache "^10.0.1" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -http-auth-connect@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/http-auth-connect/-/http-auth-connect-1.0.6.tgz#7b9fd411f8806efd1244e703477171c08396d503" - integrity sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw== - -http-auth@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/http-auth/-/http-auth-4.2.0.tgz#9bb119ba22273b63a50796363d298eed3bdbadae" - integrity sha512-trIkGI7dgnFJ5k8YaQFSr1Q5uq9c19vK6Y9ZCjlY0zBEQgdJpXZU3Cyrmk4nwrAGy4pKJhs599o7q6eicbVnhw== - dependencies: - apache-crypt "^1.1.2" - apache-md5 "^1.0.6" - bcryptjs "^2.4.3" - uuid "^8.3.2" - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -http2-wrapper@^2.1.10: - version "2.2.1" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" - integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -https-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -husky@9.1.7: - version "9.1.7" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" - integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-walk@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" - integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== - dependencies: - minimatch "^9.0.0" - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^4.0.0, import-lazy@~4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -import-local@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -index-to-position@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-0.1.2.tgz#e11bfe995ca4d8eddb1ec43274488f3c201a7f09" - integrity sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer-autosubmit-prompt@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/inquirer-autosubmit-prompt/-/inquirer-autosubmit-prompt-0.2.0.tgz#a10f952af4f7bac9c43010e3e9e0891d7e8d15a1" - integrity sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q== - dependencies: - chalk "^2.4.1" - inquirer "^6.2.1" - rxjs "^6.3.3" - -inquirer@^6.2.1: - version "6.5.2" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -inquirer@^9.2.12: - version "9.2.12" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.12.tgz#0348e9311765b7c93fce143bb1c0ef1ae879b1d7" - integrity sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q== - dependencies: - "@ljharb/through" "^2.3.11" - ansi-escapes "^4.3.2" - chalk "^5.3.0" - cli-cursor "^3.1.0" - cli-width "^4.1.0" - external-editor "^3.1.0" - figures "^5.0.0" - lodash "^4.17.21" - mute-stream "1.0.0" - ora "^5.4.1" - run-async "^3.0.0" - rxjs "^7.8.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - -internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== - dependencies: - get-intrinsic "^1.2.2" - hasown "^2.0.0" - side-channel "^1.0.4" - -inversify@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e" - integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ== - -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-callable@^1.1.4: - version "1.1.5" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-core-module@^2.1.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-core-module@^2.5.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-fullwidth-code-point@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" - integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== - dependencies: - get-east-asian-width "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-in-ci@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-0.1.0.tgz#5e07d6a02ec3a8292d3f590973357efa3fceb0d3" - integrity sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ== - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-installed-globally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" - integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== - dependencies: - global-directory "^4.0.1" - is-path-inside "^4.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-interactive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" - integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== - -is-name-taken@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-name-taken/-/is-name-taken-2.0.0.tgz#c36e6515e07621dc48cd026b6b015a504942fae1" - integrity sha512-W+FUWF5g7ONVJTx3rldZeVizmPzrMMUdscpSQ96vyYerx+4b2NcqaujLJJDWruGzE0FjzGZO9RFIipOGxx/WIw== - dependencies: - all-package-names "^2.0.2" - package-name-conflict "^1.0.3" - validate-npm-package-name "^3.0.0" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-npm@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" - integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - -is-path-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-3.0.0.tgz#889b41e55c8588b1eb2a96a61d05740a674521c7" - integrity sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA== - -is-path-inside@^3.0.2, is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-path-inside@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" - integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-obj@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-scoped@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-3.0.0.tgz#2f9fc6e37c17d432d8e38d3c749aab8c76d1bdd8" - integrity sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g== - dependencies: - scoped-regex "^3.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-text-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== - dependencies: - text-extensions "^2.0.0" - -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-unicode-supported@^1.2.0, is-unicode-supported@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" - integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== - -is-url-superb@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-6.1.0.tgz#182f0d92b482412afeadfba8e6ea2c76680e3631" - integrity sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isexe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" - integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== - -issue-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/issue-regex/-/issue-regex-4.1.0.tgz#e2039123748a48e6711eed7a9eb392f2c17c9341" - integrity sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" - integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.0" - istanbul-lib-coverage "^3.0.0-alpha.1" - make-dir "^3.0.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^3.3.3" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.19.1: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1, js-yaml@~3.13.1: - version "3.13.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== - dependencies: - universalify "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -keyv@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" - integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== - dependencies: - json-buffer "3.0.1" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -latest-version@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" - integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== - dependencies: - package-json "^8.1.0" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" - integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -linkify-it@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" - integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== - dependencies: - uc.micro "^2.0.0" - -lint-staged@15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.0.tgz#3111534ca58096a3c8f70b044b6e7fe21b36f859" - integrity sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ== - dependencies: - chalk "5.3.0" - commander "11.1.0" - debug "4.3.4" - execa "8.0.1" - lilconfig "3.0.0" - listr2 "8.0.0" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.4" - -listr-input@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/listr-input/-/listr-input-0.2.1.tgz#ce735c34530683580388fdf9462ecfebd3b66126" - integrity sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg== - dependencies: - inquirer "^7.0.0" - inquirer-autosubmit-prompt "^0.2.0" - rxjs "^6.5.3" - through "^2.3.8" - -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - -listr2@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.0.tgz#aa7c230995f8ce378585f7c96c0c6d1cefa4700d" - integrity sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.0.0" - rfdc "^1.3.0" - wrap-ansi "^9.0.0" - -listr@^0.14.3: - version "0.14.3" - resolved "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - -lodash.isfunction@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" - integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== - -lodash.zip@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" - integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= - -lodash@^4.15.0, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@~4.17.15: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-symbols@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439" - integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== - dependencies: - chalk "^5.3.0" - is-unicode-supported "^1.3.0" - -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -log-update@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" - integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== - dependencies: - ansi-escapes "^6.2.0" - cli-cursor "^4.0.0" - slice-ansi "^7.0.0" - strip-ansi "^7.1.0" - wrap-ansi "^9.0.0" - -loupe@^3.1.0, loupe@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" - integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - -lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru-cache@^7.7.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -magic-string@^0.30.12: - version "0.30.14" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.14.tgz#e9bb29870b81cfc1ec3cc656552f5a7fcbf19077" - integrity sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -make-dir@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== - dependencies: - semver "^6.0.0" - -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" - 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 "^9.0.0" - -make-fetch-happen@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" - integrity sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== - dependencies: - "@npmcli/agent" "^2.0.0" - cacache "^18.0.0" - http-cache-semantics "^4.1.1" - is-lambda "^1.0.1" - minipass "^7.0.2" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - ssri "^10.0.0" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== - -markdown-it@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" - integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - -math-intrinsics@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -mdurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" - integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -meow@^12.0.1, meow@^12.1.1: - version "12.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" - integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== - -meow@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@4.0.5, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.43.0: - version "1.43.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== - dependencies: - mime-db "1.43.0" - -mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-function@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.0.tgz#6cb5a922d17923ee58cf2f7d904f3eb350e0c87a" - integrity sha512-RBfQ+9X9DpXdEoK7Bu+KeEU6vFhumEIiXKWECPzRBmDserEq4uR2b/VCm0LwpMSosoq2k+Zuxj/GzOr0Fn6h/g== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -mimic-response@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" - integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== - -min-indent@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" - integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.5, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.0, minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-collect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" - integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== - dependencies: - minipass "^7.0.3" - -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== - dependencies: - minipass "^3.1.6" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-fetch@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" - integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== - dependencies: - minipass "^7.0.3" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0: - version "3.1.3" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minipass@^3.1.1, minipass@^3.1.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mute-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== - -"nan@github:JCMais/nan#fix/electron-failures": - version "2.22.0" - resolved "https://codeload.github.com/JCMais/nan/tar.gz/0ec2eca8b2fd7518affb3945d087e393ad839b7e" - -nanoid@^3.3.7: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -negotiator@0.6.3, negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -new-github-release-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/new-github-release-url/-/new-github-release-url-2.0.0.tgz#335189b91f52bbb9569042a7485900a205a0500b" - integrity sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ== - dependencies: - type-fest "^2.5.1" - -node-abi@^3.45.0, node-abi@^3.71.0: - version "3.71.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038" - integrity sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw== - dependencies: - semver "^7.3.5" - -node-api-version@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.0.tgz#5177441da2b1046a4d4547ab9e0972eed7b1ac1d" - integrity sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg== - dependencies: - semver "^7.3.5" - -node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-gyp@10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86" - integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw== - dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" - glob "^10.3.10" - graceful-fs "^4.2.6" - make-fetch-happen "^13.0.0" - nopt "^7.0.0" - proc-log "^4.1.0" - semver "^7.3.5" - tar "^6.2.1" - which "^4.0.0" - -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - -nopt@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" - integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== - dependencies: - abbrev "^2.0.0" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" - integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== - dependencies: - hosted-git-info "^7.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -normalize-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" - integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== - -np@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/np/-/np-9.2.0.tgz#93323e1535b47317f02885e726f2aa0f41c14ac8" - integrity sha512-VYA8IKyx5XJqROr2vu8NAstfgBznrnOu3PUByFl3TBwzQVkeGC+gzOPzGbvYKM1QwlX6Gt7kVSPMzDP4qkSs1g== - dependencies: - chalk "^5.3.0" - chalk-template "^1.1.0" - cosmiconfig "^8.3.6" - del "^7.1.0" - escape-goat "^4.0.0" - escape-string-regexp "^5.0.0" - execa "^8.0.1" - exit-hook "^4.0.0" - github-url-from-git "^1.5.0" - has-yarn "^3.0.0" - hosted-git-info "^7.0.1" - ignore-walk "^6.0.3" - import-local "^3.1.0" - inquirer "^9.2.12" - is-installed-globally "^1.0.0" - is-interactive "^2.0.0" - is-scoped "^3.0.0" - issue-regex "^4.1.0" - listr "^0.14.3" - listr-input "^0.2.1" - log-symbols "^6.0.0" - meow "^12.1.1" - new-github-release-url "^2.0.0" - npm-name "^7.1.1" - onetime "^7.0.0" - open "^9.1.0" - ow "^1.1.1" - p-memoize "^7.1.1" - p-timeout "^6.1.2" - path-exists "^5.0.0" - pkg-dir "^8.0.0" - read-package-up "^11.0.0" - read-pkg "^9.0.1" - rxjs "^7.8.1" - semver "^7.5.4" - symbol-observable "^4.0.0" - terminal-link "^3.0.0" - update-notifier "^7.0.0" - -npm-name@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/npm-name/-/npm-name-7.1.1.tgz#373774cc044b4dab7835e1d02c84f60680f7f748" - integrity sha512-lyOwsFndLoozriMEsaqJ5lXvhCATYOEhDvxlom8TNvB9a/htDXuLgpVhMUOBd9zCewUXCyBXAPxrGr2TK2adgQ== - dependencies: - got "^11.8.5" - is-name-taken "^2.0.0" - is-scoped "^3.0.0" - is-url-superb "^6.1.0" - lodash.zip "^4.2.0" - org-regex "^1.0.0" - p-map "^5.5.0" - registry-auth-token "^4.2.2" - registry-url "^6.0.1" - validate-npm-package-name "^3.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -npmlog@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" - integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== - dependencies: - are-we-there-yet "^4.0.0" - console-control-strings "^1.1.0" - gauge "^5.0.0" - set-blocking "^2.0.0" - -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nyc@15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.1, object-inspect@^1.9.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-inspect@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - -object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== - dependencies: - mimic-function "^5.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -ora@^5.1.0, ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -org-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/org-regex/-/org-regex-1.0.0.tgz#67ebb9ab3cb124fea5841289d60b59434f041a59" - integrity sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ== - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -ow@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ow/-/ow-1.1.1.tgz#354a0f7df9d8d0cf961b29116daf972ef6be1632" - integrity sha512-sJBRCbS5vh1Jp9EOgwp1Ws3c16lJrUkJYlvWTYC03oyiYVwS/ns7lKRWow4w4XjDyTrA2pplQv4B2naWSR6yDA== - dependencies: - "@sindresorhus/is" "^5.3.0" - callsites "^4.0.0" - dot-prop "^7.2.0" - lodash.isequal "^4.5.0" - vali-date "^1.0.0" - -p-cancelable@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" - integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" - integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-lock@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-lock/-/p-lock-2.1.0.tgz#6f9dbc55d3aac5b0f75c8ec47f3a6f1b954135f8" - integrity sha512-pi2yT8gNhVrV4LgsUvJWQy58TXH1HG2+NXDby9+UrsS/9fXb0FJH9aCxbdHJ0EAQ6XC7ggSP6GAzuR5puDArUQ== - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" - integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== - dependencies: - aggregate-error "^4.0.0" - -p-memoize@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/p-memoize/-/p-memoize-7.1.1.tgz#53b1d0e6007288f7261cfa11a7603b84c9261bfa" - integrity sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA== - dependencies: - mimic-fn "^4.0.0" - type-fest "^3.0.0" - -p-timeout@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.2.tgz#22b8d8a78abf5e103030211c5fc6dee1166a6aa5" - integrity sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -package-json@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" - integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== - dependencies: - got "^12.1.0" - registry-auth-token "^5.0.1" - registry-url "^6.0.0" - semver "^7.3.7" - -package-name-conflict@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/package-name-conflict/-/package-name-conflict-1.0.3.tgz#5147d35e8ae7f93401f1b3f9f3763c070463f25c" - integrity sha512-DPBNWSUWC0wPofXeNThao0uP4a93J7r90UyhagmJS0QcacTTkorZwXYsOop70phn1hKdcf/2e9lJIhazS8bx5A== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json-object@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parse-json-object/-/parse-json-object-1.1.0.tgz#eef60211cec368259723d8586ecec7252f8fcdb2" - integrity sha512-4w5s6uJY1tW9REY8UwUOyaZKSKsrbQrMEzlV/Le/g5t4iMWuuyK83pZZ0OZimSOL9iyv2ORvRSgz71Ekd7iD3g== - dependencies: - types-json "^1.0.6" - -parse-json-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/parse-json-object/-/parse-json-object-2.0.1.tgz#a441bd8c36d2c33a69516286e7e4138a23607ee0" - integrity sha512-/oF7PUUBjCqHmMEE6xIQeX5ZokQ9+miudACzPt4KBU2qi6CxZYPdisPXx4ad7wpZJYi2ZpcW2PacLTU3De3ebw== - dependencies: - types-json "^1.2.0" - -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-json@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.1.0.tgz#91cdc7728004e955af9cb734de5684733b24a717" - integrity sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA== - dependencies: - "@babel/code-frame" "^7.22.13" - index-to-position "^0.1.2" - type-fest "^4.7.1" - -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== - dependencies: - "@types/node" "*" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== - dependencies: - lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-to-regexp@0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-dir@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-8.0.0.tgz#8f3de8ba83d46b72a05c80bfd4e579f060fa91e2" - integrity sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ== - dependencies: - find-up-simple "^1.0.0" - -postcss@^8.4.43: - version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== - dependencies: - nanoid "^3.3.7" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== - -proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== - -proc-log@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" - integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== - -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@2.0.3, progress@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode.js@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pupa@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" - integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== - dependencies: - escape-goat "^4.0.0" - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-binary-file-arch@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz#959c4637daa932280a9b911b1a6766a7e44288fc" - integrity sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg== - dependencies: - debug "^4.3.4" - -read-file-safe@^1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/read-file-safe/-/read-file-safe-1.0.10.tgz#9ac9118f12cb122614612211f90dad9daf732e39" - integrity sha512-qW25fd2uMX3dV6Ui/R0jYK1MhTpjx8FO/VHaHTXzwWsGnkNwLRcqYfCXd9qDM+NZ273DPUvP2RaimYuLSu1K/g== - -read-json-safe@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/read-json-safe/-/read-json-safe-1.0.5.tgz#c459443b8e6eb3a2672cf68ddc81d2f4ef95c8d7" - integrity sha512-SJyNY/U9+vW35FPus22Qvv1oilnR7PCfN2E70uKQEGaJS313A5/cz9Yhv7ZtWzZ+XIwrtEPxXf10BOyYemHehA== - dependencies: - parse-json-object "^1.0.5" - read-file-safe "^1.0.5" - -read-package-up@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/read-package-up/-/read-package-up-11.0.0.tgz#71fb879fdaac0e16891e6e666df22de24a48d5ba" - integrity sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ== - dependencies: - find-up-simple "^1.0.0" - read-pkg "^9.0.0" - type-fest "^4.6.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -read-pkg@^9.0.0, read-pkg@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-9.0.1.tgz#b1b81fb15104f5dbb121b6bbdee9bbc9739f569b" - integrity sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA== - dependencies: - "@types/normalize-package-data" "^2.4.3" - normalize-package-data "^6.0.0" - parse-json "^8.0.0" - type-fest "^4.6.0" - unicorn-magic "^0.1.0" - -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^4.1.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.2.tgz#e6aced27ad3b9d726d8308515b9a1b98dc1b9d13" - integrity sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reflect-metadata@^0.1.12: - version "0.1.13" - resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" - -registry-auth-token@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== - dependencies: - rc "1.2.8" - -registry-auth-token@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" - integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== - dependencies: - "@pnpm/npm-conf" "^2.1.0" - -registry-url@^6.0.0, registry-url@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" - integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== - dependencies: - rc "1.2.8" - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= - dependencies: - es6-error "^4.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-global@1.0.0, resolve-global@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" - -resolve@^1.1.6: - version "1.17.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.10.0, resolve@^1.3.2: - version "1.15.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.22.4, resolve@~1.22.1: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@~1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - -responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== - dependencies: - lowercase-keys "^2.0.0" - -responselike@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" - integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== - dependencies: - lowercase-keys "^3.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" - integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== - dependencies: - glob "^10.3.7" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -roarr@^2.15.3: - version "2.15.4" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" - integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== - dependencies: - boolean "^3.0.1" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - -rollup@^4.20.0: - version "4.28.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.0.tgz#eb8d28ed43ef60a18f21d0734d230ee79dd0de77" - integrity sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.28.0" - "@rollup/rollup-android-arm64" "4.28.0" - "@rollup/rollup-darwin-arm64" "4.28.0" - "@rollup/rollup-darwin-x64" "4.28.0" - "@rollup/rollup-freebsd-arm64" "4.28.0" - "@rollup/rollup-freebsd-x64" "4.28.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.28.0" - "@rollup/rollup-linux-arm-musleabihf" "4.28.0" - "@rollup/rollup-linux-arm64-gnu" "4.28.0" - "@rollup/rollup-linux-arm64-musl" "4.28.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.28.0" - "@rollup/rollup-linux-riscv64-gnu" "4.28.0" - "@rollup/rollup-linux-s390x-gnu" "4.28.0" - "@rollup/rollup-linux-x64-gnu" "4.28.0" - "@rollup/rollup-linux-x64-musl" "4.28.0" - "@rollup/rollup-win32-arm64-msvc" "4.28.0" - "@rollup/rollup-win32-ia32-msvc" "4.28.0" - "@rollup/rollup-win32-x64-msvc" "4.28.0" - fsevents "~2.3.2" - -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" - -run-async@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" - integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== - -run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scoped-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-3.0.0.tgz#cd7ede7d942f2ae90da53272102ff2d73129c46f" - integrity sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg== - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== - -semver-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" - integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== - dependencies: - semver "^7.3.5" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.5.4, semver@^7.3.7, semver@^7.5.4, semver@~7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^6.2.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -semver@^7.3.4, semver@^7.3.5: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== - dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -side-channel@^1.0.6: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slice-ansi@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" - integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== - dependencies: - ansi-styles "^6.2.1" - is-fullwidth-code-point "^5.0.0" - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks-proxy-agent@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" - integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== - dependencies: - agent-base "^7.0.2" - debug "^4.3.4" - socks "^2.7.1" - -socks@^2.6.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - -socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - -sort-object-keys@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" - integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== - -sort-package-json@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.6.0.tgz#68337dbbd267971add856308a9b454a7d6cbfc0a" - integrity sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw== - dependencies: - detect-indent "^7.0.1" - detect-newline "^4.0.0" - get-stdin "^9.0.0" - git-hooks-list "^3.0.0" - globby "^13.1.2" - is-plain-obj "^4.1.0" - sort-object-keys "^1.1.3" - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split2@^3.0.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - -split2@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -sprintf-js@^1.1.2, sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -ssri@^10.0.0: - version "10.0.5" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" - integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== - dependencies: - minipass "^7.0.3" - -ssri@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== - dependencies: - minipass "^3.1.1" - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -std-env@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5" - integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== - -string-argv@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-argv@~0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string-width@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.0.0.tgz#14aa1b7aaa126d5b64fa79d3c894da8a9650ba06" - integrity sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@5.2.0, strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^7.0.1, strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -sumchecker@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" - integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== - dependencies: - debug "^4.1.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -synckit@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" - -tar@^6.0.5, tar@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tar@^6.1.11: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -terminal-link@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-3.0.0.tgz#91c82a66b52fc1684123297ce384429faf72ac5c" - integrity sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg== - dependencies: - ansi-escapes "^5.0.0" - supports-hyperlinks "^2.2.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-extensions@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" - integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== - -text-table@0.2.0, text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyexec@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" - integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== - -tinypool@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" - integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== - -tinyrainbow@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" - integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== - -tinyspy@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" - integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== - -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== - -ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== - -ts-node@10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.2: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" - integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== - -tslib@2.6.2, tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^1.13.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0: - version "1.11.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== - -tslint-config-airbnb@5.11.2: - version "5.11.2" - resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.2.tgz#2f3d239fa3923be8e7a4372217a7ed552671528f" - integrity sha512-mUpHPTeeCFx8XARGG/kzYP4dPSOgoCqNiYbGHh09qTH8q+Y1ghsOgaeZKYYQT7IyxMos523z/QBaiv2zKNBcow== - dependencies: - tslint-consistent-codestyle "^1.14.1" - tslint-eslint-rules "^5.4.0" - tslint-microsoft-contrib "~5.2.1" - -tslint-config-prettier@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" - integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== - -tslint-consistent-codestyle@^1.14.1: - version "1.16.0" - resolved "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.16.0.tgz#52348ea899a7e025b37cc6545751c6a566a19077" - integrity sha512-ebR/xHyMEuU36hGNOgCfjGBNYxBPixf0yU1Yoo6s3BrpBRFccjPOmIVaVvQsWAUAMdmfzHOCihVkcaMfimqvHw== - dependencies: - "@fimbul/bifrost" "^0.21.0" - tslib "^1.7.1" - tsutils "^2.29.0" - -tslint-eslint-rules@^5.4.0: - version "5.4.0" - resolved "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" - integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w== - dependencies: - doctrine "0.7.2" - tslib "1.9.0" - tsutils "^3.0.0" - -tslint-microsoft-contrib@~5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81" - integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA== - dependencies: - tsutils "^2.27.2 <2.29.0" - -tslint@6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.13.0" - tsutils "^2.29.0" - -"tsutils@^2.27.2 <2.29.0": - version "2.28.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1" - integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA== - dependencies: - tslib "^1.8.1" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -tsutils@^3.0.0, tsutils@^3.5.0: - version "3.17.1" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.0, type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^1.0.1, type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^2.11.2, type-fest@^2.13.0, type-fest@^2.5.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-fest@^3.0.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" - integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== - -type-fest@^4.6.0, type-fest@^4.7.1: - version "4.8.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c" - integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedoc-plugin-ga@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typedoc-plugin-ga/-/typedoc-plugin-ga-1.0.4.tgz#5e881129c078e2943779c5956da341e993c05a97" - integrity sha512-3YdtfRzeiRGKPgA0wlQ0p4NBIMV2As7BaTkjRVkIvu5m9bsmstxp07CWMe49nF4shIwi2xmq0OU44D7RTMTmJw== - -typedoc-plugin-nojekyll@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typedoc-plugin-nojekyll/-/typedoc-plugin-nojekyll-1.0.1.tgz#d6879d4118bbf10efe3feb3b766b69a09c80b3ef" - integrity sha512-hdFMhn0vAFCwepihSaVVs5yyImjo2FCX/OVQW89lrrqoARYHlAchOki4BQug23UqFSrYdykUu8yP4gD0M48qbw== - dependencies: - fs-extra "^6.0.1" - -typedoc@0.27.6: - version "0.27.6" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.27.6.tgz#7e8d067bd5386b7908afcb12c9054a83e8bb326b" - integrity sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw== - dependencies: - "@gerrit0/mini-shiki" "^1.24.0" - lunr "^2.3.9" - markdown-it "^14.1.0" - minimatch "^9.0.5" - yaml "^2.6.1" - -types-eslintrc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/types-eslintrc/-/types-eslintrc-1.0.3.tgz#b277d301caca6c330477cbaa67bf6f79ac3d6fee" - integrity sha512-zKTR6aKHEudQpl+JoZjS3qh0B5IzSpQK/BCpYBECujcnKtqL87DJJ1sJKe5B8k/y8/UJ5sukq42QDvlaJyCO2w== - dependencies: - types-json "^1.2.2" - -types-json@^1.0.6, types-json@^1.2.0, types-json@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/types-json/-/types-json-1.2.2.tgz#91ebe6de59e741ab38a98b071708a29494cedfe6" - integrity sha512-VfVLISHypS7ayIHvhacOESOTib4Sm4mAhnsgR8fzQdGp89YoBwMqvGmqENjtYehUQzgclT+7NafpEXkK/MHKwA== - -types-pkg-json@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/types-pkg-json/-/types-pkg-json-1.2.1.tgz#890fe4f231000a721299831ef3e17a489b1e635e" - integrity sha512-Wj75lCkPwfj1BhmaJxMPpTQj9YGpihjs3WICigt1IjTAswr7zPXP0iJYPZjU0Rw/IriODhMJjAImkCIxt9KeuQ== - dependencies: - types-eslintrc "^1.0.3" - types-json "^1.2.2" - -typescript@5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" - integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== - -typescript@~5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== - -uc.micro@^2.0.0, uc.micro@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" - integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -unicorn-magic@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" - integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== - -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== - dependencies: - unique-slug "^3.0.0" - -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== - dependencies: - imurmurhash "^0.1.4" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" - integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== - dependencies: - crypto-random-string "^4.0.0" - -universal-user-agent@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" - integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unix-crypt-td-js@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz#4912dfad1c8aeb7d20fa0a39e4c31918c1d5d5dd" - integrity sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-notifier@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-7.0.0.tgz#295aa782dadab784ed4073f7ffaea1fb2123031c" - integrity sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ== - dependencies: - boxen "^7.1.1" - chalk "^5.3.0" - configstore "^6.0.0" - import-lazy "^4.0.0" - is-in-ci "^0.1.0" - is-installed-globally "^0.4.0" - is-npm "^6.0.0" - latest-version "^7.0.0" - pupa "^3.1.0" - semver "^7.5.4" - semver-diff "^4.0.0" - xdg-basedir "^5.1.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.3: - version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - integrity sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg== - -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= - dependencies: - builtins "^1.0.3" - -validator@^13.7.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" - integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vite-node@2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" - integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== - dependencies: - cac "^6.7.14" - debug "^4.3.7" - es-module-lexer "^1.5.4" - pathe "^1.1.2" - vite "^5.0.0" - -vite@^5.0.0: - version "5.4.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" - integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" - integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== - dependencies: - "@vitest/expect" "2.1.8" - "@vitest/mocker" "2.1.8" - "@vitest/pretty-format" "^2.1.8" - "@vitest/runner" "2.1.8" - "@vitest/snapshot" "2.1.8" - "@vitest/spy" "2.1.8" - "@vitest/utils" "2.1.8" - chai "^5.1.2" - debug "^4.3.7" - expect-type "^1.1.0" - magic-string "^0.30.12" - pathe "^1.1.2" - std-env "^3.8.0" - tinybench "^2.9.0" - tinyexec "^0.3.1" - tinypool "^1.0.1" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.1.8" - why-is-node-running "^2.3.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-typed-array@^1.1.11, which-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" - integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== - dependencies: - isexe "^3.1.1" - -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -wide-align@^1.1.2, wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" - integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== - -y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" - integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== - -yaml@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" - integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.0.0, yargs@^17.0.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -z-schema@~5.0.2: - version "5.0.6" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.6.tgz#46d6a687b15e4a4369e18d6cb1c7b8618fc256c5" - integrity sha512-+XR1GhnWklYdfr8YaZv/iu+vY+ux7V5DS5zH1DQf6bO5ufrt/5cgNhVO5qyhsjFXvsqQb/f08DWE9b6uPscyAg== - dependencies: - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - validator "^13.7.0" - optionalDependencies: - commander "^10.0.0"