From a5c5839336b13bc59785ac37ae801def87bd3013 Mon Sep 17 00:00:00 2001 From: J Holmes <32bitkid@gmail.com> Date: Sat, 27 Jul 2024 14:35:17 -0600 Subject: [PATCH] Chore: moving @4bitlabs/numeric-deque and @4bitlabs/readers to 4bitlabs.bits --- README.md | 8 +- libs/numeric-deque/CHANGELOG.md | 43 - libs/numeric-deque/LICENSE.txt | 10 - libs/numeric-deque/README.md | 58 -- libs/numeric-deque/jest.config.js | 5 - libs/numeric-deque/package.json | 41 - libs/numeric-deque/src/index.ts | 1 - libs/numeric-deque/src/numeric-deque.spec.ts | 135 --- libs/numeric-deque/src/numeric-deque.ts | 100 --- libs/numeric-deque/tsconfig.json | 12 - libs/readers/.gitignore | 2 - libs/readers/CHANGELOG.md | 75 -- libs/readers/LICENSE.txt | 10 - libs/readers/README.md | 156 ---- libs/readers/jest.config.js | 5 - libs/readers/package.json | 30 - libs/readers/src/async-bit-reader.spec.ts | 125 --- libs/readers/src/async-bit-reader.ts | 107 --- libs/readers/src/bit-reader-options.ts | 6 - libs/readers/src/bit-reader.spec.ts | 219 ----- libs/readers/src/bit-reader.ts | 8 - libs/readers/src/byte-reader.ts | 67 -- libs/readers/src/create-bit-reader.ts | 19 - libs/readers/src/fast-lsb-reader.ts | 74 -- libs/readers/src/fast-msb-reader.ts | 74 -- libs/readers/src/index.ts | 5 - libs/readers/src/lsb-reader.ts | 136 ---- libs/readers/src/msb-reader.ts | 133 --- libs/readers/src/readonly-data-view.ts | 1 - libs/readers/src/typed-array.ts | 5 - libs/readers/src/utils/copy-buffer.ts | 11 - libs/readers/tsconfig.json | 12 - package-lock.json | 812 +++++++------------ package.json | 2 - 34 files changed, 309 insertions(+), 2198 deletions(-) delete mode 100644 libs/numeric-deque/CHANGELOG.md delete mode 100644 libs/numeric-deque/LICENSE.txt delete mode 100644 libs/numeric-deque/README.md delete mode 100644 libs/numeric-deque/jest.config.js delete mode 100644 libs/numeric-deque/package.json delete mode 100644 libs/numeric-deque/src/index.ts delete mode 100644 libs/numeric-deque/src/numeric-deque.spec.ts delete mode 100644 libs/numeric-deque/src/numeric-deque.ts delete mode 100644 libs/numeric-deque/tsconfig.json delete mode 100644 libs/readers/.gitignore delete mode 100644 libs/readers/CHANGELOG.md delete mode 100644 libs/readers/LICENSE.txt delete mode 100644 libs/readers/README.md delete mode 100644 libs/readers/jest.config.js delete mode 100644 libs/readers/package.json delete mode 100644 libs/readers/src/async-bit-reader.spec.ts delete mode 100644 libs/readers/src/async-bit-reader.ts delete mode 100644 libs/readers/src/bit-reader-options.ts delete mode 100644 libs/readers/src/bit-reader.spec.ts delete mode 100644 libs/readers/src/bit-reader.ts delete mode 100644 libs/readers/src/byte-reader.ts delete mode 100644 libs/readers/src/create-bit-reader.ts delete mode 100644 libs/readers/src/fast-lsb-reader.ts delete mode 100644 libs/readers/src/fast-msb-reader.ts delete mode 100644 libs/readers/src/index.ts delete mode 100644 libs/readers/src/lsb-reader.ts delete mode 100644 libs/readers/src/msb-reader.ts delete mode 100644 libs/readers/src/readonly-data-view.ts delete mode 100644 libs/readers/src/typed-array.ts delete mode 100644 libs/readers/src/utils/copy-buffer.ts delete mode 100644 libs/readers/tsconfig.json diff --git a/README.md b/README.md index f1d8ba9..3a823be 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,6 @@ A collection of packages, utilities and apps for decoding assets from This monorepo is a work-in-progress. -## General packages - -- [`@4bitlabs/readers`](./libs/readers/README.md): Basic implementations of `BitReader` in JavaScript/TypeScript. -- [`@4bitlabs/codecs`](./libs/codecs/README.md): Some common decompression algorithms, _e.g._ `Huffman` and `LZW`. -- [`@4bitlabs/numeric-deque`](./libs/numeric-deque/README.md): A simple, performant, general-purpose - _deque_, backed by a `TypedArray`. - ## Image-related packages - [`@4bitlabs/color-space`](./libs/color-space/README.md): Utility functions for parsing, converting and mixing colors in sRGB, CIE-XYZ, CIELAB, and okLab color spaces @@ -21,6 +14,7 @@ This monorepo is a work-in-progress. ## SCI packages +- [`@4bitlabs/codecs`](./libs/codecs/README.md): Some common decompression algorithms, _e.g._ `Huffman` and `LZW`. - [`@4bitlabs/sci0`](./libs/sci0/README.md): Data-structures and methods for decoding and parsing SCI0/SCI01-engine resources. diff --git a/libs/numeric-deque/CHANGELOG.md b/libs/numeric-deque/CHANGELOG.md deleted file mode 100644 index 70122ca..0000000 --- a/libs/numeric-deque/CHANGELOG.md +++ /dev/null @@ -1,43 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.1.6](https://github.com/32bitkid/sci.js/compare/@4bitlabs/numeric-deque@1.1.5...@4bitlabs/numeric-deque@1.1.6) (2024-06-16) - -### Chore - -- Cleaning up package.json repo links ([787872b](https://github.com/32bitkid/sci.js/commit/787872b5c232e9e14112ab3dfe09cde059987b75)) - -## [1.1.5](https://github.com/32bitkid/sci.js/compare/@4bitlabs/numeric-deque@1.1.4...@4bitlabs/numeric-deque@1.1.5) (2024-05-28) - -### Chore - -- Code-formatting ([e209540](https://github.com/32bitkid/sci.js/commit/e20954075368b2f53b8cfb7f17896f51bad47baa)) - -## [1.1.4](https://github.com/32bitkid/sci.js/compare/@4bitlabs/numeric-deque@1.1.3...@4bitlabs/numeric-deque@1.1.4) (2024-05-13) - -### Chore - -- Ensure numbers are properly stringified before emitting ([3a007ad](https://github.com/32bitkid/sci.js/commit/3a007ad7a200d9b2c11fa50b7287ecf28a81f7b4)) -- Removing "size" badge. Not a very good metric/representation. ([a5fc9f8](https://github.com/32bitkid/sci.js/commit/a5fc9f8a9d65a64a8ce9330c620e359cf2b17ac7)) -- updating README files ([095d19a](https://github.com/32bitkid/sci.js/commit/095d19af411d091c4315da129312e1d063bd2e39)) -- Wrap void predicates in code-blocks ([3a35456](https://github.com/32bitkid/sci.js/commit/3a35456d383e1287e709f86e50b85f76b7bbbc13)) - -## [1.1.3](https://github.com/32bitkid/sci.js/compare/@4bitlabs/numeric-deque@1.1.2...@4bitlabs/numeric-deque@1.1.3) (2024-04-05) - -### Chore - -- rely on lerna/nx for build asset better caching ([ae1ae1e](https://github.com/32bitkid/sci.js/commit/ae1ae1eb4ead8e89a4d53ea0bcfcbc8e107b1488)) - -### Update - -- @4bitlabs/bnumeric-deque readme updated ([63e9bef](https://github.com/32bitkid/sci.js/commit/63e9befe88691a34b2f8e6fa3d1b12027a785543)) - -## 1.1.2 (2024-03-22) - -- Chore: update repo and bugs properties in package.json ([d426943](https://github.com/32bitkid/sci.js/commit/d426943)) - -## 1.0.1 (2024-03-14) - -- Chore: add "clean:wipe" script ([016a33f](https://github.com/32bitkid/sci.js/commit/016a33f)) diff --git a/libs/numeric-deque/LICENSE.txt b/libs/numeric-deque/LICENSE.txt deleted file mode 100644 index 52422ee..0000000 --- a/libs/numeric-deque/LICENSE.txt +++ /dev/null @@ -1,10 +0,0 @@ -Copyright (c) 2024, J. Holmes - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, -provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. \ No newline at end of file diff --git a/libs/numeric-deque/README.md b/libs/numeric-deque/README.md deleted file mode 100644 index ada03cb..0000000 --- a/libs/numeric-deque/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# @4bitlabs/numeric-deque [![License][license]][npm] [![NPM Version][version]][npm] [![NPM Downloads][dl]][npm] - -[npm]: https://www.npmjs.com/package/@4bitlabs/numeric-deque -[version]: https://img.shields.io/npm/v/%404bitlabs%2Fnumeric-deque -[license]: https://img.shields.io/npm/l/%404bitlabs%2Fnumeric-deque -[dl]: https://img.shields.io/npm/dy/%404bitlabs%2Fnumeric-deque - -A numeric-container backed by a TypedArray ring-buffer. Implements both stack (FILO) and queue (FIFO) methods, a.k.a. _a [deque](https://en.wikipedia.org/wiki/Double-ended_queue)_. - -## Basic Usage - -```ts -import { NumericDeque } from '@4bitlabs/numeric-deque'; - -// Create a numeric deque to hold *atleast* 10 items. -const deque = new NumericDeque(10); - -deque.push(2); -deque.push(3); -deque.push(4); -deque.unshift(1); - -while (!deque.isEmpty()) { - console.log(deque.shift()); -} - -// Output: 1, 2, 3, 4 -``` - -Note, the capacity given to the constructor is the minimum _required_ capacity. The _actual_ capacity of the deque -_may_ be larger. - -### Peek - -```ts -const deque = new NumericDeque(10); - -deque.push(1); -deque.push(2); -deque.push(3); -deque.push(4); - -console.log(deque.peekHead()); // 1 -console.log(deque.peekTail()); // 4 -``` - -## `TypedArray` backed deques - -By the default, the ring-buffer is backed by `Float64Array`, however, you can any of the numeric `TypedArrays` for your -backing buffer: - -```ts -import { NumericDeque } from '@4bitlabs/numeric-deque'; - -const bytes = new NumericDeque(300, Uint8ClampedArray); -const signedData = new NumericDeque(16, Int16Array); -const buffer = new NumericDeque(2_000, Uint32Array); -``` diff --git a/libs/numeric-deque/jest.config.js b/libs/numeric-deque/jest.config.js deleted file mode 100644 index e86e13b..0000000 --- a/libs/numeric-deque/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; diff --git a/libs/numeric-deque/package.json b/libs/numeric-deque/package.json deleted file mode 100644 index 177cff7..0000000 --- a/libs/numeric-deque/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "@4bitlabs/numeric-deque", - "version": "1.1.6", - "description": "A numeric container backed by a TypedArray ring buffer, with both stack (FILO) and queue (FIFO) methods.", - "keywords": [ - "queue", - "TypedArray", - "Uint8Array", - "Uint8ClampedArray", - "Uint16Array", - "Uint32Array", - "Int8Array", - "Int16Array", - "Int32Array", - "Float32Array", - "Float64Array", - "filo", - "fifo" - ], - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "homepage": "https://github.com/32bitkid/sci.js/tree/main/libs/numeric-deque#readme", - "repository": { - "type": "git", - "url": "git+https://github.com/32bitkid/sci.js.git" - }, - "bugs": { - "url": "https://github.com/32bitkid/sci.js/issues" - }, - "files": [ - "./dist/**/*" - ], - "scripts": { - "clean": "tsc --build --clean", - "clean:wipe": "rimraf ./dist", - "build": "tsc --build", - "test": "jest src/" - }, - "author": "J. Holmes ", - "license": "ISC" -} diff --git a/libs/numeric-deque/src/index.ts b/libs/numeric-deque/src/index.ts deleted file mode 100644 index 71dfd65..0000000 --- a/libs/numeric-deque/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { NumericDeque } from './numeric-deque'; diff --git a/libs/numeric-deque/src/numeric-deque.spec.ts b/libs/numeric-deque/src/numeric-deque.spec.ts deleted file mode 100644 index 34707fc..0000000 --- a/libs/numeric-deque/src/numeric-deque.spec.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { NumericDeque } from './numeric-deque'; - -describe('NumericDeque', () => { - it('should pop values off the front of the deque', () => { - const d = new NumericDeque(4); - d.push(1); - d.push(2); - d.push(3); - d.push(4); - expect(d.pop()).toBe(4); - expect(d.pop()).toBe(3); - expect(d.pop()).toBe(2); - expect(d.pop()).toBe(1); - }); - - it('should shift values off the front of the deque', () => { - const d = new NumericDeque(4); - d.push(1); - d.push(2); - d.push(3); - d.push(4); - expect(d.shift()).toBe(1); - expect(d.shift()).toBe(2); - expect(d.shift()).toBe(3); - expect(d.shift()).toBe(4); - }); - - it('should unshift values onto the front of the deque', () => { - const d = new NumericDeque(4); - d.unshift(1); - d.unshift(2); - d.unshift(3); - d.unshift(4); - expect(d.pop()).toBe(1); - expect(d.pop()).toBe(2); - expect(d.pop()).toBe(3); - expect(d.pop()).toBe(4); - }); - - describe('push', () => { - it('should throw when full', () => { - const d = new NumericDeque(4); - d.push(1); - d.push(2); - d.push(3); - d.push(4); - expect(() => { - d.push(5); - }).toThrow(); - }); - }); - - describe('unshift', () => { - it('should throw when full', () => { - const d = new NumericDeque(4); - d.unshift(1); - d.unshift(2); - d.unshift(3); - d.unshift(4); - expect(() => { - d.unshift(5); - }).toThrow(); - }); - }); - - describe('shift', () => { - it('should throw when exhausted', () => { - const d = new NumericDeque(4); - d.push(1); - d.shift(); - expect(() => d.shift()).toThrow(); - }); - }); - - describe('pop', () => { - it('should throw when exhausted', () => { - const d = new NumericDeque(4); - d.push(1); - d.pop(); - expect(() => d.pop()).toThrow(); - }); - }); - - it('should be able to refill', () => { - const d = new NumericDeque(4); - - d.push(1); - d.push(2); - d.push(3); - expect(d.shift()).toBe(1); - expect(d.pop()).toBe(3); - expect(d.shift()).toBe(2); - - d.push(4); - d.push(5); - d.push(6); - expect(d.pop()).toBe(6); - expect(d.shift()).toBe(4); - expect(d.pop()).toBe(5); - }); - - it('should know when its empty', () => { - const d = new NumericDeque(4); - expect(d.isEmpty()).toBeTruthy(); - d.push(1); - expect(d.isEmpty()).toBeFalsy(); - d.shift(); - expect(d.isEmpty()).toBeTruthy(); - d.unshift(1); - expect(d.isEmpty()).toBeFalsy(); - d.pop(); - expect(d.isEmpty()).toBeTruthy(); - }); - - it('should be able to peek at the ends', () => { - const d = new NumericDeque(4); - d.push(1); - d.push(2); - d.push(3); - d.push(4); - - expect(d.peekHead()).toBe(1); - expect(d.peekTail()).toBe(4); - }); - - describe('TypedArray', () => { - it('should respect other typed-arrays', () => { - const d = new NumericDeque(10, Uint8ClampedArray); - d.push(400); - expect(d.pop()).toBe(255); - d.push(-50); - expect(d.pop()).toBe(0); - }); - }); -}); diff --git a/libs/numeric-deque/src/numeric-deque.ts b/libs/numeric-deque/src/numeric-deque.ts deleted file mode 100644 index 4f53bd5..0000000 --- a/libs/numeric-deque/src/numeric-deque.ts +++ /dev/null @@ -1,100 +0,0 @@ -type TypeArrayConstructor = - | Uint8ArrayConstructor - | Uint8ClampedArrayConstructor - | Uint16ArrayConstructor - | Uint32ArrayConstructor - | Int8ArrayConstructor - | Int16ArrayConstructor - | Int32ArrayConstructor - | Float32ArrayConstructor - | Float64ArrayConstructor; - -type BufferType = - | Uint8Array - | Uint8ClampedArray - | Uint16Array - | Uint32Array - | Int8Array - | Int16Array - | Int32Array - | Float32Array - | Float64Array; - -const MAX_SAFE_DWORD = ~0 >>> 0; - -export class NumericDeque { - private head = 0; - private tail = 0; - private size = 0; - private readonly mask: number; - private readonly capacity: number; - private readonly buffer: BufferType; - - constructor(minSize: number, Buffer: TypeArrayConstructor = Float64Array) { - if (minSize <= 1) - throw new Error(`Out of bounds: ${minSize.toString(10)} <= 1`); - if (minSize > MAX_SAFE_DWORD) - throw new Error( - `Out of bounds: ${minSize.toString(10)} > ${MAX_SAFE_DWORD.toString(10)}`, - ); - - this.capacity = 2 ** (32 - Math.clz32(minSize - 1)); - this.mask = ~0 >>> Math.clz32(minSize - 1); - this.buffer = new Buffer(this.capacity); - } - - get length() { - return this.size; - } - - isEmpty(): boolean { - return this.size === 0; - } - - push(value: number) { - if (this.size + 1 > this.capacity) - throw new Error('overflow: queue is full'); - - this.buffer[this.tail] = value; - this.tail = (this.tail + 1) & this.mask; - this.size++; - } - - pop(): number { - if (this.size === 0) throw new Error('underflow: queue is empty'); - this.tail = (this.tail - 1) & this.mask; - this.size--; - return this.buffer[this.tail]; - } - - unshift(value: number) { - if (this.size + 1 > this.capacity) - throw new Error('overflow: queue is full'); - - this.head = (this.head - 1) & this.mask; - this.size++; - this.buffer[this.head] = value; - } - - shift(): number { - if (this.size === 0) throw new Error('underflow: queue is empty'); - const value = this.buffer[this.head]; - this.head = (this.head + 1) & this.mask; - this.size--; - return value; - } - - peekHead(): number { - return this.buffer[this.head]; - } - - peekTail(): number { - return this.buffer[(this.tail - 1) & this.mask]; - } - - clear(): void { - this.head = 0; - this.tail = 0; - this.size = 0; - } -} diff --git a/libs/numeric-deque/tsconfig.json b/libs/numeric-deque/tsconfig.json deleted file mode 100644 index d9b2aa3..0000000 --- a/libs/numeric-deque/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist/" - }, - "include": ["src/**/*"], - "exclude": [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/__tests__/**/*.ts" - ] -} diff --git a/libs/readers/.gitignore b/libs/readers/.gitignore deleted file mode 100644 index 1e56271..0000000 --- a/libs/readers/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -perf/ - diff --git a/libs/readers/CHANGELOG.md b/libs/readers/CHANGELOG.md deleted file mode 100644 index 7fb0d96..0000000 --- a/libs/readers/CHANGELOG.md +++ /dev/null @@ -1,75 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [2.0.6](https://github.com/32bitkid/sci.js/compare/@4bitlabs/readers@2.0.5...@4bitlabs/readers@2.0.6) (2024-06-16) - -### Chore - -- Cleaning up package.json repo links ([787872b](https://github.com/32bitkid/sci.js/commit/787872b5c232e9e14112ab3dfe09cde059987b75)) - -## [2.0.5](https://github.com/32bitkid/sci.js/compare/@4bitlabs/readers@2.0.4...@4bitlabs/readers@2.0.5) (2024-05-13) - -### Chore - -- Ensure numbers are properly stringified before emitting ([3a007ad](https://github.com/32bitkid/sci.js/commit/3a007ad7a200d9b2c11fa50b7287ecf28a81f7b4)) -- Removing "size" badge. Not a very good metric/representation. ([a5fc9f8](https://github.com/32bitkid/sci.js/commit/a5fc9f8a9d65a64a8ce9330c620e359cf2b17ac7)) -- updating README files ([095d19a](https://github.com/32bitkid/sci.js/commit/095d19af411d091c4315da129312e1d063bd2e39)) -- Use "this" return type for method chaining ([cf350f8](https://github.com/32bitkid/sci.js/commit/cf350f881f29379fd7ed29055c8a63d3708babc3)) - -## [2.0.4](https://github.com/32bitkid/sci.js/compare/@4bitlabs/readers@2.0.3...@4bitlabs/readers@2.0.4) (2024-04-05) - -### Chore - -- enable no-shadow rule ([2ea836a](https://github.com/32bitkid/sci.js/commit/2ea836add49b0a30810a2241d400ca38e0b0b1ed)) -- rely on lerna/nx for build asset better caching ([ae1ae1e](https://github.com/32bitkid/sci.js/commit/ae1ae1eb4ead8e89a4d53ea0bcfcbc8e107b1488)) - -## 2.0.3 (2024-03-22) - -- Chore: small tweak to reader CHANGELOG ([5ba6796](https://github.com/32bitkid/sci.js/commit/5ba6796)) -- Chore: update repo and bugs properties in package.json ([d426943](https://github.com/32bitkid/sci.js/commit/d426943)) - -## 2.0.2 (2024-03-14) - -- Chore: add "clean:wipe" script ([016a33f](https://github.com/32bitkid/sci.js/commit/016a33f)) - -## 2.0.0 - -### Changed - -- `BitReader` class has been replaced with an interface -- `createBitReader()` method now handles using the proper implementation based on configuration flags - -### Added - -- `fast` flag when creating a bit-reader. Uses an implementation that is slightly faster, at the cost of memory - efficiency/duplication. - - ```ts - import { createBitReader } from '@4bitlabs/readers'; - - const br = createBitReader(data, { fast: true }); - ``` - -## 1.2.0 - -### Fixed - -- Fixed bug in _least-significant_ byte ordering reads across byte-boundaries. - -## 1.1.0 - -### Changed - -- Performance improvements to `BitReader`. Using single DWORD reads when possible. -- Loosen the `bytes` typescript type to be any _typed-array_ or `DataView`. - -## 1.0.0 - -Initial release. - -### Added - -- `BitReader` implementation. -- `AsyncBitReader` implementation. diff --git a/libs/readers/LICENSE.txt b/libs/readers/LICENSE.txt deleted file mode 100644 index 6ddc8e3..0000000 --- a/libs/readers/LICENSE.txt +++ /dev/null @@ -1,10 +0,0 @@ -Copyright (c) 2023, J. Holmes - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, -provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. \ No newline at end of file diff --git a/libs/readers/README.md b/libs/readers/README.md deleted file mode 100644 index af1b20e..0000000 --- a/libs/readers/README.md +++ /dev/null @@ -1,156 +0,0 @@ -# @4bitlabs/readers [![License][license]][npm] [![NPM Version][version]][npm] [![NPM Downloads][dl]][npm] - -[npm]: https://www.npmjs.com/package/@4bitlabs/readers -[version]: https://img.shields.io/npm/v/%404bitlabs%2Freaders -[license]: https://img.shields.io/npm/l/%404bitlabs%2Freaders -[dl]: https://img.shields.io/npm/dy/%404bitlabs%2Freaders - -A collection of bit-readers for javascript and typescript. - -## Installation - -```sh -# npm -❯ npm install --save @4bitlabs/readers - -# yarn -❯ yarn add @4bitlabs/readers -``` - -## Usage - -```js -import { createBitReader } from '@4bitlabs/readers'; -const reader = createBitReader(sourceData); - -// ... - -const firstTenBits = reader.read32(10); -``` - -## What is a bit-reader? - -A bit-reader allows for bits level access to a sequence of bytes, allowing bit-level reads that easily cross byte-level -boundaries. You can think of a bit-reader like a long sequence of bits that can be _shifted_ off, providing access to -later bits. Consider: - -```js -const source = Uint8Array.of(0b1111_0011, 0b1100_1111, 0b1010_1010); -``` - -If you wanted the _most-significant_ 4-bits of this byte sequence, you could use a bitmask and a bitwise shifts: - -```js -const value = (source[0] & 0b1111_0000) >>> 4; // 15 -``` - -This can be useful for simple encoded data, however, can become unweildly when crossing multiple bytes. Let's say you -wanted to get the bits - -```text - From To - |-------------| - v v -0b1111_0011_1100_1111_1010_1010 -``` - -With bitwise operators on a `Uint8Array`, you'd have to: - -```js -const value = - // select and shift the most-significant bits - ((source[0] & 0b0000_0011) << 10) | - // select and shift the middle bits - (source[1] << 2) | - // select and shift the least-significant bits - ((source[2] & 0b1100_0000) >>> 6); -``` - -With a bit-reader, you can instead say: - -```js -const reader = createBitReader(source); -reader.skip(6); // skip the first 6 bits -const value = reader.read(12); // take the next 12 bits -``` - -This can be very useful when parsing densely-packed data-structures, especially when they use _variable-length_ encoding. - -## `BitReader` API - -`BitReader` is the interface that provides a bit-reader that sequentially reads bits from an `Uint8Array` source. - -```js -const source = Uint8Array.of(0b1110_0001); -const br = createBitReader(source); - -br.read32(3); // 0b111 -br.read32(1); // 0b0 -br.read32(3); // 0b000 -br.read32(1); // 0b1 -``` - -The default behavior to read **most-significant bits** first, however, you can select reading from the -**least-significant** side: - -```js -const source = Uint8Array.of(0b1110_0001); -const r = createBitReader(source, { mode: 'lsb' }); - -br.read32(3); // 0b001 -br.read32(1); // 0b0 -br.read32(3); // 0b110 -br.read32(1); // 0b1 -``` - -### Instance properties - -#### `r.peek32(n: number): number` - -Peek `n` bits in the bit-stream. - -#### `r.skip(n: number): BitReader` - -Skip `n` bits in the bit-stream. - -#### `r.read32(n: number): number` - -Read `n` bits from the bit-stream. Shorthand for: - -```ts -const value = reader.peek32(n); -reader.skip(n); -``` - -#### `r.seek(offset: number): BitReader` - -Seek to an arbitrary _byte_-position in the underlying `ArrayBuffer`, always from the _beginning_ of the byte-array. - -#### `r.isByteAligned(): boolean` - -Returns `true` if the bit-reader is _currently_ aligned to a byte - -#### `r.align(): BitReader` - -Re-aligns to the nearest _next_ byte-boundary in the bit-stream. - -## `AsyncBitReader` - -`AsyncBitReader` provides a bit-reader that sequentially reads bits from an `AsyncIterable`. This allows it to consume -bytes from a variety of sources, from files and network sources. For instance: - -```js -import fs from 'node:fs'; -import { AsyncBitReader } from '@4bitlabs/readers'; - -const source = fs.createReadStream(path, { encoding: 'utf-8' }); -const reader = new AsyncBitReader(source); -/* ...start reading! */ -``` - -## Limitations - -As of the _initial_ version, both `MsbReader` and `AsyncBitReader` only support a maximum of **32-bit** reads at time. -However, those **32-bits** do not need to be _byte-aligned_ bits, and can occur anywhere in the bitstream. This limitation -is due to the precision of the bitwise operators in javascript. In the future, this might be addressed to allow for -53-bit reads, the maximum-safe integer size for double-precision numbers. diff --git a/libs/readers/jest.config.js b/libs/readers/jest.config.js deleted file mode 100644 index e86e13b..0000000 --- a/libs/readers/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; diff --git a/libs/readers/package.json b/libs/readers/package.json deleted file mode 100644 index ce60200..0000000 --- a/libs/readers/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "@4bitlabs/readers", - "version": "2.0.6", - "description": "A collection of low-level bit-readers for byte-arrays", - "keywords": [ - "bitreader", - "bits" - ], - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "homepage": "https://github.com/32bitkid/sci.js/tree/main/libs/readers#readme", - "repository": { - "type": "git", - "url": "git+https://github.com/32bitkid/sci.js.git" - }, - "bugs": { - "url": "https://github.com/32bitkid/sci.js/issues" - }, - "files": [ - "./dist/**/*" - ], - "scripts": { - "clean": "tsc --build --clean", - "clean:wipe": "rimraf ./dist", - "build": "tsc --build", - "test": "jest src/" - }, - "author": "J. Holmes ", - "license": "ISC" -} diff --git a/libs/readers/src/async-bit-reader.spec.ts b/libs/readers/src/async-bit-reader.spec.ts deleted file mode 100644 index 0be3594..0000000 --- a/libs/readers/src/async-bit-reader.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Readable } from 'stream'; - -import { AsyncBitReader } from './async-bit-reader'; - -const readerOf = (bytes: Uint8Array | number[], times = 1): Readable => { - let count = 0; - return new Readable({ - read() { - if (count >= times) return null; - this.push(bytes); - count += 1; - }, - }); -}; - -describe('AsyncBitReader', () => { - describe('peek', () => { - describe('with a buffer with all zeroes', () => { - it.each<[number, number]>( - Array(32) - .fill(0) - .map((_, i) => [0, i]), - )('should return %s when peeking %s bits', async (expected, n) => { - const br = new AsyncBitReader(readerOf(Uint8Array.of(0x00), Infinity)); - expect(await br.peek32(n)).toBe(expected); - }); - }); - - describe('with a buffer with all ones', () => { - it.each<[number, number]>( - Array(32) - .fill(0) - .map((_, i) => [2 ** i - 1, i]), - )('should return %s when peeking %s bits', async (expected, n) => { - const br = new AsyncBitReader(readerOf(Uint8Array.of(0xff), Infinity)); - expect(await br.peek32(n)).toBe(expected); - }); - }); - - it('should peek different lengths into a byte', async () => { - const bytes = [0b1000_1000]; - const br = new AsyncBitReader(readerOf(Uint8Array.from(bytes))); - expect(await br.peek32(1)).toBe(0b1); - expect(await br.peek32(2)).toBe(0b10); - expect(await br.peek32(3)).toBe(0b100); - expect(await br.peek32(4)).toBe(0b1000); - expect(await br.peek32(5)).toBe(0b1000_1); - expect(await br.peek32(6)).toBe(0b1000_10); - expect(await br.peek32(7)).toBe(0b1000_100); - expect(await br.peek32(8)).toBe(0b1000_1000); - }); - }); - - describe('skip', () => { - it.each<[number, number[]]>([ - [0, [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [3, [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [7, [0b0000_0001, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [16, [0b0000_0000, 0b0000_0000, 0b1000_0000, 0b0000_0000]], - [31, [0b0000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0001]], - ])('should skip %s bits', async (n, data) => { - const br = new AsyncBitReader(readerOf(Uint8Array.from(data))); - await br.skip(n); - expect(await br.peek32(1)).toBe(1); - }); - - it('should handle multiple fills', async () => { - const data = Array(8).fill(0); - data[4] = 0b0000_1000; - const br = new AsyncBitReader(readerOf(Uint8Array.from(data))); - await br.skip(4); - await br.skip(32); - expect(await br.peek32(1)).toBe(1); - }); - }); - - describe('read', () => { - it.each<[number, number[]]>([ - [0, [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [3, [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [7, [0b0000_0001, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [12, [0b0000_0000, 0b0000_1000, 0b0000_0000, 0b0000_0000]], - [31, [0b0000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0001]], - ])('should skip %s bits', async (n, data) => { - const br = new AsyncBitReader(readerOf(Uint8Array.from(data))); - expect(await br.read32(n)).toBe(0); - expect(await br.read32(1)).toBe(1); - expect(await br.read32(32 - n - 1)).toBe(0); - }); - }); - - describe('alignment', () => { - it('should know when its aligned', async () => { - const br = new AsyncBitReader(readerOf(new Uint8Array(8))); - expect(br.isByteAligned()).toBeTruthy(); - await br.skip(10); - expect(br.isByteAligned()).toBeFalsy(); - await br.skip(6); - expect(br.isByteAligned()).toBeTruthy(); - await br.skip(32); - expect(br.isByteAligned()).toBeTruthy(); - await br.skip(3); - expect(br.isByteAligned()).toBeFalsy(); - }); - - it('align itself to the next byte', async () => { - const bytes = Uint8Array.from([ - 0b1000_0000, 0b0000_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000, - 0b1000_0000, - ]); - const br = new AsyncBitReader(readerOf(bytes)); - br.align(); - expect(await br.peek32(1)).toBe(1); - await br.skip(1); - br.align(); - expect(await br.peek32(1)).toBe(0); - await br.skip(8); - br.align(); - expect(await br.peek32(1)).toBe(1); - await br.skip(22); - br.align(); - expect(await br.peek32(1)).toBe(1); - }); - }); -}); diff --git a/libs/readers/src/async-bit-reader.ts b/libs/readers/src/async-bit-reader.ts deleted file mode 100644 index c2ac9fd..0000000 --- a/libs/readers/src/async-bit-reader.ts +++ /dev/null @@ -1,107 +0,0 @@ -export class AsyncBitReader { - private readonly r: AsyncIterator; - - private bytes: Uint8Array = Uint8Array.of(); - private idx: number = 0; - private bitsRemaining: number = 0; - - private bitBuffer: number = 0; - - constructor(r: AsyncIterable) { - this.r = r[Symbol.asyncIterator](); - } - - isByteAligned(): boolean { - return (this.bitsRemaining & 0b111) === 0; - } - - align(): this { - this._trash(this.bitsRemaining & 0b111); - return this; - } - - async peek32(n: number): Promise { - if (n > 32 || n < 0) throw new Error('Out of range'); - if (n === 0) return 0; - await this._fill(n); - return this.bitBuffer >>> (32 - n); - } - - async skip(n: number): Promise { - if (n < 0) throw new Error('Out of range'); - - let bitsToSkip = n; - if (bitsToSkip > this.bitsRemaining) { - bitsToSkip -= this.bitsRemaining; - - this.bitBuffer = 0; - this.bitsRemaining = 0; - - let bytesToSkip = bitsToSkip >>> 3; - bitsToSkip &= 0b111; - - while (bytesToSkip > 0) { - if (bytesToSkip < this.bytes.length - this.idx) { - this.idx += bytesToSkip; - bytesToSkip = 0; - } else { - bytesToSkip -= this.bytes.length - this.idx; - await this._nextChunk(); - } - } - } - - if (bitsToSkip > 0) { - await this._fill(bitsToSkip); - this._trash(bitsToSkip); - } - } - - async read32(n: number): Promise { - const result = await this.peek32(n); - this._trash(n); - return result; - } - - private _trash(n: number): void { - if (n < 0) throw new Error('Out of range'); - if (n > this.bitsRemaining) throw new Error('Out of range'); - if (n === 32) { - this.bitBuffer = 0; - this.bitsRemaining = 0; - } else { - this.bitBuffer <<= n; - this.bitsRemaining -= n; - } - } - - private async _fill(n: number): Promise { - if (n <= this.bitsRemaining) return; - - const total = (32 - this.bitsRemaining) >>> 3; - - for (let i = 0; i < total; i++) { - const pos = 32 - 8 - this.bitsRemaining; - - if (this.bytes.length <= this.idx) { - if (this.bitsRemaining > n) return; - await this._nextChunk(); - } - - this.bitBuffer |= this.bytes[this.idx] << pos; - this.idx += 1; - this.bitsRemaining += 8; - } - } - - private async _nextChunk(): Promise { - const result = await this.r.next(); - if (result.done) throw new Error('EOF'); - const chunk = result.value; - this.bytes = - typeof chunk !== 'string' - ? chunk - : Uint8Array.from([...chunk].map((x) => x.charCodeAt(0))); - this.idx = 0; - } -} diff --git a/libs/readers/src/bit-reader-options.ts b/libs/readers/src/bit-reader-options.ts deleted file mode 100644 index f2e67da..0000000 --- a/libs/readers/src/bit-reader-options.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type BitReaderMode = 'msb' | 'lsb'; - -export interface BitReaderOptions { - mode?: BitReaderMode; - fast?: boolean; -} diff --git a/libs/readers/src/bit-reader.spec.ts b/libs/readers/src/bit-reader.spec.ts deleted file mode 100644 index e261054..0000000 --- a/libs/readers/src/bit-reader.spec.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { FastLsbReader } from './fast-lsb-reader'; -import { FastMsbReader } from './fast-msb-reader'; -import { LsbReader } from './lsb-reader'; -import { MsbReader } from './msb-reader'; - -describe.each([ - ['MsbReader', MsbReader], - ['FastMsbReader', FastMsbReader], -])('Most-Significant Bit first: %s', (_, BitReader) => { - describe('peek', () => { - describe('with a buffer with all zeroes', () => { - const bytes = new Uint8Array(4); - it.each<[number, number]>( - Array(31) - .fill(0) - .map((_, i) => [0, i + 1]), - )('should return %s when peeking %s bits', (expected, n) => { - const br = new BitReader(bytes); - expect(br.peek32(n)).toBe(expected); - }); - }); - - describe('with a buffer with all ones', () => { - const bytes = Uint8Array.from(Array(4).fill(0xff)); - it.each<[number, number]>( - Array(32) - .fill(0) - .map((_, i) => [2 ** i - 1, i]), - )('should return %s when peeking %s bits', (expected, n) => { - const br = new BitReader(bytes); - expect(br.peek32(n)).toBe(expected); - }); - }); - - it('should peek different lengths into a byte', () => { - const bytes = [0b1000_1000]; - const br = new BitReader(Uint8Array.from(bytes)); - expect(br.peek32(1)).toBe(0b1); - expect(br.peek32(2)).toBe(0b10); - expect(br.peek32(3)).toBe(0b100); - expect(br.peek32(4)).toBe(0b1000); - expect(br.peek32(5)).toBe(0b1000_1); - expect(br.peek32(6)).toBe(0b1000_10); - expect(br.peek32(7)).toBe(0b1000_100); - expect(br.peek32(8)).toBe(0b1000_1000); - }); - }); - - describe('skip', () => { - it.each<[number, number[]]>([ - [0, [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [3, [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [7, [0b0000_0001, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [16, [0b0000_0000, 0b0000_0000, 0b1000_0000, 0b0000_0000]], - [31, [0b0000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0001]], - ])('should skip %s bits', (n, data) => { - const br = new BitReader(Uint8Array.from(data)); - br.skip(n); - expect(br.peek32(1)).toBe(1); - }); - - it('should handle multiple fills', () => { - const data = Array(8).fill(0); - data[4] = 0b0000_1000; - const br = new BitReader(Uint8Array.from(data)); - br.skip(4); - br.skip(32); - expect(br.peek32(1)).toBe(1); - }); - }); - - describe('read', () => { - it.each<[number, number[]]>([ - [0, [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [3, [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [7, [0b0000_0001, 0b0000_0000, 0b0000_0000, 0b0000_0000]], - [12, [0b0000_0000, 0b0000_1000, 0b0000_0000, 0b0000_0000]], - [31, [0b0000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0001]], - ])('should skip %s bits', (n, data) => { - const br = new BitReader(Uint8Array.from(data)); - expect(br.read32(n)).toBe(0); - expect(br.read32(1)).toBe(1); - expect(br.read32(32 - n - 1)).toBe(0); - }); - - it('should read 11 bytes without going bonkers', () => { - const br = new BitReader( - Uint8Array.of( - 0b0000_0000, - 0b1000_0000, - 0b0100_0000, - 0b0010_0000, - 0b0001_0000, - 0b0000_1000, - 0b0000_0100, - 0b0000_0010, - 0b0000_0001, - 0b0000_0000, - 0b1000_0000, - ), - ); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - expect(br.read32(9)).toBe(1); - }); - }); - - describe('seek', () => { - it('should move around', () => { - const data = new Uint8Array(64); - data[0] = 0b1000_0000; - data[16] = 0b1000_0000; - data[22] = 0b0000_1000; - data[60] = 0b0010_0000; - - const br = new BitReader(data); - expect(br.seek(16).peek32(1)).toBe(1); - expect(br.seek(22).skip(4).peek32(1)).toBe(1); - expect(br.seek(60).skip(2).peek32(1)).toBe(1); - expect(br.seek(0).peek32(1)).toBe(1); - }); - }); - - describe('alignment', () => { - it('should know when its aligned', () => { - const br = new BitReader(new Uint8Array(8)); - expect(br.isByteAligned()).toBeTruthy(); - expect(br.skip(10).isByteAligned()).toBeFalsy(); - expect(br.skip(6).isByteAligned()).toBeTruthy(); - expect(br.skip(32).isByteAligned()).toBeTruthy(); - expect(br.skip(3).isByteAligned()).toBeFalsy(); - }); - - it('align itself to the next byte', () => { - const br = new BitReader( - Uint8Array.from([ - 0b1000_0000, 0b0000_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000, - 0b1000_0000, - ]), - ); - expect(br.skip(0).align().peek32(1)).toBe(1); - expect(br.skip(1).align().peek32(1)).toBe(0); - expect(br.skip(8).align().peek32(1)).toBe(1); - expect(br.skip(22).align().peek32(1)).toBe(1); - }); - }); - - it('should read 32 bits across byte boundaries', () => { - const br = new BitReader( - // prettier-ignore - Uint8Array.from([ - 0b0000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000, - 0b1000_0000, 0b0000_0000, 0b0000_0000, 0b1000_0000, - ]), - ); - - br.skip(1); - expect(br.read32(32)).toBe(1); - }); -}); - -describe.each([ - ['LsbReader', LsbReader], - ['FastLsbReader', FastLsbReader], -])('Least-Significant Bit First: %s', (_, BitReader) => { - it('should peek', () => { - const data = Uint8Array.of(0b1100_1111); - const r = new BitReader(data); - expect(r.peek32(4)).toBe(0b1111); - }); - - it('should read across bytes', () => { - const data = Uint8Array.of(0b0000_0011, 0b0000_1100); - const r = new BitReader(data); - expect(r.read32(2)).toBe(0b11); - expect(r.read32(8)).toBe(0b0000_0000); - expect(r.read32(2)).toBe(0b11); - expect(r.read32(2)).toBe(0b0000); - }); - - it('should read across bytes 2', () => { - const data = Uint8Array.of(0b0000_0000, 0b0000_0001); - const r = new BitReader(data); - expect(r.read32(9)).toBe(0b1_0000_0000); - }); - - it('should read across bytes 3', () => { - const data = Uint8Array.of(0b0000_0000, 0b0000_0001, 0x0, 0x0); - const r = new BitReader(data); - expect(r.read32(9)).toBe(0b1_0000_0000); - }); - - it('should read across bytes 4', () => { - const data = Uint8Array.of(0x0, 0x0, 0x0, 0b0000_0000, 0b0000_0001); - const r = new BitReader(data); - r.skip(24); - expect(r.read32(9)).toBe(0b1_0000_0000); - }); - - it('should cross multiple dwords if needed', () => { - const data = Uint8Array.of( - 0b0001_0000, - 0x00, - 0x00, - 0b0000_1000, - 0x00, - 0x00, - ); - const r = new BitReader(data); - r.skip(4); - expect(r.read32(32)).toBe(0x80_00_01); - }); -}); diff --git a/libs/readers/src/bit-reader.ts b/libs/readers/src/bit-reader.ts deleted file mode 100644 index a8855ee..0000000 --- a/libs/readers/src/bit-reader.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface BitReader { - align(): BitReader; - isByteAligned(): boolean; - peek32(n: number): number; - read32(n: number): number; - seek(offset: number): BitReader; - skip(n: number): BitReader; -} diff --git a/libs/readers/src/byte-reader.ts b/libs/readers/src/byte-reader.ts deleted file mode 100644 index 738c459..0000000 --- a/libs/readers/src/byte-reader.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { FileHandle } from 'fs/promises'; - -export interface ByteReaderOptions { - position?: number; - buffer?: Uint8Array; - offset?: number; -} - -export interface ByteReader { - read( - length: number, - options?: ByteReaderOptions, - ): Uint8Array | Promise; - - close(): Promise | void; -} - -export class AsyncFileByteReader implements ByteReader { - private readonly file: FileHandle; - private offset: number; - - constructor(file: FileHandle) { - this.file = file; - this.offset = 0; - } - - async read( - length: number, - options: ByteReaderOptions = {}, - ): Promise { - const { - buffer = new Uint8Array(length), - position = this.offset, - offset = 0, - } = options; - await this.file.read({ length, position, buffer, offset }); - this.offset += length; - return buffer; - } - - async close() { - await this.file.close(); - } -} - -export class SyncByteReader implements ByteReader { - private readonly bytes: Uint8Array; - private offset: number; - - constructor(bytes: Uint8Array) { - this.bytes = bytes; - this.offset = 0; - } - - read(length: number, options: ByteReaderOptions = {}): Uint8Array { - const { - buffer = new Uint8Array(length), - position = this.offset, - offset = 0, - } = options; - buffer.set(this.bytes.subarray(position, position + length), offset); - this.offset += length; - return buffer; - } - - close() {} -} diff --git a/libs/readers/src/create-bit-reader.ts b/libs/readers/src/create-bit-reader.ts deleted file mode 100644 index de18852..0000000 --- a/libs/readers/src/create-bit-reader.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { BitReader } from './bit-reader'; -import { BitReaderOptions } from './bit-reader-options'; -import { FastLsbReader } from './fast-lsb-reader'; -import { FastMsbReader } from './fast-msb-reader'; -import { LsbReader } from './lsb-reader'; -import { MsbReader } from './msb-reader'; -import { TypedArray } from './typed-array'; - -const safeReaders = { msb: MsbReader, lsb: LsbReader } as const; -const fastReaders = { msb: FastMsbReader, lsb: FastLsbReader } as const; - -export function createBitReader( - source: TypedArray | ArrayBuffer, - options: BitReaderOptions = {}, -): BitReader { - const { fast = false, mode = 'msb' } = options; - const BitReaderImpl = (fast ? fastReaders : safeReaders)[mode]; - return new BitReaderImpl(source); -} diff --git a/libs/readers/src/fast-lsb-reader.ts b/libs/readers/src/fast-lsb-reader.ts deleted file mode 100644 index 9dd2fff..0000000 --- a/libs/readers/src/fast-lsb-reader.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { BitReader } from './bit-reader'; -import { ReadonlyDataView } from './readonly-data-view'; -import { TypedArray } from './typed-array'; -import { copyBuffer } from './utils/copy-buffer'; - -const ALL_ONES = ~0 >>> 0; - -export class FastLsbReader implements BitReader { - private readonly view: ReadonlyDataView; - private readonly byteLength: number; - private bitOffset: number = 0; - - // Note: In certain cases this *can* be faster, but its also needs - // to copy the source array buffer to avoid buffer overruns, making - // it less memory efficient. Generally, the normal LsbReader is - // negligibly slower and doesn't incur the memory/copy penalty. - constructor(source: TypedArray | ArrayBuffer) { - this.byteLength = source.byteLength; - const buffer = new ArrayBuffer(this.byteLength + 5); - copyBuffer(source, buffer); - this.view = new DataView(buffer); - } - - isByteAligned(): boolean { - return (this.bitOffset & 0b111) === 0; - } - - align(): this { - this.bitOffset += (8 - this.bitOffset) & 0b111; - return this; - } - - seek(offset: number): this { - this.bitOffset = offset << 3; - return this; - } - - read32(n: number): number { - const result = this.peek32(n); - this.bitOffset += n; - return result; - } - - peek32(n: number): number { - if (n === 0) return 0; - - const idx = this.bitOffset >>> 3; - const shift = this.bitOffset & 0b111; - - if ((this.bitOffset + n) / 8 > this.byteLength) - throw new Error('out of bytes'); - - if (shift + n <= 32) { - const mask = ALL_ONES >>> (32 - n); - const bytes = this.view.getUint32(idx, true); - return (bytes >>> shift) & mask; - } - - const tailBits = 32 - shift; - const tailMask = ALL_ONES >>> (tailBits + shift); - const tail = (this.view.getUint32(idx, true) >> shift) & tailMask; - - const headBits = n - tailBits; - const headMask = ALL_ONES >>> headBits; - const head = this.view.getUint8(idx + 4) & headMask; - - return (head << tailBits) | tail; - } - - skip(n: number): this { - this.bitOffset += n; - return this; - } -} diff --git a/libs/readers/src/fast-msb-reader.ts b/libs/readers/src/fast-msb-reader.ts deleted file mode 100644 index e55638c..0000000 --- a/libs/readers/src/fast-msb-reader.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { BitReader } from './bit-reader'; -import { ReadonlyDataView } from './readonly-data-view'; -import { TypedArray } from './typed-array'; -import { copyBuffer } from './utils/copy-buffer'; - -const ALL_ONES = ~0 >>> 0; - -export class FastMsbReader implements BitReader { - private readonly view: ReadonlyDataView; - private readonly byteLength: number; - private bitOffset: number = 0; - - // Note: In certain cases this *can* be faster, but its also needs - // to copy the source array buffer to avoid buffer overruns, making - // it less memory efficient. Generally, the normal MsbReader is - // negligibly slower and doesn't incur the memory/copy penalty. - constructor(source: TypedArray | ArrayBuffer) { - this.byteLength = source.byteLength; - const buffer = new ArrayBuffer(this.byteLength + 5); - copyBuffer(source, buffer); - this.view = new DataView(buffer); - } - - isByteAligned(): boolean { - return (this.bitOffset & 0b111) === 0; - } - - align(): this { - this.bitOffset += (8 - this.bitOffset) & 0b111; - return this; - } - - seek(offset: number): this { - this.bitOffset = offset << 3; - return this; - } - - read32(n: number): number { - const result = this.peek32(n); - this.bitOffset += n; - return result; - } - - peek32(n: number): number { - if (n === 0) return 0; - - const idx = this.bitOffset >>> 3; - const shift = this.bitOffset & 0b111; - - if ((this.bitOffset + n) / 8 > this.byteLength) - throw new Error('out of bytes'); - - if (shift + n <= 32) { - const mask = ALL_ONES >>> (32 - n); - const offset = 32 - (shift + n); - const bytes = this.view.getUint32(idx); - return (bytes >>> offset) & mask; - } - - const headBits = 32 - shift; - const headMask = ALL_ONES >>> shift; - const head = this.view.getUint32(idx) & headMask; - - const tailBits = n - headBits; - const tail = this.view.getUint8(idx + 4) >>> (8 - tailBits); - - return (head << tailBits) | tail; - } - - skip(n: number): this { - this.bitOffset += n; - return this; - } -} diff --git a/libs/readers/src/index.ts b/libs/readers/src/index.ts deleted file mode 100644 index 06b3ed1..0000000 --- a/libs/readers/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { createBitReader } from './create-bit-reader'; -export { AsyncBitReader } from './async-bit-reader'; -export { AsyncFileByteReader, SyncByteReader } from './byte-reader'; -export type { ByteReaderOptions, ByteReader } from './byte-reader'; -export type { BitReader } from './bit-reader'; diff --git a/libs/readers/src/lsb-reader.ts b/libs/readers/src/lsb-reader.ts deleted file mode 100644 index dbd2b8b..0000000 --- a/libs/readers/src/lsb-reader.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { BitReader } from './bit-reader'; -import { ReadonlyDataView } from './readonly-data-view'; -import { TypedArray } from './typed-array'; - -const ALL_ONES = ~0 >>> 0; - -export class LsbReader implements BitReader { - private readonly view: ReadonlyDataView; - private idx: number = 0; - private buffer: number = 0; - private bitsRemaining: number = 0; - - constructor(source: TypedArray | ArrayBuffer) { - this.view = - source instanceof ArrayBuffer - ? new DataView(source) - : new DataView(source.buffer, source.byteOffset, source.byteLength); - } - - isByteAligned() { - return (this.bitsRemaining & 0b111) === 0; - } - - align(): this { - const trashBits = this.bitsRemaining & 0b111; - this.buffer >>>= trashBits; - this.bitsRemaining -= trashBits; - return this; - } - - seek(offset: number): this { - this.idx = offset; - this.buffer = 0; - this.bitsRemaining = 0; - return this; - } - - read32(n: number): number { - if (n === 0) return 0; - if (n > 32 || n < 0) - throw new Error( - `out of range: ${n.toString(10)} must be between 0 and 32`, - ); - - if (n > this.bitsRemaining) { - const tailBits = this.bitsRemaining; - - // exhaust buffer - const tail = this.buffer & (ALL_ONES >>> (32 - tailBits)); - this.buffer = 0; - this.bitsRemaining = 0; - - // refill the buffer - const headBits = n - tailBits; - this.fill(headBits); - - // extract remaining bits from buffer - const head = this.buffer & (ALL_ONES >>> (32 - headBits)); - this.buffer >>>= headBits; - this.bitsRemaining -= headBits; - - return (head << tailBits) | tail; - } - - const result = this.buffer & (ALL_ONES >>> (32 - n)); - this.buffer >>>= n; - this.bitsRemaining -= n; - return result; - } - - peek32(n: number): number { - if (n === 0) return 0; - if (n > 32 || n < 0) - throw new Error( - `out of range: ${n.toString(10)} must be between 0 and 32`, - ); - - this.fill(n); - return this.buffer & (ALL_ONES >>> (32 - n)); - } - - skip(n: number): this { - if (n < 0) throw new Error('out of range: n < 0'); - - if (n == 0) return this; - - let bitsToSkip = n; - if (bitsToSkip > this.bitsRemaining) { - // all cached bits - bitsToSkip -= this.bitsRemaining; - - this.buffer = 0; - this.bitsRemaining = 0; - this.idx += bitsToSkip >>> 3; - - bitsToSkip &= 0b111; - } - - if (bitsToSkip > 0) { - this.fill(bitsToSkip); - this.buffer >>>= bitsToSkip; - this.bitsRemaining -= bitsToSkip; - } - - return this; - } - - private get bytesLeftToRead() { - return this.view.byteLength - this.idx; - } - - private fill(n: number): void { - if (n > 32) throw new Error('unsupported'); - if (n <= this.bitsRemaining) return; - - if (this.bitsRemaining === 0 && this.bytesLeftToRead >= 4) { - // fast: get the next 32-bits - this.buffer = this.view.getUint32(this.idx, true); - this.bitsRemaining = 32; - this.idx += 4; - return; - } - - while (this.bitsRemaining <= 24 && this.bytesLeftToRead > 0) { - // slow: fill byte-by-byte - const byte = this.view.getUint8(this.idx); - this.idx++; - this.buffer |= byte << this.bitsRemaining; - this.bitsRemaining += 8; - } - - if (n > this.bitsRemaining) { - throw new Error(`unexpected eof`); - } - } -} diff --git a/libs/readers/src/msb-reader.ts b/libs/readers/src/msb-reader.ts deleted file mode 100644 index e8ad623..0000000 --- a/libs/readers/src/msb-reader.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { BitReader } from './bit-reader'; -import { ReadonlyDataView } from './readonly-data-view'; -import { TypedArray } from './typed-array'; - -export class MsbReader implements BitReader { - private readonly view: ReadonlyDataView; - private idx: number = 0; - private buffer: number = 0; - private bitsRemaining: number = 0; - - constructor(source: TypedArray | ArrayBuffer) { - this.view = - source instanceof ArrayBuffer - ? new DataView(source) - : new DataView(source.buffer, source.byteOffset, source.byteLength); - } - - isByteAligned(): boolean { - return (this.bitsRemaining & 0b111) === 0; - } - - align(): this { - const trashBits = this.bitsRemaining & 0b111; - this.buffer <<= trashBits; - this.bitsRemaining -= trashBits; - return this; - } - - seek(offset: number): this { - this.idx = offset; - this.buffer = 0; - this.bitsRemaining = 0; - return this; - } - - read32(n: number): number { - if (n === 0) return 0; - if (n > 32 || n < 0) - throw new Error( - `out of range: ${n.toString(10)} must be between 0 and 32`, - ); - - if (n > this.bitsRemaining) { - const bitsLeft = n - this.bitsRemaining; - - // exhaust buffer - const head = this.buffer >>> (32 - this.bitsRemaining); - this.buffer = 0; - this.bitsRemaining = 0; - - // refill the buffer - this.fill(bitsLeft); - - // extract remaining bits from buffer - const tail = this.buffer >>> (32 - bitsLeft); - this.buffer <<= bitsLeft; - this.bitsRemaining -= bitsLeft; - - return (head << bitsLeft) | tail; - } - - const result = this.buffer >>> (32 - n); - this.buffer <<= n; - this.bitsRemaining -= n; - return result; - } - - peek32(n: number): number { - if (n === 0) return 0; - if (n > 32 || n < 0) - throw new Error( - `out of range: ${n.toString(10)} must be between 0 and 32`, - ); - - this.fill(n); - return this.buffer >>> (32 - n); - } - - skip(n: number): this { - if (n < 0) throw new Error('out of range: n < 0'); - - if (n == 0) return this; - - let bitsToSkip = n; - if (bitsToSkip > this.bitsRemaining) { - // all cached bits - bitsToSkip -= this.bitsRemaining; - - this.buffer = 0; - this.bitsRemaining = 0; - this.idx += bitsToSkip >>> 3; - - bitsToSkip &= 0b111; - } - - if (bitsToSkip > 0) { - this.fill(bitsToSkip); - this.buffer <<= bitsToSkip; - this.bitsRemaining -= bitsToSkip; - } - - return this; - } - - private get bytesLeftToRead() { - return this.view.byteLength - this.idx; - } - - private fill(n: number): void { - if (n > 32) throw new Error('unsupported'); - if (n <= this.bitsRemaining) return; - - if (this.bitsRemaining === 0 && this.bytesLeftToRead >= 4) { - // fast: get the next 32-bits - this.buffer = this.view.getUint32(this.idx); - this.bitsRemaining = 32; - this.idx += 4; - return; - } - - while (this.bitsRemaining <= 24 && this.bytesLeftToRead > 0) { - // slow: fill byte-by-byte - const byte = this.view.getUint8(this.idx); - this.idx++; - this.buffer |= byte << (32 - 8 - this.bitsRemaining); - this.bitsRemaining += 8; - } - - if (n > this.bitsRemaining) { - throw new Error('out of bytes'); - } - } -} diff --git a/libs/readers/src/readonly-data-view.ts b/libs/readers/src/readonly-data-view.ts deleted file mode 100644 index 914e999..0000000 --- a/libs/readers/src/readonly-data-view.ts +++ /dev/null @@ -1 +0,0 @@ -export type ReadonlyDataView = Omit; diff --git a/libs/readers/src/typed-array.ts b/libs/readers/src/typed-array.ts deleted file mode 100644 index f6f0ad3..0000000 --- a/libs/readers/src/typed-array.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface TypedArray extends ArrayLike { - readonly buffer: ArrayBufferLike; - readonly byteLength: number; - readonly byteOffset: number; -} diff --git a/libs/readers/src/utils/copy-buffer.ts b/libs/readers/src/utils/copy-buffer.ts deleted file mode 100644 index 3a08503..0000000 --- a/libs/readers/src/utils/copy-buffer.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TypedArray } from '../typed-array'; - -export function copyBuffer( - source: TypedArray | ArrayBuffer, - dest: ArrayBuffer, -): void { - const destBytes = new Uint8Array(dest); - const sourceBytes = - source instanceof ArrayBuffer ? new Uint8Array(source) : source; - destBytes.set(sourceBytes); -} diff --git a/libs/readers/tsconfig.json b/libs/readers/tsconfig.json deleted file mode 100644 index d9b2aa3..0000000 --- a/libs/readers/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist/" - }, - "include": ["src/**/*"], - "exclude": [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/__tests__/**/*.ts" - ] -} diff --git a/package-lock.json b/package-lock.json index a1786c7..8449cf0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,9 +14,7 @@ "libs/color-space", "libs/color", "libs/image", - "libs/numeric-deque", "libs/pmachine", - "libs/readers", "libs/resize-filters", "libs/sci0", "libs/vec2", @@ -166,11 +164,6 @@ "@4bitlabs/color-utils": "0.0.0" } }, - "libs/numeric-deque": { - "name": "@4bitlabs/numeric-deque", - "version": "1.1.6", - "license": "ISC" - }, "libs/palettes": { "name": "@4bitlabs/palettes", "version": "0.0.0", @@ -185,11 +178,6 @@ "name": "@4bitlabs/pmachine", "license": "ISC" }, - "libs/readers": { - "name": "@4bitlabs/readers", - "version": "2.0.6", - "license": "ISC" - }, "libs/resize-filters": { "name": "@4bitlabs/resize-filters", "version": "1.0.17", @@ -277,16 +265,18 @@ "link": true }, "node_modules/@4bitlabs/numeric-deque": { - "resolved": "libs/numeric-deque", - "link": true + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@4bitlabs/numeric-deque/-/numeric-deque-1.1.7.tgz", + "integrity": "sha512-LtOT/ZrP+eM2SEEH7XCLUqqQjx7lY4hDWUAgfl1zyO5LbySjHEYzo5Daw2Idq/EkTmhR3W765tewf/X3TeAzuQ==" }, "node_modules/@4bitlabs/pmachine": { "resolved": "libs/pmachine", "link": true }, "node_modules/@4bitlabs/readers": { - "resolved": "libs/readers", - "link": true + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@4bitlabs/readers/-/readers-2.0.7.tgz", + "integrity": "sha512-djJicKoExWOD5sXScPqj4kGUOiON7lDdm+H738AGJn61e2wgL1h9RHJ7bvK8/rsn+tAFeYA3/4m5MFrfJOFpOw==" }, "node_modules/@4bitlabs/resize-filters": { "resolved": "libs/resize-filters", @@ -1417,9 +1407,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.6.0.tgz", - "integrity": "sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", + "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2558,9 +2548,9 @@ } }, "node_modules/@lerna/create/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2646,13 +2636,10 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/arborist": { "version": "7.5.3", @@ -2722,13 +2709,10 @@ } }, "node_modules/@npmcli/arborist/node_modules/lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/arborist/node_modules/minimatch": { "version": "9.0.5", @@ -2746,9 +2730,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2770,9 +2754,9 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2810,18 +2794,15 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2886,9 +2867,9 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -2901,31 +2882,10 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/map-workspaces/node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -2967,9 +2927,9 @@ } }, "node_modules/@npmcli/metavuln-calculator/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3024,9 +2984,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -3039,29 +2999,8 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { @@ -3089,9 +3028,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3265,9 +3204,9 @@ } }, "node_modules/@nx/devkit/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4327,9 +4266,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5289,9 +5228,9 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -5304,39 +5243,15 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.5", @@ -5815,9 +5730,9 @@ } }, "node_modules/conventional-changelog-core/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5872,9 +5787,9 @@ } }, "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6068,9 +5983,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -7760,9 +7675,9 @@ } }, "node_modules/git-semver-tags/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -8049,13 +7964,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/html-escaper": { "version": "2.0.2", @@ -8284,9 +8196,9 @@ } }, "node_modules/init-package-json/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -8782,9 +8694,9 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "dependencies": { "@babel/core": "^7.23.9", @@ -8798,9 +8710,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -8851,16 +8763,13 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -9347,9 +9256,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9850,9 +9759,9 @@ } }, "node_modules/lerna/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9956,9 +9865,9 @@ } }, "node_modules/libnpmpublish/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10082,9 +9991,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10285,9 +10194,9 @@ } }, "node_modules/meow/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10743,9 +10652,9 @@ } }, "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -10758,9 +10667,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -10774,24 +10680,6 @@ "node": ">=16" } }, - "node_modules/node-gyp/node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/node-gyp/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -10817,9 +10705,9 @@ } }, "node_modules/node-gyp/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10891,9 +10779,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10936,9 +10824,9 @@ } }, "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10972,9 +10860,9 @@ } }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11011,9 +10899,9 @@ } }, "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11180,9 +11068,9 @@ } }, "node_modules/nx/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11684,13 +11572,10 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", @@ -12373,9 +12258,9 @@ } }, "node_modules/rimraf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", - "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.9.tgz", + "integrity": "sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -12384,7 +12269,7 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14.18" + "node": "14 >=14.20 || 16 >=16.20 || >=18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -12400,31 +12285,29 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -12537,24 +12420,10 @@ "dev": true }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex-test": { "version": "1.0.3", @@ -12682,9 +12551,9 @@ } }, "node_modules/sharp/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -12943,12 +12812,12 @@ } }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "node_modules/string-length": { @@ -13285,21 +13154,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -13428,9 +13282,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -13915,9 +13769,9 @@ } }, "node_modules/vue-tsc/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -14268,13 +14122,17 @@ } }, "@4bitlabs/numeric-deque": { - "version": "file:libs/numeric-deque" + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@4bitlabs/numeric-deque/-/numeric-deque-1.1.7.tgz", + "integrity": "sha512-LtOT/ZrP+eM2SEEH7XCLUqqQjx7lY4hDWUAgfl1zyO5LbySjHEYzo5Daw2Idq/EkTmhR3W765tewf/X3TeAzuQ==" }, "@4bitlabs/pmachine": { "version": "file:libs/pmachine" }, "@4bitlabs/readers": { - "version": "file:libs/readers" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@4bitlabs/readers/-/readers-2.0.7.tgz", + "integrity": "sha512-djJicKoExWOD5sXScPqj4kGUOiON7lDdm+H738AGJn61e2wgL1h9RHJ7bvK8/rsn+tAFeYA3/4m5MFrfJOFpOw==" }, "@4bitlabs/resize-filters": { "version": "file:libs/resize-filters", @@ -15036,9 +14894,9 @@ } }, "@eslint/js": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.6.0.tgz", - "integrity": "sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", + "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", "dev": true }, "@humanwhocodes/config-array": { @@ -15727,9 +15585,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, "write-file-atomic": { @@ -15792,9 +15650,9 @@ }, "dependencies": { "lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true } } @@ -15858,9 +15716,9 @@ "dev": true }, "lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, "minimatch": { @@ -15873,9 +15731,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -15890,9 +15748,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -15920,15 +15778,15 @@ "dev": true }, "lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, "which": { @@ -15974,9 +15832,9 @@ } }, "glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "requires": { "foreground-child": "^3.1.0", @@ -15987,16 +15845,6 @@ "path-scurry": "^1.11.1" } }, - "jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -16028,9 +15876,9 @@ "dev": true }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -16072,9 +15920,9 @@ } }, "glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "requires": { "foreground-child": "^3.1.0", @@ -16085,16 +15933,6 @@ "path-scurry": "^1.11.1" } }, - "jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "json-parse-even-better-errors": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", @@ -16111,9 +15949,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -16245,9 +16083,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -16975,9 +16813,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -17700,9 +17538,9 @@ } }, "glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "requires": { "foreground-child": "^3.1.0", @@ -17713,20 +17551,10 @@ "path-scurry": "^1.11.1" } }, - "jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, "minimatch": { @@ -18078,9 +17906,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, "yallist": { @@ -18119,9 +17947,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -18260,9 +18088,9 @@ "dev": true }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { "ms": "2.1.2" @@ -19524,9 +19352,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -19732,9 +19560,9 @@ }, "dependencies": { "lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true } } @@ -19905,9 +19733,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -20253,9 +20081,9 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "requires": { "@babel/core": "^7.23.9", @@ -20266,9 +20094,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -20306,9 +20134,9 @@ } }, "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", @@ -20679,9 +20507,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -21080,9 +20908,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, "write-file-atomic": { @@ -21154,9 +20982,9 @@ "dev": true }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -21257,9 +21085,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -21418,9 +21246,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, "type-fest": { @@ -21761,9 +21589,9 @@ } }, "glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "requires": { "foreground-child": "^3.1.0", @@ -21780,16 +21608,6 @@ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true }, - "jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -21806,9 +21624,9 @@ "dev": true }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, "which": { @@ -21861,9 +21679,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -21893,9 +21711,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -21919,9 +21737,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -21948,9 +21766,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -22073,9 +21891,9 @@ } }, "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -22436,9 +22254,9 @@ }, "dependencies": { "lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true } } @@ -22921,9 +22739,9 @@ "dev": true }, "rimraf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", - "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.9.tgz", + "integrity": "sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==", "dev": true, "requires": { "glob": "^10.3.7" @@ -22939,22 +22757,23 @@ } }, "glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "requires": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" } }, "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -23033,9 +22852,9 @@ } }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex-test": { @@ -23149,9 +22968,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==" + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" } } }, @@ -23361,12 +23180,12 @@ } }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "string-length": { @@ -23623,21 +23442,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -23715,9 +23519,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -24024,9 +23828,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } diff --git a/package.json b/package.json index 80f2aba..2f63d9d 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,7 @@ "libs/color-space", "libs/color", "libs/image", - "libs/numeric-deque", "libs/pmachine", - "libs/readers", "libs/resize-filters", "libs/sci0", "libs/vec2",