From 36ef77988dda3e8eb43ed126e929a5153cc1e98a Mon Sep 17 00:00:00 2001 From: Paolo Insogna Date: Thu, 19 Feb 2026 16:31:52 +0100 Subject: [PATCH 1/3] feat: Migrated to ESM and TypeScript. Signed-off-by: Paolo Insogna --- .github/dco.yml | 5 + .github/workflows/ci.yml | 32 ++ .github/workflows/release.yml | 55 +++ .gitignore | 138 +------- BENCHMARKS.md | 59 ---- CLAUDE.md | 41 --- NOTICE | 13 + README.md | 325 +++++++----------- benchmark.js => benchmark.ts | 42 +-- dco.txt | 37 ++ eslint.config.js | 21 +- lib/definitions.js | 28 -- lib/varint.js | 64 ---- package.json | 72 ++-- prettier.config.js | 9 + scripts/bump-version.ts | 54 +++ scripts/postbuild.ts | 17 + scripts/utils.ts | 21 ++ src/definitions.ts | 6 + lib/dynamic-buffer.js => src/index.ts | 189 +++++----- src/varint.ts | 47 +++ src/version.ts | 8 + test/config/c8-ci.json | 8 + test/config/c8-local.json | 3 + .../{dynamic-buffer.test.js => index.test.ts} | 145 ++++---- test/{varint.test.js => varint.test.ts} | 9 +- tsconfig.base.json | 8 + tsconfig.json | 10 + 28 files changed, 733 insertions(+), 733 deletions(-) create mode 100644 .github/dco.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml delete mode 100644 BENCHMARKS.md delete mode 100644 CLAUDE.md create mode 100644 NOTICE rename benchmark.js => benchmark.ts (82%) create mode 100644 dco.txt delete mode 100644 lib/definitions.js delete mode 100644 lib/varint.js create mode 100644 prettier.config.js create mode 100644 scripts/bump-version.ts create mode 100644 scripts/postbuild.ts create mode 100644 scripts/utils.ts create mode 100644 src/definitions.ts rename lib/dynamic-buffer.js => src/index.ts (73%) create mode 100644 src/varint.ts create mode 100644 src/version.ts create mode 100644 test/config/c8-ci.json create mode 100644 test/config/c8-local.json rename test/{dynamic-buffer.test.js => index.test.ts} (94%) rename test/{varint.test.js => varint.test.ts} (93%) create mode 100644 tsconfig.base.json create mode 100644 tsconfig.json diff --git a/.github/dco.yml b/.github/dco.yml new file mode 100644 index 0000000..4d316cb --- /dev/null +++ b/.github/dco.yml @@ -0,0 +1,5 @@ +allowRemediationCommits: + individual: true + thirdParty: true +require: + members: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..13b43e1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +--- +name: Run Tests +on: + push: + branches: + - main + pull_request: + workflow_dispatch: +jobs: + ci: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Use supported Node.js Version + uses: actions/setup-node@v4 + with: + node-version: 24 + - name: Restore cached dependencies + uses: actions/cache@v3 + with: + path: ~/.pnpm-store + key: node-modules-${{ hashFiles('package.json') }} + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Run Tests + run: 'pnpm run ci' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..20af895 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,55 @@ +name: Publish release + +on: + workflow_dispatch: + inputs: + version: + description: 'The version number to tag and release' + required: true + type: string + prerelease: + description: 'Release as pre-release' + required: false + type: boolean + default: false + +jobs: + release-npm: + runs-on: ubuntu-latest + environment: main + permissions: + id-token: write + contents: write + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + - name: Use supported Node.js Version + uses: actions/setup-node@v4 + with: + node-version: 22 + registry-url: 'https://registry.npmjs.org' + cache: 'pnpm' + - name: Restore cached dependencies + uses: actions/cache@v3 + with: + path: ~/.pnpm-store + key: node-modules-${{ hashFiles('package.json') }} + - name: Install dependencies + run: pnpm install + - name: Bump Version + run: node scripts/bump-version.ts "${{ inputs.version }}" "${{ github.actor }}" + env: + GITHUB_ACTIONS: 'true' + - name: Push changes + run: git push origin HEAD:${{ github.ref }} + - name: Update npm + run: npm install -g npm@latest + - name: Publish to NPM + run: pnpm publish --access public --tag ${{ inputs.prerelease == true && 'next' || 'latest' }} --publish-branch ${{ github.ref_name }} --no-git-checks + - name: 'Create release notes' + run: | + pnpx @matteo.collina/release-notes -a ${{ secrets.GH_RELEASE_TOKEN }} -t v${{ inputs.version }} -o platformatic -r @platformatic/dynamic-buffer ${{ github.event.inputs.prerelease == 'true' && '-p' || '' }} -c ${{ github.ref }} diff --git a/.gitignore b/.gitignore index 1170717..04ac0e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,136 +1,8 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul +dist/ +node_modules coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache .eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files .env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* +.vscode +.vim +.zed \ No newline at end of file diff --git a/BENCHMARKS.md b/BENCHMARKS.md deleted file mode 100644 index 78593b9..0000000 --- a/BENCHMARKS.md +++ /dev/null @@ -1,59 +0,0 @@ -# Benchmark Results - -Performance comparison between DynamicBuffer and BufferList (bl library) using mitata benchmarking. - -## Key Performance Highlights - -### Construction Performance -- **DynamicBuffer**: 47-214 ns per operation -- **BufferList**: 973 ns - 4.33 µs per operation -- **Winner**: DynamicBuffer (20-40x faster) - -### Append Operations -- **DynamicBuffer**: 207 ns per iteration -- **BufferList**: 4.69 µs per iteration -- **Winner**: DynamicBuffer (22x faster) - -### Reading Operations -- **readUInt32BE**: DynamicBuffer 57 µs vs BufferList 106 µs (1.9x faster) -- **readUInt8**: DynamicBuffer 4.32 µs vs BufferList 38.13 µs (8.8x faster) - -### Slice Operations -- **slice()**: Comparable performance (~71-74 ns) -- **subarray()**: DynamicBuffer supports it, BufferList doesn't - -### Consume Operations -- **DynamicBuffer**: 437 ns per operation -- **BufferList**: 1.32 µs per operation -- **Winner**: DynamicBuffer (3x faster) - -### Memory Usage Simulation (1000 random chunks) -- **DynamicBuffer**: 2.30 µs -- **BufferList**: 39.54 µs -- **Winner**: DynamicBuffer (17x faster) - -## Unique Features - -### Variable-Length Integers -- DynamicBuffer has built-in varint support (357 ns for write/read cycle) -- BufferList has no native varint support - -### API Differences -- DynamicBuffer supports `subarray()` method -- BufferList doesn't implement `subarray()` -- Both support similar reading/writing operations - -## Test Environment -- **CPU**: Apple M4 Max (~4.18 GHz) -- **Runtime**: Node.js 22.16.0 (arm64-darwin) -- **Benchmark Tool**: mitata - -## Conclusion - -DynamicBuffer significantly outperforms BufferList in most operations, especially: -- Construction and append operations (20-40x faster) -- Memory-intensive operations (17x faster) -- Individual byte reading (8.8x faster) -- Consume operations (3x faster) - -The performance gains come from DynamicBuffer's optimized internal structure and zero-copy design principles. \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 475a2e4..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,41 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Project Overview - -Dynamic Buffer is a Node.js library that provides a list-like structure for Buffer objects, optimized for reading and writing across multiple binary chunks without copying data unnecessarily. It's designed as a fast alternative to buffer concatenation. - -## Core Architecture - -The library consists of three main modules: - -- **`lib/dynamic-buffer.js`**: Main `DynamicBuffer` class that manages an array of Buffer objects internally -- **`lib/varint.js`**: Variable-length integer encoding/decoding utilities with ZigZag encoding for signed integers -- **`lib/definitions.js`**: Constants for buffer sizes and empty buffer instances - -The `DynamicBuffer` class maintains an internal array of Buffer objects and provides methods to read/write data across buffer boundaries without copying. Key design patterns: - -- Buffer boundaries are handled transparently - reads/writes spanning multiple internal buffers work seamlessly -- Methods follow Node.js Buffer conventions (same method names, endianness options) -- Variable-length integer support uses standard varint encoding with ZigZag for signed values -- Instance detection via private Symbol for type checking - -## Development Commands - -- **Run tests**: `npm test` (runs eslint + Node.js test runner) -- **Fix linting**: `npm run lint:fix` -- **Lint only**: `eslint --cache` -- **Single test file**: `node --test test/dynamic-buffer.test.js` -- **Run benchmarks**: `npm run benchmark` (compares performance with bl library) - -## Testing - -Uses Node.js built-in test runner (`node:test`) with `node:assert` for assertions. Test files are in the `test/` directory. Tests cover both single-buffer and multi-buffer scenarios extensively, especially boundary conditions where operations span multiple internal buffers. - -## Code Style - -- Uses neostandard ESLint configuration -- CommonJS modules (`module.exports`/`require()`) -- Strict mode enabled -- Private class fields (#) for internal state \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..f602054 --- /dev/null +++ b/NOTICE @@ -0,0 +1,13 @@ + Copyright 2025 Platformatic + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 3bf17fb..a473087 100644 --- a/README.md +++ b/README.md @@ -1,318 +1,255 @@ -# dynbuffer +# @platformatic/dynamic-buffer -A fast, efficient list of Buffer objects optimized for reading and writing across multiple binary chunks without unnecessary copying. +A fast, efficient list of `Buffer` objects optimized for reading and writing across multiple binary chunks without unnecessary copying. + +`DynamicBuffer` lets you append/prepend chunks, read values across chunk boundaries, and encode/decode varints without manually concatenating buffers every time. ## Installation ```bash -npm install dynbuffer +npm i @platformatic/dynamic-buffer ``` ## Features -- **Zero-copy operations**: Read and write across buffer boundaries without copying data -- **Buffer-compatible API**: Familiar methods that mirror Node.js Buffer API -- **Variable-length integers**: Built-in support for varint encoding with ZigZag for signed values -- **Memory efficient**: Only concatenates buffers when explicitly requested -- **TypeScript ready**: Written in JavaScript with clear type patterns +- **Zero-copy operations**: read and write across buffer boundaries without eagerly concatenating +- **Buffer-compatible API**: familiar methods mirroring Node.js `Buffer` +- **Variable-length integers**: built-in unsigned varint and zig-zag varint support +- **Memory efficient**: internal chunks are only concatenated when explicitly requested +- **TypeScript ready**: exports type definitions -## Quick Start +## Quick start -```javascript -const { DynamicBuffer } = require('dynbuffer') +```ts +import { DynamicBuffer } from '@platformatic/dynamic-buffer' -// Create from existing buffers -const db = new DynamicBuffer([ - Buffer.from([1, 2]), - Buffer.from([3, 4, 5]) -]) +const db = new DynamicBuffer([Buffer.from([1, 2]), Buffer.from([3, 4, 5])]) -// Read across buffer boundaries seamlessly -console.log(db.readUInt16BE(1)) // Reads bytes 1-2: [2, 3] +// Read across boundaries +console.log(db.readUInt16BE(1)) // bytes [2, 3] -// Append more data +// Append data db.append(Buffer.from([6, 7, 8])) -// Access the full buffer when needed +// Contiguous buffer view (concatenates on access) console.log(db.buffer) // ``` -## API Reference +## API reference + +### Exports + +- `DynamicBuffer` +- `OutOfBoundsError` ### Constructor #### `new DynamicBuffer([buffers])` -Creates a new DynamicBuffer instance. +Creates a new `DynamicBuffer` instance. -- `buffers` (Buffer | Buffer[]): Optional initial buffer(s) +- `buffers` (`Buffer | Buffer[]`): optional initial buffer(s) -```javascript -const db1 = new DynamicBuffer() // Empty -const db2 = new DynamicBuffer(Buffer.from([1, 2, 3])) // Single buffer -const db3 = new DynamicBuffer([buf1, buf2, buf3]) // Multiple buffers +```ts +const db1 = new DynamicBuffer() +const db2 = new DynamicBuffer(Buffer.from([1, 2, 3])) +const db3 = new DynamicBuffer([Buffer.from([1]), Buffer.from([2, 3])]) ``` ### Properties #### `length` -Returns the total length of all buffers combined. + +Total length (in bytes) across all internal buffers. #### `buffer` -Returns a concatenated Buffer of all internal buffers. Only performs concatenation when accessed. + +Returns a contiguous `Buffer` of all internal chunks. + +- Returns the original chunk when there is only one buffer +- Concatenates only when there are multiple chunks #### `buffers` -Direct access to the internal buffer array (use with caution). -### Static Methods +Direct access to internal chunks (`Buffer[]`). Use with caution. + +### Static methods #### `DynamicBuffer.isDynamicBuffer(obj)` -Checks if an object is a DynamicBuffer instance. -```javascript +Checks whether a value is a `DynamicBuffer` instance. + +```ts DynamicBuffer.isDynamicBuffer(new DynamicBuffer()) // true DynamicBuffer.isDynamicBuffer(Buffer.from([1, 2])) // false ``` -### Buffer Management +### Buffer management #### `append(buffer)` -Appends a buffer to the end. Returns `this` for chaining. -```javascript -db.append(Buffer.from([1, 2, 3])) -``` +Appends a chunk. Returns `this`. #### `prepend(buffer)` -Prepends a buffer to the beginning. Returns `this` for chaining. -```javascript -db.prepend(Buffer.from([1, 2, 3])) -``` +Prepends a chunk. Returns `this`. #### `appendFrom(dynamicBuffer)` -Appends all buffers from another DynamicBuffer. Returns `this` for chaining. -```javascript -const other = new DynamicBuffer([buf1, buf2]) -db.appendFrom(other) -``` +Appends chunks from another `DynamicBuffer`. Returns `this`. #### `prependFrom(dynamicBuffer)` -Prepends all buffers from another DynamicBuffer. Returns `this` for chaining. -```javascript -db.prependFrom(other) -``` +Prepends chunks from another `DynamicBuffer`. Returns `this`. -### Data Access +### Data access #### `get(offset)` -Returns the byte at the specified offset. -```javascript -const byte = db.get(5) // Returns byte at position 5 -``` +Returns the byte at `offset`. #### `slice(start, end)` -Returns a new Buffer containing the specified slice. -```javascript -const slice = db.slice(2, 8) // Buffer from positions 2-7 -``` +Returns a `Buffer` for the selected range. #### `subarray(start, end)` -Returns a new DynamicBuffer containing the specified range. -```javascript -const sub = db.subarray(2, 8) // DynamicBuffer from positions 2-7 -``` +Returns a new `DynamicBuffer` for the selected range. #### `toString(encoding, start, end)` -Converts to string using the specified encoding. -```javascript -const str = db.toString('utf8', 0, 10) -``` +Converts a selected range to string. -### Buffer Operations +### Buffer operations #### `clone(deep = false)` -Creates a copy of the DynamicBuffer. -- `deep` (boolean): If true, creates copies of internal buffers +Creates a copy of the `DynamicBuffer`. -```javascript -const shallow = db.clone() -const deep = db.clone(true) -``` +- `deep = false`: copies the chunk list only (shared chunk references) +- `deep = true`: clones each chunk via `Buffer.slice()` #### `consume(offset)` -Removes bytes from the beginning up to the specified offset. Returns `this` for chaining. -```javascript -db.consume(4) // Remove first 4 bytes -``` +Consumes bytes from the front up to `offset`. Returns `this`. -### Reading Methods - -All read methods support an optional `offset` parameter (defaults to 0). - -#### Integer Reading -```javascript -db.readUInt8(offset) -db.readInt8(offset) -db.readUInt16BE(offset) -db.readUInt16LE(offset) -db.readInt16BE(offset) -db.readInt16LE(offset) -db.readUInt32BE(offset) -db.readUInt32LE(offset) -db.readInt32BE(offset) -db.readInt32LE(offset) -db.readBigUInt64BE(offset) -db.readBigUInt64LE(offset) -db.readBigInt64BE(offset) -db.readBigInt64LE(offset) -``` +### Reading methods -#### Floating Point Reading -```javascript -db.readFloatBE(offset) -db.readFloatLE(offset) -db.readDoubleBE(offset) -db.readDoubleLE(offset) -``` +All read methods support an optional `offset` (default `0`, except varints where offset is required). -#### Variable-Length Integer Reading -Returns `[value, bytesRead]` tuple. +#### Integer reading -```javascript -const [value, bytesRead] = db.readUnsignedVarInt(offset) -const [value, bytesRead] = db.readUnsignedVarInt64(offset) -const [value, bytesRead] = db.readVarInt(offset) // ZigZag decoded -const [value, bytesRead] = db.readVarInt64(offset) // ZigZag decoded -``` +- `readUInt8`, `readUInt16BE`, `readUInt16LE`, `readUInt32BE`, `readUInt32LE` +- `readInt8`, `readInt16BE`, `readInt16LE`, `readInt32BE`, `readInt32LE` +- `readBigUInt64BE`, `readBigUInt64LE` +- `readBigInt64BE`, `readBigInt64LE` -### Writing Methods - -All write methods support an optional `append` parameter (defaults to true). When `append` is false, data is prepended. - -#### Integer Writing -```javascript -db.writeUInt8(value, append) -db.writeInt8(value, append) -db.writeUInt16BE(value, append) -db.writeUInt16LE(value, append) -db.writeInt16BE(value, append) -db.writeInt16LE(value, append) -db.writeUInt32BE(value, append) -db.writeUInt32LE(value, append) -db.writeInt32BE(value, append) -db.writeInt32LE(value, append) -db.writeBigUInt64BE(value, append) -db.writeBigUInt64LE(value, append) -db.writeBigInt64BE(value, append) -db.writeBigInt64LE(value, append) -``` +#### Floating-point reading -#### Floating Point Writing -```javascript -db.writeFloatBE(value, append) -db.writeFloatLE(value, append) -db.writeDoubleBE(value, append) -db.writeDoubleLE(value, append) -``` +- `readFloatBE`, `readFloatLE` +- `readDoubleBE`, `readDoubleLE` -#### Variable-Length Integer Writing -```javascript -db.writeUnsignedVarInt(value, append) -db.writeUnsignedVarInt64(value, append) -db.writeVarInt(value, append) // ZigZag encoded -db.writeVarInt64(value, append) // ZigZag encoded -``` +#### Variable-length integer reading + +Returns a tuple: `[value, bytesRead]` + +- `readUnsignedVarInt(offset): [number, number]` +- `readUnsignedVarInt64(offset): [bigint, number]` +- `readVarInt(offset): [number, number]` (zig-zag decoded) +- `readVarInt64(offset): [bigint, number]` (zig-zag decoded) + +### Writing methods + +Most write methods accept `append = true` (when `false`, data is prepended) and return `this`. + +#### Integer writing + +- `writeUInt8`, `writeUInt16BE`, `writeUInt16LE`, `writeUInt32BE`, `writeUInt32LE` +- `writeInt8`, `writeInt16BE`, `writeInt16LE`, `writeInt32BE`, `writeInt32LE` +- `writeBigUInt64BE`, `writeBigUInt64LE` +- `writeBigInt64BE`, `writeBigInt64LE` + +#### Floating-point writing + +- `writeFloatBE`, `writeFloatLE` +- `writeDoubleBE`, `writeDoubleLE` + +#### Variable-length integer writing + +- `writeUnsignedVarInt(value, append)` +- `writeUnsignedVarInt64(value, append)` +- `writeVarInt(value, append)` (zig-zag encoded) +- `writeVarInt64(value, append)` (zig-zag encoded) + +> Note: varint write methods append/prepend encoded bytes but do not return `this`. ## Examples -### Building a Protocol Message +### Building a protocol message -```javascript -const { DynamicBuffer } = require('dynbuffer') +```ts +import { DynamicBuffer } from '@platformatic/dynamic-buffer' +const payload = Buffer.from('hello') const message = new DynamicBuffer() -// Write header -message.writeUInt32BE(0x12345678) // Magic number -message.writeUInt16BE(1) // Version -message.writeVarInt(payload.length) // Payload length - -// Append payload +message.writeUInt32BE(0x12345678) // magic +message.writeUInt16BE(1) // version +message.writeVarInt(payload.length) // payload size message.append(payload) -// Send the complete message socket.write(message.buffer) ``` -### Parsing Streaming Data +### Parsing streaming data + +```ts +import { DynamicBuffer } from '@platformatic/dynamic-buffer' -```javascript const parser = new DynamicBuffer() -socket.on('data', (chunk) => { +socket.on('data', chunk => { parser.append(chunk) - + while (parser.length >= 4) { const messageLength = parser.readUInt32BE(0) - + if (parser.length >= 4 + messageLength) { - // Extract complete message const message = parser.slice(4, 4 + messageLength) processMessage(message) - - // Remove processed data parser.consume(4 + messageLength) } else { - break // Wait for more data + break } } }) ``` -### Working with Variable-Length Integers +### Working with varints + +```ts +import { DynamicBuffer } from '@platformatic/dynamic-buffer' -```javascript const db = new DynamicBuffer() -// Write variable-length integers -db.writeVarInt(42) // Positive number -db.writeVarInt(-42) // Negative number (ZigZag encoded) -db.writeVarInt64(123456789012345n) // Large number +db.writeVarInt(42) +db.writeVarInt(-42) +db.writeVarInt64(123456789012345n) -// Read them back let offset = 0 -const [val1, bytes1] = db.readVarInt(offset) -offset += bytes1 +const [v1, b1] = db.readVarInt(offset) +offset += b1 -const [val2, bytes2] = db.readVarInt(offset) -offset += bytes2 +const [v2, b2] = db.readVarInt(offset) +offset += b2 -const [val3, bytes3] = db.readVarInt64(offset) +const [v3] = db.readVarInt64(offset) ``` -## Performance - -DynamicBuffer is designed for scenarios where you need to: -- Build up binary data incrementally without knowing the final size -- Read structured data from multiple buffer chunks -- Avoid expensive buffer concatenation operations -- Work with streaming data where messages may span multiple chunks +## Error handling -The library only allocates new memory when absolutely necessary (like calling `.buffer` or `.slice()`). +Out-of-range access throws `OutOfBoundsError` with `code: 'OUT_OF_BOUNDS'`. ## License -Apache-2.0 - -## Contributing - -This project follows standard Node.js conventions. Run `npm test` to execute the test suite. +Apache-2.0. See [LICENSE](LICENSE). diff --git a/benchmark.js b/benchmark.ts similarity index 82% rename from benchmark.js rename to benchmark.ts index 1cc1a44..50e9b50 100644 --- a/benchmark.js +++ b/benchmark.ts @@ -1,12 +1,9 @@ -'use strict' +import { run, bench, group } from 'mitata' +import BufferList from 'bl' +import { DynamicBuffer } from './src/index.ts' -const { run, bench, group } = require('mitata') -const { DynamicBuffer } = require('./lib/dynamic-buffer') -const BufferList = require('bl') - -// Helper function to create test buffers -function createTestBuffers(count, size) { - const buffers = [] +function createTestBuffers (count: number, size: number): Buffer[] { + const buffers: Buffer[] = [] for (let i = 0; i < count; i++) { const buf = Buffer.allocUnsafe(size) buf.fill(i % 256) @@ -15,10 +12,9 @@ function createTestBuffers(count, size) { return buffers } -// Create test data sets -const smallBuffers = createTestBuffers(10, 100) // 10 buffers of 100 bytes each -const mediumBuffers = createTestBuffers(50, 200) // 50 buffers of 200 bytes each -const largeBuffers = createTestBuffers(100, 1000) // 100 buffers of 1000 bytes each +const smallBuffers = createTestBuffers(10, 100) +const mediumBuffers = createTestBuffers(50, 200) +const largeBuffers = createTestBuffers(100, 1000) group('Construction', () => { bench('DynamicBuffer - small buffers', () => { @@ -139,7 +135,7 @@ group('Buffer Access', () => { group('Consume Operations', () => { bench('DynamicBuffer - consume', () => { - const db = new DynamicBuffer(smallBuffers.map(b => b.slice())) + const db = new DynamicBuffer(smallBuffers.map((b) => b.slice())) for (let i = 0; i < 5; i++) { db.consume(10) } @@ -147,7 +143,7 @@ group('Consume Operations', () => { }) bench('BufferList - consume', () => { - const bl = new BufferList(smallBuffers.map(b => b.slice())) + const bl = new BufferList(smallBuffers.map((b) => b.slice())) for (let i = 0; i < 5; i++) { bl.consume(10) } @@ -157,16 +153,14 @@ group('Consume Operations', () => { group('Variable Integer Operations', () => { const testValues = [1, 127, 128, 16383, 16384, 2097151, 2097152] - + bench('DynamicBuffer - write/read varints', () => { const db = new DynamicBuffer() - - // Write + for (const value of testValues) { db.writeUnsignedVarInt(value) } - - // Read + let offset = 0 let sum = 0 for (let i = 0; i < testValues.length; i++) { @@ -174,17 +168,15 @@ group('Variable Integer Operations', () => { sum += value offset += bytesRead } - + return sum }) - - // Note: BufferList doesn't have native varint support, so we skip this comparison }) group('Memory Usage Simulation', () => { - const chunks = [] + const chunks: Buffer[] = [] for (let i = 0; i < 1000; i++) { - chunks.push(Buffer.allocUnsafe(Math.random() * 100 + 50)) + chunks.push(Buffer.allocUnsafe(Math.floor(Math.random() * 100 + 50))) } bench('DynamicBuffer - incremental build', () => { @@ -205,4 +197,4 @@ group('Memory Usage Simulation', () => { }) console.log('Running DynamicBuffer vs BufferList (bl) benchmarks...\n') -run() \ No newline at end of file +run() diff --git a/dco.txt b/dco.txt new file mode 100644 index 0000000..8201f99 --- /dev/null +++ b/dco.txt @@ -0,0 +1,37 @@ +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +1 Letterman Drive +Suite D4700 +San Francisco, CA, 94129 + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. diff --git a/eslint.config.js b/eslint.config.js index 5212dc9..3b66b5d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,3 +1,20 @@ -'use strict' +import eslintPluginPrettier from 'eslint-plugin-prettier' +import { globalIgnores } from 'eslint/config' +import neostandard from 'neostandard' -module.exports = require('neostandard')({}) +const eslint = [ + ...neostandard({ ts: true }), + globalIgnores(['dist/', 'external/']), + { + files: ['**/*.ts'], + rules: { + '@typescript-eslint/consistent-type-imports': ['error', { fixStyle: 'inline-type-imports' }], + 'prettier/prettier': 'error' + }, + plugins: { + prettier: eslintPluginPrettier + } + } +] + +export default eslint diff --git a/lib/definitions.js b/lib/definitions.js deleted file mode 100644 index 86aba23..0000000 --- a/lib/definitions.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -const INT8_SIZE = 1 -const INT16_SIZE = 2 -const INT32_SIZE = 4 -const INT64_SIZE = 8 -const UUID_SIZE = 16 - -const EMPTY_BUFFER = Buffer.alloc(0) -const EMPTY_UUID = Buffer.alloc(UUID_SIZE) - -// Since it is serialized at either 0 (for nullable) or 1 (since length is stored as length + 1), it always uses a single byte -const EMPTY_OR_SINGLE_COMPACT_LENGTH_SIZE = INT8_SIZE - -// TODO(ShogunPanda): Tagged fields are not supported yet -const EMPTY_TAGGED_FIELDS_BUFFER = Buffer.from([0]) - -module.exports = { - INT8_SIZE, - INT16_SIZE, - INT32_SIZE, - INT64_SIZE, - UUID_SIZE, - EMPTY_BUFFER, - EMPTY_UUID, - EMPTY_OR_SINGLE_COMPACT_LENGTH_SIZE, - EMPTY_TAGGED_FIELDS_BUFFER -} diff --git a/lib/varint.js b/lib/varint.js deleted file mode 100644 index 72e06d3..0000000 --- a/lib/varint.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict' - -const MOST_SIGNIFICANT_BIT_FLAG = 0x80 // 128 or 1000 0000 -const MOST_SIGNIFICANT_BIT_FLAG_64 = 0x80n // 128 or 1000 0000 -const LEAST_SIGNIFICANT_7_BITS = 0x7f // 127 or 0111 1111 -const LEAST_SIGNIFICANT_7_BITS_64 = 0x7fn // 127 or 0111 1111 - -// This is used in varint to check if there are any other bits set after the first 7 bits, -// which means it still needs more than a byte to represent the number in varint encoding -const BITS_8PLUS_MASK = 0xffffffff - 0x7f -const BITS_8PLUS_MASK_64 = 0xffffffffn - 0x7fn - -function intZigZagEncode (value) { - return (value << 1) ^ (value >> 31) -} - -function intZigZagDecode (value) { - return (value >> 1) ^ -(value & 1) -} - -function int64ZigZagEncode (value) { - return (value << 1n) ^ (value >> 31n) -} - -function int64ZigZagDecode (value) { - return (value >> 1n) ^ -(value & 1n) -} - -function sizeOfUnsignedVarInt (value) { - let bytes = 1 - - while ((value & BITS_8PLUS_MASK) !== 0) { - bytes++ - value >>>= 7 - } - - return bytes -} - -function sizeOfUnsignedVarInt64 (value) { - let bytes = 1 - - while ((value & BITS_8PLUS_MASK_64) !== 0n) { - bytes++ - value >>= 7n - } - - return bytes -} - -module.exports = { - MOST_SIGNIFICANT_BIT_FLAG, - MOST_SIGNIFICANT_BIT_FLAG_64, - LEAST_SIGNIFICANT_7_BITS, - LEAST_SIGNIFICANT_7_BITS_64, - BITS_8PLUS_MASK, - BITS_8PLUS_MASK_64, - intZigZagEncode, - intZigZagDecode, - int64ZigZagEncode, - int64ZigZagDecode, - sizeOfUnsignedVarInt, - sizeOfUnsignedVarInt64 -} diff --git a/package.json b/package.json index 5e8e526..ad6daab 100644 --- a/package.json +++ b/package.json @@ -1,36 +1,56 @@ { - "name": "dynbuffer", - "version": "0.1.0", - "description": "A list of Buffer - fast for reading/writing across multiple binary chunks", - "homepage": "https://github.com/platformatic/dynamic-buffer#readme", - "author": "Matteo Collina ", - "main": "lib/dynamic-buffer.js", - "type": "commonjs", - "scripts": { - "lint:fix": "eslint --cache --fix", - "test": "eslint --cache && node --test", - "benchmark": "node benchmark.js" - }, + "name": "@platformatic/dynamic-buffer", + "version": "0.0.1", + "description": "A small utility class to work with logically contiguous binary data split across multiple Buffer chunks.", + "homepage": "https://github.com/platformatic/@platformatic/dynamic-buffer", + "author": "Platformatic Inc. (https://platformatic.dev)", + "license": "Apache-2.0", "repository": { "type": "git", - "url": "git+https://github.com/platformatic/dynamic-buffer.git" + "url": "git+https://github.com/platformatic/@platformatic/dynamic-buffer.git" }, - "keywords": [ - "buffer", - "list", - "bl", - "fast", - "binary", - "chunk" - ], - "license": "Apache-2.0", + "keywords": [], "bugs": { - "url": "https://github.com/platformatic/dynamic-buffer/issues" + "url": "https://github.com/platformatic/@platformatic/dynamic-buffer/issues" + }, + "private": false, + "files": [ + "dist", + "LICENSE", + "README.md" + ], + "type": "module", + "exports": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.base.json", + "postbuild": "node scripts/postbuild.ts", + "lint": "eslint --cache", + "typecheck": "tsc -p . --noEmit", + "format": "prettier -w src test", + "test": "c8 -c test/config/c8-local.json node --test --test-reporter=cleaner-spec-reporter --test-timeout=60000 'test/**/*.test.ts'", + "test:ci": "c8 -c test/config/c8-ci.json node --test --test-reporter=cleaner-spec-reporter --test-timeout=60000 'test/**/*.test.ts'", + "ci": "npm run build && npm run lint && npm run test:ci", + "prepublishOnly": "npm run build && npm run lint", + "postpublish": "git push origin && git push origin -f --tags" }, "devDependencies": { - "bl": "^6.1.0", - "eslint": "^9.28.0", + "@platformatic/tsconfig": "^0.2.0", + "@types/node": "^25.2.3", + "@types/semver": "^7.7.1", + "bl": "^6.1.6", + "c8": "^10.1.3", + "cleaner-spec-reporter": "^1.0.3", + "eslint": "^9.39.0", + "eslint-plugin-prettier": "^5.5.5", "mitata": "^1.0.34", - "neostandard": "^0.12.1" + "neostandard": "^0.12.2", + "prettier": "^3.8.1", + "prettier-plugin-space-before-function-paren": "^0.0.10", + "semver": "^7.7.4", + "typescript": "^5.9.3" + }, + "engines": { + "node": ">= 22.19.0" } } diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..de7144b --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,9 @@ +export default { + printWidth: 120, + semi: false, + singleQuote: true, + bracketSpacing: true, + trailingComma: 'none', + arrowParens: 'avoid', + plugins: ['prettier-plugin-space-before-function-paren'] // This is for neostandard compatibility +} diff --git a/scripts/bump-version.ts b/scripts/bump-version.ts new file mode 100644 index 0000000..6b1f04f --- /dev/null +++ b/scripts/bump-version.ts @@ -0,0 +1,54 @@ +#!/usr/bin/env -S node + +import { execSync } from 'node:child_process' +import { readFile, writeFile } from 'node:fs/promises' +import { inc, type ReleaseType } from 'semver' + +type UserInfo = [string, string] + +function getUserInfo (): UserInfo { + const username = process.argv[3] ?? process.env.GITHUB_ACTOR + const defaultUser = 'mcollina' + + const users: Record = { + mcollina: ['Matteo Collina', 'hello@matteocollina.com'], + ShogunPanda: ['Paolo Insogna', 'paolo@cowtech.it'] + } + + let userInfo = users[username] + + if (!userInfo) { + userInfo = users[defaultUser] + } + + return userInfo +} + +async function getVersion (): Promise { + const version = process.argv[2].replace(/^v/, '') + + if (['minor', 'major', 'patch'].includes(process.argv[2])) { + const packageJson = JSON.parse(await readFile('package.json', 'utf8')) + return inc(packageJson.version, version as ReleaseType)! + } + + return version +} + +async function updatePackageJson (version: string): Promise { + const packageJson = JSON.parse(await readFile('package.json', 'utf8')) + packageJson.version = version + await writeFile('package.json', JSON.stringify(packageJson, null, 2)) +} + +const userInfo = getUserInfo() +const version = await getVersion() + +await updatePackageJson(version) + +if (process.env.GITHUB_ACTIONS === 'true') { + execSync(`git config --global user.name "${userInfo[0]}"`) + execSync(`git config --global user.email "${userInfo[1]}"`) +} + +execSync(`git commit -a -m "chore: Bumped v${version}." -m "Signed-off-by: ${userInfo[0]} <${userInfo[1]}>"`) diff --git a/scripts/postbuild.ts b/scripts/postbuild.ts new file mode 100644 index 0000000..59cab2e --- /dev/null +++ b/scripts/postbuild.ts @@ -0,0 +1,17 @@ +#!/usr/bin/env -S node + +import { readFile, writeFile } from 'node:fs/promises' +import { resolve } from 'node:path' + +async function generateVersion () { + const { name, version } = JSON.parse(await readFile(resolve(process.cwd(), 'package.json'), 'utf-8')) + + const file = import.meta.url.includes('dist') + ? new URL('../src/version.js', import.meta.url) + : new URL('../dist/version.js', import.meta.url) + + // To address https://github.com/platformatic/kafka/issues/91 + await writeFile(file, `export const name = "${name}";\nexport const version = "${version}";\n`, 'utf-8') +} + +await generateVersion() diff --git a/scripts/utils.ts b/scripts/utils.ts new file mode 100644 index 0000000..b4eee46 --- /dev/null +++ b/scripts/utils.ts @@ -0,0 +1,21 @@ +import { ESLint } from 'eslint' +import { format } from 'prettier' + +export async function formatOutput (output: string, filePath: string): Promise { + // Format with prettier + output = await format(output, { + parser: 'typescript', + printWidth: 120, + semi: false, + singleQuote: true, + bracketSpacing: true, + trailingComma: 'none', + arrowParens: 'avoid' + }) + + // Lint with eslint + const eslint = new ESLint({ fix: true }) + const [result] = await eslint.lintText(output, { filePath }) + + return result.output ?? result.source! ?? output +} diff --git a/src/definitions.ts b/src/definitions.ts new file mode 100644 index 0000000..edda56e --- /dev/null +++ b/src/definitions.ts @@ -0,0 +1,6 @@ +export const INT8_SIZE = 1 +export const INT16_SIZE = 2 +export const INT32_SIZE = 4 +export const INT64_SIZE = 8 + +export const EMPTY_BUFFER = Buffer.alloc(0) diff --git a/lib/dynamic-buffer.js b/src/index.ts similarity index 73% rename from lib/dynamic-buffer.js rename to src/index.ts index d0a989e..6c017fe 100644 --- a/lib/dynamic-buffer.js +++ b/src/index.ts @@ -1,7 +1,5 @@ -'use strict' - -const { EMPTY_BUFFER, INT16_SIZE, INT32_SIZE, INT64_SIZE, INT8_SIZE } = require('./definitions') -const { +import { EMPTY_BUFFER, INT16_SIZE, INT32_SIZE, INT64_SIZE, INT8_SIZE } from './definitions.ts' +import { BITS_8PLUS_MASK, BITS_8PLUS_MASK_64, int64ZigZagDecode, @@ -14,18 +12,33 @@ const { MOST_SIGNIFICANT_BIT_FLAG_64, sizeOfUnsignedVarInt, sizeOfUnsignedVarInt64 -} = require('./varint') +} from './varint.ts' const instanceIdentifier = Symbol('plt.dynamicBuffer.instanceIdentifier') -class DynamicBuffer { - #readBuffer // This is used from the fixed length readers +export * from './definitions.ts' +export * from './varint.ts' + +export class OutOfBoundsError extends Error { + code: string - static isDynamicBuffer (target) { + constructor (message: string) { + super(message) + this.code = 'OUT_OF_BOUNDS' + } +} + +export class DynamicBuffer { + buffers: Buffer[] + length: number + #readBuffer: Buffer; // This is used from the fixed length readers + [instanceIdentifier]: boolean + + static isDynamicBuffer (target: any): boolean { return target?.[instanceIdentifier] === true } - constructor (buffers) { + constructor (buffers?: Buffer | Buffer[]) { this.buffers = [] this.length = 0 this.#readBuffer = Buffer.allocUnsafe(8) @@ -44,7 +57,7 @@ class DynamicBuffer { } } - get buffer () { + get buffer (): Buffer { if (this.buffers.length === 0) { return EMPTY_BUFFER } @@ -55,41 +68,51 @@ class DynamicBuffer { return Buffer.concat(this.buffers, this.length) } - append (buffer) { + append (buffer: Buffer): this { this.buffers.push(buffer) this.length += buffer.length return this } - prepend (buffer) { + prepend (buffer: Buffer): this { this.buffers.unshift(buffer) this.length += buffer.length return this } - appendFrom (DynamicBuffer) { - this.buffers.push(...DynamicBuffer.buffers) + appendFrom (DynamicBuffer: DynamicBuffer): this { + const buffers = DynamicBuffer.buffers + + for (let i = 0; i < buffers.length; i++) { + this.buffers.push(buffers[i]) + } + this.length += DynamicBuffer.length return this } - prependFrom (DynamicBuffer) { - this.buffers.unshift(...DynamicBuffer.buffers) + prependFrom (DynamicBuffer: DynamicBuffer): this { + const buffers = DynamicBuffer.buffers + + for (let i = buffers.length - 1; i >= 0; i--) { + this.buffers.unshift(buffers[i]) + } + this.length += DynamicBuffer.length return this } - subarray (start = 0, end) { + subarray (start: number = 0, end?: number): DynamicBuffer { if (typeof end === 'undefined') { end = this.length } if (start < 0 || start > this.length || end > this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } if (this.buffers.length === 0) { @@ -120,19 +143,19 @@ class DynamicBuffer { return new DynamicBuffer(buffers) } - slice (start = 0, end) { + slice (start: number = 0, end?: number): Buffer { if (typeof end === 'undefined') { end = this.length } if (start < 0 || start > this.length || end > this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } if (this.buffers.length === 0) { return EMPTY_BUFFER } else if (this.buffers.length === 1) { - return this.buffers[0].slice(start, end) + return this.buffers[0].subarray(start, end) } let position = 0 @@ -159,7 +182,7 @@ class DynamicBuffer { return buffer } - clone (deep = false) { + clone (deep: boolean = false): DynamicBuffer { if (!deep) { return new DynamicBuffer(this.buffers) } @@ -172,9 +195,9 @@ class DynamicBuffer { return new DynamicBuffer(buffers) } - consume (offset) { + consume (offset: number): this { if (offset < 0 || offset > this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } if (offset === 0) { @@ -202,22 +225,22 @@ class DynamicBuffer { return this } - toString (encoding = 'utf-8', start = 0, end) { + toString (encoding: BufferEncoding = 'utf-8', start: number = 0, end?: number): string { return this.slice(start, end).toString(encoding) } - get (offset) { + get (offset: number): number { if (offset < 0 || offset >= this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } const [finalIndex, current] = this.#findInitialBuffer(offset) return this.buffers[current][finalIndex] } - readUInt8 (offset = 0) { + readUInt8 (offset: number = 0): number { if (offset < 0 || offset >= this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } const [finalIndex, current] = this.#findInitialBuffer(offset) @@ -226,44 +249,44 @@ class DynamicBuffer { return this.#readBuffer.readUInt8(0) } - readUInt16BE (offset = 0) { + readUInt16BE (offset: number = 0): number { this.#readMultiple(offset, 2) return this.#readBuffer.readUInt16BE(0) } - readUInt16LE (offset = 0) { + readUInt16LE (offset: number = 0): number { this.#readMultiple(offset, 2) return this.#readBuffer.readUInt16LE(0) } - readUInt32BE (offset = 0) { + readUInt32BE (offset: number = 0): number { this.#readMultiple(offset, 4) return this.#readBuffer.readUInt32BE(0) } - readUInt32LE (offset = 0) { + readUInt32LE (offset: number = 0): number { this.#readMultiple(offset, 4) return this.#readBuffer.readUInt32LE(0) } - readBigUInt64BE (offset = 0) { + readBigUInt64BE (offset: number = 0): bigint { this.#readMultiple(offset, 8) return this.#readBuffer.readBigUInt64BE(0) } - readBigUInt64LE (offset = 0) { + readBigUInt64LE (offset: number = 0): bigint { this.#readMultiple(offset, 8) return this.#readBuffer.readBigUInt64LE(0) } - readUnsignedVarInt (offset = 0) { + readUnsignedVarInt (offset: number): [number, number] { let i = 0 - let byte + let byte: number let value = 0 let read = 0 if (offset < 0 || offset >= this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } // Find the initial buffer @@ -285,14 +308,14 @@ class DynamicBuffer { return [value, read] } - readUnsignedVarInt64 (offset = 0) { + readUnsignedVarInt64 (offset: number): [bigint, number] { let i = 0n - let byte + let byte: bigint let value = 0n let read = 0 if (offset < 0 || offset >= this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } // Find the initial buffer @@ -314,9 +337,9 @@ class DynamicBuffer { return [value, read] } - readInt8 (offset = 0) { + readInt8 (offset: number = 0): number { if (offset < 0 || offset >= this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } const [finalIndex, current] = this.#findInitialBuffer(offset) @@ -325,67 +348,67 @@ class DynamicBuffer { return this.#readBuffer.readInt8(0) } - readInt16BE (offset = 0) { + readInt16BE (offset: number = 0): number { this.#readMultiple(offset, INT16_SIZE) return this.#readBuffer.readInt16BE(0) } - readInt16LE (offset = 0) { + readInt16LE (offset: number = 0): number { this.#readMultiple(offset, INT16_SIZE) return this.#readBuffer.readInt16LE(0) } - readInt32BE (offset = 0) { + readInt32BE (offset: number = 0): number { this.#readMultiple(offset, INT32_SIZE) return this.#readBuffer.readInt32BE(0) } - readInt32LE (offset = 0) { + readInt32LE (offset: number = 0): number { this.#readMultiple(offset, INT32_SIZE) return this.#readBuffer.readInt32LE(0) } - readBigInt64BE (offset = 0) { + readBigInt64BE (offset: number = 0): bigint { this.#readMultiple(offset, INT64_SIZE) return this.#readBuffer.readBigInt64BE(0) } - readBigInt64LE (offset = 0) { + readBigInt64LE (offset: number = 0): bigint { this.#readMultiple(offset, INT64_SIZE) return this.#readBuffer.readBigInt64LE(0) } - readVarInt (offset) { + readVarInt (offset: number): [number, number] { const [value, read] = this.readUnsignedVarInt(offset) return [intZigZagDecode(value), read] } - readVarInt64 (offset) { + readVarInt64 (offset: number): [bigint, number] { const [value, read] = this.readUnsignedVarInt64(offset) return [int64ZigZagDecode(value), read] } - readFloatBE (offset = 0) { + readFloatBE (offset: number = 0): number { this.#readMultiple(offset, INT32_SIZE) return this.#readBuffer.readFloatBE(0) } - readFloatLE (offset = 0) { + readFloatLE (offset: number = 0): number { this.#readMultiple(offset, INT32_SIZE) return this.#readBuffer.readFloatLE(0) } - readDoubleBE (offset = 0) { + readDoubleBE (offset: number = 0): number { this.#readMultiple(offset, INT64_SIZE) return this.#readBuffer.readDoubleBE(0) } - readDoubleLE (offset = 0) { + readDoubleLE (offset: number = 0): number { this.#readMultiple(offset, INT64_SIZE) return this.#readBuffer.readDoubleLE(0) } - writeUInt8 (value, append = true) { + writeUInt8 (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT8_SIZE) buffer.writeUInt8(value) @@ -398,7 +421,7 @@ class DynamicBuffer { return this } - writeUInt16BE (value, append = true) { + writeUInt16BE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT16_SIZE) buffer.writeUInt16BE(value) @@ -411,7 +434,7 @@ class DynamicBuffer { return this } - writeUInt16LE (value, append = true) { + writeUInt16LE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT16_SIZE) buffer.writeUInt16LE(value) @@ -424,7 +447,7 @@ class DynamicBuffer { return this } - writeUInt32BE (value, append = true) { + writeUInt32BE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT32_SIZE) buffer.writeUInt32BE(value) @@ -437,7 +460,7 @@ class DynamicBuffer { return this } - writeUInt32LE (value, append = true) { + writeUInt32LE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT32_SIZE) buffer.writeUInt32LE(value) @@ -450,7 +473,7 @@ class DynamicBuffer { return this } - writeBigUInt64BE (value, append = true) { + writeBigUInt64BE (value: bigint, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT64_SIZE) buffer.writeBigUInt64BE(value) @@ -463,7 +486,7 @@ class DynamicBuffer { return this } - writeBigUInt64LE (value, append = true) { + writeBigUInt64LE (value: bigint, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT64_SIZE) buffer.writeBigUInt64LE(value) @@ -476,8 +499,8 @@ class DynamicBuffer { return this } - writeUnsignedVarInt (value, append = true) { - const buffer = Buffer.alloc(sizeOfUnsignedVarInt(value)) + writeUnsignedVarInt (value: number, append: boolean = true): void { + const buffer = Buffer.allocUnsafe(sizeOfUnsignedVarInt(value)) let position = 0 while ((value & BITS_8PLUS_MASK) !== 0) { @@ -495,8 +518,8 @@ class DynamicBuffer { } } - writeUnsignedVarInt64 (value, append = true) { - const buffer = Buffer.alloc(sizeOfUnsignedVarInt64(value)) + writeUnsignedVarInt64 (value: bigint, append: boolean = true) { + const buffer = Buffer.allocUnsafe(sizeOfUnsignedVarInt64(value)) let position = 0 while ((value & BITS_8PLUS_MASK_64) !== 0n) { @@ -514,7 +537,7 @@ class DynamicBuffer { } } - writeInt8 (value, append = true) { + writeInt8 (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT8_SIZE) buffer.writeInt8(value) @@ -527,7 +550,7 @@ class DynamicBuffer { return this } - writeInt16BE (value, append = true) { + writeInt16BE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT16_SIZE) buffer.writeInt16BE(value) @@ -540,7 +563,7 @@ class DynamicBuffer { return this } - writeInt16LE (value, append = true) { + writeInt16LE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT16_SIZE) buffer.writeInt16LE(value) @@ -553,7 +576,7 @@ class DynamicBuffer { return this } - writeInt32BE (value, append = true) { + writeInt32BE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT32_SIZE) buffer.writeInt32BE(value) @@ -566,7 +589,7 @@ class DynamicBuffer { return this } - writeInt32LE (value, append = true) { + writeInt32LE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT32_SIZE) buffer.writeInt32LE(value) @@ -579,7 +602,7 @@ class DynamicBuffer { return this } - writeBigInt64BE (value, append = true) { + writeBigInt64BE (value: bigint, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT64_SIZE) buffer.writeBigInt64BE(value) @@ -592,7 +615,7 @@ class DynamicBuffer { return this } - writeBigInt64LE (value, append = true) { + writeBigInt64LE (value: bigint, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT64_SIZE) buffer.writeBigInt64LE(value) @@ -605,15 +628,15 @@ class DynamicBuffer { return this } - writeVarInt (value, append = true) { + writeVarInt (value: number, append: boolean = true) { this.writeUnsignedVarInt(intZigZagEncode(value), append) } - writeVarInt64 (value, append = true) { + writeVarInt64 (value: bigint, append: boolean = true) { this.writeUnsignedVarInt64(int64ZigZagEncode(value), append) } - writeFloatBE (value, append = true) { + writeFloatBE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT32_SIZE) buffer.writeFloatBE(value) @@ -626,7 +649,7 @@ class DynamicBuffer { return this } - writeFloatLE (value, append = true) { + writeFloatLE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT32_SIZE) buffer.writeFloatLE(value) @@ -639,7 +662,7 @@ class DynamicBuffer { return this } - writeDoubleBE (value, append = true) { + writeDoubleBE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT64_SIZE) buffer.writeDoubleBE(value) @@ -652,7 +675,7 @@ class DynamicBuffer { return this } - writeDoubleLE (value, append = true) { + writeDoubleLE (value: number, append: boolean = true) { const buffer = Buffer.allocUnsafe(INT64_SIZE) buffer.writeDoubleLE(value) @@ -665,7 +688,7 @@ class DynamicBuffer { return this } - #findInitialBuffer (start) { + #findInitialBuffer (start: number): [number, number] { let current = 0 // Find the initial buffer @@ -677,9 +700,9 @@ class DynamicBuffer { return [start, current] } - #readMultiple (index, length) { + #readMultiple (index: number, length: number) { if (index < 0 || index + length > this.length) { - throw new Error('Out of bounds.') + throw new OutOfBoundsError('Out of bounds.') } let [startOffset, current] = this.#findInitialBuffer(index) @@ -694,5 +717,3 @@ class DynamicBuffer { } } } - -module.exports.DynamicBuffer = DynamicBuffer diff --git a/src/varint.ts b/src/varint.ts new file mode 100644 index 0000000..5588cab --- /dev/null +++ b/src/varint.ts @@ -0,0 +1,47 @@ +export const MOST_SIGNIFICANT_BIT_FLAG = 0x80 // 128 or 1000 0000 +export const MOST_SIGNIFICANT_BIT_FLAG_64 = 0x80n // 128 or 1000 0000 +export const LEAST_SIGNIFICANT_7_BITS = 0x7f // 127 or 0111 1111 +export const LEAST_SIGNIFICANT_7_BITS_64 = 0x7fn // 127 or 0111 1111 + +// This is used in varint to check if there are any other bits set after the first 7 bits, +// which means it still needs more than a byte to represent the number in varint encoding +export const BITS_8PLUS_MASK = 0xffffffff - 0x7f +export const BITS_8PLUS_MASK_64 = 0xffffffffn - 0x7fn + +export function intZigZagEncode (value: number): number { + return (value << 1) ^ (value >> 31) +} + +export function intZigZagDecode (value: number): number { + return (value >> 1) ^ -(value & 1) +} + +export function int64ZigZagEncode (value: bigint): bigint { + return (value << 1n) ^ (value >> 31n) +} + +export function int64ZigZagDecode (value: bigint): bigint { + return (value >> 1n) ^ -(value & 1n) +} + +export function sizeOfUnsignedVarInt (value: number): number { + let bytes = 1 + + while ((value & BITS_8PLUS_MASK) !== 0) { + bytes++ + value >>>= 7 + } + + return bytes +} + +export function sizeOfUnsignedVarInt64 (value: bigint): number { + let bytes = 1 + + while ((value & BITS_8PLUS_MASK_64) !== 0n) { + bytes++ + value >>= 7n + } + + return bytes +} diff --git a/src/version.ts b/src/version.ts new file mode 100644 index 0000000..be5b931 --- /dev/null +++ b/src/version.ts @@ -0,0 +1,8 @@ +// This file is replaced by the postbuild script to be bundler friendly + +import { readFileSync } from 'node:fs' + +const packageJson = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8')) + +export const name = packageJson.name +export const version = packageJson.version diff --git a/test/config/c8-ci.json b/test/config/c8-ci.json new file mode 100644 index 0000000..a8081eb --- /dev/null +++ b/test/config/c8-ci.json @@ -0,0 +1,8 @@ +{ + "check-coverage": true, + "reporter": ["text", "json"], + "branches": 90, + "functions": 90, + "lines": 90, + "statements": 90 +} diff --git a/test/config/c8-local.json b/test/config/c8-local.json new file mode 100644 index 0000000..916baeb --- /dev/null +++ b/test/config/c8-local.json @@ -0,0 +1,3 @@ +{ + "reporter": ["text", "html"] +} diff --git a/test/dynamic-buffer.test.js b/test/index.test.ts similarity index 94% rename from test/dynamic-buffer.test.js rename to test/index.test.ts index 05f42bb..ef2e239 100644 --- a/test/dynamic-buffer.test.js +++ b/test/index.test.ts @@ -1,13 +1,33 @@ -'use strict' - -const { deepStrictEqual, notStrictEqual, ok, strictEqual, throws } = require('node:assert') -const { test } = require('node:test') -const { DynamicBuffer } = require('..') -const { EMPTY_BUFFER } = require('../lib/definitions.js') +import { deepStrictEqual, notStrictEqual, strictEqual, throws } from 'node:assert' +import test from 'node:test' +import { EMPTY_BUFFER } from '../src/definitions.ts' +import { DynamicBuffer, OutOfBoundsError } from '../src/index.ts' test('static isDynamicBuffer', () => { - ok(DynamicBuffer.isDynamicBuffer(new DynamicBuffer())) - ok(!DynamicBuffer.isDynamicBuffer('STRING')) + // Test with a DynamicBuffer instance + const dynamicBuffer = new DynamicBuffer() + strictEqual(DynamicBuffer.isDynamicBuffer(dynamicBuffer), true) + + // Test with a regular Buffer + const regularBuffer = Buffer.from([1, 2, 3]) + strictEqual(DynamicBuffer.isDynamicBuffer(regularBuffer), false) + + // Test with null + strictEqual(DynamicBuffer.isDynamicBuffer(null), false) + + // Test with undefined + strictEqual(DynamicBuffer.isDynamicBuffer(undefined), false) + + // Test with other types + strictEqual(DynamicBuffer.isDynamicBuffer({}), false) + strictEqual(DynamicBuffer.isDynamicBuffer([]), false) + strictEqual(DynamicBuffer.isDynamicBuffer('string'), false) + strictEqual(DynamicBuffer.isDynamicBuffer(123), false) + + // The dynamicBuffer symbol is a private implementation detail and can't be faked from outside + // as it's not exported or accessible (it's not Symbol.for() but a local Symbol) + const fakeBuffer = {} + strictEqual(DynamicBuffer.isDynamicBuffer(fakeBuffer), false) }) test('constructor', () => { @@ -119,7 +139,7 @@ test('subarray', () => { emptyBuffer.subarray(0, 1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -191,7 +211,7 @@ test('subarray', () => { multiBuffer.subarray(-1, 5) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -200,7 +220,7 @@ test('subarray', () => { multiBuffer.subarray(0, 7) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -215,7 +235,7 @@ test('slice', () => { emptyBuffer.slice(0, 1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -285,7 +305,7 @@ test('slice', () => { singleBuffer.slice(-1, 5) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -294,7 +314,7 @@ test('slice', () => { singleBuffer.slice(0, 7) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -434,7 +454,7 @@ test('consume', () => { buffer.consume(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -444,7 +464,7 @@ test('consume', () => { buffer.consume(buffer.length + 1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) } @@ -538,7 +558,7 @@ test('get', () => { emptyBuffer.get(0) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -563,7 +583,7 @@ test('get', () => { multiBuffer.get(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -572,7 +592,7 @@ test('get', () => { multiBuffer.get(5) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -588,7 +608,7 @@ test('readUInt8', () => { buffer.readUInt8(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -597,7 +617,7 @@ test('readUInt8', () => { buffer.readUInt8(3) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -615,7 +635,7 @@ test('readInt8', () => { buffer.readInt8(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -624,12 +644,14 @@ test('readInt8', () => { buffer.readInt8(3) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) -const fixedLengths = [ +type Reader = (offset?: number) => T +type Writer = (value: T, offset?: number) => void +const fixedLengths: [string, number][] = [ ['UInt16', 2], ['Int16', 2], ['UInt32', 4], @@ -650,13 +672,13 @@ for (const [name, bytes] of fixedLengths) { const split = 2 ** (bytes * (8 - 1)) + 7 if (name.includes('Big')) { - const writer = totalBuffer[`write${spec}`] + const writer = totalBuffer[`write${spec}` as keyof Buffer] as Writer writer.call(totalBuffer, 1n, 0) writer.call(totalBuffer, 2n, bytes) writer.call(totalBuffer, BigInt(split), bytes * 2) writer.call(totalBuffer, 3n, bytes * 3) } else { - const writer = totalBuffer[`write${spec}`] + const writer = totalBuffer[`write${spec}` as keyof Buffer] as Writer writer.call(totalBuffer, 1, 0) writer.call(totalBuffer, 2, bytes) @@ -670,7 +692,7 @@ for (const [name, bytes] of fixedLengths) { totalBuffer.subarray(bytes * 2 + bytes / 2) ]) - const reader = DynamicBuffer.prototype[`read${spec}`] + const reader = DynamicBuffer.prototype[`read${spec}` as keyof DynamicBuffer] as Reader if (name.includes('Big')) { strictEqual(reader.call(buffer), 1n) @@ -689,7 +711,7 @@ for (const [name, bytes] of fixedLengths) { reader.call(buffer, -1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -698,7 +720,7 @@ for (const [name, bytes] of fixedLengths) { reader.call(buffer, bytes * 4) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -742,7 +764,7 @@ test('readFloatBE', () => { singleBuffer.readFloatBE(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -751,7 +773,7 @@ test('readFloatBE', () => { singleBuffer.readFloatBE(1) // Not enough bytes for a float }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -793,7 +815,7 @@ test('readFloatLE', () => { singleBuffer.readFloatLE(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -802,7 +824,7 @@ test('readFloatLE', () => { singleBuffer.readFloatLE(1) // Not enough bytes for a float }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -845,7 +867,7 @@ test('readDoubleBE', () => { singleBuffer.readDoubleBE(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -854,7 +876,7 @@ test('readDoubleBE', () => { singleBuffer.readDoubleBE(1) // Not enough bytes for a double }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -897,7 +919,7 @@ test('readDoubleLE', () => { singleBuffer.readDoubleLE(-1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) @@ -906,7 +928,7 @@ test('readDoubleLE', () => { singleBuffer.readDoubleLE(1) // Not enough bytes for a double }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -955,7 +977,7 @@ test('readUnsignedVarInt', () => { smallBuffer.readUnsignedVarInt(1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -1014,7 +1036,7 @@ test('readUnsignedVarInt64', () => { smallBuffer.readUnsignedVarInt64(1) }, err => { - return err instanceof Error && err.message === 'Out of bounds.' + return err instanceof OutOfBoundsError } ) }) @@ -1166,7 +1188,7 @@ test('writeInt8', () => { // Test for fixed width numeric methods // Parameters for test cases: [method name, value, expected size] -const writeFixedMethodTests = [ +const writeFixedMethodTests: [string, number | bigint, number][] = [ ['writeUInt16BE', 0xabcd, 2], ['writeUInt16LE', 0xabcd, 2], ['writeInt16BE', -12345, 2], @@ -1184,11 +1206,14 @@ const writeFixedMethodTests = [ for (const [methodName, value, expectedSize] of writeFixedMethodTests) { test(methodName, () => { // Get writer method - const writer = DynamicBuffer.prototype[methodName] + const writer = DynamicBuffer.prototype[methodName as keyof DynamicBuffer] as ( + value: any, + append?: boolean + ) => DynamicBuffer // Get corresponding reader method - remove 'write' and add 'read' const readerMethodName = 'read' + methodName.substring(5) - const reader = DynamicBuffer.prototype[readerMethodName] + const reader = DynamicBuffer.prototype[readerMethodName as keyof DynamicBuffer] as (offset?: number) => any // Test with append = true (default) const dynamicBuffer1 = new DynamicBuffer() @@ -1218,7 +1243,7 @@ for (const [methodName, value, expectedSize] of writeFixedMethodTests) { } // Test for floating point methods -const writeFloatMethodTests = [ +const writeFloatMethodTests: [string, number, number][] = [ ['writeFloatBE', 123.456, 4], ['writeFloatLE', 123.456, 4], ['writeDoubleBE', 12345.6789, 8], @@ -1228,11 +1253,14 @@ const writeFloatMethodTests = [ for (const [methodName, value, expectedSize] of writeFloatMethodTests) { test(methodName, () => { // Get writer method - const writer = DynamicBuffer.prototype[methodName] + const writer = DynamicBuffer.prototype[methodName as keyof DynamicBuffer] as ( + value: number, + append?: boolean + ) => DynamicBuffer // Get corresponding reader method - remove 'write' and add 'read' const readerMethodName = 'read' + methodName.substring(5) - const reader = DynamicBuffer.prototype[readerMethodName] + const reader = DynamicBuffer.prototype[readerMethodName as keyof DynamicBuffer] as (offset?: number) => number // Test with append = true (default) const dynamicBuffer1 = new DynamicBuffer() @@ -1379,30 +1407,3 @@ test('writeVarInt64', () => { dynamicBuffer5.writeVarInt64(-42n, false) // Prepend -42 strictEqual(dynamicBuffer5.length > buffer5Length, true) // Length should have increased }) - -test('isDynamicBuffer - static method', () => { - // Test with a DynamicBuffer instance - const dynamicBuffer = new DynamicBuffer() - strictEqual(DynamicBuffer.isDynamicBuffer(dynamicBuffer), true) - - // Test with a regular Buffer - const regularBuffer = Buffer.from([1, 2, 3]) - strictEqual(DynamicBuffer.isDynamicBuffer(regularBuffer), false) - - // Test with null - strictEqual(DynamicBuffer.isDynamicBuffer(null), false) - - // Test with undefined - strictEqual(DynamicBuffer.isDynamicBuffer(undefined), false) - - // Test with other types - strictEqual(DynamicBuffer.isDynamicBuffer({}), false) - strictEqual(DynamicBuffer.isDynamicBuffer([]), false) - strictEqual(DynamicBuffer.isDynamicBuffer('string'), false) - strictEqual(DynamicBuffer.isDynamicBuffer(123), false) - - // The dynamicBuffer symbol is a private implementation detail and can't be faked from outside - // as it's not exported or accessible (it's not Symbol.for() but a local Symbol) - const fakeBuffer = {} - strictEqual(DynamicBuffer.isDynamicBuffer(fakeBuffer), false) -}) diff --git a/test/varint.test.js b/test/varint.test.ts similarity index 93% rename from test/varint.test.js rename to test/varint.test.ts index eaa6a87..ff23c4a 100644 --- a/test/varint.test.js +++ b/test/varint.test.ts @@ -1,14 +1,13 @@ -'use strict' -const { strictEqual } = require('node:assert') -const test = require('node:test') -const { +import { strictEqual } from 'node:assert' +import test from 'node:test' +import { int64ZigZagDecode, int64ZigZagEncode, intZigZagDecode, intZigZagEncode, sizeOfUnsignedVarInt, sizeOfUnsignedVarInt64 -} = require('../lib/varint.js') +} from '../src/index.ts' test('zigzag encoding (32-bit)', () => { strictEqual(intZigZagEncode(0), 0) diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..8bc13c5 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,8 @@ +{ + "extends": "@platformatic/tsconfig", + "compilerOptions": { + "declaration": true, + "outDir": "dist", + }, + "include": ["src/*.ts", "src/**/*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..52e4dfa --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "include": [ + "src/*.ts", + "src/**/*.ts", + "test/*.ts", + "test/**/*.ts", + "scripts/*.ts", + ] +} From c3b32d6e71efe100092da819c6eedf9570a2f91f Mon Sep 17 00:00:00 2001 From: Paolo Insogna Date: Thu, 19 Feb 2026 16:34:38 +0100 Subject: [PATCH 2/3] fixup Signed-off-by: Paolo Insogna --- pnpm-lock.yaml | 3234 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3234 insertions(+) create mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..44151bd --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3234 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@platformatic/tsconfig': + specifier: ^0.2.0 + version: 0.2.0 + '@types/node': + specifier: ^25.2.3 + version: 25.3.0 + '@types/semver': + specifier: ^7.7.1 + version: 7.7.1 + bl: + specifier: ^6.1.6 + version: 6.1.6 + c8: + specifier: ^10.1.3 + version: 10.1.3 + cleaner-spec-reporter: + specifier: ^1.0.3 + version: 1.0.3 + eslint: + specifier: ^9.39.0 + version: 9.39.2 + eslint-plugin-prettier: + specifier: ^5.5.5 + version: 5.5.5(eslint@9.39.2)(prettier@3.8.1) + mitata: + specifier: ^1.0.34 + version: 1.0.34 + neostandard: + specifier: ^0.12.2 + version: 0.12.2(@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + prettier: + specifier: ^3.8.1 + version: 3.8.1 + prettier-plugin-space-before-function-paren: + specifier: ^0.0.10 + version: 0.0.10(prettier@3.8.1) + semver: + specifier: ^7.7.4 + version: 7.7.4 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + +packages: + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/gitignore-to-minimatch@1.0.2': + resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@platformatic/tsconfig@0.2.0': + resolution: {integrity: sha512-vDnuv54z0QsgvrtJ0byc1b9zfnLaCzRYMCuA2pTXUecd+xq5iF0jidkuph4/SRrYmGUVG7xjgUtwViwfprQ49g==} + engines: {node: '>=22.19.0'} + + '@stylistic/eslint-plugin@2.11.0': + resolution: {integrity: sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.40.0' + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@25.3.0': + resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} + + '@types/readable-stream@4.0.23': + resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@typescript-eslint/eslint-plugin@8.56.0': + resolution: {integrity: sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.56.0': + resolution: {integrity: sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.56.0': + resolution: {integrity: sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.56.0': + resolution: {integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.56.0': + resolution: {integrity: sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.56.0': + resolution: {integrity: sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.56.0': + resolution: {integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.56.0': + resolution: {integrity: sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.56.0': + resolution: {integrity: sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.56.0': + resolution: {integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.3: + resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} + engines: {node: 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@6.1.6: + resolution: {integrity: sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + c8@10.1.3: + resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + monocart-coverage-reports: ^2 + peerDependenciesMeta: + monocart-coverage-reports: + optional: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + cleaner-spec-reporter@1.0.3: + resolution: {integrity: sha512-LgsmrqWRVLcfpyom+A50ukifqg0To+G3UJwKLg/C9r+flm+3MZQQe2MpX4T1fRhMV9VPe+8JuTkGU2gp375G2A==} + engines: {node: '>= 22.21.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comment-parser@1.4.5: + resolution: {integrity: sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==} + engines: {node: '>= 12.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.2: + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import-x@4.16.1: + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true + + eslint-plugin-n@17.24.0: + resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-promise@7.2.1: + resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + minimatch@10.2.1: + resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mitata@1.0.34: + resolution: {integrity: sha512-Mc3zrtNBKIMeHSCQ0XqRLo1vbdIx1wvFV9c8NJAiyho6AjNfMY8bVhbS12bwciUdd1t4rj8099CH3N3NFahaUA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neostandard@0.12.2: + resolution: {integrity: sha512-VZU8EZpSaNadp3rKEwBhVD1Kw8jE3AftQLkCyOaM7bWemL1LwsYRsBnAmXy2LjG9zO8t66qJdqB7ccwwORyrAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + eslint: ^9.0.0 + + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + peowly@1.3.3: + resolution: {integrity: sha512-5UmUtvuCv3KzBX2NuQw2uF28o0t8Eq4KkPRZfUCzJs+DiNVKw7OaYn29vNDgrt/Pggs23CPlSTqgzlhHJfpT0A==} + engines: {node: '>=18.6.0', typescript: '>=5.8'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier-plugin-space-before-function-paren@0.0.10: + resolution: {integrity: sha512-hpAA68ajNtb98XRBBcxVCGMp2K3XSj9wcnXQESb+BrV0CJP7d/r5KL8SFjOutKkJrvsSMP7WgmQSPcSRCrNi2g==} + peerDependencies: + prettier: '>=3.0.0' + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} + hasBin: true + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} + peerDependencies: + typescript: '>=4.0.0' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.56.0: + resolution: {integrity: sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@bcoe/v8-coverage@1.0.2': {} + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': + dependencies: + eslint: 9.39.2 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/gitignore-to-minimatch@1.0.2': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nolyfill/is-core-module@1.0.39': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} + + '@platformatic/tsconfig@0.2.0': + dependencies: + json5: 2.2.3 + + '@stylistic/eslint-plugin@2.11.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/estree@1.0.8': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@25.3.0': + dependencies: + undici-types: 7.18.2 + + '@types/readable-stream@4.0.23': + dependencies: + '@types/node': 25.3.0 + + '@types/semver@7.7.1': {} + + '@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.56.0 + '@typescript-eslint/type-utils': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.0 + eslint: 9.39.2 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.56.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.56.0 + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.0 + debug: 4.4.3 + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.56.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) + '@typescript-eslint/types': 8.56.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.56.0': + dependencies: + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/visitor-keys': 8.56.0 + + '@typescript-eslint/tsconfig-utils@8.56.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.56.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.56.0': {} + + '@typescript-eslint/typescript-estree@8.56.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.56.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/visitor-keys': 8.56.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.56.0 + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.56.0': + dependencies: + '@typescript-eslint/types': 8.56.0 + eslint-visitor-keys: 5.0.0 + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + balanced-match@1.0.2: {} + + balanced-match@4.0.3: {} + + base64-js@1.5.1: {} + + bl@6.1.6: + dependencies: + '@types/readable-stream': 4.0.23 + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 4.7.0 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.3 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + c8@10.1.3: + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + test-exclude: 7.0.1 + v8-to-istanbul: 9.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + cleaner-spec-reporter@1.0.3: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comment-parser@1.4.5: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.19.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.2: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@9.39.2): + dependencies: + eslint: 9.39.2 + semver: 7.7.4 + + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.13.6 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 9.39.2 + get-tsconfig: 4.13.6 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2) + transitivePeerDependencies: + - supports-color + + eslint-plugin-es-x@7.8.0(eslint@9.39.2): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + eslint: 9.39.2 + eslint-compat-utils: 0.5.1(eslint@9.39.2) + + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2): + dependencies: + '@typescript-eslint/types': 8.56.0 + comment-parser: 1.4.5 + debug: 4.4.3 + eslint: 9.39.2 + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + is-glob: 4.0.3 + minimatch: 10.2.1 + semver: 7.7.4 + stable-hash-x: 0.2.0 + unrs-resolver: 1.11.1 + optionalDependencies: + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-n@17.24.0(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + enhanced-resolve: 5.19.0 + eslint: 9.39.2 + eslint-plugin-es-x: 7.8.0(eslint@9.39.2) + get-tsconfig: 4.13.6 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.7.4 + ts-declaration-location: 1.0.7(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + eslint-plugin-prettier@5.5.5(eslint@9.39.2)(prettier@3.8.1): + dependencies: + eslint: 9.39.2 + prettier: 3.8.1 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + + eslint-plugin-promise@7.2.1(eslint@9.39.2): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + eslint: 9.39.2 + + eslint-plugin-react@7.37.5(eslint@9.39.2): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.2 + eslint: 9.39.2 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.6 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.0: {} + + eslint@9.39.2: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@14.0.0: {} + + globals@15.15.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globrex@0.1.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.4 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + make-dir@4.0.0: + dependencies: + semver: 7.7.4 + + math-intrinsics@1.1.0: {} + + minimatch@10.2.1: + dependencies: + brace-expansion: 5.0.2 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.3: {} + + mitata@1.0.34: {} + + ms@2.1.3: {} + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + neostandard@0.12.2(@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@humanwhocodes/gitignore-to-minimatch': 1.0.2 + '@stylistic/eslint-plugin': 2.11.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2) + eslint-plugin-n: 17.24.0(eslint@9.39.2)(typescript@5.9.3) + eslint-plugin-promise: 7.2.1(eslint@9.39.2) + eslint-plugin-react: 7.37.5(eslint@9.39.2) + find-up: 5.0.0 + globals: 15.15.0 + peowly: 1.3.3 + typescript-eslint: 8.56.0(eslint@9.39.2)(typescript@5.9.3) + transitivePeerDependencies: + - '@typescript-eslint/utils' + - eslint-import-resolver-node + - eslint-plugin-import + - supports-color + - typescript + + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + peowly@1.3.3: {} + + picomatch@4.0.3: {} + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier-plugin-space-before-function-paren@0.0.10(prettier@3.8.1): + dependencies: + prettier: 3.8.1 + + prettier@3.8.1: {} + + process@0.11.10: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + punycode@2.3.1: {} + + react-is@16.13.1: {} + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@2.0.0-next.6: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + semver@6.3.1: {} + + semver@7.7.4: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + stable-hash-x@0.2.0: {} + + stable-hash@0.0.5: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.11.12: + dependencies: + '@pkgr/core': 0.2.9 + + tapable@2.3.0: {} + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.5.0 + minimatch: 9.0.5 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-declaration-location@1.0.7(typescript@5.9.3): + dependencies: + picomatch: 4.0.3 + typescript: 5.9.3 + + tslib@2.8.1: + optional: true + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.56.0(eslint@9.39.2)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@7.18.2: {} + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} From 6bebdcde75fe882b5e9be939e996324e9536b378 Mon Sep 17 00:00:00 2001 From: Paolo Insogna Date: Thu, 19 Feb 2026 16:36:23 +0100 Subject: [PATCH 3/3] fixup Signed-off-by: Paolo Insogna --- benchmark.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmark.ts b/benchmark.ts index 50e9b50..edb0d0c 100644 --- a/benchmark.ts +++ b/benchmark.ts @@ -135,7 +135,7 @@ group('Buffer Access', () => { group('Consume Operations', () => { bench('DynamicBuffer - consume', () => { - const db = new DynamicBuffer(smallBuffers.map((b) => b.slice())) + const db = new DynamicBuffer(smallBuffers.map(b => b.slice())) for (let i = 0; i < 5; i++) { db.consume(10) } @@ -143,7 +143,7 @@ group('Consume Operations', () => { }) bench('BufferList - consume', () => { - const bl = new BufferList(smallBuffers.map((b) => b.slice())) + const bl = new BufferList(smallBuffers.map(b => b.slice())) for (let i = 0; i < 5; i++) { bl.consume(10) }