diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 78e7312..eebabc3 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -73,4 +73,6 @@ jobs: - name: Run Linter run: pnpm turbo lint - name: Run Tests - run: pnpm turbo test + run: pnpm turbo test:cov + - name: Check Package + run: pnpm turbo lint:publint diff --git a/.gitignore b/.gitignore index d33dc5a..e4f9fc5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules/ # Build Artifacts +.rollup.cache/ .tsbuildinfo .turbo/ dist/ @@ -20,3 +21,4 @@ coverage/ # IDEs .idea +this.code-workspace diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..f0e4878 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["biomejs.biome", "denoland.vscode-deno"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index c90e44c..5e12150 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { + "biome.enabled": true, "deno.enable": false, "deno.enablePaths": ["./@kindspells/internal-tools"] } diff --git a/@kindspells/dev-configs/tsconfig.json b/@kindspells/dev-configs/tsconfig.json index d5d9607..afe00d0 100644 --- a/@kindspells/dev-configs/tsconfig.json +++ b/@kindspells/dev-configs/tsconfig.json @@ -6,12 +6,12 @@ "incremental": true, /* Language and Environment */ - "target": "ES2020", + "target": "es2020", + "lib": ["es2020", "DOM", "DOM.Iterable"], /* Modules */ - "module": "ES2020", + "module": "es2020", "moduleResolution": "Bundler", - "baseUrl": "./src/", "allowArbitraryExtensions": true, "allowImportingTsExtensions": true, "resolvePackageJsonExports": true, @@ -19,8 +19,8 @@ "resolveJsonModule": true, /* JavaScript Support */ - "allowJs": true, - "checkJs": true, + "allowJs": false, + "checkJs": false, /* Emit */ "noEmit": true, @@ -31,6 +31,10 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, + /* Declarations */ + "declaration": true, + "isolatedDeclarations": true, + /* Type Checking */ "strict": true, "noUnusedLocals": true, diff --git a/@kindspells/ts-crypto/package.json b/@kindspells/ts-crypto/package.json index 2771d65..2e60485 100644 --- a/@kindspells/ts-crypto/package.json +++ b/@kindspells/ts-crypto/package.json @@ -3,16 +3,45 @@ "private": false, "version": "0.0.1", "license": "MIT", + "main": "./dist/main.cjs", + "module": "./dist/main.mjs", + "types": "./dist/main.d.cts", + "files": ["dist"], + "exports": { + "import": { + "types": "./dist/main.d.mts", + "default": "./dist/main.mjs" + }, + "require": { + "types": "./dist/main.d.cts", + "default": "./dist/main.cjs" + } + }, "scripts": { + "build": "rm -rf dist/* && rollup --config rollup.config.mjs", "format": "pnpm biome check --write --files-ignore-unknown=true .", "format-staged": "biome-check-staged", - "lint": "pnpm biome check --files-ignore-unknown=true .", + "lint": "pnpm lint:biome", + "lint:biome": "pnpm biome check --files-ignore-unknown=true .", + "lint:publint": "publint", + "prepublishOnly": "pnpm lint && pnpm build", + "test": "vitest -c vitest.config.mts run", + "test:cov": "vitest -c vitest.config.mts run --coverage", "typecheck": "tsc --incremental true --tsBuildInfoFile .tsbuildinfo --noEmit -p ./tsconfig.json" }, "devDependencies": { "@biomejs/biome": "^1.8.3", "@kindspells/dev-configs": "workspace:*", - "typescript": "^5.5.4" + "@types/node": "^22.1.0", + "@vitest/coverage-v8": "^2.0.5", + "get-tsconfig": "^4.7.6", + "publint": "^0.2.9", + "rollup": "^4.20.0", + "rollup-plugin-dts": "^6.1.1", + "rollup-plugin-esbuild": "^6.1.1", + "tslib": "^2.6.3", + "typescript": "^5.5.4", + "vitest": "^2.0.5" }, "engines": { "node": ">=20.0" diff --git a/@kindspells/ts-crypto/rollup.config.mjs b/@kindspells/ts-crypto/rollup.config.mjs new file mode 100644 index 0000000..43446ae --- /dev/null +++ b/@kindspells/ts-crypto/rollup.config.mjs @@ -0,0 +1,38 @@ +import { dirname } from 'node:path' +import { fileURLToPath } from 'node:url' + +import { getTsconfig } from 'get-tsconfig' +import { defineConfig } from 'rollup' +import dts from 'rollup-plugin-dts' +import esbuild from 'rollup-plugin-esbuild' + +const projectDir = dirname(fileURLToPath(import.meta.url)) +const tsconfig = getTsconfig(projectDir) +const target = tsconfig?.config.compilerOptions?.target ?? 'es2020' + +const input = 'src/main.mts' + +export default defineConfig([ + { + input, + output: [ + { format: 'cjs', file: 'dist/main.cjs', sourcemap: true }, + { format: 'esm', file: 'dist/main.mjs', sourcemap: true }, + ], + plugins: [ + esbuild({ + target: ['node20', 'node22', target], + loaders: { '.mts': 'ts' }, + minify: true, + }), + ], + }, + { + input, + output: [ + { format: 'cjs', file: 'dist/main.d.cts' }, + { format: 'esm', file: 'dist/main.d.mts' }, + ], + plugins: [dts()], + }, +]) diff --git a/@kindspells/ts-crypto/src/encoding/hex.mts b/@kindspells/ts-crypto/src/encoding/hex.mts new file mode 100644 index 0000000..e244b3f --- /dev/null +++ b/@kindspells/ts-crypto/src/encoding/hex.mts @@ -0,0 +1,32 @@ +const numToHexL: { [key: number]: string } = {} +const numToHexU: { [key: number]: string } = {} +const hexToNum: { [key: string]: number } = {} + +for (let i = 0; i < 256; i++) { + const hex = i.toString(16).padStart(2, '0') + numToHexL[i] = hex // Number.toString returns lowercase + numToHexU[i] = hex.toUpperCase() + hexToNum[hex] = i +} + +export function fromHex(hex: string): Uint8Array { + const _hex = hex.toLowerCase() + const buffer = new Uint8Array(_hex.length >> 1) + + for (let i = 0; i < _hex.length; i += 2) { + // biome-ignore lint/style/noNonNullAssertion: it is up to the caller to ensure that `hex` is a valid input + buffer[i >> 1] = hexToNum[_hex.slice(i, i + 2)]! + } + return buffer +} + +export function toHex(buffer: Uint8Array, lowerCase = true): string { + const table = lowerCase ? numToHexL : numToHexU + + let hex = '' + for (const byte of buffer) { + hex += table[byte] + } + + return hex +} diff --git a/@kindspells/ts-crypto/src/encoding/tests/hex.test.mts b/@kindspells/ts-crypto/src/encoding/tests/hex.test.mts new file mode 100644 index 0000000..ad24a42 --- /dev/null +++ b/@kindspells/ts-crypto/src/encoding/tests/hex.test.mts @@ -0,0 +1,86 @@ +import { describe, expect, it } from 'vitest' + +import { fromHex, toHex } from '../hex.mts' + +describe('fromHex', () => { + it('returns a buffer of length 0 for an empty string', () => { + const buffer = fromHex('') + expect(buffer).toBeInstanceOf(Uint8Array) + expect(buffer).toHaveLength(0) + }) + + it('returns a buffer of length 1 for a single byte hex string', () => { + const buffer = fromHex('00') + expect(buffer).toBeInstanceOf(Uint8Array) + expect(buffer).toHaveLength(1) + expect(buffer[0]).toBe(0) + }) + + it('returns a buffer of length 1 for a single byte hex string with lowercase letters', () => { + const buffer = fromHex('ff') + expect(buffer).toBeInstanceOf(Uint8Array) + expect(buffer).toHaveLength(1) + expect(buffer[0]).toBe(255) + }) + + it('returns a buffer of length 1 for a single byte hex string with uppercase letters', () => { + const buffer = fromHex('FF') + expect(buffer).toBeInstanceOf(Uint8Array) + expect(buffer).toHaveLength(1) + expect(buffer[0]).toBe(255) + }) + + it('returns a buffer of length 2 for a two byte hex string', () => { + const buffer = fromHex('00ff') + expect(buffer).toBeInstanceOf(Uint8Array) + expect(buffer).toHaveLength(2) + expect(buffer[0]).toBe(0) + expect(buffer[1]).toBe(255) + }) + + it('works with mixed case hex strings', () => { + const buffer = fromHex('fF') + expect(buffer).toBeInstanceOf(Uint8Array) + expect(buffer).toHaveLength(1) + expect(buffer[0]).toBe(255) + }) + + it('works with long hex strings', () => { + const buffer = fromHex('0123456789abcdef') + expect(buffer).toBeInstanceOf(Uint8Array) + expect(buffer).toHaveLength(8) + expect(buffer).toEqual(new Uint8Array([1, 35, 69, 103, 137, 171, 205, 239])) + }) +}) + +describe('toHex', () => { + it('returns an empty string for a buffer of length 0', () => { + const hex = toHex(new Uint8Array([])) + expect(hex).toBe('') + }) + + it('returns a single byte hex string for a buffer of length 1', () => { + const hex = toHex(new Uint8Array([0])) + expect(hex).toBe('00') + }) + + it('returns a single byte hex string with lowercase letters for a buffer of length 1', () => { + const hex = toHex(new Uint8Array([255])) + expect(hex).toBe('ff') + }) + + it('returns a single byte hex string with uppercase letters for a buffer of length 1', () => { + const hex = toHex(new Uint8Array([255]), false) + expect(hex).toBe('FF') + }) + + it('returns a two byte hex string for a buffer of length 2', () => { + const hex = toHex(new Uint8Array([0, 255])) + expect(hex).toBe('00ff') + }) + + it('works with long buffers', () => { + const hex = toHex(new Uint8Array([1, 35, 69, 103, 137, 171, 205, 239])) + expect(hex).toBe('0123456789abcdef') + }) +}) diff --git a/@kindspells/ts-crypto/src/hashes/hashes.mts b/@kindspells/ts-crypto/src/hashes/hashes.mts new file mode 100644 index 0000000..cf5c831 --- /dev/null +++ b/@kindspells/ts-crypto/src/hashes/hashes.mts @@ -0,0 +1,9 @@ +export interface Hasher { + reset(): this + update(data: BufferSource): this + digest(): Promise | ArrayBuffer +} + +export type HashFunction = ( + data: BufferSource, +) => Promise | ArrayBuffer diff --git a/@kindspells/ts-crypto/src/hashes/md5.mts b/@kindspells/ts-crypto/src/hashes/md5.mts new file mode 100644 index 0000000..d966576 --- /dev/null +++ b/@kindspells/ts-crypto/src/hashes/md5.mts @@ -0,0 +1,258 @@ +import { convertToBuffer } from '../utils/data.mts' +import { TsCryptoAlreadyFinishedError } from '../utils/errors.mts' +import type { HashFunction, Hasher } from './hashes.mts' + +type Md5HasherState = { + finished: boolean + bytesHashed: number + bufferLength: number + state: Uint32Array + buffer: DataView +} + +const MD5_INIT_STATE = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476] as const +const MD5_BLOCK_SIZE = 64 as const +const MD5_DIGEST_LENGTH = 16 as const + +function cmn(q: number, a: number, b: number, x: number, s: number, t: number) { + const aa = (((a + q) & 0xffffffff) + ((x + t) & 0xffffffff)) & 0xffffffff + return (((aa << s) | (aa >>> (32 - s))) + b) & 0xffffffff +} + +function ff( + a: number, + b: number, + c: number, + d: number, + x: number, + s: number, + t: number, +) { + return cmn((b & c) | (~b & d), a, b, x, s, t) +} + +function gg( + a: number, + b: number, + c: number, + d: number, + x: number, + s: number, + t: number, +) { + return cmn((b & d) | (c & ~d), a, b, x, s, t) +} + +function hh( + a: number, + b: number, + c: number, + d: number, + x: number, + s: number, + t: number, +) { + return cmn(b ^ c ^ d, a, b, x, s, t) +} + +function ii( + a: number, + b: number, + c: number, + d: number, + x: number, + s: number, + t: number, +) { + return cmn(c ^ (b | ~d), a, b, x, s, t) +} + +function _hashBuffer(state: Uint32Array, buffer: DataView): void { + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + let a = state[0]! + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + let b = state[1]! + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + let c = state[2]! + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + let d = state[3]! + + a = ff(a, b, c, d, buffer.getUint32(0, true), 7, 0xd76aa478) + d = ff(d, a, b, c, buffer.getUint32(4, true), 12, 0xe8c7b756) + c = ff(c, d, a, b, buffer.getUint32(8, true), 17, 0x242070db) + b = ff(b, c, d, a, buffer.getUint32(12, true), 22, 0xc1bdceee) + a = ff(a, b, c, d, buffer.getUint32(16, true), 7, 0xf57c0faf) + d = ff(d, a, b, c, buffer.getUint32(20, true), 12, 0x4787c62a) + c = ff(c, d, a, b, buffer.getUint32(24, true), 17, 0xa8304613) + b = ff(b, c, d, a, buffer.getUint32(28, true), 22, 0xfd469501) + a = ff(a, b, c, d, buffer.getUint32(32, true), 7, 0x698098d8) + d = ff(d, a, b, c, buffer.getUint32(36, true), 12, 0x8b44f7af) + c = ff(c, d, a, b, buffer.getUint32(40, true), 17, 0xffff5bb1) + b = ff(b, c, d, a, buffer.getUint32(44, true), 22, 0x895cd7be) + a = ff(a, b, c, d, buffer.getUint32(48, true), 7, 0x6b901122) + d = ff(d, a, b, c, buffer.getUint32(52, true), 12, 0xfd987193) + c = ff(c, d, a, b, buffer.getUint32(56, true), 17, 0xa679438e) + b = ff(b, c, d, a, buffer.getUint32(60, true), 22, 0x49b40821) + + a = gg(a, b, c, d, buffer.getUint32(4, true), 5, 0xf61e2562) + d = gg(d, a, b, c, buffer.getUint32(24, true), 9, 0xc040b340) + c = gg(c, d, a, b, buffer.getUint32(44, true), 14, 0x265e5a51) + b = gg(b, c, d, a, buffer.getUint32(0, true), 20, 0xe9b6c7aa) + a = gg(a, b, c, d, buffer.getUint32(20, true), 5, 0xd62f105d) + d = gg(d, a, b, c, buffer.getUint32(40, true), 9, 0x02441453) + c = gg(c, d, a, b, buffer.getUint32(60, true), 14, 0xd8a1e681) + b = gg(b, c, d, a, buffer.getUint32(16, true), 20, 0xe7d3fbc8) + a = gg(a, b, c, d, buffer.getUint32(36, true), 5, 0x21e1cde6) + d = gg(d, a, b, c, buffer.getUint32(56, true), 9, 0xc33707d6) + c = gg(c, d, a, b, buffer.getUint32(12, true), 14, 0xf4d50d87) + b = gg(b, c, d, a, buffer.getUint32(32, true), 20, 0x455a14ed) + a = gg(a, b, c, d, buffer.getUint32(52, true), 5, 0xa9e3e905) + d = gg(d, a, b, c, buffer.getUint32(8, true), 9, 0xfcefa3f8) + c = gg(c, d, a, b, buffer.getUint32(28, true), 14, 0x676f02d9) + b = gg(b, c, d, a, buffer.getUint32(48, true), 20, 0x8d2a4c8a) + + a = hh(a, b, c, d, buffer.getUint32(20, true), 4, 0xfffa3942) + d = hh(d, a, b, c, buffer.getUint32(32, true), 11, 0x8771f681) + c = hh(c, d, a, b, buffer.getUint32(44, true), 16, 0x6d9d6122) + b = hh(b, c, d, a, buffer.getUint32(56, true), 23, 0xfde5380c) + a = hh(a, b, c, d, buffer.getUint32(4, true), 4, 0xa4beea44) + d = hh(d, a, b, c, buffer.getUint32(16, true), 11, 0x4bdecfa9) + c = hh(c, d, a, b, buffer.getUint32(28, true), 16, 0xf6bb4b60) + b = hh(b, c, d, a, buffer.getUint32(40, true), 23, 0xbebfbc70) + a = hh(a, b, c, d, buffer.getUint32(52, true), 4, 0x289b7ec6) + d = hh(d, a, b, c, buffer.getUint32(0, true), 11, 0xeaa127fa) + c = hh(c, d, a, b, buffer.getUint32(12, true), 16, 0xd4ef3085) + b = hh(b, c, d, a, buffer.getUint32(24, true), 23, 0x04881d05) + a = hh(a, b, c, d, buffer.getUint32(36, true), 4, 0xd9d4d039) + d = hh(d, a, b, c, buffer.getUint32(48, true), 11, 0xe6db99e5) + c = hh(c, d, a, b, buffer.getUint32(60, true), 16, 0x1fa27cf8) + b = hh(b, c, d, a, buffer.getUint32(8, true), 23, 0xc4ac5665) + + a = ii(a, b, c, d, buffer.getUint32(0, true), 6, 0xf4292244) + d = ii(d, a, b, c, buffer.getUint32(28, true), 10, 0x432aff97) + c = ii(c, d, a, b, buffer.getUint32(56, true), 15, 0xab9423a7) + b = ii(b, c, d, a, buffer.getUint32(20, true), 21, 0xfc93a039) + a = ii(a, b, c, d, buffer.getUint32(48, true), 6, 0x655b59c3) + d = ii(d, a, b, c, buffer.getUint32(12, true), 10, 0x8f0ccc92) + c = ii(c, d, a, b, buffer.getUint32(40, true), 15, 0xffeff47d) + b = ii(b, c, d, a, buffer.getUint32(4, true), 21, 0x85845dd1) + a = ii(a, b, c, d, buffer.getUint32(32, true), 6, 0x6fa87e4f) + d = ii(d, a, b, c, buffer.getUint32(60, true), 10, 0xfe2ce6e0) + c = ii(c, d, a, b, buffer.getUint32(24, true), 15, 0xa3014314) + b = ii(b, c, d, a, buffer.getUint32(52, true), 21, 0x4e0811a1) + a = ii(a, b, c, d, buffer.getUint32(16, true), 6, 0xf7537e82) + d = ii(d, a, b, c, buffer.getUint32(44, true), 10, 0xbd3af235) + c = ii(c, d, a, b, buffer.getUint32(8, true), 15, 0x2ad7d2bb) + b = ii(b, c, d, a, buffer.getUint32(36, true), 21, 0xeb86d391) + + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + state[0] = (a + state[0]!) & 0xffffffff + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + state[1] = (b + state[1]!) & 0xffffffff + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + state[2] = (c + state[2]!) & 0xffffffff + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + state[3] = (d + state[3]!) & 0xffffffff +} + +function _reset(): Md5HasherState { + return { + finished: false, + bytesHashed: 0, + bufferLength: 0, + state: new Uint32Array(MD5_INIT_STATE), + buffer: new DataView(new ArrayBuffer(MD5_BLOCK_SIZE)), + } +} + +function _update(ctx: Md5HasherState, sourceData: BufferSource): void { + let { byteLength } = sourceData + if (byteLength === 0) { + return + } + if (ctx.finished) { + throw new TsCryptoAlreadyFinishedError() + } + + const data = convertToBuffer(sourceData) + let position = 0 + + ctx.bytesHashed += byteLength + + while (byteLength > 0) { + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + ctx.buffer.setUint8(ctx.bufferLength++, data[position++]!) + byteLength -= 1 + + if (ctx.bufferLength === MD5_BLOCK_SIZE) { + _hashBuffer(ctx.state, ctx.buffer) + ctx.bufferLength = 0 + } + } +} + +function _digest(ctx: Md5HasherState): ArrayBuffer { + if (!ctx.finished) { + const undecoratedLength = ctx.bufferLength + const bitsHashed = ctx.bytesHashed * 8 + ctx.buffer.setUint8(ctx.bufferLength++, 0b10000000) + + // Ensure the final block has enough room for the hashed length + if (undecoratedLength % MD5_BLOCK_SIZE >= MD5_BLOCK_SIZE - 8) { + for (let i = ctx.bufferLength; i < MD5_BLOCK_SIZE; i++) { + ctx.buffer.setUint8(i, 0) + } + _hashBuffer(ctx.state, ctx.buffer) + ctx.bufferLength = 0 + } + + for (let i = ctx.bufferLength; i < MD5_BLOCK_SIZE - 8; i++) { + ctx.buffer.setUint8(i, 0) + } + ctx.buffer.setUint32(MD5_BLOCK_SIZE - 8, bitsHashed >>> 0, true) + ctx.buffer.setUint32( + MD5_BLOCK_SIZE - 4, + Math.floor(bitsHashed / 0x100000000), + + true, + ) + + _hashBuffer(ctx.state, ctx.buffer) + + ctx.finished = true + } + + const out = new DataView(new ArrayBuffer(MD5_DIGEST_LENGTH)) + for (let i = 0; i < 4; i += 1) { + // biome-ignore lint/style/noNonNullAssertion: guaranteed by the algorithm + out.setUint32(i * 4, ctx.state[i]!, true) + } + + return out.buffer +} + +export function md5Hasher(): Hasher { + let ctx: Md5HasherState + + const hasher = { + reset(): Hasher { + ctx = _reset() + return hasher + }, + update: (sourceData: BufferSource): Hasher => { + _update(ctx, sourceData) + return hasher + }, + digest(): ArrayBuffer { + return _digest(ctx) + }, + } + + return hasher.reset() +} + +export const md5: HashFunction = ( + data: BufferSource, +): Promise | ArrayBuffer => { + return md5Hasher().update(data).digest() +} diff --git a/@kindspells/ts-crypto/src/hashes/tests/md5.test.mts b/@kindspells/ts-crypto/src/hashes/tests/md5.test.mts new file mode 100644 index 0000000..c51c5bb --- /dev/null +++ b/@kindspells/ts-crypto/src/hashes/tests/md5.test.mts @@ -0,0 +1,290 @@ +import { describe, expect, it } from 'vitest' + +import { fromHex, toHex } from '../../encoding/hex.mts' +import { md5, md5Hasher } from '../md5.mts' + +const strToMd5: Record = { + '': fromHex('d41d8cd98f00b204e9800998ecf8427e'), + ' ': fromHex('7215ee9c7d9dc229d2921a40e899ec5f'), + ' ': fromHex('23b58def11b45727d3351702515f86af'), + ' ': fromHex('628631f07321b22d8c176c200c855e1b'), + ' ': fromHex('0cf31b2c283ce3431794586df7b0996d'), + hello: fromHex('5d41402abc4b2a76b9719d911017c592'), + 'Hello World!': fromHex('ed076287532e86365e841e92bfc50d8c'), + 'message digest': fromHex('f96b697d7cb7938d525a2f31aaf161d0'), + 'The quick brown fox jumps over the lazy dog': fromHex( + '9e107d9d372bb6826bd81d3542a419d6', + ), + 'The quick brown fox jumps over the lazy dog.': fromHex( + 'e4d909c290d0fb1ca068ffaddf22cbd0', + ), + a: fromHex('0cc175b9c0f1b6a831c399e269772661'), + abc: fromHex('900150983cd24fb0d6963f7d28e17f72'), + abcdefghijklmnopqrstuvwxyz: fromHex('c3fcd3d76192e4007dfb496cca67e13b'), + ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789: fromHex( + 'd174ab98d277d9f5a5611c2c9f419d9f', + ), + '1': fromHex('c4ca4238a0b923820dcc509a6f75849b'), + '12': fromHex('c20ad4d76fe97759aa27a0c99bff6710'), + '123': fromHex('202cb962ac59075b964b07152d234b70'), + '1234': fromHex('81dc9bdb52d04dc20036dbd8313ed055'), + '12345': fromHex('827ccb0eea8a706c4c34a16891f84e7b'), + '123456': fromHex('e10adc3949ba59abbe56e057f20f883e'), + '1234567': fromHex('fcea920f7412b5da7be0cf42b8c93759'), + '12345678': fromHex('25d55ad283aa400af464c76d713c07ad'), + '123456789': fromHex('25f9e794323b453885f5181f1b624d0b'), + '1234567890': fromHex('e807f1fcf82d132f9bb018ca6738a19f'), + '1234567890a': fromHex('b50d979457eca75e16f9f7c0f6321747'), + '1234567890ab': fromHex('5aab4fe20e4e90534028b2db43175a34'), + '1234567890abc': fromHex('43287ae11fca6e336459a32845e41b24'), + '1234567890abcd': fromHex('3d2a4a6fbf62bd4e9722540718a93917'), + '1234567890abcde': fromHex('5801c332b4e5ba9c0a297d60bb51cc72'), + '1234567890abcdef': fromHex('996ce17f6abc9fe126b57aa5f1d8c92c'), + '12345678901234567890123456789012345678901234567890123456789012345678901234567890': + fromHex('57edf4a22be3c955ac49da2e2107b67a'), +} + +const binSeqUpTo = (length: number): Uint8Array => { + return new Uint8Array(Array.from({ length }, (_, i) => i + 1)) +} + +const binaryToMd5: Record = { + // All zeros + ['00'.repeat(1)]: fromHex('93b885adfe0da089cdf634904fd59f71'), + ['00'.repeat(2)]: fromHex('c4103f122d27677c9db144cae1394a66'), + ['00'.repeat(3)]: fromHex('693e9af84d3dfcc71e640e005bdc5e2e'), + ['00'.repeat(4)]: fromHex('f1d3ff8443297732862df21dc4e57262'), + ['00'.repeat(5)]: fromHex('ca9c491ac66b2c62500882e93f3719a8'), + ['00'.repeat(6)]: fromHex('7319468847d7b1aee40dbf5dd963c999'), + ['00'.repeat(7)]: fromHex('d310a40483f9399dd7ed1712e0fdd702'), + ['00'.repeat(8)]: fromHex('7dea362b3fac8e00956a4952a3d4f474'), + ['00'.repeat(9)]: fromHex('3f2829b2ffe8434d67f98a2a98968652'), + ['00'.repeat(10)]: fromHex('a63c90cc3684ad8b0a2176a6a8fe9005'), + ['00'.repeat(11)]: fromHex('74da4121dc1c0ed2a8e5b0741f824034'), + ['00'.repeat(12)]: fromHex('8dd6bb7329a71449b0a1b292b5999164'), + ['00'.repeat(13)]: fromHex('0b867e53c1d233ce9fe49d54549a2323'), + ['00'.repeat(14)]: fromHex('36df9540a5ef4996a9737657e4a8929c'), + ['00'.repeat(15)]: fromHex('3449c9e5e332f1dbb81505cd739fbf3f'), + ['00'.repeat(16)]: fromHex('4ae71336e44bf9bf79d2752e234818a5'), + ['00'.repeat(17)]: fromHex('f3c8bdb6b9df478f227af2ce61c8a5a1'), + ['00'.repeat(18)]: fromHex('ff035bff2dcf972ee7dfd023455997ef'), + ['00'.repeat(19)]: fromHex('0e6bce6899fae841f79024afbdf7db1d'), + ['00'.repeat(20)]: fromHex('441018525208457705bf09a8ee3c1093'), + ['00'.repeat(21)]: fromHex('2319ac34f4848755a639fd524038dfd3'), + ['00'.repeat(22)]: fromHex('db46e81649d6863b16bd99ab139c865b'), + ['00'.repeat(23)]: fromHex('6b43b583e2b662724b6fbb5189f6ab28'), + ['00'.repeat(24)]: fromHex('1681ffc6e046c7af98c9e6c232a3fe0a'), + ['00'.repeat(25)]: fromHex('d28c293e10139d5d8f6e4592aeaffc1b'), + ['00'.repeat(26)]: fromHex('a396c59a96af3b36d364448c7b687fb1'), + ['00'.repeat(27)]: fromHex('65435a5d117aa6b052a5f737d9946a7b'), + ['00'.repeat(28)]: fromHex('1c9e99e48a495fe81d388fdb4900e59f'), + ['00'.repeat(29)]: fromHex('4aa476a72347ba44c9bd20c974d0f181'), + ['00'.repeat(30)]: fromHex('862dec5c27142824a394bc6464928f48'), + ['00'.repeat(31)]: fromHex('3861facee9efc127e340387f1936b8fb'), + ['00'.repeat(32)]: fromHex('70bc8f4b72a86921468bf8e8441dce51'), + ['00'.repeat(33)]: fromHex('099a150e83972a433492a59c2fbe98e0'), + ['00'.repeat(34)]: fromHex('0b91f1d54f932dc6382dc69f197900cf'), + ['00'.repeat(35)]: fromHex('c54104d7894a1941ca710981da437f9f'), + ['00'.repeat(36)]: fromHex('81684c2e68ade2cd4bf9f2e8a67dd4fe'), + ['00'.repeat(37)]: fromHex('21e2e8fe686ed0003b67d698b1273481'), + ['00'.repeat(38)]: fromHex('f3a534d52e3fe0c7a85b30ca00ca7424'), + ['00'.repeat(39)]: fromHex('002d5910de023eddce8358edf169c07f'), + ['00'.repeat(40)]: fromHex('fd4b38e94292e00251b9f39c47ee5710'), + ['00'.repeat(41)]: fromHex('f5cfd73023c1eedb6b9569736073f1dd'), + ['00'.repeat(42)]: fromHex('c183857770364b05c2011bdebb914ed3'), + ['00'.repeat(43)]: fromHex('aea2fa668453e23c431649801e5ea548'), + ['00'.repeat(44)]: fromHex('3e5ceb07f51a70d9d431714f04c0272f'), + ['00'.repeat(45)]: fromHex('7622214b8536afe7b89b1c6606069b0d'), + ['00'.repeat(46)]: fromHex('d898504a722bff1524134c6ab6a5eaa5'), + ['00'.repeat(47)]: fromHex('0d7db7ff842f89a36b58fa2541de2a6c'), + ['00'.repeat(48)]: fromHex('b203621a65475445e6fcdca717c667b5'), + ['00'.repeat(49)]: fromHex('884bb48a55da67b4812805cb8905277d'), + ['00'.repeat(50)]: fromHex('871bdd96b159c14d15c8d97d9111e9c8'), + ['00'.repeat(51)]: fromHex('e2365bc6a6fbd41287fae648437296fa'), + ['00'.repeat(52)]: fromHex('469aa816010c9c8639a9176f625189af'), + ['00'.repeat(53)]: fromHex('eca0470178275ac94e5de381969ed232'), + ['00'.repeat(54)]: fromHex('8910e6fc12f07a52b796eb55fbf3edda'), + ['00'.repeat(55)]: fromHex('c9ea3314b91c9fd4e38f9432064fd1f2'), + ['00'.repeat(56)]: fromHex('e3c4dd21a9171fd39d208efa09bf7883'), + ['00'.repeat(57)]: fromHex('ab9d8ef2ffa9145d6c325cefa41d5d4e'), + ['00'.repeat(58)]: fromHex('2c1cf4f76fa1cecc0c4737cfd8d95118'), + ['00'.repeat(59)]: fromHex('22031453e4c3a1a0d47b0b97d83d8984'), + ['00'.repeat(60)]: fromHex('a302a771ee0e3127b8950f0a67d17e49'), + ['00'.repeat(61)]: fromHex('e2a482a3896964675811dba0bfde2f0b'), + ['00'.repeat(62)]: fromHex('8d7d1020185f9b09cc22e789887be328'), + ['00'.repeat(63)]: fromHex('65cecfb980d72fde57d175d6ec1c3f64'), + + // All ones + ['ff'.repeat(1)]: fromHex('00594fd4f42ba43fc1ca0427a0576295'), + ['ff'.repeat(2)]: fromHex('ab2a0d28de6b77ffdd6c72afead099ab'), + ['ff'.repeat(3)]: fromHex('8597d4e7e65352a302b63e07bc01a7da'), + ['ff'.repeat(4)]: fromHex('a54f0041a9e15b050f25c463f1db7449'), + ['ff'.repeat(5)]: fromHex('50f20ea370a1130f64409e521154aa68'), + ['ff'.repeat(6)]: fromHex('00b1abd87bad356b90fcdfcb6132c26f'), + ['ff'.repeat(7)]: fromHex('2a0afadb9fd119cf6344fda615e5db79'), + ['ff'.repeat(8)]: fromHex('c2cb56f4c5bf656faca0986e7eba0308'), + ['ff'.repeat(9)]: fromHex('552a34689d9440ccf12b45c68d4e6ec8'), + ['ff'.repeat(10)]: fromHex('97d4c3505dde00c5b6e28c117e221704'), + ['ff'.repeat(11)]: fromHex('dfd842e55479c438397ddc7f33fb655e'), + ['ff'.repeat(12)]: fromHex('c1fa1f22fa36d331be4027e683baad06'), + ['ff'.repeat(13)]: fromHex('de10f91e6355d0d1048a95b865c42bfe'), + ['ff'.repeat(14)]: fromHex('e2b970633d2474c5fec1cc8a61e4feb2'), + ['ff'.repeat(15)]: fromHex('9ddd02276e5c30436e3b530eba05ad6a'), + ['ff'.repeat(16)]: fromHex('8d79cbc9a4ecdde112fc91ba625b13c2'), + ['ff'.repeat(17)]: fromHex('aca625a04c5f4caad0299c8def569073'), + ['ff'.repeat(18)]: fromHex('ec4d9bcf6cff57d39cf43de74b93ddbb'), + ['ff'.repeat(19)]: fromHex('bc13754d40d0ecbd91c20c68706d10c6'), + ['ff'.repeat(20)]: fromHex('0762a515ab26e0a9837fcadbe42f0712'), + ['ff'.repeat(21)]: fromHex('1538d3059abbcc6ad8d785b36b8f2a53'), + ['ff'.repeat(22)]: fromHex('757226036bf0e9484bd12bff9ba0704f'), + ['ff'.repeat(23)]: fromHex('81ce75f5f620e5964e953cf95650682d'), + ['ff'.repeat(24)]: fromHex('cb98701c46073e5a45e0e72cb5de17a1'), + ['ff'.repeat(25)]: fromHex('2841937c35c311e947bee49864b9d295'), + ['ff'.repeat(26)]: fromHex('0c833cc8156a285c814016def77b2658'), + ['ff'.repeat(27)]: fromHex('6da3d4a6d753fdc930bd9cc30e0afff2'), + ['ff'.repeat(28)]: fromHex('83fbbde4e2e2f7277ba64678046a8059'), + ['ff'.repeat(29)]: fromHex('138b4fd5cbdf4ee5a21414e6ca98a532'), + ['ff'.repeat(30)]: fromHex('9e489c7c597142c7c3ac1201c95b54e1'), + ['ff'.repeat(31)]: fromHex('3498b0e2e50d0de1f6c63c5d7e4fac22'), + ['ff'.repeat(32)]: fromHex('0d7dc4266497100e4831f5b31b6b274f'), + ['ff'.repeat(33)]: fromHex('e88afa9026b35aedc4be9d12ad6d417a'), + ['ff'.repeat(34)]: fromHex('6c006fea774da0c27ad903b98dd39bdb'), + ['ff'.repeat(35)]: fromHex('7931dbcaea4eb6e4b12a5e8c2ae31f89'), + ['ff'.repeat(36)]: fromHex('19317008e3605621e53c4686a32d1448'), + ['ff'.repeat(37)]: fromHex('8cecdc0fccebe76dec28bed5af1b0e52'), + ['ff'.repeat(38)]: fromHex('22ea82234ff4b6025ac1ae830aa05929'), + ['ff'.repeat(39)]: fromHex('9b8b45334fc27e0e6538a6a32fa9bdd2'), + ['ff'.repeat(40)]: fromHex('5c7191c0bf59f6d17bbe1bb4bf222e6b'), + ['ff'.repeat(41)]: fromHex('351aa2cbf626b9509f2803b9e21ee891'), + ['ff'.repeat(42)]: fromHex('006bd5607ab2c3bc65f6f17a74c47c9b'), + ['ff'.repeat(43)]: fromHex('e29327d58c00216a5cf310d0556b71c6'), + ['ff'.repeat(44)]: fromHex('b559a9dc72dc67a9d145432efe4bee5e'), + ['ff'.repeat(45)]: fromHex('b4b990a2175215e0b38150a527c1e134'), + ['ff'.repeat(46)]: fromHex('610005b4bb77820ec48b0ebc60507ffd'), + ['ff'.repeat(47)]: fromHex('d2771705f397679c4b41acbe8a67c9da'), + ['ff'.repeat(48)]: fromHex('5b53000f4d831a433070f80004262910'), + ['ff'.repeat(49)]: fromHex('0dd3cd72b9f2204162fa50ba9a32d30a'), + ['ff'.repeat(50)]: fromHex('be581b8c27c28a84b5fe49d1cbc831ff'), + ['ff'.repeat(51)]: fromHex('27204d71cb8785efbdd8759bb683fe37'), + ['ff'.repeat(52)]: fromHex('c805c8668e36876d4d7aa2ec987c7a8f'), + ['ff'.repeat(53)]: fromHex('880539f1691041ce797112e3ff28b076'), + ['ff'.repeat(54)]: fromHex('30855eb73c2f88ffc3005b998ca4cd69'), + ['ff'.repeat(55)]: fromHex('fd696aa639acaba9ce0e0964028fbe81'), + ['ff'.repeat(56)]: fromHex('74444b7e7b01632f3277365c8ca35ec2'), + ['ff'.repeat(57)]: fromHex('9d243c4a0a71953f292e01dca1be3587'), + ['ff'.repeat(58)]: fromHex('f857297ff8132513d2a604629308fad3'), + ['ff'.repeat(59)]: fromHex('3523d6acbac279fee49bbf7b42ed774c'), + ['ff'.repeat(60)]: fromHex('a011ab15bd0c1d0ffe4caab3095d3025'), + ['ff'.repeat(61)]: fromHex('d1963d35428d2dbe76b4858e4bb91712'), + ['ff'.repeat(62)]: fromHex('c40ace35651c3af4c1cf7a3f7493862b'), + ['ff'.repeat(63)]: fromHex('2e8381ef75aa4df05c31143466ecc2a8'), + + // Increasing sequence + [toHex(binSeqUpTo(1))]: fromHex('55a54008ad1ba589aa210d2629c1df41'), + [toHex(binSeqUpTo(2))]: fromHex('0cb988d042a7f28dd5fe2b55b3f5ac7a'), + [toHex(binSeqUpTo(3))]: fromHex('5289df737df57326fcdd22597afb1fac'), + [toHex(binSeqUpTo(4))]: fromHex('08d6c05a21512a79a1dfeb9d2a8f262f'), + [toHex(binSeqUpTo(5))]: fromHex('7cfdd07889b3295d6a550914ab35e068'), + [toHex(binSeqUpTo(6))]: fromHex('6ac1e56bc78f031059be7be854522c4c'), + [toHex(binSeqUpTo(7))]: fromHex('498001217bc632cb158588224d7d23c4'), + [toHex(binSeqUpTo(8))]: fromHex('0ee0646c1c77d8131cc8f4ee65c7673b'), + [toHex(binSeqUpTo(9))]: fromHex('8596c1af55b14b7b320112944fcb8536'), + [toHex(binSeqUpTo(10))]: fromHex('70903e79b7575e3f4e7ffa15c2608ac7'), + [toHex(binSeqUpTo(11))]: fromHex('3a0a12db5c1e3d4e72822fbfec67e4f6'), + [toHex(binSeqUpTo(12))]: fromHex('d2bc225f9724ea69812867fc45794a2e'), + [toHex(binSeqUpTo(13))]: fromHex('b61c83e2cbcad5d96fead7d6b949f2fa'), + [toHex(binSeqUpTo(14))]: fromHex('bf13fc19e5151ac57d4252e0e0f87abe'), + [toHex(binSeqUpTo(15))]: fromHex('ab3825d5aeaec5925b05d44beb7ddc7d'), + [toHex(binSeqUpTo(16))]: fromHex('190c4c105786a2121d85018939108a6c'), + [toHex(binSeqUpTo(17))]: fromHex('5187e484290250b220c67d5c40eac760'), + [toHex(binSeqUpTo(18))]: fromHex('0f514b1f70495f72ee834a83866e3a45'), + [toHex(binSeqUpTo(19))]: fromHex('1a68212b64dfc3cc83a13c427cad7ce0'), + [toHex(binSeqUpTo(20))]: fromHex('4d5555e067dd97d08fef90959b1510cb'), + [toHex(binSeqUpTo(21))]: fromHex('5e28425275cf3549645864021282b785'), + [toHex(binSeqUpTo(22))]: fromHex('b6bb6e607a57190f64de3d77ab72605a'), + [toHex(binSeqUpTo(23))]: fromHex('1e5fefd2559803a79c49b64b88259a46'), + [toHex(binSeqUpTo(24))]: fromHex('147e88065f0c9f17a7ae174877e6c233'), + [toHex(binSeqUpTo(25))]: fromHex('8a5690c97e2b1e44de8a68372e83768e'), + [toHex(binSeqUpTo(26))]: fromHex('aac57ba66a0af28c3cb943275eb7826a'), + [toHex(binSeqUpTo(27))]: fromHex('997000a18d739761c235a04a5e96ae52'), + [toHex(binSeqUpTo(28))]: fromHex('85a47158bbcfe75f4551676784d225ef'), + [toHex(binSeqUpTo(29))]: fromHex('d45a7ba135eee8f6b8befa75ed7e9a8f'), + [toHex(binSeqUpTo(30))]: fromHex('7f01935a0ea5b5468f1ca86d8dc8cd18'), + [toHex(binSeqUpTo(31))]: fromHex('d3896a4978b90f9c4703c09c01050ae7'), + [toHex(binSeqUpTo(32))]: fromHex('5985331bcec971b262122aa1ca5ad411'), + [toHex(binSeqUpTo(33))]: fromHex('d41608a6b37022ca41d7b7d32d8a0eac'), + [toHex(binSeqUpTo(34))]: fromHex('1f5acd0a99d51744d5aa5546b13084e8'), + [toHex(binSeqUpTo(35))]: fromHex('c3de4479d40456032264b64cd04bf6c9'), + [toHex(binSeqUpTo(36))]: fromHex('782ed146fb8c5262337f2ad02614f901'), + [toHex(binSeqUpTo(37))]: fromHex('fb1cff7def1a66537e5829223d5d1990'), + [toHex(binSeqUpTo(38))]: fromHex('df0eda707a27fa1d32c39e14c767a3b5'), + [toHex(binSeqUpTo(39))]: fromHex('ee80c58e1edcd4f3af47c075d6fcf611'), + [toHex(binSeqUpTo(40))]: fromHex('b1e76b9efe511bf70d9aa4cb0c3dafc9'), + [toHex(binSeqUpTo(41))]: fromHex('de96776362c812ed4c9849f43163e0f8'), + [toHex(binSeqUpTo(42))]: fromHex('4aca5af2ecbe95f519db9f7e28f0a5b3'), + [toHex(binSeqUpTo(43))]: fromHex('59b3a3a1f8397ee8ab00a30273697b96'), + [toHex(binSeqUpTo(44))]: fromHex('6b5489ea8158e3662666a57589bbb470'), + [toHex(binSeqUpTo(45))]: fromHex('420e9302b1cd405a85710c5337ad48fd'), + [toHex(binSeqUpTo(46))]: fromHex('6fb7e3c228fd930fbfc18565d99f2569'), + [toHex(binSeqUpTo(47))]: fromHex('12d07993502c2d4246d04eff37b1a2de'), + [toHex(binSeqUpTo(48))]: fromHex('8fb7da194de8ac2381e355e6f372e6b2'), + [toHex(binSeqUpTo(49))]: fromHex('3b46d2728e162374b753c22b0c6647e5'), + [toHex(binSeqUpTo(50))]: fromHex('f6d51ed601f87577a8fba7469e3238b9'), + [toHex(binSeqUpTo(51))]: fromHex('4bd2e4e3e93a23b5e48538fe2a488f55'), + [toHex(binSeqUpTo(52))]: fromHex('1c78fcfddf1850496c5fbd87604f4b05'), + [toHex(binSeqUpTo(53))]: fromHex('7585135641b67529371990f5d587dc14'), + [toHex(binSeqUpTo(54))]: fromHex('5be9c52d3e8ae8f85129fc610e3e7bd1'), + [toHex(binSeqUpTo(55))]: fromHex('b0dfea8a6c34da94d11ac2d6859fdd0b'), + [toHex(binSeqUpTo(56))]: fromHex('0e948e7f8183ae39d759364fa6d61cd2'), + [toHex(binSeqUpTo(57))]: fromHex('adc5941735e23599c993d518ae4278de'), + [toHex(binSeqUpTo(58))]: fromHex('22b0e45c4b035c5cf667c2cee361821e'), + [toHex(binSeqUpTo(59))]: fromHex('619995880f57cb34ff80902fb434a33f'), + [toHex(binSeqUpTo(60))]: fromHex('fd3ecf0be5eb7335790ea6e887244579'), + [toHex(binSeqUpTo(61))]: fromHex('9c40f512fe9b747a269bddb8dbd4b250'), + [toHex(binSeqUpTo(62))]: fromHex('81676d3786a12f93ae3b6a9773e9a543'), + [toHex(binSeqUpTo(63))]: fromHex('d41676f6509e0ade859c0040ea4bfdc0'), + [toHex(binSeqUpTo(64))]: fromHex('50e845bfe6c70fee663ab5500fd0c411'), +} + +describe('md5', () => { + it('returns the correct hash for an empty string', async () => { + const h1 = new Uint8Array(await md5(new TextEncoder().encode(''))) + expect(h1).toEqual(strToMd5['']) + + const h2 = new Uint8Array(await md5(Buffer.from(''))) + expect(h2).toEqual(strToMd5['']) + }) + + it('returns the correct hash for a collection of strings', async () => { + for (const [data, expectedHash] of Object.entries(strToMd5)) { + const h1 = new Uint8Array(await md5(new TextEncoder().encode(data))) + expect(h1).toEqual(expectedHash) + } + }) + + it('returns the correct hash for a collection of binary streams', async () => { + for (const [data, expectedHash] of Object.entries(binaryToMd5)) { + const h1 = new Uint8Array(await md5(fromHex(data))) + expect(h1).toEqual(expectedHash) + } + }) +}) + +describe('md5Hasher', () => { + it('returns the same digest independently of how we partition the input data', async () => { + const data = new Uint8Array(256).fill(23) + + const hasher1 = md5Hasher() + const h1 = await hasher1.update(data).digest() + + for (let i = 4; i < 192; i += 1) { + const hasher2 = md5Hasher() + const h2 = await hasher2 + .update(data.slice(0, i)) + .update(data.slice(i)) + .digest() + + expect(h1).toEqual(h2) + } + }) +}) diff --git a/@kindspells/ts-crypto/src/main.mts b/@kindspells/ts-crypto/src/main.mts new file mode 100644 index 0000000..8647918 --- /dev/null +++ b/@kindspells/ts-crypto/src/main.mts @@ -0,0 +1,11 @@ +export type { Hasher, HashFunction } from './hashes/hashes.mts' + +// In this case, we consider that it is acceptable to have a barrel file here +// because splitting the library exports into multiple files could lead to +// accidental code duplication (post-compilation) due to shared utility +// functions that end up copied into multiple files. +// +// biome-ignore lint/performance/noBarrelFile: the trade-off is worth it +export { md5, md5Hasher } from './hashes/md5.mts' + +export { fromHex, toHex } from './encoding/hex.mts' diff --git a/@kindspells/ts-crypto/src/main.ts b/@kindspells/ts-crypto/src/main.ts deleted file mode 100644 index e69de29..0000000 diff --git a/@kindspells/ts-crypto/src/utils/data.mts b/@kindspells/ts-crypto/src/utils/data.mts new file mode 100644 index 0000000..ae508cd --- /dev/null +++ b/@kindspells/ts-crypto/src/utils/data.mts @@ -0,0 +1,5 @@ +export function convertToBuffer(data: BufferSource): Uint8Array { + return ArrayBuffer.isView(data) + ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength) + : new Uint8Array(data) +} diff --git a/@kindspells/ts-crypto/src/utils/errors.mts b/@kindspells/ts-crypto/src/utils/errors.mts new file mode 100644 index 0000000..becfb48 --- /dev/null +++ b/@kindspells/ts-crypto/src/utils/errors.mts @@ -0,0 +1,13 @@ +export class TsCryptoHasherError extends Error { + constructor(message: string) { + super(message) + this.name = 'TsCryptoHasherError' + } +} + +export class TsCryptoAlreadyFinishedError extends TsCryptoHasherError { + constructor() { + super('Attempted to update an already finished hash.') + this.name = 'TsCryptoAlreadyFinishedError' + } +} diff --git a/@kindspells/ts-crypto/tsconfig.json b/@kindspells/ts-crypto/tsconfig.json index a662c46..27341f8 100644 --- a/@kindspells/ts-crypto/tsconfig.json +++ b/@kindspells/ts-crypto/tsconfig.json @@ -1,5 +1,10 @@ { "extends": "@kindspells/dev-configs/tsconfig", + "compilerOptions": { + "rootDir": ".", + "baseUrl": "./src/", + "outDir": "./dist/" + }, "include": ["src/**/*"], "exclude": ["dist/**/*", "node_modules/**/*"] } diff --git a/@kindspells/ts-crypto/vitest.config.mts b/@kindspells/ts-crypto/vitest.config.mts new file mode 100644 index 0000000..cd6dfa6 --- /dev/null +++ b/@kindspells/ts-crypto/vitest.config.mts @@ -0,0 +1,19 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + coverage: { + provider: 'v8', + include: ['src/**/*.mjs', 'src/**/*.mts'], + exclude: ['src/**/tests/**/*', 'coverage/**/*'], + thresholds: { + statements: 90.0, + branches: 90.0, + functions: 85.0, + lines: 90.0, + }, + reportsDirectory: 'coverage', + }, + include: ['src/**/tests/**/*.test.mts'], + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 60d56fd..c0ddb3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,12 +40,71 @@ importers: '@kindspells/dev-configs': specifier: workspace:* version: link:../dev-configs + '@types/node': + specifier: ^22.1.0 + version: 22.1.0 + '@vitest/coverage-v8': + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@22.1.0)) + get-tsconfig: + specifier: ^4.7.6 + version: 4.7.6 + publint: + specifier: ^0.2.9 + version: 0.2.9 + rollup: + specifier: ^4.20.0 + version: 4.20.0 + rollup-plugin-dts: + specifier: ^6.1.1 + version: 6.1.1(rollup@4.20.0)(typescript@5.5.4) + rollup-plugin-esbuild: + specifier: ^6.1.1 + version: 6.1.1(esbuild@0.23.0)(rollup@4.20.0) + tslib: + specifier: ^2.6.3 + version: 2.6.3 typescript: specifier: ^5.5.4 version: 5.5.4 + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.1.0) packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@biomejs/biome@1.8.3': resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} engines: {node: '>=14.21.3'} @@ -99,107 +158,1894 @@ packages: cpu: [x64] os: [win32] - turbo-darwin-64@2.0.11: - resolution: {integrity: sha512-YlHEEhcm+jI1BSZoLugGHUWDfRXaNaQIv7tGQBfadYjo9kixBnqoTOU6s1ubOrQMID+lizZZQs79GXwqM6vohg==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + engines: {node: '>=18'} cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] os: [darwin] - turbo-darwin-arm64@2.0.11: - resolution: {integrity: sha512-K/YW+hWzRQ/wGmtffxllH4M1tgy8OlwgXODrIiAGzkSpZl9+pIsem/F86UULlhsIeavBYK/LS5+dzV3DPMjJ9w==} + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - turbo-linux-64@2.0.11: - resolution: {integrity: sha512-mv8CwGP06UPweMh1Vlp6PI6OWnkuibxfIJ4Vlof7xqjohAaZU5FLqeOeHkjQflH/6YrCVuS9wrK0TFOu+meTtA==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + engines: {node: '>=18'} cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] os: [linux] - turbo-linux-arm64@2.0.11: - resolution: {integrity: sha512-wLE5tl4oriTmHbuayc0ki0csaCplmVLj+uCWtecM/mfBuZgNS9ICNM9c4sB+Cfl5tlBBFeepqRNgvRvn8WeVZg==} + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - turbo-windows-64@2.0.11: - resolution: {integrity: sha512-tja3zvVCSWu3HizOoeQv0qDJ+GeWGWRFOOM6a8i3BYnXLgGKAaDZFcjwzgC50tWiAw4aowIVR4OouwIyRhLBaQ==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + engines: {node: '>=18'} cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] os: [win32] - turbo-windows-arm64@2.0.11: - resolution: {integrity: sha512-sYjXP6k94Bqh99R+y3M1Ks6LRIEZybMz+7enA8GKl6JJ2ZFaXxTnS6q+/2+ii1+rRwxohj5OBb4gxODcF8Jd4w==} + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - turbo@2.0.11: - resolution: {integrity: sha512-imDlFFAvitbCm1JtDFJ6eG882qwxHUmVT2noPb3p2jq5o5DuXOchMbkVS9kUeC3/4WpY5N0GBZ3RvqNyjHZw1Q==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@22.1.0': + resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} + + '@vitest/coverage-v8@2.0.5': + resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} + peerDependencies: + vitest: 2.0.5 + + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} hasBin: true - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} hasBin: true -snapshots: + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - '@biomejs/biome@1.8.3': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.8.3 - '@biomejs/cli-darwin-x64': 1.8.3 - '@biomejs/cli-linux-arm64': 1.8.3 - '@biomejs/cli-linux-arm64-musl': 1.8.3 - '@biomejs/cli-linux-x64': 1.8.3 - '@biomejs/cli-linux-x64-musl': 1.8.3 - '@biomejs/cli-win32-arm64': 1.8.3 - '@biomejs/cli-win32-x64': 1.8.3 + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - '@biomejs/cli-darwin-arm64@1.8.3': - optional: true + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - '@biomejs/cli-darwin-x64@1.8.3': - optional: true + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - '@biomejs/cli-linux-arm64-musl@1.8.3': - optional: true + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} - '@biomejs/cli-linux-arm64@1.8.3': - optional: true + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - '@biomejs/cli-linux-x64-musl@1.8.3': - optional: true + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - '@biomejs/cli-linux-x64@1.8.3': - optional: true + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - '@biomejs/cli-win32-arm64@1.8.3': - optional: true + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - '@biomejs/cli-win32-x64@1.8.3': - optional: true + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} - turbo-darwin-64@2.0.11: - optional: true + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true - turbo-darwin-arm64@2.0.11: - optional: true + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported - turbo-linux-64@2.0.11: - optional: true + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - turbo-linux-arm64@2.0.11: - optional: true + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - turbo-windows-64@2.0.11: - optional: true + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - turbo-windows-arm64@2.0.11: - optional: true + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} - turbo@2.0.11: - optionalDependencies: - turbo-darwin-64: 2.0.11 - turbo-darwin-arm64: 2.0.11 - turbo-linux-64: 2.0.11 - turbo-linux-arm64: 2.0.11 - turbo-windows-64: 2.0.11 - turbo-windows-arm64: 2.0.11 + ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - typescript@5.5.4: {} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + npm-bundled@2.0.1: + resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + npm-normalize-package-bin@2.0.0: + resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + npm-packlist@5.1.3: + resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + engines: {node: ^10 || ^12 || >=14} + + publint@0.2.9: + resolution: {integrity: sha512-nITKS1NSwD68PQlts0ntryhxrWObep6P0CCycwi1lgXI+K7uKyacMYRRCQi7hTae8imkI3FCi0FlgnwLxjM8yA==} + engines: {node: '>=16'} + hasBin: true + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rollup-plugin-dts@6.1.1: + resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + + rollup-plugin-esbuild@6.1.1: + resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} + engines: {node: '>=14.18.0'} + peerDependencies: + esbuild: '>=0.18.0' + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + engines: {node: '>=14.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + turbo-darwin-64@2.0.11: + resolution: {integrity: sha512-YlHEEhcm+jI1BSZoLugGHUWDfRXaNaQIv7tGQBfadYjo9kixBnqoTOU6s1ubOrQMID+lizZZQs79GXwqM6vohg==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.0.11: + resolution: {integrity: sha512-K/YW+hWzRQ/wGmtffxllH4M1tgy8OlwgXODrIiAGzkSpZl9+pIsem/F86UULlhsIeavBYK/LS5+dzV3DPMjJ9w==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@2.0.11: + resolution: {integrity: sha512-mv8CwGP06UPweMh1Vlp6PI6OWnkuibxfIJ4Vlof7xqjohAaZU5FLqeOeHkjQflH/6YrCVuS9wrK0TFOu+meTtA==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.0.11: + resolution: {integrity: sha512-wLE5tl4oriTmHbuayc0ki0csaCplmVLj+uCWtecM/mfBuZgNS9ICNM9c4sB+Cfl5tlBBFeepqRNgvRvn8WeVZg==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.0.11: + resolution: {integrity: sha512-tja3zvVCSWu3HizOoeQv0qDJ+GeWGWRFOOM6a8i3BYnXLgGKAaDZFcjwzgC50tWiAw4aowIVR4OouwIyRhLBaQ==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.0.11: + resolution: {integrity: sha512-sYjXP6k94Bqh99R+y3M1Ks6LRIEZybMz+7enA8GKl6JJ2ZFaXxTnS6q+/2+ii1+rRwxohj5OBb4gxODcF8Jd4w==} + cpu: [arm64] + os: [win32] + + turbo@2.0.11: + resolution: {integrity: sha512-imDlFFAvitbCm1JtDFJ6eG882qwxHUmVT2noPb3p2jq5o5DuXOchMbkVS9kUeC3/4WpY5N0GBZ3RvqNyjHZw1Q==} + hasBin: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.13.0: + resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} + + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + optional: true + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + optional: true + + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@1.8.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.8.3 + '@biomejs/cli-darwin-x64': 1.8.3 + '@biomejs/cli-linux-arm64': 1.8.3 + '@biomejs/cli-linux-arm64-musl': 1.8.3 + '@biomejs/cli-linux-x64': 1.8.3 + '@biomejs/cli-linux-x64-musl': 1.8.3 + '@biomejs/cli-win32-arm64': 1.8.3 + '@biomejs/cli-win32-x64': 1.8.3 + + '@biomejs/cli-darwin-arm64@1.8.3': + optional: true + + '@biomejs/cli-darwin-x64@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64@1.8.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-x64@1.8.3': + optional: true + + '@biomejs/cli-win32-arm64@1.8.3': + optional: true + + '@biomejs/cli-win32-x64@1.8.3': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.0': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.0': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.0': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.0': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.0': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.0': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.0': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.0': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.0': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.0': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.0': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.0': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.0': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.0': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.0': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.0': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.0': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.0': + optional: true + + '@esbuild/openbsd-arm64@0.23.0': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.0': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.0': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.0': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.0': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.0': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/pluginutils@5.1.0(rollup@4.20.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.20.0 + + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@types/estree@1.0.5': {} + + '@types/node@22.1.0': + dependencies: + undici-types: 6.13.0 + + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@22.1.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.11 + magicast: 0.3.4 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.0.5(@types/node@22.1.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.0.5': + dependencies: + '@vitest/utils': 2.0.5 + pathe: 1.1.2 + + '@vitest/snapshot@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.0 + + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + optional: true + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + cac@6.7.14: {} + + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + optional: true + + check-error@2.1.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + optional: true + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: + optional: true + + color-name@1.1.4: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + deep-eql@5.0.2: {} + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + es-module-lexer@1.5.4: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + + escape-string-regexp@1.0.5: + optional: true + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-func-name@2.0.2: {} + + get-stream@8.0.1: {} + + get-tsconfig@4.7.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob@10.4.5: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + has-flag@3.0.0: + optional: true + + has-flag@4.0.0: {} + + html-escaper@2.0.2: {} + + human-signals@5.0.0: {} + + ignore-walk@5.0.1: + dependencies: + minimatch: 5.1.6 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-fullwidth-code-point@3.0.0: {} + + is-stream@3.0.0: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-tokens@4.0.0: + optional: true + + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.4: + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + source-map-js: 1.2.0 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + merge-stream@2.0.0: {} + + mimic-fn@4.0.0: {} + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mri@1.2.0: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + npm-bundled@2.0.1: + dependencies: + npm-normalize-package-bin: 2.0.0 + + npm-normalize-package-bin@2.0.0: {} + + npm-packlist@5.1.3: + dependencies: + glob: 8.1.0 + ignore-walk: 5.0.1 + npm-bundled: 2.0.1 + npm-normalize-package-bin: 2.0.0 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + package-json-from-dist@1.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + postcss@8.4.40: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + publint@0.2.9: + dependencies: + npm-packlist: 5.1.3 + picocolors: 1.0.1 + sade: 1.8.1 + + resolve-pkg-maps@1.0.0: {} + + rollup-plugin-dts@6.1.1(rollup@4.20.0)(typescript@5.5.4): + dependencies: + magic-string: 0.30.11 + rollup: 4.20.0 + typescript: 5.5.4 + optionalDependencies: + '@babel/code-frame': 7.24.7 + + rollup-plugin-esbuild@6.1.1(esbuild@0.23.0)(rollup@4.20.0): + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.20.0) + debug: 4.3.6 + es-module-lexer: 1.5.4 + esbuild: 0.23.0 + get-tsconfig: 4.7.6 + rollup: 4.20.0 + transitivePeerDependencies: + - supports-color + + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + semver@7.6.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.0: {} + + stackback@0.0.2: {} + + std-env@3.7.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-final-newline@3.0.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + optional: true + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + tinybench@2.9.0: {} + + tinypool@1.0.0: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.0: {} + + to-fast-properties@2.0.0: {} + + tslib@2.6.3: {} + + turbo-darwin-64@2.0.11: + optional: true + + turbo-darwin-arm64@2.0.11: + optional: true + + turbo-linux-64@2.0.11: + optional: true + + turbo-linux-arm64@2.0.11: + optional: true + + turbo-windows-64@2.0.11: + optional: true + + turbo-windows-arm64@2.0.11: + optional: true + + turbo@2.0.11: + optionalDependencies: + turbo-darwin-64: 2.0.11 + turbo-darwin-arm64: 2.0.11 + turbo-linux-64: 2.0.11 + turbo-linux-arm64: 2.0.11 + turbo-windows-64: 2.0.11 + turbo-windows-arm64: 2.0.11 + + typescript@5.5.4: {} + + undici-types@6.13.0: {} + + vite-node@2.0.5(@types/node@22.1.0): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@22.1.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite@5.3.5(@types/node@22.1.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.40 + rollup: 4.20.0 + optionalDependencies: + '@types/node': 22.1.0 + fsevents: 2.3.3 + + vitest@2.0.5(@types/node@22.1.0): + dependencies: + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + debug: 4.3.6 + execa: 8.0.1 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinypool: 1.0.0 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@22.1.0) + vite-node: 2.0.5(@types/node@22.1.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.1.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} diff --git a/turbo.json b/turbo.json index 4f62f0f..7d17e40 100644 --- a/turbo.json +++ b/turbo.json @@ -88,10 +88,19 @@ "./**/*.d.cts" ] }, + "lint:publint": { + "dependsOn": ["build", "^lint:publint"], + "inputs": ["./package.json", "./dist/**/*"] + }, "test": { "dependsOn": ["^test"], "inputs": ["./package.json", "./src/**/*"] }, + "test:cov": { + "dependsOn": ["^test:cov"], + "inputs": ["./package.json", "./src/**/*"], + "outputs": ["./coverage/**/*"] + }, "typecheck": { "dependsOn": ["^typecheck"], "inputs": ["./src/**/*", "./tsconfig.json", "./.tsbuildinfo"],