├── .clang-format ├── .editorconfig ├── .gitattributes ├── .github ├── CODE_OF_CONDUCT.md ├── FUNDING.yml ├── ISSUE_TEMPLATE.md ├── dependabot.yml └── workflows │ ├── ci.yml │ ├── clang-format.yml │ └── release.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── argon2.cjs ├── argon2.cpp ├── binding.gyp ├── biome.json ├── package-lock.json ├── package.json ├── test.cjs └── tsconfig.json /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: LLVM 4 | AccessModifierOffset: -4 5 | IndentWidth: 4 6 | ... 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | charset = utf-8 4 | end_of_line = lf 5 | trim_trailing_whitespace = true 6 | insert_final_newline = true 7 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.gyp linguist-vendored 2 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at ranisalt+github@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: node-argon2 6 | ko_fi: ranieri 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: ranieri 10 | issuehunt: ranisalt/node-argon2 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with a single custom sponsorship URL 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Welcome to the issues section if it's your first time! 2 | 3 | ### Before creating an issue, please be sure to: 4 | - [ ] Checkout to the latest version, **including submodules** 5 | - [ ] Try to find an *isolated* way to reproduce the behavior 6 | - [ ] Fill in all the blanks in the most specific way you can 7 | 8 | ### Steps to reproduce 9 | 1. 10 | 2. 11 | 3. 12 | 13 | ### Expected behaviour 14 | Tell us what should happen 15 | 16 | ### Actual behaviour 17 | Tell us what happens instead 18 | 19 | ### Environment 20 | **Operating system**: 21 | 22 | **Node version:** 23 | 24 | **Compiler version:** 25 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | lint: 7 | name: Lint 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v4 13 | with: 14 | submodules: true 15 | 16 | - name: Install dependencies 17 | run: npm ci 18 | 19 | - name: Lint 20 | run: npm run lint 21 | 22 | coverage: 23 | name: Report coverage 24 | runs-on: ubuntu-latest 25 | 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@v4 29 | with: 30 | submodules: true 31 | 32 | - name: Use Node.js 20 33 | uses: actions/setup-node@v4 34 | with: 35 | cache: npm 36 | node-version: 20 37 | 38 | - name: Install dependencies 39 | run: npm ci 40 | env: 41 | npm_config_debug: true 42 | 43 | - name: Run tests 44 | run: node --test --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=lcov.info test.cjs 45 | 46 | - name: Install lcov 47 | run: sudo apt install -yq lcov 48 | 49 | - name: Merge coverage reports 50 | run: | 51 | lcov --capture --directory . --no-external --output-file lcov-cpp.info 52 | lcov --add-tracefile lcov-cpp.info --add-tracefile lcov.info --output-file lcov.info 53 | lcov --remove lcov.info "*/node_modules/*" --output-file lcov.info 54 | 55 | - name: "Send to Codacy" 56 | uses: codacy/codacy-coverage-reporter-action@v1 57 | with: 58 | coverage-reports: lcov.info 59 | project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} 60 | 61 | test: 62 | strategy: 63 | matrix: 64 | node-version: [18, 20, 22] 65 | os: [ubuntu-22.04, macos-13, macos-14, windows-2019] 66 | 67 | name: Test for node-${{ matrix.node-version }} on ${{ matrix.os }} 68 | runs-on: ${{ matrix.os }} 69 | 70 | steps: 71 | - name: Checkout 72 | uses: actions/checkout@v4 73 | with: 74 | submodules: true 75 | 76 | - name: Use Node.js ${{ matrix.node-version }} 77 | uses: actions/setup-node@v4 78 | with: 79 | cache: npm 80 | node-version: ${{ matrix.node-version }} 81 | 82 | - name: Install dependencies 83 | run: npm ci 84 | 85 | - name: Run tests 86 | run: npm test 87 | 88 | test-alpine: 89 | strategy: 90 | matrix: 91 | node-version: [18, 20, 22] 92 | 93 | name: Test for node-${{ matrix.node-version }} on Alpine Linux 94 | runs-on: ubuntu-latest 95 | 96 | container: 97 | image: node:${{ matrix.node-version }}-alpine3.18 98 | 99 | steps: 100 | - name: Install build deps 101 | run: apk add make g++ python3 git 102 | 103 | - name: Checkout 104 | uses: actions/checkout@v4 105 | with: 106 | submodules: true 107 | 108 | - name: Install dependencies 109 | run: npm ci 110 | 111 | - name: Run tests 112 | run: npm test 113 | 114 | test-freebsd: 115 | strategy: 116 | matrix: 117 | node-version: [18, 20] 118 | 119 | name: Test for node-${{ matrix.node-version }} on FreeBSD 120 | runs-on: ubuntu-latest 121 | 122 | steps: 123 | - name: Checkout 124 | uses: actions/checkout@v4 125 | with: 126 | submodules: true 127 | 128 | - uses: vmactions/freebsd-vm@v1 129 | with: 130 | prepare: | 131 | pkg install -y gmake python3 npm-node${{ matrix.node-version }} 132 | run: | 133 | npm ci 134 | npm test 135 | sync: sshfs 136 | 137 | build-with-fortify-source: 138 | strategy: 139 | matrix: 140 | cppflags: ['', '-D _FORTIFY_SOURCE=2', '-D _FORTIFY_SOURCE=3', '-D_FORTIFY_SOURCE=2', '-D_FORTIFY_SOURCE=3'] 141 | 142 | name: Test that setting _FORTIFY_SOURCE will not break the build 143 | runs-on: ubuntu-latest 144 | 145 | steps: 146 | - name: Checkout 147 | uses: actions/checkout@v4 148 | with: 149 | submodules: true 150 | 151 | - name: Use Node.js 22 152 | uses: actions/setup-node@v4 153 | with: 154 | cache: npm 155 | node-version: 22 156 | 157 | - name: Install 158 | run: CPPFLAGS="${{ matrix.cppflags }}" npm ci 159 | -------------------------------------------------------------------------------- /.github/workflows/clang-format.yml: -------------------------------------------------------------------------------- 1 | name: Check code style 2 | 3 | on: 4 | push: 5 | paths: 6 | - .clang-format 7 | - '*.cpp' 8 | 9 | pull_request: 10 | paths: 11 | - .clang-format 12 | - '*.cpp' 13 | 14 | jobs: 15 | check-format: 16 | runs-on: ubuntu-22.04 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - name: Setup LLVM repository 21 | run: | 22 | wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - 23 | sudo add-apt-repository -y 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy main' 24 | 25 | - name: Install clang-format 26 | run: sudo apt update -q && sudo apt install -yq clang-format 27 | 28 | - name: Check code style 29 | run: clang-format -n -style=file --Werror *.cpp 30 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | 6 | pull_request: 7 | branches: 8 | - master 9 | 10 | release: 11 | types: [published] 12 | 13 | workflow_dispatch: 14 | inputs: 15 | new-version: 16 | description: New version to be published, overrides tag 17 | required: true 18 | type: string 19 | 20 | npm-tag: 21 | description: NPM tag 22 | required: true 23 | default: latest 24 | type: choice 25 | options: 26 | - latest 27 | - next 28 | 29 | jobs: 30 | build: 31 | strategy: 32 | matrix: 33 | include: 34 | - os: ubuntu-22.04 35 | arch: linux-x64-glibc 36 | - os: ubuntu-22.04-arm 37 | arch: linux-arm64-glibc 38 | - os: macos-13 39 | arch: darwin-x64 40 | - os: macos-14 41 | arch: darwin-arm64 42 | - os: windows-2019 43 | arch: win32-x64 44 | 45 | name: Build for ${{ matrix.arch }} 46 | runs-on: ${{ matrix.os }} 47 | 48 | steps: 49 | - name: Checkout 50 | uses: actions/checkout@v4 51 | with: 52 | submodules: true 53 | 54 | - name: Use Node.js 20 55 | uses: actions/setup-node@v4 56 | with: 57 | cache: npm 58 | node-version: 20 59 | 60 | - name: Install dependencies 61 | run: npm ci 62 | 63 | - name: Prebuild 64 | run: npm run build 65 | 66 | - name: Upload artifacts 67 | uses: actions/upload-artifact@v4 68 | with: 69 | name: prebuild-${{ matrix.arch }} 70 | path: prebuilds/**/*.node 71 | 72 | build-musl: 73 | strategy: 74 | matrix: 75 | include: 76 | - os: ubuntu-22.04 77 | arch: x64 78 | platform: linux/amd64 79 | - os: ubuntu-22.04-arm 80 | arch: arm64 81 | platform: linux/arm64 82 | - os: ubuntu-22.04-arm 83 | arch: armv7 84 | platform: linux/arm/v7 85 | 86 | name: Build for linux-${{ matrix.arch }}-musl 87 | runs-on: ${{ matrix.os }} 88 | 89 | steps: 90 | - name: Checkout 91 | uses: actions/checkout@v4 92 | with: 93 | submodules: true 94 | 95 | - name: Set up QEMU 96 | uses: docker/setup-qemu-action@v3 97 | with: 98 | platforms: ${{ matrix.platform }} 99 | 100 | - name: Prebuild 101 | uses: addnab/docker-run-action@v3 102 | with: 103 | image: node:20-alpine 104 | options: --platform=${{ matrix.platform }} --volume=${{ github.workspace }}:/repo --workdir=/repo 105 | run: | 106 | apk add --no-cache g++ make python3 107 | npm ci 108 | npm run build 109 | 110 | - name: Upload artifacts 111 | uses: actions/upload-artifact@v4 112 | with: 113 | name: prebuild-linux-${{ matrix.arch }}-musl 114 | path: prebuilds/**/*.node 115 | 116 | build-freebsd-x64: 117 | name: Build for freebsd-x64 118 | runs-on: ubuntu-latest 119 | 120 | steps: 121 | - name: Checkout 122 | uses: actions/checkout@v4 123 | with: 124 | submodules: true 125 | 126 | - name: Prebuild 127 | uses: vmactions/freebsd-vm@v1 128 | with: 129 | prepare: | 130 | pkg install -y gmake python3 npm-node20 131 | run: | 132 | npm ci 133 | npm run build 134 | sync: sshfs 135 | 136 | - name: Upload artifacts 137 | uses: actions/upload-artifact@v4 138 | with: 139 | name: prebuild-freebsd-x64 140 | path: prebuilds/**/*.node 141 | 142 | build-linux-armv7-glibc: 143 | name: Build for linux-armv7-glibc 144 | runs-on: ubuntu-latest 145 | 146 | steps: 147 | - name: Checkout 148 | uses: actions/checkout@v4 149 | with: 150 | submodules: true 151 | 152 | - name: Set up QEMU 153 | uses: docker/setup-qemu-action@v3 154 | with: 155 | platforms: linux/arm/v7 156 | 157 | - name: Prebuild 158 | uses: addnab/docker-run-action@v3 159 | with: 160 | image: node:20-bullseye 161 | options: --platform=linux/arm/v7 --volume=${{ github.workspace }}:/repo --workdir=/repo 162 | run: | 163 | apt update -yq && apt install -yq wget 164 | wget -qL https://deb.nodesource.com/setup_20.x | bash - 165 | apt install -yq g++ make python3 nodejs 166 | npm ci 167 | npm run build 168 | 169 | - name: Upload artifacts 170 | uses: actions/upload-artifact@v4 171 | with: 172 | name: prebuild-linux-armv7-glibc 173 | path: prebuilds/**/*.node 174 | 175 | publish: 176 | name: Publish package 177 | runs-on: ubuntu-latest 178 | 179 | permissions: 180 | contents: read 181 | id-token: write 182 | 183 | needs: 184 | - build 185 | - build-musl 186 | - build-freebsd-x64 187 | - build-linux-armv7-glibc 188 | 189 | steps: 190 | - name: Checkout 191 | uses: actions/checkout@v4 192 | with: 193 | submodules: true 194 | 195 | - name: Setup npm with Node.js 20 196 | uses: actions/setup-node@v4 197 | with: 198 | cache: npm 199 | node-version: 20 200 | token: ${{ secrets.NPM_TOKEN }} 201 | registry-url: 'https://registry.npmjs.org' 202 | 203 | - name: Install dependencies 204 | run: npm ci --ignore-scripts 205 | 206 | - name: Download artifacts 207 | id: download-artifact 208 | uses: actions/download-artifact@v4 209 | 210 | - name: Move prebuild artifacts 211 | run: mkdir prebuilds && cp --recursive prebuild-*/* prebuilds/ 212 | 213 | - name: Pack package 214 | run: npm pack 215 | if: ${{ github.event_name == 'push' || github.event_name == 'pull_request' }} 216 | 217 | - name: Upload package artifact 218 | uses: actions/upload-artifact@v4 219 | if: ${{ github.event_name == 'push' || github.event_name == 'pull_request' }} 220 | with: 221 | name: package 222 | path: '*.tgz' 223 | 224 | - name: Publish to NPM 225 | run: | 226 | npm version --allow-same-version --no-git-tag-version $VERSION 227 | npm publish --provenance --tag $TAG 228 | if: ${{ !env.ACT && (github.event_name == 'release' || github.event_name == 'workflow_dispatch') }} 229 | env: 230 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 231 | TAG: ${{ inputs.npm-tag || 'latest' }} 232 | VERSION: ${{ inputs.new-version || github.ref_name }} 233 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Node ### 2 | # Logs 3 | logs 4 | *.log 5 | npm-debug.log* 6 | 7 | # Coverage directory used by tools like istanbul 8 | coverage 9 | 10 | # Compiled binary addons (http://nodejs.org/api/addons.html) 11 | lib/ 12 | build*/ 13 | 14 | # Dependency directories 15 | node_modules/ 16 | 17 | # Output of 'npm pack' 18 | *.tgz 19 | 20 | # Generated Typescript declarations 21 | *.d.cts 22 | *.d.cts.map 23 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "argon2"] 2 | path = argon2 3 | url = https://github.com/P-H-C/phc-winner-argon2.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Ranieri Althoff 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-argon2 2 | 3 | [![Financial contributors on Open Collective][opencollective-image]][opencollective-url] 4 | [![Build status][actions-image]][actions-url] 5 | [![NPM package][npm-image]][npm-url] 6 | 7 | Bindings to the reference [Argon2](https://github.com/P-H-C/phc-winner-argon2) 8 | implementation. 9 | 10 | ## Usage 11 | It's possible to hash using either Argon2i, Argon2d or Argon2id (default), and 12 | verify if a password matches a hash. 13 | 14 | To hash a password: 15 | ```js 16 | const argon2 = require('argon2'); 17 | 18 | try { 19 | const hash = await argon2.hash("password"); 20 | } catch (err) { 21 | //... 22 | } 23 | ``` 24 | 25 | To see how you can modify the output (hash length, encoding) and parameters 26 | (time cost, memory cost and parallelism), 27 | [read the wiki](https://github.com/ranisalt/node-argon2/wiki/Options) 28 | 29 | To verify a password: 30 | ```js 31 | try { 32 | if (await argon2.verify("", "password")) { 33 | // password match 34 | } else { 35 | // password did not match 36 | } 37 | } catch (err) { 38 | // internal failure 39 | } 40 | ``` 41 | 42 | ### Migrating from another hash function 43 | See [this article on the wiki](https://github.com/ranisalt/node-argon2/wiki/Migrating-from-another-hash-function) for steps on how to migrate your existing code to Argon2. It's easy! 44 | 45 | ### TypeScript usage 46 | A TypeScript type declaration file is published with this module. If you are 47 | using TypeScript 2.0.0 or later, that means you do not need to install any 48 | additional typings in order to get access to the strongly typed interface. 49 | Simply use the library as mentioned above. 50 | 51 | ```ts 52 | import * as argon2 from "argon2"; 53 | 54 | const hash = await argon2.hash(..); 55 | ``` 56 | 57 | ## Prebuilt binaries 58 | **node-argon2** provides prebuilt binaries from `v0.26.0` onwards. They are 59 | built every release using GitHub Actions. 60 | 61 | The current prebuilt binaries are built and tested with the following systems: 62 | - Ubuntu 20.04 (x86-64; ARM64 from v0.28.2; ARMv7 from v0.43.0) 63 | - MacOS 13 (x86-64) 64 | - MacOS 14 (ARM64 from v0.29.0) 65 | - Windows Server 2019 (x86-64) 66 | - Alpine Linux 3.18 (x86-64 from v0.28.1; ARM64 from v0.28.2; ARMv7 from v0.43.0) 67 | - FreeBSD 14 (x86-64 from v0.29.1) 68 | 69 | Binaries should also work for any version more recent than the ones listed 70 | above. For example, the binary for Ubuntu 20.04 also works on Ubuntu 22.04, or 71 | any other Linux system that ships a newer version of glibc; the binary for 72 | MacOS 11 also works on MacOS 12. If your platform is below the above 73 | requirements, you can follow the [Before installing](#before-installing) 74 | section below to manually compile from source. It is also always recommended to 75 | build from source to ensure consistency of the compiled module. 76 | 77 | ## Before installing 78 | *You can skip this section if the [prebuilt binaries](#prebuilt-binaries) work for you.* 79 | 80 | You **MUST** have a **node-gyp** global install before proceeding with the install, 81 | along with GCC >= 5 / Clang >= 3.3. On Windows, you must compile under Visual 82 | Studio 2015 or newer. 83 | 84 | **node-argon2** works only and is tested against Node >=18.0.0. 85 | 86 | ### OSX 87 | To install GCC >= 5 on OSX, use [homebrew](http://brew.sh/): 88 | ```console 89 | $ brew install gcc 90 | ``` 91 | 92 | Once you've got GCC installed and ready to run, you then need to install 93 | node-gyp, you must do this globally: 94 | ```console 95 | $ npm install -g node-gyp 96 | ``` 97 | 98 | Finally, once node-gyp is installed and ready to go, you can install this 99 | library, specifying the GCC or Clang binary to use: 100 | 101 | ```console 102 | $ CXX=g++-12 npm install argon2 103 | ``` 104 | 105 | **NOTE**: If your GCC or Clang binary is named something different than `g++-12`, 106 | you'll need to specify that in the command. 107 | 108 | ## FAQ 109 |
110 | How do I manually rebuild the binaries? 111 | 112 | ```bash 113 | $ npx @mapbox/node-pre-gyp rebuild -C ./node_modules/argon2 114 | ``` 115 | 116 | Run `@mapbox/node-pre-gyp` instead of `node-gyp` because node-argon2's 117 | `binding.gyp` file relies on variables from `@mapbox/node-pre-gyp`. 118 | 119 | You can omit `npx @mapbox` and use just `node-pre-gyp` if you have a global 120 | installation of `@mapbox/node-pre-gyp`, otherwise prefixing `npx` will use 121 | the local one in `./node_modules/.bin` 122 |
123 | 124 |
125 | 126 | How do I skip installing prebuilt binaries and manually compile from source? 127 | 128 | 129 | You can do either of the two methods below: 130 | 131 | 1. Force build from source on install. 132 | ```bash 133 | $ npm install argon2 --build-from-source 134 | ``` 135 | 136 | 2. Ignore `node-argon2` install script and build manually. 137 | ```bash 138 | $ npm install argon2 --ignore-scripts 139 | $ npx node-gyp rebuild -C ./node_modules/argon2 140 | ``` 141 |
142 | 143 |
144 | 145 | I installed Node as a snap, and I can't install node-argon2. 146 | 147 | 148 | This seems to be an issue related to snap (see [#345 (comment)](https://github.com/ranisalt/node-argon2/issues/345#issuecomment-1164178674)). Installing Node with another package manager, such as [asdf](https://asdf-vm.com/) or [nvm](https://github.com/nvm-sh/nvm), is a possible workaround. 149 |
150 | 151 | ## Contributors 152 | 153 | ### Code contributors 154 | 155 | This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. 156 | 157 | 158 | ### Financial contributors 159 | 160 | Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/node-argon2/contribute)] 161 | 162 | #### Individuals 163 | 164 | 165 | 166 | #### Organizations 167 | 168 | Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/node-argon2/contribute)] 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | ## License 182 | Work licensed under the [MIT License](LICENSE). Please check 183 | [P-H-C/phc-winner-argon2](https://github.com/P-H-C/phc-winner-argon2) for 184 | license over Argon2 and the reference implementation. 185 | 186 | [opencollective-image]: https://img.shields.io/opencollective/all/node-argon2.svg?style=flat-square 187 | [opencollective-url]: https://opencollective.com/node-argon2 188 | [npm-image]: https://img.shields.io/npm/v/argon2.svg?style=flat-square 189 | [npm-url]: https://www.npmjs.com/package/argon2 190 | [actions-image]: https://img.shields.io/github/actions/workflow/status/ranisalt/node-argon2/ci.yml?branch=master&style=flat-square 191 | [actions-url]: https://github.com/ranisalt/node-argon2/actions 192 | -------------------------------------------------------------------------------- /argon2.cjs: -------------------------------------------------------------------------------- 1 | const assert = require("node:assert"); 2 | const { randomBytes, timingSafeEqual } = require("node:crypto"); 3 | const { promisify } = require("node:util"); 4 | const { deserialize, serialize } = require("@phc/format"); 5 | const gypBuild = require("node-gyp-build"); 6 | 7 | const { hash: bindingsHash } = gypBuild(__dirname); 8 | 9 | /** @type {(size: number) => Promise} */ 10 | const generateSalt = promisify(randomBytes); 11 | 12 | const argon2d = 0; 13 | const argon2i = 1; 14 | const argon2id = 2; 15 | 16 | module.exports.argon2d = argon2d; 17 | module.exports.argon2i = argon2i; 18 | module.exports.argon2id = argon2id; 19 | 20 | /** @enum {argon2i | argon2d | argon2id} */ 21 | const types = Object.freeze({ argon2d, argon2i, argon2id }); 22 | 23 | /** @enum {'argon2d' | 'argon2i' | 'argon2id'} */ 24 | const names = Object.freeze({ 25 | [types.argon2d]: "argon2d", 26 | [types.argon2i]: "argon2i", 27 | [types.argon2id]: "argon2id", 28 | }); 29 | 30 | const defaults = { 31 | hashLength: 32, 32 | timeCost: 3, 33 | memoryCost: 1 << 16, 34 | parallelism: 4, 35 | type: argon2id, 36 | version: 0x13, 37 | }; 38 | 39 | /** 40 | * @typedef {Object} Options 41 | * @property {number} [hashLength=32] 42 | * @property {number} [timeCost=3] 43 | * @property {number} [memoryCost=65536] 44 | * @property {number} [parallelism=4] 45 | * @property {keyof typeof names} [type=argon2id] 46 | * @property {number} [version=19] 47 | * @property {Buffer} [salt] 48 | * @property {Buffer} [associatedData] 49 | * @property {Buffer} [secret] 50 | */ 51 | 52 | /** 53 | * Hashes a password with Argon2, producing a raw hash 54 | * 55 | * @overload 56 | * @param {Buffer | string} password The plaintext password to be hashed 57 | * @param {Options & { raw: true }} options The parameters for Argon2 58 | * @returns {Promise} The raw hash generated from `password` 59 | */ 60 | /** 61 | * Hashes a password with Argon2, producing an encoded hash 62 | * 63 | * @overload 64 | * @param {Buffer | string} password The plaintext password to be hashed 65 | * @param {Options & { raw?: boolean }} [options] The parameters for Argon2 66 | * @returns {Promise} The encoded hash generated from `password` 67 | */ 68 | /** 69 | * @param {Buffer | string} password The plaintext password to be hashed 70 | * @param {Options & { raw?: boolean }} [options] The parameters for Argon2 71 | */ 72 | async function hash(password, options) { 73 | let { raw, salt, ...rest } = { ...defaults, ...options }; 74 | 75 | if (rest.hashLength > 2 ** 32 - 1) { 76 | throw new RangeError("Hash length is too large"); 77 | } 78 | 79 | if (rest.memoryCost > 2 ** 32 - 1) { 80 | throw new RangeError("Memory cost is too large"); 81 | } 82 | 83 | if (rest.timeCost > 2 ** 32 - 1) { 84 | throw new RangeError("Time cost is too large"); 85 | } 86 | 87 | if (rest.parallelism > 2 ** 24 - 1) { 88 | throw new RangeError("Parallelism is too large"); 89 | } 90 | 91 | salt = salt ?? (await generateSalt(16)); 92 | 93 | const { 94 | hashLength, 95 | secret = Buffer.alloc(0), 96 | type, 97 | version, 98 | memoryCost: m, 99 | timeCost: t, 100 | parallelism: p, 101 | associatedData: data = Buffer.alloc(0), 102 | } = rest; 103 | 104 | const hash = await bindingsHash({ 105 | password: Buffer.from(password), 106 | salt, 107 | secret, 108 | data, 109 | hashLength, 110 | m, 111 | t, 112 | p, 113 | version, 114 | type, 115 | }); 116 | if (raw) { 117 | return hash; 118 | } 119 | 120 | return serialize({ 121 | id: names[type], 122 | version, 123 | params: { m, t, p, ...(data.byteLength > 0 ? { data } : {}) }, 124 | salt, 125 | hash, 126 | }); 127 | } 128 | module.exports.hash = hash; 129 | 130 | /** 131 | * @param {string} digest The digest to be checked 132 | * @param {Object} [options] The current parameters for Argon2 133 | * @param {number} [options.timeCost=3] 134 | * @param {number} [options.memoryCost=65536] 135 | * @param {number} [options.parallelism=4] 136 | * @param {number} [options.version=0x13] 137 | * @returns {boolean} `true` if the digest parameters do not match the parameters in `options`, otherwise `false` 138 | */ 139 | function needsRehash(digest, options = {}) { 140 | const { memoryCost, timeCost, parallelism, version } = { 141 | ...defaults, 142 | ...options, 143 | }; 144 | 145 | const { 146 | version: v, 147 | params: { m, t, p }, 148 | } = deserialize(digest); 149 | 150 | return ( 151 | +v !== +version || 152 | +m !== +memoryCost || 153 | +t !== +timeCost || 154 | +p !== +parallelism 155 | ); 156 | } 157 | module.exports.needsRehash = needsRehash; 158 | 159 | /** 160 | * @param {string} digest The digest to be checked 161 | * @param {Buffer | string} password The plaintext password to be verified 162 | * @param {Object} [options] The current parameters for Argon2 163 | * @param {Buffer} [options.secret] 164 | * @returns {Promise} `true` if the digest parameters matches the hash generated from `password`, otherwise `false` 165 | */ 166 | async function verify(digest, password, options = {}) { 167 | const { id, ...rest } = deserialize(digest); 168 | if (!(id in types)) { 169 | return false; 170 | } 171 | 172 | const { 173 | version = 0x10, 174 | params: { m, t, p, data = "" }, 175 | salt, 176 | hash, 177 | } = rest; 178 | 179 | const { secret = Buffer.alloc(0) } = options; 180 | 181 | return timingSafeEqual( 182 | await bindingsHash({ 183 | password: Buffer.from(password), 184 | salt, 185 | secret, 186 | data: Buffer.from(data, "base64"), 187 | hashLength: hash.byteLength, 188 | m: +m, 189 | t: +t, 190 | p: +p, 191 | version: +version, 192 | type: types[id], 193 | }), 194 | hash, 195 | ); 196 | } 197 | module.exports.verify = verify; 198 | -------------------------------------------------------------------------------- /argon2.cpp: -------------------------------------------------------------------------------- 1 | #include "argon2/include/argon2.h" 2 | 3 | #include 4 | #include 5 | 6 | namespace { 7 | 8 | class HashWorker final : public Napi::AsyncWorker { 9 | public: 10 | HashWorker(const Napi::Env &env, const Napi::Buffer &plain, 11 | const Napi::Buffer &salt, 12 | const Napi::Buffer &secret, 13 | const Napi::Buffer &ad, uint32_t hash_length, 14 | uint32_t memory_cost, uint32_t time_cost, uint32_t parallelism, 15 | uint32_t version, uint32_t type) 16 | : AsyncWorker{env, "argon2:HashWorker"}, deferred{env}, 17 | plain{plain.Data(), plain.Data() + plain.ByteLength()}, 18 | salt{salt.Data(), salt.Data() + salt.ByteLength()}, 19 | secret{secret.Data(), secret.Data() + secret.ByteLength()}, 20 | ad{ad.Data(), ad.Data() + ad.ByteLength()}, hash_length{hash_length}, 21 | memory_cost{memory_cost}, time_cost{time_cost}, 22 | parallelism{parallelism}, version{version}, 23 | type{static_cast(type)} {} 24 | 25 | auto GetPromise() -> Napi::Promise { return deferred.Promise(); } 26 | 27 | protected: 28 | void Execute() override { 29 | hash.resize(hash_length); 30 | 31 | argon2_context ctx; 32 | ctx.out = hash.data(); 33 | ctx.outlen = static_cast(hash.size()); 34 | ctx.pwd = plain.data(); 35 | ctx.pwdlen = static_cast(plain.size()); 36 | ctx.salt = salt.data(); 37 | ctx.saltlen = static_cast(salt.size()); 38 | ctx.secret = secret.empty() ? nullptr : secret.data(); 39 | ctx.secretlen = static_cast(secret.size()); 40 | ctx.ad = ad.empty() ? nullptr : ad.data(); 41 | ctx.adlen = static_cast(ad.size()); 42 | ctx.m_cost = memory_cost; 43 | ctx.t_cost = time_cost; 44 | ctx.lanes = parallelism; 45 | ctx.threads = parallelism; 46 | ctx.allocate_cbk = nullptr; 47 | ctx.free_cbk = nullptr; 48 | ctx.flags = ARGON2_FLAG_CLEAR_PASSWORD | ARGON2_FLAG_CLEAR_SECRET; 49 | ctx.version = version; 50 | 51 | if (const int result = argon2_ctx(&ctx, type); result != ARGON2_OK) { 52 | /* LCOV_EXCL_START */ 53 | SetError(argon2_error_message(result)); 54 | /* LCOV_EXCL_STOP */ 55 | } 56 | } 57 | 58 | void OnOK() override { 59 | deferred.Resolve( 60 | Napi::Buffer::Copy(Env(), hash.data(), hash.size())); 61 | } 62 | 63 | void OnError(const Napi::Error &err) override { 64 | deferred.Reject(err.Value()); 65 | } 66 | 67 | private: 68 | using ustring = std::vector; 69 | 70 | Napi::Promise::Deferred deferred; 71 | ustring hash = {}; 72 | 73 | ustring plain; 74 | ustring salt; 75 | ustring secret; 76 | ustring ad; 77 | 78 | uint32_t hash_length; 79 | uint32_t memory_cost; 80 | uint32_t time_cost; 81 | uint32_t parallelism; 82 | uint32_t version; 83 | 84 | argon2_type type; 85 | }; 86 | 87 | auto Hash(const Napi::CallbackInfo &info) -> Napi::Value { 88 | NAPI_CHECK(info.Length() == 1, "Hash", "expected 1 argument"); 89 | 90 | const auto &args = info[0].As(); 91 | auto *worker = new HashWorker{info.Env(), 92 | args["password"].As>(), 93 | args["salt"].As>(), 94 | args["secret"].As>(), 95 | args["data"].As>(), 96 | args["hashLength"].ToNumber(), 97 | args["m"].ToNumber(), 98 | args["t"].ToNumber(), 99 | args["p"].ToNumber(), 100 | args["version"].ToNumber(), 101 | args["type"].ToNumber()}; 102 | 103 | worker->Queue(); 104 | return worker->GetPromise(); 105 | } 106 | 107 | auto init(Napi::Env env, Napi::Object exports) -> Napi::Object { 108 | exports["hash"] = Napi::Function::New(env, Hash); 109 | return exports; 110 | } 111 | 112 | } // namespace 113 | 114 | NODE_API_MODULE(argon2_lib, init) 115 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | "variables": { 3 | "fortify_source_defined": "=16.17.0" 27 | } 28 | }, 29 | "node_modules/@biomejs/biome": { 30 | "version": "1.9.4", 31 | "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", 32 | "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", 33 | "dev": true, 34 | "hasInstallScript": true, 35 | "license": "MIT OR Apache-2.0", 36 | "bin": { 37 | "biome": "bin/biome" 38 | }, 39 | "engines": { 40 | "node": ">=14.21.3" 41 | }, 42 | "funding": { 43 | "type": "opencollective", 44 | "url": "https://opencollective.com/biome" 45 | }, 46 | "optionalDependencies": { 47 | "@biomejs/cli-darwin-arm64": "1.9.4", 48 | "@biomejs/cli-darwin-x64": "1.9.4", 49 | "@biomejs/cli-linux-arm64": "1.9.4", 50 | "@biomejs/cli-linux-arm64-musl": "1.9.4", 51 | "@biomejs/cli-linux-x64": "1.9.4", 52 | "@biomejs/cli-linux-x64-musl": "1.9.4", 53 | "@biomejs/cli-win32-arm64": "1.9.4", 54 | "@biomejs/cli-win32-x64": "1.9.4" 55 | } 56 | }, 57 | "node_modules/@biomejs/cli-darwin-arm64": { 58 | "version": "1.9.4", 59 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", 60 | "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", 61 | "cpu": [ 62 | "arm64" 63 | ], 64 | "dev": true, 65 | "license": "MIT OR Apache-2.0", 66 | "optional": true, 67 | "os": [ 68 | "darwin" 69 | ], 70 | "engines": { 71 | "node": ">=14.21.3" 72 | } 73 | }, 74 | "node_modules/@biomejs/cli-darwin-x64": { 75 | "version": "1.9.4", 76 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", 77 | "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", 78 | "cpu": [ 79 | "x64" 80 | ], 81 | "dev": true, 82 | "license": "MIT OR Apache-2.0", 83 | "optional": true, 84 | "os": [ 85 | "darwin" 86 | ], 87 | "engines": { 88 | "node": ">=14.21.3" 89 | } 90 | }, 91 | "node_modules/@biomejs/cli-linux-arm64": { 92 | "version": "1.9.4", 93 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", 94 | "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", 95 | "cpu": [ 96 | "arm64" 97 | ], 98 | "dev": true, 99 | "license": "MIT OR Apache-2.0", 100 | "optional": true, 101 | "os": [ 102 | "linux" 103 | ], 104 | "engines": { 105 | "node": ">=14.21.3" 106 | } 107 | }, 108 | "node_modules/@biomejs/cli-linux-arm64-musl": { 109 | "version": "1.9.4", 110 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", 111 | "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", 112 | "cpu": [ 113 | "arm64" 114 | ], 115 | "dev": true, 116 | "license": "MIT OR Apache-2.0", 117 | "optional": true, 118 | "os": [ 119 | "linux" 120 | ], 121 | "engines": { 122 | "node": ">=14.21.3" 123 | } 124 | }, 125 | "node_modules/@biomejs/cli-linux-x64": { 126 | "version": "1.9.4", 127 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", 128 | "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", 129 | "cpu": [ 130 | "x64" 131 | ], 132 | "dev": true, 133 | "license": "MIT OR Apache-2.0", 134 | "optional": true, 135 | "os": [ 136 | "linux" 137 | ], 138 | "engines": { 139 | "node": ">=14.21.3" 140 | } 141 | }, 142 | "node_modules/@biomejs/cli-linux-x64-musl": { 143 | "version": "1.9.4", 144 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", 145 | "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", 146 | "cpu": [ 147 | "x64" 148 | ], 149 | "dev": true, 150 | "license": "MIT OR Apache-2.0", 151 | "optional": true, 152 | "os": [ 153 | "linux" 154 | ], 155 | "engines": { 156 | "node": ">=14.21.3" 157 | } 158 | }, 159 | "node_modules/@biomejs/cli-win32-arm64": { 160 | "version": "1.9.4", 161 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", 162 | "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", 163 | "cpu": [ 164 | "arm64" 165 | ], 166 | "dev": true, 167 | "license": "MIT OR Apache-2.0", 168 | "optional": true, 169 | "os": [ 170 | "win32" 171 | ], 172 | "engines": { 173 | "node": ">=14.21.3" 174 | } 175 | }, 176 | "node_modules/@biomejs/cli-win32-x64": { 177 | "version": "1.9.4", 178 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", 179 | "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", 180 | "cpu": [ 181 | "x64" 182 | ], 183 | "dev": true, 184 | "license": "MIT OR Apache-2.0", 185 | "optional": true, 186 | "os": [ 187 | "win32" 188 | ], 189 | "engines": { 190 | "node": ">=14.21.3" 191 | } 192 | }, 193 | "node_modules/@isaacs/cliui": { 194 | "version": "8.0.2", 195 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 196 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 197 | "dev": true, 198 | "license": "ISC", 199 | "dependencies": { 200 | "string-width": "^5.1.2", 201 | "string-width-cjs": "npm:string-width@^4.2.0", 202 | "strip-ansi": "^7.0.1", 203 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 204 | "wrap-ansi": "^8.1.0", 205 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 206 | }, 207 | "engines": { 208 | "node": ">=12" 209 | } 210 | }, 211 | "node_modules/@isaacs/fs-minipass": { 212 | "version": "4.0.1", 213 | "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", 214 | "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", 215 | "dev": true, 216 | "license": "ISC", 217 | "dependencies": { 218 | "minipass": "^7.0.4" 219 | }, 220 | "engines": { 221 | "node": ">=18.0.0" 222 | } 223 | }, 224 | "node_modules/@npmcli/agent": { 225 | "version": "3.0.0", 226 | "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", 227 | "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", 228 | "dev": true, 229 | "license": "ISC", 230 | "dependencies": { 231 | "agent-base": "^7.1.0", 232 | "http-proxy-agent": "^7.0.0", 233 | "https-proxy-agent": "^7.0.1", 234 | "lru-cache": "^10.0.1", 235 | "socks-proxy-agent": "^8.0.3" 236 | }, 237 | "engines": { 238 | "node": "^18.17.0 || >=20.5.0" 239 | } 240 | }, 241 | "node_modules/@npmcli/fs": { 242 | "version": "4.0.0", 243 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", 244 | "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", 245 | "dev": true, 246 | "license": "ISC", 247 | "dependencies": { 248 | "semver": "^7.3.5" 249 | }, 250 | "engines": { 251 | "node": "^18.17.0 || >=20.5.0" 252 | } 253 | }, 254 | "node_modules/@phc/format": { 255 | "version": "1.0.0", 256 | "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", 257 | "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", 258 | "license": "MIT", 259 | "engines": { 260 | "node": ">=10" 261 | } 262 | }, 263 | "node_modules/@pkgjs/parseargs": { 264 | "version": "0.11.0", 265 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 266 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 267 | "dev": true, 268 | "license": "MIT", 269 | "optional": true, 270 | "engines": { 271 | "node": ">=14" 272 | } 273 | }, 274 | "node_modules/@tsconfig/node18": { 275 | "version": "18.2.4", 276 | "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", 277 | "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", 278 | "dev": true, 279 | "license": "MIT" 280 | }, 281 | "node_modules/@types/node": { 282 | "version": "22.13.10", 283 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", 284 | "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", 285 | "dev": true, 286 | "license": "MIT", 287 | "dependencies": { 288 | "undici-types": "~6.20.0" 289 | } 290 | }, 291 | "node_modules/abbrev": { 292 | "version": "3.0.1", 293 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", 294 | "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", 295 | "dev": true, 296 | "license": "ISC", 297 | "engines": { 298 | "node": "^18.17.0 || >=20.5.0" 299 | } 300 | }, 301 | "node_modules/agent-base": { 302 | "version": "7.1.3", 303 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 304 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", 305 | "dev": true, 306 | "license": "MIT", 307 | "engines": { 308 | "node": ">= 14" 309 | } 310 | }, 311 | "node_modules/ansi-regex": { 312 | "version": "6.1.0", 313 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 314 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 315 | "dev": true, 316 | "license": "MIT", 317 | "engines": { 318 | "node": ">=12" 319 | }, 320 | "funding": { 321 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 322 | } 323 | }, 324 | "node_modules/ansi-styles": { 325 | "version": "6.2.1", 326 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 327 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 328 | "dev": true, 329 | "license": "MIT", 330 | "engines": { 331 | "node": ">=12" 332 | }, 333 | "funding": { 334 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 335 | } 336 | }, 337 | "node_modules/balanced-match": { 338 | "version": "1.0.2", 339 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 340 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 341 | "dev": true, 342 | "license": "MIT" 343 | }, 344 | "node_modules/base64-js": { 345 | "version": "1.5.1", 346 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 347 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 348 | "dev": true, 349 | "funding": [ 350 | { 351 | "type": "github", 352 | "url": "https://github.com/sponsors/feross" 353 | }, 354 | { 355 | "type": "patreon", 356 | "url": "https://www.patreon.com/feross" 357 | }, 358 | { 359 | "type": "consulting", 360 | "url": "https://feross.org/support" 361 | } 362 | ], 363 | "license": "MIT" 364 | }, 365 | "node_modules/bl": { 366 | "version": "4.1.0", 367 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 368 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 369 | "dev": true, 370 | "license": "MIT", 371 | "dependencies": { 372 | "buffer": "^5.5.0", 373 | "inherits": "^2.0.4", 374 | "readable-stream": "^3.4.0" 375 | } 376 | }, 377 | "node_modules/brace-expansion": { 378 | "version": "2.0.1", 379 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 380 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 381 | "dev": true, 382 | "license": "MIT", 383 | "dependencies": { 384 | "balanced-match": "^1.0.0" 385 | } 386 | }, 387 | "node_modules/buffer": { 388 | "version": "5.7.1", 389 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 390 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 391 | "dev": true, 392 | "funding": [ 393 | { 394 | "type": "github", 395 | "url": "https://github.com/sponsors/feross" 396 | }, 397 | { 398 | "type": "patreon", 399 | "url": "https://www.patreon.com/feross" 400 | }, 401 | { 402 | "type": "consulting", 403 | "url": "https://feross.org/support" 404 | } 405 | ], 406 | "license": "MIT", 407 | "dependencies": { 408 | "base64-js": "^1.3.1", 409 | "ieee754": "^1.1.13" 410 | } 411 | }, 412 | "node_modules/cacache": { 413 | "version": "19.0.1", 414 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", 415 | "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", 416 | "dev": true, 417 | "license": "ISC", 418 | "dependencies": { 419 | "@npmcli/fs": "^4.0.0", 420 | "fs-minipass": "^3.0.0", 421 | "glob": "^10.2.2", 422 | "lru-cache": "^10.0.1", 423 | "minipass": "^7.0.3", 424 | "minipass-collect": "^2.0.1", 425 | "minipass-flush": "^1.0.5", 426 | "minipass-pipeline": "^1.2.4", 427 | "p-map": "^7.0.2", 428 | "ssri": "^12.0.0", 429 | "tar": "^7.4.3", 430 | "unique-filename": "^4.0.0" 431 | }, 432 | "engines": { 433 | "node": "^18.17.0 || >=20.5.0" 434 | } 435 | }, 436 | "node_modules/chownr": { 437 | "version": "3.0.0", 438 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", 439 | "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", 440 | "dev": true, 441 | "license": "BlueOak-1.0.0", 442 | "engines": { 443 | "node": ">=18" 444 | } 445 | }, 446 | "node_modules/color-convert": { 447 | "version": "2.0.1", 448 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 449 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 450 | "dev": true, 451 | "license": "MIT", 452 | "dependencies": { 453 | "color-name": "~1.1.4" 454 | }, 455 | "engines": { 456 | "node": ">=7.0.0" 457 | } 458 | }, 459 | "node_modules/color-name": { 460 | "version": "1.1.4", 461 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 462 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 463 | "dev": true, 464 | "license": "MIT" 465 | }, 466 | "node_modules/cross-spawn": { 467 | "version": "7.0.6", 468 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 469 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 470 | "dev": true, 471 | "license": "MIT", 472 | "dependencies": { 473 | "path-key": "^3.1.0", 474 | "shebang-command": "^2.0.0", 475 | "which": "^2.0.1" 476 | }, 477 | "engines": { 478 | "node": ">= 8" 479 | } 480 | }, 481 | "node_modules/cross-spawn/node_modules/isexe": { 482 | "version": "2.0.0", 483 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 484 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 485 | "dev": true, 486 | "license": "ISC" 487 | }, 488 | "node_modules/cross-spawn/node_modules/which": { 489 | "version": "2.0.2", 490 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 491 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 492 | "dev": true, 493 | "license": "ISC", 494 | "dependencies": { 495 | "isexe": "^2.0.0" 496 | }, 497 | "bin": { 498 | "node-which": "bin/node-which" 499 | }, 500 | "engines": { 501 | "node": ">= 8" 502 | } 503 | }, 504 | "node_modules/debug": { 505 | "version": "4.4.0", 506 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 507 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 508 | "dev": true, 509 | "license": "MIT", 510 | "dependencies": { 511 | "ms": "^2.1.3" 512 | }, 513 | "engines": { 514 | "node": ">=6.0" 515 | }, 516 | "peerDependenciesMeta": { 517 | "supports-color": { 518 | "optional": true 519 | } 520 | } 521 | }, 522 | "node_modules/eastasianwidth": { 523 | "version": "0.2.0", 524 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 525 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 526 | "dev": true, 527 | "license": "MIT" 528 | }, 529 | "node_modules/emoji-regex": { 530 | "version": "9.2.2", 531 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 532 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 533 | "dev": true, 534 | "license": "MIT" 535 | }, 536 | "node_modules/encoding": { 537 | "version": "0.1.13", 538 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 539 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 540 | "dev": true, 541 | "license": "MIT", 542 | "optional": true, 543 | "dependencies": { 544 | "iconv-lite": "^0.6.2" 545 | } 546 | }, 547 | "node_modules/end-of-stream": { 548 | "version": "1.4.4", 549 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 550 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 551 | "dev": true, 552 | "license": "MIT", 553 | "dependencies": { 554 | "once": "^1.4.0" 555 | } 556 | }, 557 | "node_modules/env-paths": { 558 | "version": "2.2.1", 559 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 560 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 561 | "dev": true, 562 | "license": "MIT", 563 | "engines": { 564 | "node": ">=6" 565 | } 566 | }, 567 | "node_modules/err-code": { 568 | "version": "2.0.3", 569 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 570 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 571 | "dev": true, 572 | "license": "MIT" 573 | }, 574 | "node_modules/exponential-backoff": { 575 | "version": "3.1.2", 576 | "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", 577 | "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", 578 | "dev": true, 579 | "license": "Apache-2.0" 580 | }, 581 | "node_modules/fdir": { 582 | "version": "6.4.4", 583 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", 584 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 585 | "dev": true, 586 | "license": "MIT", 587 | "peerDependencies": { 588 | "picomatch": "^3 || ^4" 589 | }, 590 | "peerDependenciesMeta": { 591 | "picomatch": { 592 | "optional": true 593 | } 594 | } 595 | }, 596 | "node_modules/foreground-child": { 597 | "version": "3.3.1", 598 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 599 | "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 600 | "dev": true, 601 | "license": "ISC", 602 | "dependencies": { 603 | "cross-spawn": "^7.0.6", 604 | "signal-exit": "^4.0.1" 605 | }, 606 | "engines": { 607 | "node": ">=14" 608 | }, 609 | "funding": { 610 | "url": "https://github.com/sponsors/isaacs" 611 | } 612 | }, 613 | "node_modules/fs-constants": { 614 | "version": "1.0.0", 615 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 616 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 617 | "dev": true, 618 | "license": "MIT" 619 | }, 620 | "node_modules/fs-minipass": { 621 | "version": "3.0.3", 622 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", 623 | "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", 624 | "dev": true, 625 | "license": "ISC", 626 | "dependencies": { 627 | "minipass": "^7.0.3" 628 | }, 629 | "engines": { 630 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 631 | } 632 | }, 633 | "node_modules/glob": { 634 | "version": "10.4.5", 635 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 636 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 637 | "dev": true, 638 | "license": "ISC", 639 | "dependencies": { 640 | "foreground-child": "^3.1.0", 641 | "jackspeak": "^3.1.2", 642 | "minimatch": "^9.0.4", 643 | "minipass": "^7.1.2", 644 | "package-json-from-dist": "^1.0.0", 645 | "path-scurry": "^1.11.1" 646 | }, 647 | "bin": { 648 | "glob": "dist/esm/bin.mjs" 649 | }, 650 | "funding": { 651 | "url": "https://github.com/sponsors/isaacs" 652 | } 653 | }, 654 | "node_modules/graceful-fs": { 655 | "version": "4.2.11", 656 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 657 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 658 | "dev": true, 659 | "license": "ISC" 660 | }, 661 | "node_modules/http-cache-semantics": { 662 | "version": "4.1.1", 663 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 664 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 665 | "dev": true, 666 | "license": "BSD-2-Clause" 667 | }, 668 | "node_modules/http-proxy-agent": { 669 | "version": "7.0.2", 670 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 671 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 672 | "dev": true, 673 | "license": "MIT", 674 | "dependencies": { 675 | "agent-base": "^7.1.0", 676 | "debug": "^4.3.4" 677 | }, 678 | "engines": { 679 | "node": ">= 14" 680 | } 681 | }, 682 | "node_modules/https-proxy-agent": { 683 | "version": "7.0.6", 684 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 685 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 686 | "dev": true, 687 | "license": "MIT", 688 | "dependencies": { 689 | "agent-base": "^7.1.2", 690 | "debug": "4" 691 | }, 692 | "engines": { 693 | "node": ">= 14" 694 | } 695 | }, 696 | "node_modules/iconv-lite": { 697 | "version": "0.6.3", 698 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 699 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 700 | "dev": true, 701 | "license": "MIT", 702 | "optional": true, 703 | "dependencies": { 704 | "safer-buffer": ">= 2.1.2 < 3.0.0" 705 | }, 706 | "engines": { 707 | "node": ">=0.10.0" 708 | } 709 | }, 710 | "node_modules/ieee754": { 711 | "version": "1.2.1", 712 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 713 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 714 | "dev": true, 715 | "funding": [ 716 | { 717 | "type": "github", 718 | "url": "https://github.com/sponsors/feross" 719 | }, 720 | { 721 | "type": "patreon", 722 | "url": "https://www.patreon.com/feross" 723 | }, 724 | { 725 | "type": "consulting", 726 | "url": "https://feross.org/support" 727 | } 728 | ], 729 | "license": "BSD-3-Clause" 730 | }, 731 | "node_modules/imurmurhash": { 732 | "version": "0.1.4", 733 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 734 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 735 | "dev": true, 736 | "license": "MIT", 737 | "engines": { 738 | "node": ">=0.8.19" 739 | } 740 | }, 741 | "node_modules/inherits": { 742 | "version": "2.0.4", 743 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 744 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 745 | "dev": true, 746 | "license": "ISC" 747 | }, 748 | "node_modules/ip-address": { 749 | "version": "9.0.5", 750 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 751 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 752 | "dev": true, 753 | "license": "MIT", 754 | "dependencies": { 755 | "jsbn": "1.1.0", 756 | "sprintf-js": "^1.1.3" 757 | }, 758 | "engines": { 759 | "node": ">= 12" 760 | } 761 | }, 762 | "node_modules/is-fullwidth-code-point": { 763 | "version": "3.0.0", 764 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 765 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 766 | "dev": true, 767 | "license": "MIT", 768 | "engines": { 769 | "node": ">=8" 770 | } 771 | }, 772 | "node_modules/isexe": { 773 | "version": "3.1.1", 774 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", 775 | "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", 776 | "dev": true, 777 | "license": "ISC", 778 | "engines": { 779 | "node": ">=16" 780 | } 781 | }, 782 | "node_modules/jackspeak": { 783 | "version": "3.4.3", 784 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 785 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 786 | "dev": true, 787 | "license": "BlueOak-1.0.0", 788 | "dependencies": { 789 | "@isaacs/cliui": "^8.0.2" 790 | }, 791 | "funding": { 792 | "url": "https://github.com/sponsors/isaacs" 793 | }, 794 | "optionalDependencies": { 795 | "@pkgjs/parseargs": "^0.11.0" 796 | } 797 | }, 798 | "node_modules/jsbn": { 799 | "version": "1.1.0", 800 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 801 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 802 | "dev": true, 803 | "license": "MIT" 804 | }, 805 | "node_modules/lru-cache": { 806 | "version": "10.4.3", 807 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 808 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 809 | "dev": true, 810 | "license": "ISC" 811 | }, 812 | "node_modules/make-fetch-happen": { 813 | "version": "14.0.3", 814 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", 815 | "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", 816 | "dev": true, 817 | "license": "ISC", 818 | "dependencies": { 819 | "@npmcli/agent": "^3.0.0", 820 | "cacache": "^19.0.1", 821 | "http-cache-semantics": "^4.1.1", 822 | "minipass": "^7.0.2", 823 | "minipass-fetch": "^4.0.0", 824 | "minipass-flush": "^1.0.5", 825 | "minipass-pipeline": "^1.2.4", 826 | "negotiator": "^1.0.0", 827 | "proc-log": "^5.0.0", 828 | "promise-retry": "^2.0.1", 829 | "ssri": "^12.0.0" 830 | }, 831 | "engines": { 832 | "node": "^18.17.0 || >=20.5.0" 833 | } 834 | }, 835 | "node_modules/minimatch": { 836 | "version": "9.0.5", 837 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 838 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 839 | "dev": true, 840 | "license": "ISC", 841 | "dependencies": { 842 | "brace-expansion": "^2.0.1" 843 | }, 844 | "engines": { 845 | "node": ">=16 || 14 >=14.17" 846 | }, 847 | "funding": { 848 | "url": "https://github.com/sponsors/isaacs" 849 | } 850 | }, 851 | "node_modules/minimist": { 852 | "version": "1.2.8", 853 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 854 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 855 | "dev": true, 856 | "license": "MIT", 857 | "funding": { 858 | "url": "https://github.com/sponsors/ljharb" 859 | } 860 | }, 861 | "node_modules/minipass": { 862 | "version": "7.1.2", 863 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 864 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 865 | "dev": true, 866 | "license": "ISC", 867 | "engines": { 868 | "node": ">=16 || 14 >=14.17" 869 | } 870 | }, 871 | "node_modules/minipass-collect": { 872 | "version": "2.0.1", 873 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", 874 | "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", 875 | "dev": true, 876 | "license": "ISC", 877 | "dependencies": { 878 | "minipass": "^7.0.3" 879 | }, 880 | "engines": { 881 | "node": ">=16 || 14 >=14.17" 882 | } 883 | }, 884 | "node_modules/minipass-fetch": { 885 | "version": "4.0.1", 886 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", 887 | "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", 888 | "dev": true, 889 | "license": "MIT", 890 | "dependencies": { 891 | "minipass": "^7.0.3", 892 | "minipass-sized": "^1.0.3", 893 | "minizlib": "^3.0.1" 894 | }, 895 | "engines": { 896 | "node": "^18.17.0 || >=20.5.0" 897 | }, 898 | "optionalDependencies": { 899 | "encoding": "^0.1.13" 900 | } 901 | }, 902 | "node_modules/minipass-flush": { 903 | "version": "1.0.5", 904 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 905 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 906 | "dev": true, 907 | "license": "ISC", 908 | "dependencies": { 909 | "minipass": "^3.0.0" 910 | }, 911 | "engines": { 912 | "node": ">= 8" 913 | } 914 | }, 915 | "node_modules/minipass-flush/node_modules/minipass": { 916 | "version": "3.3.6", 917 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 918 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 919 | "dev": true, 920 | "license": "ISC", 921 | "dependencies": { 922 | "yallist": "^4.0.0" 923 | }, 924 | "engines": { 925 | "node": ">=8" 926 | } 927 | }, 928 | "node_modules/minipass-flush/node_modules/yallist": { 929 | "version": "4.0.0", 930 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 931 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 932 | "dev": true, 933 | "license": "ISC" 934 | }, 935 | "node_modules/minipass-pipeline": { 936 | "version": "1.2.4", 937 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 938 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 939 | "dev": true, 940 | "license": "ISC", 941 | "dependencies": { 942 | "minipass": "^3.0.0" 943 | }, 944 | "engines": { 945 | "node": ">=8" 946 | } 947 | }, 948 | "node_modules/minipass-pipeline/node_modules/minipass": { 949 | "version": "3.3.6", 950 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 951 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 952 | "dev": true, 953 | "license": "ISC", 954 | "dependencies": { 955 | "yallist": "^4.0.0" 956 | }, 957 | "engines": { 958 | "node": ">=8" 959 | } 960 | }, 961 | "node_modules/minipass-pipeline/node_modules/yallist": { 962 | "version": "4.0.0", 963 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 964 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 965 | "dev": true, 966 | "license": "ISC" 967 | }, 968 | "node_modules/minipass-sized": { 969 | "version": "1.0.3", 970 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 971 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 972 | "dev": true, 973 | "license": "ISC", 974 | "dependencies": { 975 | "minipass": "^3.0.0" 976 | }, 977 | "engines": { 978 | "node": ">=8" 979 | } 980 | }, 981 | "node_modules/minipass-sized/node_modules/minipass": { 982 | "version": "3.3.6", 983 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 984 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 985 | "dev": true, 986 | "license": "ISC", 987 | "dependencies": { 988 | "yallist": "^4.0.0" 989 | }, 990 | "engines": { 991 | "node": ">=8" 992 | } 993 | }, 994 | "node_modules/minipass-sized/node_modules/yallist": { 995 | "version": "4.0.0", 996 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 997 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 998 | "dev": true, 999 | "license": "ISC" 1000 | }, 1001 | "node_modules/minizlib": { 1002 | "version": "3.0.2", 1003 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", 1004 | "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", 1005 | "dev": true, 1006 | "license": "MIT", 1007 | "dependencies": { 1008 | "minipass": "^7.1.2" 1009 | }, 1010 | "engines": { 1011 | "node": ">= 18" 1012 | } 1013 | }, 1014 | "node_modules/mkdirp": { 1015 | "version": "3.0.1", 1016 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", 1017 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 1018 | "dev": true, 1019 | "license": "MIT", 1020 | "bin": { 1021 | "mkdirp": "dist/cjs/src/bin.js" 1022 | }, 1023 | "engines": { 1024 | "node": ">=10" 1025 | }, 1026 | "funding": { 1027 | "url": "https://github.com/sponsors/isaacs" 1028 | } 1029 | }, 1030 | "node_modules/mkdirp-classic": { 1031 | "version": "0.5.3", 1032 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1033 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1034 | "dev": true, 1035 | "license": "MIT" 1036 | }, 1037 | "node_modules/ms": { 1038 | "version": "2.1.3", 1039 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1040 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1041 | "dev": true, 1042 | "license": "MIT" 1043 | }, 1044 | "node_modules/negotiator": { 1045 | "version": "1.0.0", 1046 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 1047 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 1048 | "dev": true, 1049 | "license": "MIT", 1050 | "engines": { 1051 | "node": ">= 0.6" 1052 | } 1053 | }, 1054 | "node_modules/node-abi": { 1055 | "version": "3.74.0", 1056 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", 1057 | "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", 1058 | "dev": true, 1059 | "license": "MIT", 1060 | "dependencies": { 1061 | "semver": "^7.3.5" 1062 | }, 1063 | "engines": { 1064 | "node": ">=10" 1065 | } 1066 | }, 1067 | "node_modules/node-addon-api": { 1068 | "version": "8.3.1", 1069 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", 1070 | "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", 1071 | "license": "MIT", 1072 | "engines": { 1073 | "node": "^18 || ^20 || >= 21" 1074 | } 1075 | }, 1076 | "node_modules/node-gyp": { 1077 | "version": "11.2.0", 1078 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", 1079 | "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", 1080 | "dev": true, 1081 | "license": "MIT", 1082 | "dependencies": { 1083 | "env-paths": "^2.2.0", 1084 | "exponential-backoff": "^3.1.1", 1085 | "graceful-fs": "^4.2.6", 1086 | "make-fetch-happen": "^14.0.3", 1087 | "nopt": "^8.0.0", 1088 | "proc-log": "^5.0.0", 1089 | "semver": "^7.3.5", 1090 | "tar": "^7.4.3", 1091 | "tinyglobby": "^0.2.12", 1092 | "which": "^5.0.0" 1093 | }, 1094 | "bin": { 1095 | "node-gyp": "bin/node-gyp.js" 1096 | }, 1097 | "engines": { 1098 | "node": "^18.17.0 || >=20.5.0" 1099 | } 1100 | }, 1101 | "node_modules/node-gyp-build": { 1102 | "version": "4.8.4", 1103 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", 1104 | "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", 1105 | "license": "MIT", 1106 | "bin": { 1107 | "node-gyp-build": "bin.js", 1108 | "node-gyp-build-optional": "optional.js", 1109 | "node-gyp-build-test": "build-test.js" 1110 | } 1111 | }, 1112 | "node_modules/nopt": { 1113 | "version": "8.1.0", 1114 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", 1115 | "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", 1116 | "dev": true, 1117 | "license": "ISC", 1118 | "dependencies": { 1119 | "abbrev": "^3.0.0" 1120 | }, 1121 | "bin": { 1122 | "nopt": "bin/nopt.js" 1123 | }, 1124 | "engines": { 1125 | "node": "^18.17.0 || >=20.5.0" 1126 | } 1127 | }, 1128 | "node_modules/npm-run-path": { 1129 | "version": "3.1.0", 1130 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", 1131 | "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", 1132 | "dev": true, 1133 | "license": "MIT", 1134 | "dependencies": { 1135 | "path-key": "^3.0.0" 1136 | }, 1137 | "engines": { 1138 | "node": ">=8" 1139 | } 1140 | }, 1141 | "node_modules/once": { 1142 | "version": "1.4.0", 1143 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1144 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1145 | "dev": true, 1146 | "license": "ISC", 1147 | "dependencies": { 1148 | "wrappy": "1" 1149 | } 1150 | }, 1151 | "node_modules/p-map": { 1152 | "version": "7.0.3", 1153 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", 1154 | "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", 1155 | "dev": true, 1156 | "license": "MIT", 1157 | "engines": { 1158 | "node": ">=18" 1159 | }, 1160 | "funding": { 1161 | "url": "https://github.com/sponsors/sindresorhus" 1162 | } 1163 | }, 1164 | "node_modules/package-json-from-dist": { 1165 | "version": "1.0.1", 1166 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1167 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1168 | "dev": true, 1169 | "license": "BlueOak-1.0.0" 1170 | }, 1171 | "node_modules/path-key": { 1172 | "version": "3.1.1", 1173 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1174 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1175 | "dev": true, 1176 | "license": "MIT", 1177 | "engines": { 1178 | "node": ">=8" 1179 | } 1180 | }, 1181 | "node_modules/path-scurry": { 1182 | "version": "1.11.1", 1183 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1184 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1185 | "dev": true, 1186 | "license": "BlueOak-1.0.0", 1187 | "dependencies": { 1188 | "lru-cache": "^10.2.0", 1189 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1190 | }, 1191 | "engines": { 1192 | "node": ">=16 || 14 >=14.18" 1193 | }, 1194 | "funding": { 1195 | "url": "https://github.com/sponsors/isaacs" 1196 | } 1197 | }, 1198 | "node_modules/picomatch": { 1199 | "version": "4.0.2", 1200 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1201 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1202 | "dev": true, 1203 | "license": "MIT", 1204 | "engines": { 1205 | "node": ">=12" 1206 | }, 1207 | "funding": { 1208 | "url": "https://github.com/sponsors/jonschlinkert" 1209 | } 1210 | }, 1211 | "node_modules/prebuildify": { 1212 | "version": "6.0.1", 1213 | "resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz", 1214 | "integrity": "sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==", 1215 | "dev": true, 1216 | "license": "MIT", 1217 | "dependencies": { 1218 | "minimist": "^1.2.5", 1219 | "mkdirp-classic": "^0.5.3", 1220 | "node-abi": "^3.3.0", 1221 | "npm-run-path": "^3.1.0", 1222 | "pump": "^3.0.0", 1223 | "tar-fs": "^2.1.0" 1224 | }, 1225 | "bin": { 1226 | "prebuildify": "bin.js" 1227 | } 1228 | }, 1229 | "node_modules/proc-log": { 1230 | "version": "5.0.0", 1231 | "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", 1232 | "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", 1233 | "dev": true, 1234 | "license": "ISC", 1235 | "engines": { 1236 | "node": "^18.17.0 || >=20.5.0" 1237 | } 1238 | }, 1239 | "node_modules/promise-retry": { 1240 | "version": "2.0.1", 1241 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1242 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1243 | "dev": true, 1244 | "license": "MIT", 1245 | "dependencies": { 1246 | "err-code": "^2.0.2", 1247 | "retry": "^0.12.0" 1248 | }, 1249 | "engines": { 1250 | "node": ">=10" 1251 | } 1252 | }, 1253 | "node_modules/pump": { 1254 | "version": "3.0.2", 1255 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1256 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1257 | "dev": true, 1258 | "license": "MIT", 1259 | "dependencies": { 1260 | "end-of-stream": "^1.1.0", 1261 | "once": "^1.3.1" 1262 | } 1263 | }, 1264 | "node_modules/readable-stream": { 1265 | "version": "3.6.2", 1266 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1267 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1268 | "dev": true, 1269 | "license": "MIT", 1270 | "dependencies": { 1271 | "inherits": "^2.0.3", 1272 | "string_decoder": "^1.1.1", 1273 | "util-deprecate": "^1.0.1" 1274 | }, 1275 | "engines": { 1276 | "node": ">= 6" 1277 | } 1278 | }, 1279 | "node_modules/retry": { 1280 | "version": "0.12.0", 1281 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1282 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1283 | "dev": true, 1284 | "license": "MIT", 1285 | "engines": { 1286 | "node": ">= 4" 1287 | } 1288 | }, 1289 | "node_modules/safe-buffer": { 1290 | "version": "5.2.1", 1291 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1292 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1293 | "dev": true, 1294 | "funding": [ 1295 | { 1296 | "type": "github", 1297 | "url": "https://github.com/sponsors/feross" 1298 | }, 1299 | { 1300 | "type": "patreon", 1301 | "url": "https://www.patreon.com/feross" 1302 | }, 1303 | { 1304 | "type": "consulting", 1305 | "url": "https://feross.org/support" 1306 | } 1307 | ], 1308 | "license": "MIT" 1309 | }, 1310 | "node_modules/safer-buffer": { 1311 | "version": "2.1.2", 1312 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1313 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1314 | "dev": true, 1315 | "license": "MIT", 1316 | "optional": true 1317 | }, 1318 | "node_modules/semver": { 1319 | "version": "7.7.1", 1320 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 1321 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 1322 | "dev": true, 1323 | "license": "ISC", 1324 | "bin": { 1325 | "semver": "bin/semver.js" 1326 | }, 1327 | "engines": { 1328 | "node": ">=10" 1329 | } 1330 | }, 1331 | "node_modules/shebang-command": { 1332 | "version": "2.0.0", 1333 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1334 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1335 | "dev": true, 1336 | "license": "MIT", 1337 | "dependencies": { 1338 | "shebang-regex": "^3.0.0" 1339 | }, 1340 | "engines": { 1341 | "node": ">=8" 1342 | } 1343 | }, 1344 | "node_modules/shebang-regex": { 1345 | "version": "3.0.0", 1346 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1347 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1348 | "dev": true, 1349 | "license": "MIT", 1350 | "engines": { 1351 | "node": ">=8" 1352 | } 1353 | }, 1354 | "node_modules/signal-exit": { 1355 | "version": "4.1.0", 1356 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1357 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1358 | "dev": true, 1359 | "license": "ISC", 1360 | "engines": { 1361 | "node": ">=14" 1362 | }, 1363 | "funding": { 1364 | "url": "https://github.com/sponsors/isaacs" 1365 | } 1366 | }, 1367 | "node_modules/smart-buffer": { 1368 | "version": "4.2.0", 1369 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1370 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1371 | "dev": true, 1372 | "license": "MIT", 1373 | "engines": { 1374 | "node": ">= 6.0.0", 1375 | "npm": ">= 3.0.0" 1376 | } 1377 | }, 1378 | "node_modules/socks": { 1379 | "version": "2.8.4", 1380 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", 1381 | "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", 1382 | "dev": true, 1383 | "license": "MIT", 1384 | "dependencies": { 1385 | "ip-address": "^9.0.5", 1386 | "smart-buffer": "^4.2.0" 1387 | }, 1388 | "engines": { 1389 | "node": ">= 10.0.0", 1390 | "npm": ">= 3.0.0" 1391 | } 1392 | }, 1393 | "node_modules/socks-proxy-agent": { 1394 | "version": "8.0.5", 1395 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", 1396 | "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", 1397 | "dev": true, 1398 | "license": "MIT", 1399 | "dependencies": { 1400 | "agent-base": "^7.1.2", 1401 | "debug": "^4.3.4", 1402 | "socks": "^2.8.3" 1403 | }, 1404 | "engines": { 1405 | "node": ">= 14" 1406 | } 1407 | }, 1408 | "node_modules/sprintf-js": { 1409 | "version": "1.1.3", 1410 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1411 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 1412 | "dev": true, 1413 | "license": "BSD-3-Clause" 1414 | }, 1415 | "node_modules/ssri": { 1416 | "version": "12.0.0", 1417 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", 1418 | "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", 1419 | "dev": true, 1420 | "license": "ISC", 1421 | "dependencies": { 1422 | "minipass": "^7.0.3" 1423 | }, 1424 | "engines": { 1425 | "node": "^18.17.0 || >=20.5.0" 1426 | } 1427 | }, 1428 | "node_modules/string_decoder": { 1429 | "version": "1.3.0", 1430 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1431 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1432 | "dev": true, 1433 | "license": "MIT", 1434 | "dependencies": { 1435 | "safe-buffer": "~5.2.0" 1436 | } 1437 | }, 1438 | "node_modules/string-width": { 1439 | "version": "5.1.2", 1440 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1441 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1442 | "dev": true, 1443 | "license": "MIT", 1444 | "dependencies": { 1445 | "eastasianwidth": "^0.2.0", 1446 | "emoji-regex": "^9.2.2", 1447 | "strip-ansi": "^7.0.1" 1448 | }, 1449 | "engines": { 1450 | "node": ">=12" 1451 | }, 1452 | "funding": { 1453 | "url": "https://github.com/sponsors/sindresorhus" 1454 | } 1455 | }, 1456 | "node_modules/string-width-cjs": { 1457 | "name": "string-width", 1458 | "version": "4.2.3", 1459 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1460 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1461 | "dev": true, 1462 | "license": "MIT", 1463 | "dependencies": { 1464 | "emoji-regex": "^8.0.0", 1465 | "is-fullwidth-code-point": "^3.0.0", 1466 | "strip-ansi": "^6.0.1" 1467 | }, 1468 | "engines": { 1469 | "node": ">=8" 1470 | } 1471 | }, 1472 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1473 | "version": "5.0.1", 1474 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1475 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1476 | "dev": true, 1477 | "license": "MIT", 1478 | "engines": { 1479 | "node": ">=8" 1480 | } 1481 | }, 1482 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1483 | "version": "8.0.0", 1484 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1485 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1486 | "dev": true, 1487 | "license": "MIT" 1488 | }, 1489 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1490 | "version": "6.0.1", 1491 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1492 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1493 | "dev": true, 1494 | "license": "MIT", 1495 | "dependencies": { 1496 | "ansi-regex": "^5.0.1" 1497 | }, 1498 | "engines": { 1499 | "node": ">=8" 1500 | } 1501 | }, 1502 | "node_modules/strip-ansi": { 1503 | "version": "7.1.0", 1504 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1505 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1506 | "dev": true, 1507 | "license": "MIT", 1508 | "dependencies": { 1509 | "ansi-regex": "^6.0.1" 1510 | }, 1511 | "engines": { 1512 | "node": ">=12" 1513 | }, 1514 | "funding": { 1515 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1516 | } 1517 | }, 1518 | "node_modules/strip-ansi-cjs": { 1519 | "name": "strip-ansi", 1520 | "version": "6.0.1", 1521 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1522 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1523 | "dev": true, 1524 | "license": "MIT", 1525 | "dependencies": { 1526 | "ansi-regex": "^5.0.1" 1527 | }, 1528 | "engines": { 1529 | "node": ">=8" 1530 | } 1531 | }, 1532 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1533 | "version": "5.0.1", 1534 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1535 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1536 | "dev": true, 1537 | "license": "MIT", 1538 | "engines": { 1539 | "node": ">=8" 1540 | } 1541 | }, 1542 | "node_modules/tar": { 1543 | "version": "7.4.3", 1544 | "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", 1545 | "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", 1546 | "dev": true, 1547 | "license": "ISC", 1548 | "dependencies": { 1549 | "@isaacs/fs-minipass": "^4.0.0", 1550 | "chownr": "^3.0.0", 1551 | "minipass": "^7.1.2", 1552 | "minizlib": "^3.0.1", 1553 | "mkdirp": "^3.0.1", 1554 | "yallist": "^5.0.0" 1555 | }, 1556 | "engines": { 1557 | "node": ">=18" 1558 | } 1559 | }, 1560 | "node_modules/tar-fs": { 1561 | "version": "2.1.2", 1562 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", 1563 | "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", 1564 | "dev": true, 1565 | "license": "MIT", 1566 | "dependencies": { 1567 | "chownr": "^1.1.1", 1568 | "mkdirp-classic": "^0.5.2", 1569 | "pump": "^3.0.0", 1570 | "tar-stream": "^2.1.4" 1571 | } 1572 | }, 1573 | "node_modules/tar-fs/node_modules/chownr": { 1574 | "version": "1.1.4", 1575 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1576 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 1577 | "dev": true, 1578 | "license": "ISC" 1579 | }, 1580 | "node_modules/tar-stream": { 1581 | "version": "2.2.0", 1582 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1583 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1584 | "dev": true, 1585 | "license": "MIT", 1586 | "dependencies": { 1587 | "bl": "^4.0.3", 1588 | "end-of-stream": "^1.4.1", 1589 | "fs-constants": "^1.0.0", 1590 | "inherits": "^2.0.3", 1591 | "readable-stream": "^3.1.1" 1592 | }, 1593 | "engines": { 1594 | "node": ">=6" 1595 | } 1596 | }, 1597 | "node_modules/tinyglobby": { 1598 | "version": "0.2.13", 1599 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", 1600 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 1601 | "dev": true, 1602 | "license": "MIT", 1603 | "dependencies": { 1604 | "fdir": "^6.4.4", 1605 | "picomatch": "^4.0.2" 1606 | }, 1607 | "engines": { 1608 | "node": ">=12.0.0" 1609 | }, 1610 | "funding": { 1611 | "url": "https://github.com/sponsors/SuperchupuDev" 1612 | } 1613 | }, 1614 | "node_modules/typescript": { 1615 | "version": "5.8.3", 1616 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 1617 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 1618 | "dev": true, 1619 | "license": "Apache-2.0", 1620 | "bin": { 1621 | "tsc": "bin/tsc", 1622 | "tsserver": "bin/tsserver" 1623 | }, 1624 | "engines": { 1625 | "node": ">=14.17" 1626 | } 1627 | }, 1628 | "node_modules/undici-types": { 1629 | "version": "6.20.0", 1630 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 1631 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 1632 | "dev": true, 1633 | "license": "MIT" 1634 | }, 1635 | "node_modules/unique-filename": { 1636 | "version": "4.0.0", 1637 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", 1638 | "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", 1639 | "dev": true, 1640 | "license": "ISC", 1641 | "dependencies": { 1642 | "unique-slug": "^5.0.0" 1643 | }, 1644 | "engines": { 1645 | "node": "^18.17.0 || >=20.5.0" 1646 | } 1647 | }, 1648 | "node_modules/unique-slug": { 1649 | "version": "5.0.0", 1650 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", 1651 | "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", 1652 | "dev": true, 1653 | "license": "ISC", 1654 | "dependencies": { 1655 | "imurmurhash": "^0.1.4" 1656 | }, 1657 | "engines": { 1658 | "node": "^18.17.0 || >=20.5.0" 1659 | } 1660 | }, 1661 | "node_modules/util-deprecate": { 1662 | "version": "1.0.2", 1663 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1664 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1665 | "dev": true, 1666 | "license": "MIT" 1667 | }, 1668 | "node_modules/which": { 1669 | "version": "5.0.0", 1670 | "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", 1671 | "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", 1672 | "dev": true, 1673 | "license": "ISC", 1674 | "dependencies": { 1675 | "isexe": "^3.1.1" 1676 | }, 1677 | "bin": { 1678 | "node-which": "bin/which.js" 1679 | }, 1680 | "engines": { 1681 | "node": "^18.17.0 || >=20.5.0" 1682 | } 1683 | }, 1684 | "node_modules/wrap-ansi": { 1685 | "version": "8.1.0", 1686 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1687 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1688 | "dev": true, 1689 | "license": "MIT", 1690 | "dependencies": { 1691 | "ansi-styles": "^6.1.0", 1692 | "string-width": "^5.0.1", 1693 | "strip-ansi": "^7.0.1" 1694 | }, 1695 | "engines": { 1696 | "node": ">=12" 1697 | }, 1698 | "funding": { 1699 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1700 | } 1701 | }, 1702 | "node_modules/wrap-ansi-cjs": { 1703 | "name": "wrap-ansi", 1704 | "version": "7.0.0", 1705 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1706 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1707 | "dev": true, 1708 | "license": "MIT", 1709 | "dependencies": { 1710 | "ansi-styles": "^4.0.0", 1711 | "string-width": "^4.1.0", 1712 | "strip-ansi": "^6.0.0" 1713 | }, 1714 | "engines": { 1715 | "node": ">=10" 1716 | }, 1717 | "funding": { 1718 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1719 | } 1720 | }, 1721 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1722 | "version": "5.0.1", 1723 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1724 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1725 | "dev": true, 1726 | "license": "MIT", 1727 | "engines": { 1728 | "node": ">=8" 1729 | } 1730 | }, 1731 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 1732 | "version": "4.3.0", 1733 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1734 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1735 | "dev": true, 1736 | "license": "MIT", 1737 | "dependencies": { 1738 | "color-convert": "^2.0.1" 1739 | }, 1740 | "engines": { 1741 | "node": ">=8" 1742 | }, 1743 | "funding": { 1744 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1745 | } 1746 | }, 1747 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1748 | "version": "8.0.0", 1749 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1750 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1751 | "dev": true, 1752 | "license": "MIT" 1753 | }, 1754 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1755 | "version": "4.2.3", 1756 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1757 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1758 | "dev": true, 1759 | "license": "MIT", 1760 | "dependencies": { 1761 | "emoji-regex": "^8.0.0", 1762 | "is-fullwidth-code-point": "^3.0.0", 1763 | "strip-ansi": "^6.0.1" 1764 | }, 1765 | "engines": { 1766 | "node": ">=8" 1767 | } 1768 | }, 1769 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1770 | "version": "6.0.1", 1771 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1772 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1773 | "dev": true, 1774 | "license": "MIT", 1775 | "dependencies": { 1776 | "ansi-regex": "^5.0.1" 1777 | }, 1778 | "engines": { 1779 | "node": ">=8" 1780 | } 1781 | }, 1782 | "node_modules/wrappy": { 1783 | "version": "1.0.2", 1784 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1785 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1786 | "dev": true, 1787 | "license": "ISC" 1788 | }, 1789 | "node_modules/yallist": { 1790 | "version": "5.0.0", 1791 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", 1792 | "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", 1793 | "dev": true, 1794 | "license": "BlueOak-1.0.0", 1795 | "engines": { 1796 | "node": ">=18" 1797 | } 1798 | } 1799 | } 1800 | } 1801 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "argon2", 3 | "version": "0.43.0", 4 | "description": "An Argon2 library for Node", 5 | "keywords": ["argon2", "crypto", "encryption", "hashing", "password"], 6 | "homepage": "https://github.com/ranisalt/node-argon2#readme", 7 | "bugs": { 8 | "url": "https://github.com/ranisalt/node-argon2/issues" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/ranisalt/node-argon2.git" 13 | }, 14 | "license": "MIT", 15 | "author": "Ranieri Althoff ", 16 | "type": "commonjs", 17 | "main": "argon2.cjs", 18 | "types": "argon2.d.cts", 19 | "files": [ 20 | "argon2.cpp", 21 | "argon2.d.cts", 22 | "argon2.d.cts.map", 23 | "binding.gyp", 24 | "argon2/CHANGELOG.md", 25 | "argon2/LICENSE", 26 | "argon2/include/", 27 | "argon2/src/blake2/", 28 | "argon2/src/argon2.c", 29 | "argon2/src/core.c", 30 | "argon2/src/core.h", 31 | "argon2/src/encoding.c", 32 | "argon2/src/encoding.h", 33 | "argon2/src/opt.c", 34 | "argon2/src/ref.c", 35 | "argon2/src/thread.c", 36 | "argon2/src/thread.h", 37 | "prebuilds/**/*.node" 38 | ], 39 | "binary": { 40 | "napi_versions": [8] 41 | }, 42 | "scripts": { 43 | "build": "prebuildify --napi --strip --tag-armv --tag-libc", 44 | "install": "node-gyp-build", 45 | "lint": "biome check .", 46 | "prepare": "tsc", 47 | "test": "node --test test.cjs" 48 | }, 49 | "dependencies": { 50 | "@phc/format": "^1.0.0", 51 | "node-addon-api": "^8.3.1", 52 | "node-gyp-build": "^4.8.4" 53 | }, 54 | "devDependencies": { 55 | "@biomejs/biome": "1.9.4", 56 | "@tsconfig/node18": "18.2.4", 57 | "@types/node": "22.13.10", 58 | "node-gyp": "11.2.0", 59 | "prebuildify": "6.0.1", 60 | "typescript": "5.8.3" 61 | }, 62 | "packageManager": "npm@11.2.0+sha512.3dc9c50ba813a3d54393155a435fe66404b72685ab0e3008f9ae9ed8d81f6104860f07ed2656dd5748c1322d95f3140fa9b19c59a6bba7750fd12285f81866da", 63 | "engines": { 64 | "node": ">=16.17.0" 65 | }, 66 | "collective": { 67 | "type": "opencollective", 68 | "url": "https://opencollective.com/node-argon2" 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /test.cjs: -------------------------------------------------------------------------------- 1 | const assert = require("node:assert/strict"); 2 | const { describe, it } = require("node:test"); 3 | const argon2 = require("./argon2.cjs"); 4 | 5 | const { argon2i, argon2d, argon2id } = argon2; 6 | 7 | const password = "password"; 8 | const salt = Buffer.alloc(16, "salt"); 9 | const associatedData = Buffer.alloc(16, "ad"); 10 | const secret = Buffer.alloc(16, "secret"); 11 | 12 | // hashes for argon2i and argon2d with default options 13 | const hashes = { 14 | argon2id: 15 | "$argon2id$v=19$m=65536,t=3,p=4$c2FsdHNhbHRzYWx0c2FsdA$rBWULD5jOGpQy32rLvGcmvQMVqIVNAmrCtekWvUA8bw", 16 | withNull: 17 | "$argon2id$v=19$m=65536,t=3,p=4$c2FsdHNhbHRzYWx0c2FsdA$NqchDOxwWbcBzA+0gtsCtyspEQxqKFf4/PO/AoIvo+Q", 18 | withAd: 19 | "$argon2id$v=19$m=65536,t=3,p=4,data=YWRhZGFkYWRhZGFkYWRhZA$c2FsdHNhbHRzYWx0c2FsdA$TEIIM4GBSUxvMLolL9ePXYP5G/qcr0vywQqqm/ILvsM", 20 | withSecret: 21 | "$argon2id$v=19$m=65536,t=3,p=4$c2FsdHNhbHRzYWx0c2FsdA$8dZyo1MdHgdzBm+VU7+tyW06dUO7B9FyaPImH5ejVOU", 22 | argon2i: 23 | "$argon2i$v=19$m=65536,t=3,p=4$c2FsdHNhbHRzYWx0c2FsdA$1Ccmp7ECb+Rb5XPjqRwEuAjCufY1xQDOJwnHrB+orZ4", 24 | argon2d: 25 | "$argon2d$v=19$m=65536,t=3,p=4$c2FsdHNhbHRzYWx0c2FsdA$VtxJNl5Jr/yZ2UIhvfvL4sGPdDQyGCcy45Cs7rIdFq8", 26 | rawArgon2id: Buffer.from( 27 | "ac15942c3e63386a50cb7dab2ef19c9af40c56a2153409ab0ad7a45af500f1bc", 28 | "hex", 29 | ), 30 | rawWithNull: Buffer.from( 31 | "36a7210cec7059b701cc0fb482db02b72b29110c6a2857f8fcf3bf02822fa3e4", 32 | "hex", 33 | ), 34 | rawArgon2i: Buffer.from( 35 | "d42726a7b1026fe45be573e3a91c04b808c2b9f635c500ce2709c7ac1fa8ad9e", 36 | "hex", 37 | ), 38 | rawArgon2d: Buffer.from( 39 | "56dc49365e49affc99d94221bdfbcbe2c18f743432182732e390aceeb21d16af", 40 | "hex", 41 | ), 42 | oldFormat: 43 | "$argon2i$m=4096,t=3,p=1$tbagT6b1YH33niCo9lVzuA$htv/k+OqWk1V9zD9k5DOBi2kcfcZ6Xu3tWmwEPV3/nc", 44 | }; 45 | 46 | describe("hash", () => { 47 | it("hash with argon2i", async () => { 48 | assert.equal( 49 | hashes.argon2i, 50 | await argon2.hash(password, { type: argon2i, salt }), 51 | ); 52 | }); 53 | 54 | it("argon2i with raw hash", async () => { 55 | assert( 56 | hashes.rawArgon2i.equals( 57 | await argon2.hash(password, { type: argon2i, raw: true, salt }), 58 | ), 59 | ); 60 | }); 61 | 62 | it("hash with argon2d", async () => { 63 | assert.equal( 64 | hashes.argon2d, 65 | await argon2.hash(password, { type: argon2d, salt }), 66 | ); 67 | }); 68 | 69 | it("argon2d with raw hash", async () => { 70 | assert( 71 | hashes.rawArgon2d.equals( 72 | await argon2.hash(password, { type: argon2d, raw: true, salt }), 73 | ), 74 | ); 75 | }); 76 | 77 | it("hash with argon2id", async () => { 78 | assert.equal( 79 | hashes.argon2id, 80 | await argon2.hash(password, { type: argon2id, salt }), 81 | ); 82 | }); 83 | 84 | it("argon2id with raw hash", async () => { 85 | assert( 86 | hashes.rawArgon2id.equals( 87 | await argon2.hash(password, { type: argon2id, raw: true, salt }), 88 | ), 89 | ); 90 | }); 91 | 92 | it("with null in password", async () => { 93 | assert.equal(hashes.withNull, await argon2.hash("pass\0word", { salt })); 94 | }); 95 | 96 | it("with raw hash, null in password", async () => { 97 | assert( 98 | hashes.rawWithNull.equals( 99 | await argon2.hash("pass\0word", { raw: true, salt }), 100 | ), 101 | ); 102 | }); 103 | 104 | it("with associated data", async () => { 105 | assert.equal( 106 | hashes.withAd, 107 | await argon2.hash(password, { associatedData, salt }), 108 | ); 109 | }); 110 | 111 | it("with secret", async () => { 112 | assert.equal( 113 | hashes.withSecret, 114 | await argon2.hash(password, { secret, salt }), 115 | ); 116 | }); 117 | }); 118 | 119 | describe("set options", () => { 120 | it("hash with time cost", async () => { 121 | assert.match(await argon2.hash(password, { timeCost: 4 }), /t=4/); 122 | }); 123 | 124 | it("hash with high time cost", () => { 125 | assert.rejects( 126 | argon2.hash(password, { timeCost: Number.MAX_SAFE_INTEGER }), 127 | RangeError, 128 | "Time cost is too large", 129 | ); 130 | }); 131 | 132 | it("hash with hash length", async () => { 133 | // 4 bytes ascii == 6 bytes base64 134 | assert.match(await argon2.hash(password, { hashLength: 4 }), /\$[^$]{6}$/); 135 | }); 136 | 137 | it("hash with high hash length", () => { 138 | assert.rejects( 139 | argon2.hash(password, { hashLength: Number.MAX_SAFE_INTEGER }), 140 | RangeError, 141 | "Hash length is too large", 142 | ); 143 | }); 144 | 145 | it("hash with memory cost", async () => { 146 | assert.match( 147 | await argon2.hash(password, { memoryCost: 1 << 13 }), 148 | /m=8192/, 149 | ); 150 | }); 151 | 152 | it("hash with high memory cost", () => { 153 | assert.rejects( 154 | argon2.hash(password, { memoryCost: Number.MAX_SAFE_INTEGER }), 155 | RangeError, 156 | "Memory cost is too large", 157 | ); 158 | }); 159 | 160 | it("hash with parallelism", async () => { 161 | assert.match(await argon2.hash(password, { parallelism: 2 }), /p=2/); 162 | }); 163 | 164 | it("hash with high parallelism", () => { 165 | assert.rejects( 166 | argon2.hash(password, { parallelism: Number.MAX_SAFE_INTEGER }), 167 | RangeError, 168 | "Parallelism is too large", 169 | ); 170 | }); 171 | 172 | it("hash with all options", async () => { 173 | assert.match( 174 | await argon2.hash(password, { 175 | timeCost: 4, 176 | memoryCost: 1 << 13, 177 | parallelism: 2, 178 | }), 179 | /m=8192,t=4,p=2/, 180 | ); 181 | }); 182 | }); 183 | 184 | describe("needsRehash", () => { 185 | it("needs rehash old version", async () => { 186 | const hash = await argon2.hash(password, { version: 0x10 }); 187 | assert(argon2.needsRehash(hash)); 188 | assert(!argon2.needsRehash(hash, { version: 0x10 })); 189 | }); 190 | 191 | it("needs rehash low memory cost", async () => { 192 | const hash = await argon2.hash(password, { memoryCost: 1 << 15 }); 193 | assert(argon2.needsRehash(hash)); 194 | assert(!argon2.needsRehash(hash, { memoryCost: 1 << 15 })); 195 | }); 196 | 197 | it("needs rehash low time cost", async () => { 198 | const hash = await argon2.hash(password, { timeCost: 2 }); 199 | assert(argon2.needsRehash(hash)); 200 | assert(!argon2.needsRehash(hash, { timeCost: 2 })); 201 | }); 202 | }); 203 | 204 | describe("verify", () => { 205 | it("verify correct password", async () => { 206 | assert(await argon2.verify(await argon2.hash(password), password)); 207 | }); 208 | 209 | it("verify wrong password", async () => { 210 | assert(!(await argon2.verify(await argon2.hash(password), "passworld"))); 211 | }); 212 | 213 | it("verify with null in password", async () => { 214 | assert(await argon2.verify(await argon2.hash("pass\0word"), "pass\0word")); 215 | }); 216 | 217 | it("verify with associated data", async () => { 218 | assert( 219 | await argon2.verify( 220 | await argon2.hash(password, { associatedData }), 221 | "password", 222 | ), 223 | ); 224 | }); 225 | 226 | it("verify with secret", async () => { 227 | assert( 228 | await argon2.verify(await argon2.hash(password, { secret }), "password", { 229 | secret, 230 | }), 231 | ); 232 | }); 233 | 234 | it("verify with options without secret", async () => { 235 | // https://github.com/ranisalt/node-argon2/issues/407 236 | await assert.doesNotReject( 237 | argon2.verify(await argon2.hash(password, { secret }), "password", {}), 238 | ); 239 | }); 240 | 241 | it("verify argon2d correct password", async () => { 242 | assert( 243 | await argon2.verify( 244 | await argon2.hash(password, { type: argon2d }), 245 | password, 246 | ), 247 | ); 248 | }); 249 | 250 | it("verify argon2d wrong password", async () => { 251 | assert( 252 | !(await argon2.verify( 253 | await argon2.hash(password, { type: argon2d }), 254 | "passworld", 255 | )), 256 | ); 257 | }); 258 | 259 | it("verify argon2id correct password", async () => { 260 | assert( 261 | await argon2.verify( 262 | await argon2.hash(password, { type: argon2id }), 263 | password, 264 | ), 265 | ); 266 | }); 267 | 268 | it("verify argon2id wrong password", async () => { 269 | assert( 270 | !(await argon2.verify( 271 | await argon2.hash(password, { type: argon2id }), 272 | "passworld", 273 | )), 274 | ); 275 | }); 276 | 277 | it("verify old hash format", async () => { 278 | // older hashes did not contain the v (version) parameter 279 | assert(await argon2.verify(hashes.oldFormat, "password")); 280 | }); 281 | 282 | it("verify invalid hash function", async () => { 283 | assert( 284 | !(await argon2.verify( 285 | "$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW", 286 | "abc123xyz", 287 | )), 288 | ); 289 | }); 290 | }); 291 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node18/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "declaration": true, 6 | "declarationMap": true, 7 | "emitDeclarationOnly": true 8 | }, 9 | "files": ["argon2.cjs"] 10 | } 11 | --------------------------------------------------------------------------------