pax_global_header00006660000000000000000000000064151017531070014512gustar00rootroot0000000000000052 comment=1211e9a2213e0b3ee232a204b3ce899beebce31a bcrypt.js-3.0.3/000077500000000000000000000000001510175310700134335ustar00rootroot00000000000000bcrypt.js-3.0.3/.gitattributes000066400000000000000000000000271510175310700163250ustar00rootroot00000000000000bin/bcrypt text eol=lf bcrypt.js-3.0.3/.github/000077500000000000000000000000001510175310700147735ustar00rootroot00000000000000bcrypt.js-3.0.3/.github/FUNDING.yml000066400000000000000000000000201510175310700166000ustar00rootroot00000000000000github: dcodeIO bcrypt.js-3.0.3/.github/workflows/000077500000000000000000000000001510175310700170305ustar00rootroot00000000000000bcrypt.js-3.0.3/.github/workflows/publish.yml000066400000000000000000000015501510175310700212220ustar00rootroot00000000000000name: Publish on: workflow_dispatch: jobs: publish: name: Publish if: github.repository == 'dcodeIO/bcrypt.js' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: ref: main fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: current - name: Install dependencies run: npm ci - name: Build run: npm run build - name: Run tests run: npm test - name: Publish env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: | VERSION=$(npx aspublish --version) if [ -z "$VERSION" ]; then echo "Changes do not trigger a release" else echo "Publishing new version: $VERSION" npx aspublish fi bcrypt.js-3.0.3/.github/workflows/stale.yml000066400000000000000000000021341510175310700206630ustar00rootroot00000000000000name: Stale on: schedule: - cron: "0 0 * * *" jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v9 with: stale-issue-message: "This issue has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!" stale-issue-label: "stale" stale-pr-message: "This PR has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!" close-pr-message: "This PR has been automatically closed due to lack of recent activity, but feel free to reopen it as long as you merge in the main branch afterwards." exempt-issue-labels: "bug,enhancement,compatibility" exempt-pr-labels: "breaking change" exempt-draft-pr: true exempt-all-milestones: true exempt-all-assignees: true days-before-issue-stale: 30 days-before-pr-stale: 60 days-before-close: 7 bcrypt.js-3.0.3/.github/workflows/test.yml000066400000000000000000000014171510175310700205350ustar00rootroot00000000000000name: Test on: push: branches: - main pull_request: workflow_dispatch: jobs: lint: name: Check formatting runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - name: Install dependencies run: npm ci --no-audit - name: Lint run: npm run lint test: name: Build and test runs-on: ubuntu-latest strategy: matrix: node_version: ["current", "lts/*"] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node_version }} - name: Install dependencies run: npm ci --no-audit - name: Build run: npm run build - name: Run tests run: npm test bcrypt.js-3.0.3/.gitignore000066400000000000000000000000661510175310700154250ustar00rootroot00000000000000node_modules/ npm-debug.* umd/index.js umd/types.d.ts bcrypt.js-3.0.3/.prettierrc.js000066400000000000000000000000231510175310700162250ustar00rootroot00000000000000export default {}; bcrypt.js-3.0.3/LICENSE000066400000000000000000000027721510175310700144500ustar00rootroot00000000000000bcrypt.js --------- Copyright (c) 2012 Nevins Bartolomeo Copyright (c) 2012 Shane Girish Copyright (c) 2025 Daniel Wirtz Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. bcrypt.js-3.0.3/README.md000066400000000000000000000167141510175310700147230ustar00rootroot00000000000000# bcrypt.js Optimized bcrypt in JavaScript with zero dependencies, with TypeScript support. Compatible to the C++ [bcrypt](https://npmjs.org/package/bcrypt) binding on Node.js and also working in the browser. [![Build Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/test.yml?branch=main&label=test&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/test.yml) [![Publish Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/publish.yml?branch=main&label=publish&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/publish.yml) [![npm](https://img.shields.io/npm/v/bcryptjs.svg?label=npm&color=007acc&logo=npm)](https://www.npmjs.com/package/bcryptjs) ## Security considerations Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power. ([see](http://en.wikipedia.org/wiki/Bcrypt)) While bcrypt.js is compatible to the C++ bcrypt binding, it is written in pure JavaScript and thus slower ([about 30%](https://github.com/dcodeIO/bcrypt.js/wiki/Benchmark)), effectively reducing the number of iterations that can be processed in an equal time span. The maximum input length is 72 bytes (note that UTF-8 encoded characters use up to 4 bytes) and the length of generated hashes is 60 characters. Note that maximum input length is not implicitly checked by the library for compatibility with the C++ binding on Node.js, but should be checked with `bcrypt.truncates(password)` where necessary. ## Usage The package exports an ECMAScript module with an UMD fallback. ``` $> npm install bcryptjs ``` ```ts import bcrypt from "bcryptjs"; ``` ### Usage with a CDN - From GitHub via [jsDelivr](https://www.jsdelivr.com):
`https://cdn.jsdelivr.net/gh/dcodeIO/bcrypt.js@TAG/index.js` (ESM) - From npm via [jsDelivr](https://www.jsdelivr.com):
`https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/index.js` (ESM)
`https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/umd/index.js` (UMD) - From npm via [unpkg](https://unpkg.com):
`https://unpkg.com/bcryptjs@VERSION/index.js` (ESM)
`https://unpkg.com/bcryptjs@VERSION/umd/index.js` (UMD) Replace `TAG` respectively `VERSION` with a [specific version](https://github.com/dcodeIO/bcrypt.js/releases) or omit it (not recommended in production) to use latest. When using the ESM variant in a browser, the `crypto` import needs to be stubbed out, for example using an [import map](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap). Bundlers should omit it automatically. ### Usage - Sync To hash a password: ```ts const salt = bcrypt.genSaltSync(10); const hash = bcrypt.hashSync("B4c0/\/", salt); // Store hash in your password DB ``` To check a password: ```ts // Load hash from your password DB bcrypt.compareSync("B4c0/\/", hash); // true bcrypt.compareSync("not_bacon", hash); // false ``` Auto-gen a salt and hash: ```ts const hash = bcrypt.hashSync("bacon", 10); ``` ### Usage - Async To hash a password: ```ts const salt = await bcrypt.genSalt(10); const hash = await bcrypt.hash("B4c0/\/", salt); // Store hash in your password DB ``` ```ts bcrypt.genSalt(10, (err, salt) => { bcrypt.hash("B4c0/\/", salt, function (err, hash) { // Store hash in your password DB }); }); ``` To check a password: ```ts // Load hash from your password DB await bcrypt.compare("B4c0/\/", hash); // true await bcrypt.compare("not_bacon", hash); // false ``` ```ts // Load hash from your password DB bcrypt.compare("B4c0/\/", hash, (err, res) => { // res === true }); bcrypt.compare("not_bacon", hash, (err, res) => { // res === false }); ``` Auto-gen a salt and hash: ```ts await bcrypt.hash("B4c0/\/", 10); // Store hash in your password DB ``` ```ts bcrypt.hash("B4c0/\/", 10, (err, hash) => { // Store hash in your password DB }); ``` **Note:** Under the hood, asynchronous APIs split an operation into small chunks. After the completion of a chunk, the execution of the next chunk is placed on the back of the [JS event queue](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop), efficiently yielding for other computation to execute. ### Usage - Command Line ``` Usage: bcrypt [rounds|salt] ``` ## API ### Callback types - **Callback<`T`>**: `(err: Error | null, result?: T) => void`
Called with an error on failure or a value of type `T` upon success. - **ProgressCallback**: `(percentage: number) => void`
Called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. - **RandomFallback**: `(length: number) => number[]`
Called to obtain random bytes when both [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI/) and Node.js [crypto](http://nodejs.org/api/crypto.html) are not available. ### Functions - bcrypt.**genSaltSync**(rounds?: `number`): `string`
Synchronously generates a salt. Number of rounds defaults to 10 when omitted. - bcrypt.**genSalt**(rounds?: `number`): `Promise`
Asynchronously generates a salt. Number of rounds defaults to 10 when omitted. - bcrypt.**genSalt**([rounds: `number`, ]callback: `Callback`): `void`
Asynchronously generates a salt. Number of rounds defaults to 10 when omitted. - bcrypt.**truncates**(password: `string`): `boolean`
Tests if a password will be truncated when hashed, that is its length is greater than 72 bytes when converted to UTF-8. - bcrypt.**hashSync**(password: `string`, salt?: `number | string`): `string` Synchronously generates a hash for the given password. Number of rounds defaults to 10 when omitted. - bcrypt.**hash**(password: `string`, salt: `number | string`): `Promise`
Asynchronously generates a hash for the given password. - bcrypt.**hash**(password: `string`, salt: `number | string`, callback: `Callback`, progressCallback?: `ProgressCallback`): `void`
Asynchronously generates a hash for the given password. - bcrypt.**compareSync**(password: `string`, hash: `string`): `boolean`
Synchronously tests a password against a hash. - bcrypt.**compare**(password: `string`, hash: `string`): `Promise`
Asynchronously compares a password against a hash. - bcrypt.**compare**(password: `string`, hash: `string`, callback: `Callback`, progressCallback?: `ProgressCallback`)
Asynchronously compares a password against a hash. - bcrypt.**getRounds**(hash: `string`): `number`
Gets the number of rounds used to encrypt the specified hash. - bcrypt.**getSalt**(hash: `string`): `string`
Gets the salt portion from a hash. Does not validate the hash. - bcrypt.**setRandomFallback**(random: `RandomFallback`): `void`
Sets the pseudo random number generator to use as a fallback if neither [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI/) nor Node.js [crypto](http://nodejs.org/api/crypto.html) are available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! ## Building Building the UMD fallback: ``` $> npm run build ``` Running the [tests](./tests): ``` $> npm test ``` ## Credits Based on work started by Shane Girish at [bcrypt-nodejs](https://github.com/shaneGirish/bcrypt-nodejs), which is itself based on [javascript-bcrypt](http://code.google.com/p/javascript-bcrypt/) (New BSD-licensed). bcrypt.js-3.0.3/bin/000077500000000000000000000000001510175310700142035ustar00rootroot00000000000000bcrypt.js-3.0.3/bin/bcrypt000066400000000000000000000010201510175310700154220ustar00rootroot00000000000000#!/usr/bin/env node import path from "node:path"; import bcrypt from "../index.js"; if (process.argv.length < 3) { console.log( "Usage: " + path.basename(process.argv[1]) + " [rounds|salt]", ); process.exit(1); } else { var salt; if (process.argv.length > 3) { salt = process.argv[3]; var rounds = parseInt(salt, 10); if (rounds == salt) { salt = bcrypt.genSaltSync(rounds); } } else { salt = bcrypt.genSaltSync(); } console.log(bcrypt.hashSync(process.argv[2], salt)); } bcrypt.js-3.0.3/index.d.ts000066400000000000000000000001311510175310700153270ustar00rootroot00000000000000import * as bcrypt from "./types.js"; export * from "./types.js"; export default bcrypt; bcrypt.js-3.0.3/index.js000066400000000000000000001210701510175310700151010ustar00rootroot00000000000000/* Copyright (c) 2012 Nevins Bartolomeo Copyright (c) 2012 Shane Girish Copyright (c) 2025 Daniel Wirtz Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // The Node.js crypto module is used as a fallback for the Web Crypto API. When // building for the browser, inclusion of the crypto module should be disabled, // which the package hints at in its package.json for bundlers that support it. import nodeCrypto from "crypto"; /** * The random implementation to use as a fallback. * @type {?function(number):!Array.} * @inner */ var randomFallback = null; /** * Generates cryptographically secure random bytes. * @function * @param {number} len Bytes length * @returns {!Array.} Random bytes * @throws {Error} If no random implementation is available * @inner */ function randomBytes(len) { // Web Crypto API. Globally available in the browser and in Node.js >=23. try { return crypto.getRandomValues(new Uint8Array(len)); } catch {} // Node.js crypto module for non-browser environments. try { return nodeCrypto.randomBytes(len); } catch {} // Custom fallback specified with `setRandomFallback`. if (!randomFallback) { throw Error( "Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative", ); } return randomFallback(len); } /** * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it * is seeded properly! * @param {?function(number):!Array.} random Function taking the number of bytes to generate as its * sole argument, returning the corresponding array of cryptographically secure random byte values. * @see http://nodejs.org/api/crypto.html * @see http://www.w3.org/TR/WebCryptoAPI/ */ export function setRandomFallback(random) { randomFallback = random; } /** * Synchronously generates a salt. * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted * @param {number=} seed_length Not supported. * @returns {string} Resulting salt * @throws {Error} If a random fallback is required but not set */ export function genSaltSync(rounds, seed_length) { rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; if (typeof rounds !== "number") throw Error( "Illegal arguments: " + typeof rounds + ", " + typeof seed_length, ); if (rounds < 4) rounds = 4; else if (rounds > 31) rounds = 31; var salt = []; salt.push("$2b$"); if (rounds < 10) salt.push("0"); salt.push(rounds.toString()); salt.push("$"); salt.push(base64_encode(randomBytes(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw return salt.join(""); } /** * Asynchronously generates a salt. * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted * @param {(number|function(Error, string=))=} seed_length Not supported. * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function */ export function genSalt(rounds, seed_length, callback) { if (typeof seed_length === "function") (callback = seed_length), (seed_length = undefined); // Not supported. if (typeof rounds === "function") (callback = rounds), (rounds = undefined); if (typeof rounds === "undefined") rounds = GENSALT_DEFAULT_LOG2_ROUNDS; else if (typeof rounds !== "number") throw Error("illegal arguments: " + typeof rounds); function _async(callback) { nextTick(function () { // Pretty thin, but salting is fast enough try { callback(null, genSaltSync(rounds)); } catch (err) { callback(err); } }); } if (callback) { if (typeof callback !== "function") throw Error("Illegal callback: " + typeof callback); _async(callback); } else return new Promise(function (resolve, reject) { _async(function (err, res) { if (err) { reject(err); return; } resolve(res); }); }); } /** * Synchronously generates a hash for the given password. * @param {string} password Password to hash * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 * @returns {string} Resulting hash */ export function hashSync(password, salt) { if (typeof salt === "undefined") salt = GENSALT_DEFAULT_LOG2_ROUNDS; if (typeof salt === "number") salt = genSaltSync(salt); if (typeof password !== "string" || typeof salt !== "string") throw Error("Illegal arguments: " + typeof password + ", " + typeof salt); return _hash(password, salt); } /** * Asynchronously generates a hash for the given password. * @param {string} password Password to hash * @param {number|string} salt Salt length to generate or salt to use * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function */ export function hash(password, salt, callback, progressCallback) { function _async(callback) { if (typeof password === "string" && typeof salt === "number") genSalt(salt, function (err, salt) { _hash(password, salt, callback, progressCallback); }); else if (typeof password === "string" && typeof salt === "string") _hash(password, salt, callback, progressCallback); else nextTick( callback.bind( this, Error("Illegal arguments: " + typeof password + ", " + typeof salt), ), ); } if (callback) { if (typeof callback !== "function") throw Error("Illegal callback: " + typeof callback); _async(callback); } else return new Promise(function (resolve, reject) { _async(function (err, res) { if (err) { reject(err); return; } resolve(res); }); }); } /** * Compares two strings of the same length in constant time. * @param {string} known Must be of the correct length * @param {string} unknown Must be the same length as `known` * @returns {boolean} * @inner */ function safeStringCompare(known, unknown) { var diff = known.length ^ unknown.length; for (var i = 0; i < known.length; ++i) { diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i); } return diff === 0; } /** * Synchronously tests a password against a hash. * @param {string} password Password to compare * @param {string} hash Hash to test against * @returns {boolean} true if matching, otherwise false * @throws {Error} If an argument is illegal */ export function compareSync(password, hash) { if (typeof password !== "string" || typeof hash !== "string") throw Error("Illegal arguments: " + typeof password + ", " + typeof hash); if (hash.length !== 60) return false; return safeStringCompare( hashSync(password, hash.substring(0, hash.length - 31)), hash, ); } /** * Asynchronously tests a password against a hash. * @param {string} password Password to compare * @param {string} hashValue Hash to test against * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function */ export function compare(password, hashValue, callback, progressCallback) { function _async(callback) { if (typeof password !== "string" || typeof hashValue !== "string") { nextTick( callback.bind( this, Error( "Illegal arguments: " + typeof password + ", " + typeof hashValue, ), ), ); return; } if (hashValue.length !== 60) { nextTick(callback.bind(this, null, false)); return; } hash( password, hashValue.substring(0, 29), function (err, comp) { if (err) callback(err); else callback(null, safeStringCompare(comp, hashValue)); }, progressCallback, ); } if (callback) { if (typeof callback !== "function") throw Error("Illegal callback: " + typeof callback); _async(callback); } else return new Promise(function (resolve, reject) { _async(function (err, res) { if (err) { reject(err); return; } resolve(res); }); }); } /** * Gets the number of rounds used to encrypt the specified hash. * @param {string} hash Hash to extract the used number of rounds from * @returns {number} Number of rounds used * @throws {Error} If `hash` is not a string */ export function getRounds(hash) { if (typeof hash !== "string") throw Error("Illegal arguments: " + typeof hash); return parseInt(hash.split("$")[2], 10); } /** * Gets the salt portion from a hash. Does not validate the hash. * @param {string} hash Hash to extract the salt from * @returns {string} Extracted salt part * @throws {Error} If `hash` is not a string or otherwise invalid */ export function getSalt(hash) { if (typeof hash !== "string") throw Error("Illegal arguments: " + typeof hash); if (hash.length !== 60) throw Error("Illegal hash length: " + hash.length + " != 60"); return hash.substring(0, 29); } /** * Tests if a password will be truncated when hashed, that is its length is * greater than 72 bytes when converted to UTF-8. * @param {string} password The password to test * @returns {boolean} `true` if truncated, otherwise `false` */ export function truncates(password) { if (typeof password !== "string") throw Error("Illegal arguments: " + typeof password); return utf8Length(password) > 72; } /** * Continues with the callback after yielding to the event loop. * @function * @param {function(...[*])} callback Callback to execute * @inner */ var nextTick = typeof setImmediate === "function" ? setImmediate : typeof scheduler === "object" && typeof scheduler.postTask === "function" ? scheduler.postTask.bind(scheduler) : setTimeout; /** Calculates the byte length of a string encoded as UTF8. */ function utf8Length(string) { var len = 0, c = 0; for (var i = 0; i < string.length; ++i) { c = string.charCodeAt(i); if (c < 128) len += 1; else if (c < 2048) len += 2; else if ( (c & 0xfc00) === 0xd800 && (string.charCodeAt(i + 1) & 0xfc00) === 0xdc00 ) { ++i; len += 4; } else len += 3; } return len; } /** Converts a string to an array of UTF8 bytes. */ function utf8Array(string) { var offset = 0, c1, c2; var buffer = new Array(utf8Length(string)); for (var i = 0, k = string.length; i < k; ++i) { c1 = string.charCodeAt(i); if (c1 < 128) { buffer[offset++] = c1; } else if (c1 < 2048) { buffer[offset++] = (c1 >> 6) | 192; buffer[offset++] = (c1 & 63) | 128; } else if ( (c1 & 0xfc00) === 0xd800 && ((c2 = string.charCodeAt(i + 1)) & 0xfc00) === 0xdc00 ) { c1 = 0x10000 + ((c1 & 0x03ff) << 10) + (c2 & 0x03ff); ++i; buffer[offset++] = (c1 >> 18) | 240; buffer[offset++] = ((c1 >> 12) & 63) | 128; buffer[offset++] = ((c1 >> 6) & 63) | 128; buffer[offset++] = (c1 & 63) | 128; } else { buffer[offset++] = (c1 >> 12) | 224; buffer[offset++] = ((c1 >> 6) & 63) | 128; buffer[offset++] = (c1 & 63) | 128; } } return buffer; } // A base64 implementation for the bcrypt algorithm. This is partly non-standard. /** * bcrypt's own non-standard base64 dictionary. * @type {!Array.} * @const * @inner **/ var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""); /** * @type {!Array.} * @const * @inner **/ var BASE64_INDEX = [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, ]; /** * Encodes a byte array to base64 with up to len bytes of input. * @param {!Array.} b Byte array * @param {number} len Maximum input length * @returns {string} * @inner */ function base64_encode(b, len) { var off = 0, rs = [], c1, c2; if (len <= 0 || len > b.length) throw Error("Illegal len: " + len); while (off < len) { c1 = b[off++] & 0xff; rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); c1 = (c1 & 0x03) << 4; if (off >= len) { rs.push(BASE64_CODE[c1 & 0x3f]); break; } c2 = b[off++] & 0xff; c1 |= (c2 >> 4) & 0x0f; rs.push(BASE64_CODE[c1 & 0x3f]); c1 = (c2 & 0x0f) << 2; if (off >= len) { rs.push(BASE64_CODE[c1 & 0x3f]); break; } c2 = b[off++] & 0xff; c1 |= (c2 >> 6) & 0x03; rs.push(BASE64_CODE[c1 & 0x3f]); rs.push(BASE64_CODE[c2 & 0x3f]); } return rs.join(""); } /** * Decodes a base64 encoded string to up to len bytes of output. * @param {string} s String to decode * @param {number} len Maximum output length * @returns {!Array.} * @inner */ function base64_decode(s, len) { var off = 0, slen = s.length, olen = 0, rs = [], c1, c2, c3, c4, o, code; if (len <= 0) throw Error("Illegal len: " + len); while (off < slen - 1 && olen < len) { code = s.charCodeAt(off++); c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; code = s.charCodeAt(off++); c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; if (c1 == -1 || c2 == -1) break; o = (c1 << 2) >>> 0; o |= (c2 & 0x30) >> 4; rs.push(String.fromCharCode(o)); if (++olen >= len || off >= slen) break; code = s.charCodeAt(off++); c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; if (c3 == -1) break; o = ((c2 & 0x0f) << 4) >>> 0; o |= (c3 & 0x3c) >> 2; rs.push(String.fromCharCode(o)); if (++olen >= len || off >= slen) break; code = s.charCodeAt(off++); c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; o = ((c3 & 0x03) << 6) >>> 0; o |= c4; rs.push(String.fromCharCode(o)); ++olen; } var res = []; for (off = 0; off < olen; off++) res.push(rs[off].charCodeAt(0)); return res; } /** * @type {number} * @const * @inner */ var BCRYPT_SALT_LEN = 16; /** * @type {number} * @const * @inner */ var GENSALT_DEFAULT_LOG2_ROUNDS = 10; /** * @type {number} * @const * @inner */ var BLOWFISH_NUM_ROUNDS = 16; /** * @type {number} * @const * @inner */ var MAX_EXECUTION_TIME = 100; /** * @type {Array.} * @const * @inner */ var P_ORIG = [ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, ]; /** * @type {Array.} * @const * @inner */ var S_ORIG = [ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, ]; /** * @type {Array.} * @const * @inner */ var C_ORIG = [ 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274, ]; /** * @param {Array.} lr * @param {number} off * @param {Array.} P * @param {Array.} S * @returns {Array.} * @inner */ function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt var n, l = lr[off], r = lr[off + 1]; l ^= P[0]; /* for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;) // Feistel substitution on left word n = S[l >>> 24], n += S[0x100 | ((l >> 16) & 0xff)], n ^= S[0x200 | ((l >> 8) & 0xff)], n += S[0x300 | (l & 0xff)], r ^= n ^ P[++i], // Feistel substitution on right word n = S[r >>> 24], n += S[0x100 | ((r >> 16) & 0xff)], n ^= S[0x200 | ((r >> 8) & 0xff)], n += S[0x300 | (r & 0xff)], l ^= n ^ P[++i]; */ //The following is an unrolled version of the above loop. //Iteration 0 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[1]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[2]; //Iteration 1 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[3]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[4]; //Iteration 2 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[5]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[6]; //Iteration 3 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[7]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[8]; //Iteration 4 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[9]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[10]; //Iteration 5 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[11]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[12]; //Iteration 6 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[13]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[14]; //Iteration 7 n = S[l >>> 24]; n += S[0x100 | ((l >> 16) & 0xff)]; n ^= S[0x200 | ((l >> 8) & 0xff)]; n += S[0x300 | (l & 0xff)]; r ^= n ^ P[15]; n = S[r >>> 24]; n += S[0x100 | ((r >> 16) & 0xff)]; n ^= S[0x200 | ((r >> 8) & 0xff)]; n += S[0x300 | (r & 0xff)]; l ^= n ^ P[16]; lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; lr[off + 1] = l; return lr; } /** * @param {Array.} data * @param {number} offp * @returns {{key: number, offp: number}} * @inner */ function _streamtoword(data, offp) { for (var i = 0, word = 0; i < 4; ++i) (word = (word << 8) | (data[offp] & 0xff)), (offp = (offp + 1) % data.length); return { key: word, offp: offp }; } /** * @param {Array.} key * @param {Array.} P * @param {Array.} S * @inner */ function _key(key, P, S) { var offset = 0, lr = [0, 0], plen = P.length, slen = S.length, sw; for (var i = 0; i < plen; i++) (sw = _streamtoword(key, offset)), (offset = sw.offp), (P[i] = P[i] ^ sw.key); for (i = 0; i < plen; i += 2) (lr = _encipher(lr, 0, P, S)), (P[i] = lr[0]), (P[i + 1] = lr[1]); for (i = 0; i < slen; i += 2) (lr = _encipher(lr, 0, P, S)), (S[i] = lr[0]), (S[i + 1] = lr[1]); } /** * Expensive key schedule Blowfish. * @param {Array.} data * @param {Array.} key * @param {Array.} P * @param {Array.} S * @inner */ function _ekskey(data, key, P, S) { var offp = 0, lr = [0, 0], plen = P.length, slen = S.length, sw; for (var i = 0; i < plen; i++) (sw = _streamtoword(key, offp)), (offp = sw.offp), (P[i] = P[i] ^ sw.key); offp = 0; for (i = 0; i < plen; i += 2) (sw = _streamtoword(data, offp)), (offp = sw.offp), (lr[0] ^= sw.key), (sw = _streamtoword(data, offp)), (offp = sw.offp), (lr[1] ^= sw.key), (lr = _encipher(lr, 0, P, S)), (P[i] = lr[0]), (P[i + 1] = lr[1]); for (i = 0; i < slen; i += 2) (sw = _streamtoword(data, offp)), (offp = sw.offp), (lr[0] ^= sw.key), (sw = _streamtoword(data, offp)), (offp = sw.offp), (lr[1] ^= sw.key), (lr = _encipher(lr, 0, P, S)), (S[i] = lr[0]), (S[i + 1] = lr[1]); } /** * Internaly crypts a string. * @param {Array.} b Bytes to crypt * @param {Array.} salt Salt bytes to use * @param {number} rounds Number of rounds * @param {function(Error, Array.=)=} callback Callback receiving the error, if any, and the resulting bytes. If * omitted, the operation will be performed synchronously. * @param {function(number)=} progressCallback Callback called with the current progress * @returns {!Array.|undefined} Resulting bytes if callback has been omitted, otherwise `undefined` * @inner */ function _crypt(b, salt, rounds, callback, progressCallback) { var cdata = C_ORIG.slice(), clen = cdata.length, err; // Validate if (rounds < 4 || rounds > 31) { err = Error("Illegal number of rounds (4-31): " + rounds); if (callback) { nextTick(callback.bind(this, err)); return; } else throw err; } if (salt.length !== BCRYPT_SALT_LEN) { err = Error( "Illegal salt length: " + salt.length + " != " + BCRYPT_SALT_LEN, ); if (callback) { nextTick(callback.bind(this, err)); return; } else throw err; } rounds = (1 << rounds) >>> 0; var P, S, i = 0, j; //Use typed arrays when available - huge speedup! if (typeof Int32Array === "function") { P = new Int32Array(P_ORIG); S = new Int32Array(S_ORIG); } else { P = P_ORIG.slice(); S = S_ORIG.slice(); } _ekskey(salt, b, P, S); /** * Calcualtes the next round. * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` * @inner */ function next() { if (progressCallback) progressCallback(i / rounds); if (i < rounds) { var start = Date.now(); for (; i < rounds; ) { i = i + 1; _key(b, P, S); _key(salt, P, S); if (Date.now() - start > MAX_EXECUTION_TIME) break; } } else { for (i = 0; i < 64; i++) for (j = 0; j < clen >> 1; j++) _encipher(cdata, j << 1, P, S); var ret = []; for (i = 0; i < clen; i++) ret.push(((cdata[i] >> 24) & 0xff) >>> 0), ret.push(((cdata[i] >> 16) & 0xff) >>> 0), ret.push(((cdata[i] >> 8) & 0xff) >>> 0), ret.push((cdata[i] & 0xff) >>> 0); if (callback) { callback(null, ret); return; } else return ret; } if (callback) nextTick(next); } // Async if (typeof callback !== "undefined") { next(); // Sync } else { var res; while (true) if (typeof (res = next()) !== "undefined") return res || []; } } /** * Internally hashes a password. * @param {string} password Password to hash * @param {?string} salt Salt to use, actually never null * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, * hashing is performed synchronously. * @param {function(number)=} progressCallback Callback called with the current progress * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` * @inner */ function _hash(password, salt, callback, progressCallback) { var err; if (typeof password !== "string" || typeof salt !== "string") { err = Error("Invalid string / salt: Not a string"); if (callback) { nextTick(callback.bind(this, err)); return; } else throw err; } // Validate the salt var minor, offset; if (salt.charAt(0) !== "$" || salt.charAt(1) !== "2") { err = Error("Invalid salt version: " + salt.substring(0, 2)); if (callback) { nextTick(callback.bind(this, err)); return; } else throw err; } if (salt.charAt(2) === "$") (minor = String.fromCharCode(0)), (offset = 3); else { minor = salt.charAt(2); if ( (minor !== "a" && minor !== "b" && minor !== "y") || salt.charAt(3) !== "$" ) { err = Error("Invalid salt revision: " + salt.substring(2, 4)); if (callback) { nextTick(callback.bind(this, err)); return; } else throw err; } offset = 4; } // Extract number of rounds if (salt.charAt(offset + 2) > "$") { err = Error("Missing salt rounds"); if (callback) { nextTick(callback.bind(this, err)); return; } else throw err; } var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), rounds = r1 + r2, real_salt = salt.substring(offset + 3, offset + 25); password += minor >= "a" ? "\x00" : ""; var passwordb = utf8Array(password), saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); /** * Finishes hashing. * @param {Array.} bytes Byte array * @returns {string} * @inner */ function finish(bytes) { var res = []; res.push("$2"); if (minor >= "a") res.push(minor); res.push("$"); if (rounds < 10) res.push("0"); res.push(rounds.toString()); res.push("$"); res.push(base64_encode(saltb, saltb.length)); res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); return res.join(""); } // Sync if (typeof callback == "undefined") return finish(_crypt(passwordb, saltb, rounds)); // Async else { _crypt( passwordb, saltb, rounds, function (err, bytes) { if (err) callback(err, null); else callback(null, finish(bytes)); }, progressCallback, ); } } /** * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. * @function * @param {!Array.} bytes Byte array * @param {number} length Maximum input length * @returns {string} */ export function encodeBase64(bytes, length) { return base64_encode(bytes, length); } /** * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. * @function * @param {string} string String to decode * @param {number} length Maximum output length * @returns {!Array.} */ export function decodeBase64(string, length) { return base64_decode(string, length); } export default { setRandomFallback, genSaltSync, genSalt, hashSync, hash, compareSync, compare, getRounds, getSalt, truncates, encodeBase64, decodeBase64, }; bcrypt.js-3.0.3/package-lock.json000066400000000000000000001325261510175310700166600ustar00rootroot00000000000000{ "name": "bcryptjs", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bcryptjs", "version": "0.0.0", "license": "BSD-3-Clause", "bin": { "bcrypt": "bin/bcrypt" }, "devDependencies": { "bcrypt": "^5.1.1", "esm2umd": "^0.3.1", "prettier": "^3.5.0", "typescript": "^5.7.3" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.8", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", "@babel/parser": "^7.26.8", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@types/gensync": "^1.0.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.26.8", "@babel/types": "^7.26.8", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.26.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.26.8" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/template": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.8", "@babel/types": "^7.26.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "@babel/template": "^7.26.8", "@babel/types": "^7.26.8", "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "node_modules/@types/gensync": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", "dev": true, "license": "MIT" }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "license": "ISC" }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "4" }, "engines": { "node": ">= 6.0.0" } }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true, "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { "node": ">=10" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/bcrypt": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.11", "node-addon-api": "^5.0.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/caniuse-lite": { "version": "1.0.30001699", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "CC-BY-4.0" }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "license": "ISC" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "license": "MIT" }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8" } }, "node_modules/electron-to-chromium": { "version": "1.5.97", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/esm2umd": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/esm2umd/-/esm2umd-0.3.1.tgz", "integrity": "sha512-5WcGtkITdTHoLSkM/ZGWgsieCvlPUJLJdGOAmnmXPjjNBU/lwMGg3D4Tx/FWe32pY0ZhhAwoM8Oy+1hBI7BKQg==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.26.8", "@babel/helper-plugin-utils": "^7.26.5" }, "bin": { "esm2umd": "bin/esm2umd.js" } }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.1", "object-assign": "^4.1.1", "signal-exit": "^3.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.2" }, "engines": { "node": ">=10" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "license": "ISC" }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=6" } }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", "dev": true, "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "peerDependenciesMeta": { "encoding": { "optional": true } } }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, "license": "ISC", "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { "node": ">=6" } }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", "gauge": "^3.0.0", "set-blocking": "^2.0.0" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/prettier": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz", "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==", "dev": true, "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "MIT" }, "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, "license": "MIT" }, "node_modules/typescript": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "license": "MIT" }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" } } } bcrypt.js-3.0.3/package.json000066400000000000000000000040241510175310700157210ustar00rootroot00000000000000{ "name": "bcryptjs", "description": "Optimized bcrypt in plain JavaScript with zero dependencies, with TypeScript support. Compatible to 'bcrypt'.", "version": "0.0.0", "author": "Daniel Wirtz ", "contributors": [ "Shane Girish (https://github.com/shaneGirish)", "Alex Murray <> (https://github.com/alexmurray)", "Nicolas Pelletier <> (https://github.com/NicolasPelletier)", "Josh Rogers <> (https://github.com/geekymole)", "Noah Isaacson (https://github.com/nisaacson)" ], "repository": { "type": "url", "url": "https://github.com/dcodeIO/bcrypt.js.git" }, "bugs": { "url": "https://github.com/dcodeIO/bcrypt.js/issues" }, "keywords": [ "bcrypt", "password", "auth", "authentication", "encryption", "crypt", "crypto" ], "type": "module", "main": "umd/index.js", "types": "umd/index.d.ts", "exports": { ".": { "import": { "types": "./index.d.ts", "default": "./index.js" }, "require": { "types": "./umd/index.d.ts", "default": "./umd/index.js" } } }, "bin": { "bcrypt": "bin/bcrypt" }, "license": "BSD-3-Clause", "scripts": { "build": "node scripts/build.js", "lint": "prettier --check .", "format": "prettier --write .", "test": "npm run test:unit && npm run test:typescript", "test:unit": "node tests", "test:typescript": "tsc --project tests/typescript/tsconfig.esnext.json && tsc --project tests/typescript/tsconfig.nodenext.json && tsc --project tests/typescript/tsconfig.commonjs.json && tsc --project tests/typescript/tsconfig.global.json" }, "files": [ "index.js", "index.d.ts", "types.d.ts", "umd/index.js", "umd/index.d.ts", "umd/types.d.ts", "umd/package.json", "LICENSE", "README.md" ], "browser": { "crypto": false }, "devDependencies": { "bcrypt": "^5.1.1", "esm2umd": "^0.3.1", "prettier": "^3.5.0", "typescript": "^5.7.3" } } bcrypt.js-3.0.3/scripts/000077500000000000000000000000001510175310700151225ustar00rootroot00000000000000bcrypt.js-3.0.3/scripts/build.js000066400000000000000000000015051510175310700165600ustar00rootroot00000000000000import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; import esm2umd from "esm2umd"; import prettier from "prettier"; const basePath = path.join(path.dirname(fileURLToPath(import.meta.url)), ".."); const esmPath = path.join(basePath, "index.js"); const umdPath = path.join(basePath, "umd", "index.js"); const esmSource = fs.readFileSync(esmPath, "utf8"); const umdSource = esm2umd("bcrypt", esmSource); async function formatWithPrettier(source, filepath) { const options = await prettier.resolveConfig(filepath); return await prettier.format(source, { ...options, filepath }); } const prettierUmdSource = await formatWithPrettier(umdSource, umdPath); fs.writeFileSync(umdPath, prettierUmdSource); fs.copyFileSync( path.join(basePath, "types.d.ts"), path.join(basePath, "umd", "types.d.ts"), ); bcrypt.js-3.0.3/tests/000077500000000000000000000000001510175310700145755ustar00rootroot00000000000000bcrypt.js-3.0.3/tests/bench.js000066400000000000000000000027061510175310700162170ustar00rootroot00000000000000import bcrypt from "bcrypt"; import bcryptjs from "../index.js"; const pass = "ä☺𠜎️☁"; const testRounds = [8, 9, 10, 11, 12, 13, 14, 15]; function testSync(name, salt, impl) { var res; console.time(name); res = impl.hashSync(pass, salt); console.timeEnd(name); console.log("`" + res + "` "); } function testAsync(name, salt, impl, cb) { console.time(name); impl.hash(pass, salt, function (err, res) { console.timeEnd(name); console.log("`" + res + "` "); if (cb) cb(); }); } function testMax(name, impl) { var s = "", salt = bcryptjs.genSaltSync(4), last = null; while (s.length < 100) { s += "0"; var hash = impl.hashSync(s, salt); if (hash === last) { console.log(name + " maximum input length is: " + (s.length - 1)); break; } last = hash; } } testMax("bcrypt.js", bcryptjs); console.log("## Comparing bcryptjs with bcrypt\n"); function next() { if (testRounds.length === 0) return; (function (rounds) { var salt = bcryptjs.genSaltSync(rounds); console.log("#### Using " + rounds + " rounds"); console.log("Salt: `" + salt + "` "); testSync("* **bcrypt** sync", salt, bcrypt); testSync("* **bcrypt.js** sync", salt, bcryptjs); testAsync("* **bcrypt** async", salt, bcrypt, function () { testAsync("* **bcrypt.js** async", salt, bcryptjs, function () { console.log(""); next(); }); }); })(testRounds.shift()); } next(); bcrypt.js-3.0.3/tests/index.js000066400000000000000000000165651510175310700162570ustar00rootroot00000000000000import assert from "node:assert"; import { createRequire } from "node:module"; import bcryptcpp from "bcrypt"; import bcrypt from "../index.js"; const require = createRequire(import.meta.url); const tests = [ function encodeBase64(done) { var str = bcrypt.encodeBase64( [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, ], 16, ); assert.strictEqual(str, "..CA.uOD/eaGAOmJB.yMBu"); done(); }, function decodeBase64(done) { var bytes = bcrypt.decodeBase64("..CA.uOD/eaGAOmJB.yMBv.", 16); assert.deepEqual( bytes, [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, ], ); done(); }, function genSaltSync(done) { var salt = bcrypt.genSaltSync(10); assert(salt); assert(typeof salt === "string"); assert(salt.length > 0); done(); }, function genSalt(done) { bcrypt.genSalt(10, function (err, salt) { assert(!err); assert(salt); assert(typeof salt === "string"); assert(salt.length > 0); done(); }); }, function hashSync(done) { assert.doesNotThrow(function () { bcrypt.hashSync("hello", 10); }); assert.notEqual(bcrypt.hashSync("hello", 10), bcrypt.hashSync("hello", 10)); done(); }, function hash(done) { bcrypt.hash("hello", 10, function (err, hash) { assert(!err); assert(hash); done(); }); }, function compareSync(done) { var salt1 = bcrypt.genSaltSync(), hash1 = bcrypt.hashSync("hello", salt1); // $2b$ var salt2 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2y$"), hash2 = bcrypt.hashSync("world", salt2); var salt3 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2a$"), hash3 = bcrypt.hashSync("hello world", salt3); assert.strictEqual(hash1.substring(0, 4), "$2b$"); assert(bcrypt.compareSync("hello", hash1)); assert(!bcrypt.compareSync("hello", hash2)); assert(!bcrypt.compareSync("hello", hash3)); assert.strictEqual(hash2.substring(0, 4), "$2y$"); assert(bcrypt.compareSync("world", hash2)); assert(!bcrypt.compareSync("world", hash1)); assert(!bcrypt.compareSync("world", hash3)); assert.strictEqual(hash3.substring(0, 4), "$2a$"); assert(bcrypt.compareSync("hello world", hash3)); assert(!bcrypt.compareSync("hello world", hash1)); assert(!bcrypt.compareSync("hello world", hash2)); done(); }, function compare(done) { var salt1 = bcrypt.genSaltSync(), hash1 = bcrypt.hashSync("hello", salt1); // $2a$ var salt2 = bcrypt.genSaltSync(); salt2 = salt2.substring(0, 2) + "y" + salt2.substring(3); // $2y$ var hash2 = bcrypt.hashSync("world", salt2); bcrypt.compare("hello", hash1, function (err, same) { assert(!err); assert(same); bcrypt.compare("hello", hash2, function (err, same) { assert(!err); assert(!same); bcrypt.compare("world", hash2, function (err, same) { assert(!err); assert(same); bcrypt.compare("world", hash1, function (err, same) { assert(!err); assert(!same); done(); }); }); }); }); }, function getSalt(done) { var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); var salt = bcrypt.getSalt(hash1); var hash2 = bcrypt.hashSync("hello", salt); assert.equal(hash1, hash2); done(); }, function getRounds(done) { var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); assert.equal(bcrypt.getRounds(hash1), 10); done(); }, function truncates(done) { assert(!bcrypt.truncates("")); assert(!bcrypt.truncates("a".repeat(72))); assert(bcrypt.truncates("a".repeat(73))); assert(bcrypt.truncates("๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า")); done(); }, function progress(done) { bcrypt.genSalt(12, function (err, salt) { assert(!err); var progress = []; bcrypt.hash( "hello world", salt, function (err, hash) { assert(!err); assert(typeof hash === "string"); assert(progress.length >= 2); assert.strictEqual(progress[0], 0); assert.strictEqual(progress[progress.length - 1], 1); done(); }, function (n) { progress.push(n); }, ); }); }, function promise(done) { bcrypt.genSalt(10).then( function (salt) { bcrypt.hash("hello", salt).then( function (hash) { assert(hash); bcrypt.compare("hello", hash).then( function (result) { assert(result); bcrypt.genSalt(/* no args */).then( function (salt) { assert(salt); done(); }, function (err) { assert(false); }, ); }, function (err) { assert(false); }, ); }, function (err) { assert(false); }, ); }, function (err) { assert(false); }, ); }, function compat_hash(done) { var pass = [ "", " ", " a ", "a".repeat(72), "a".repeat(73), "Heizölrückstoßabdämpfung", "Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία", "El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y ", "Où l'obèse jury mûr", "Úrmhac na hÓighe Beannaithe", "Árvíztűrő tükörfúrógép", "Sævör grét áðan því úlpan var ónýt", "わかよたれそつねならむ", "ケフコエテ アサキユメミシ", "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה", "Pchnąć w tę łódź jeża lub ośm skrzyń fig", "В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!", "๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า", "Pijamalı hasta, yağız şoföre çabucak güvendi.", ]; for (var i = 0; i < pass.length; i++) { var salt = bcrypt.genSaltSync(), hash1 = bcryptcpp.hashSync(pass[i], salt), hash2 = bcrypt.hashSync(pass[i], salt); assert.equal(hash1, hash2); } done(); }, function compat_rounds(done) { var salt1 = bcrypt.genSaltSync(0), // $10$ like not set salt2 = bcryptcpp.genSaltSync(0); assert.strictEqual(salt1.substring(0, 7), "$2b$10$"); assert.strictEqual(salt2.substring(0, 7), "$2b$10$"); salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap salt2 = bcryptcpp.genSaltSync(3); assert.strictEqual(salt1.substring(0, 7), "$2b$04$"); assert.strictEqual(salt2.substring(0, 7), "$2b$04$"); salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap salt2 = bcryptcpp.genSaltSync(32); assert.strictEqual(salt1.substring(0, 7), "$2b$31$"); assert.strictEqual(salt2.substring(0, 7), "$2b$31$"); done(); }, function commonJS(done) { var umd = require("../umd/index.js"); umd.genSalt().then(done); }, ]; function next() { if (!tests.length) return; var test = tests.shift(); console.log(test.name); test(next); } next(); bcrypt.js-3.0.3/tests/typescript/000077500000000000000000000000001510175310700170035ustar00rootroot00000000000000bcrypt.js-3.0.3/tests/typescript/test-global.ts000066400000000000000000000001101510175310700215600ustar00rootroot00000000000000/// bcrypt.hashSync("test"); bcrypt.js-3.0.3/tests/typescript/test-import.ts000066400000000000000000000001671510175310700216460ustar00rootroot00000000000000import bcrypt, { hashSync } from "../../index.js"; bcrypt.hashSync("test"); hashSync("test"); export default bcrypt; bcrypt.js-3.0.3/tests/typescript/test-require.ts000066400000000000000000000001331510175310700220010ustar00rootroot00000000000000import bcrypt = require("../../umd/index.js"); bcrypt.hashSync("test"); export = bcrypt; bcrypt.js-3.0.3/tests/typescript/tsconfig.base.json000066400000000000000000000001121510175310700224150ustar00rootroot00000000000000{ "compilerOptions": { "target": "ESNext", "noEmit": true } } bcrypt.js-3.0.3/tests/typescript/tsconfig.commonjs.json000066400000000000000000000002431510175310700233350ustar00rootroot00000000000000{ "extends": "./tsconfig.base.json", "compilerOptions": { "module": "CommonJS", "moduleResolution": "node10" }, "include": ["./test-require.ts"] } bcrypt.js-3.0.3/tests/typescript/tsconfig.esnext.json000066400000000000000000000001761510175310700230230ustar00rootroot00000000000000{ "extends": "./tsconfig.base.json", "compilerOptions": { "module": "ESNext" }, "include": ["./test-import.ts"] } bcrypt.js-3.0.3/tests/typescript/tsconfig.global.json000066400000000000000000000001741510175310700227530ustar00rootroot00000000000000{ "extends": "./tsconfig.base.json", "compilerOptions": { "module": "None" }, "include": ["./test-global.ts"] } bcrypt.js-3.0.3/tests/typescript/tsconfig.json000066400000000000000000000000541510175310700215110ustar00rootroot00000000000000{ "extends": "./tsconfig.commonjs.json" } bcrypt.js-3.0.3/tests/typescript/tsconfig.nodenext.json000066400000000000000000000002441510175310700233350ustar00rootroot00000000000000{ "extends": "./tsconfig.base.json", "compilerOptions": { "module": "NodeNext", "moduleResolution": "nodenext" }, "include": ["./test-import.ts"] } bcrypt.js-3.0.3/types.d.ts000066400000000000000000000130251510175310700153720ustar00rootroot00000000000000// Originally imported from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8b36dbdf95b624b8a7cd7f8416f06c15d274f9e6/types/bcryptjs/index.d.ts // MIT license. /** Called with an error on failure or a value of type `T` upon success. */ type Callback = (err: Error | null, result?: T) => void; /** Called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. */ type ProgressCallback = (percentage: number) => void; /** Called to obtain random bytes when both Web Crypto API and Node.js crypto are not available. */ type RandomFallback = (length: number) => number[]; /** * Sets the pseudo random number generator to use as a fallback if neither node's crypto module nor the Web Crypto API is available. * Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! * @param random Function taking the number of bytes to generate as its sole argument, returning the corresponding array of cryptographically secure random byte values. */ export declare function setRandomFallback(random: RandomFallback): void; /** * Synchronously generates a salt. * @param rounds Number of rounds to use, defaults to 10 if omitted * @return Resulting salt * @throws If a random fallback is required but not set */ export declare function genSaltSync(rounds?: number): string; /** * Asynchronously generates a salt. * @param rounds Number of rounds to use, defaults to 10 if omitted * @return Promise with resulting salt, if callback has been omitted */ export declare function genSalt(rounds?: number): Promise; /** * Asynchronously generates a salt. * @param callback Callback receiving the error, if any, and the resulting salt */ export declare function genSalt(callback: Callback): void; /** * Asynchronously generates a salt. * @param rounds Number of rounds to use, defaults to 10 if omitted * @param callback Callback receiving the error, if any, and the resulting salt */ export declare function genSalt( rounds: number, callback: Callback, ): void; /** * Synchronously generates a hash for the given password. * @param password Password to hash * @param salt Salt length to generate or salt to use, default to 10 * @return Resulting hash */ export declare function hashSync( password: string, salt?: number | string, ): string; /** * Asynchronously generates a hash for the given password. * @param password Password to hash * @param salt Salt length to generate or salt to use * @return Promise with resulting hash, if callback has been omitted */ export declare function hash( password: string, salt: number | string, ): Promise; /** * Asynchronously generates a hash for the given password. * @param password Password to hash * @param salt Salt length to generate or salt to use * @param callback Callback receiving the error, if any, and the resulting hash * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. */ export declare function hash( password: string, salt: number | string, callback?: Callback, progressCallback?: ProgressCallback, ): void; /** * Synchronously tests a password against a hash. * @param password Password to test * @param hash Hash to test against * @return true if matching, otherwise false */ export declare function compareSync(password: string, hash: string): boolean; /** * Asynchronously tests a password against a hash. * @param password Password to test * @param hash Hash to test against * @return Promise, if callback has been omitted */ export declare function compare( password: string, hash: string, ): Promise; /** * Asynchronously tests a password against a hash. * @param password Password to test * @param hash Hash to test against * @param callback Callback receiving the error, if any, otherwise the result * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. */ export declare function compare( password: string, hash: string, callback?: Callback, progressCallback?: ProgressCallback, ): void; /** * Gets the number of rounds used to encrypt the specified hash. * @param hash Hash to extract the used number of rounds from * @return Number of rounds used */ export declare function getRounds(hash: string): number; /** * Gets the salt portion from a hash. Does not validate the hash. * @param hash Hash to extract the salt from * @return Extracted salt part */ export declare function getSalt(hash: string): string; /** * Tests if a password will be truncated when hashed, that is its length is * greater than 72 bytes when converted to UTF-8. * @param password The password to test * @returns `true` if truncated, otherwise `false` */ export declare function truncates(password: string): boolean; /** * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. * @function * @param b Byte array * @param len Maximum input length */ export declare function encodeBase64( b: Readonly>, len: number, ): string; /** * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. * @function * @param s String to decode * @param len Maximum output length */ export declare function decodeBase64(s: string, len: number): number[]; bcrypt.js-3.0.3/umd/000077500000000000000000000000001510175310700142205ustar00rootroot00000000000000bcrypt.js-3.0.3/umd/index.d.ts000066400000000000000000000001231510175310700161150ustar00rootroot00000000000000import * as bcrypt from "./types.js"; export = bcrypt; export as namespace bcrypt; bcrypt.js-3.0.3/umd/package.json000066400000000000000000000000311510175310700165000ustar00rootroot00000000000000{ "type": "commonjs" }