diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..214c29d --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/ROADMAP.md b/ROADMAP.md index 0de3386..88b86f3 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -17,11 +17,11 @@ - [x] Add circle-ray intersection helper - [x] Implement swept AABB collision checks - [x] Document new modules in `docs/index.d.ts` and examples folder -- [ ] Achieve >80% coverage across new modules +- [x] Achieve >80% coverage across new modules ## Milestone 0.3.0 – Web Performance & Data Pipelines - [x] Introduce request deduplication helper -- [ ] Ship virtual scrolling utilities +- [x] Ship virtual scrolling utilities - [ ] Add diff/patch helpers for nested JSON structures - [ ] Create benchmarking scripts to compare algorithm variants - [ ] Expand CI to include coverage gating and bundle size checks diff --git a/docs/index.d.ts b/docs/index.d.ts index d3e1eed..3dafb73 100644 --- a/docs/index.d.ts +++ b/docs/index.d.ts @@ -186,6 +186,35 @@ export function throttle any>( limit: number ): (...args: Parameters) => void; +/** + * Virtual scrolling window calculator for fixed-height lists. + * Use for: long lists, chat logs, table virtualization. + * Performance: O(visible + overrides) per update. + * Import: util/virtualScroll.ts + */ +export interface VirtualScrollOptions { + itemCount: number; + itemHeight: number; + scrollOffset: number; + viewportHeight: number; + overscan?: number; + measurements?: ReadonlyArray; +} +export interface VirtualItem { + index: number; + offset: number; + size: number; +} +export interface VirtualRange { + startIndex: number; + endIndex: number; + padFront: number; + padEnd: number; + totalSize: number; + items: VirtualItem[]; +} +export function calculateVirtualRange(options: VirtualScrollOptions): VirtualRange; + /** * Least recently used cache. * Use for: memoizing responses, data loaders, pagination caches. diff --git a/examples/virtualScroll.ts b/examples/virtualScroll.ts new file mode 100644 index 0000000..ee82dcb --- /dev/null +++ b/examples/virtualScroll.ts @@ -0,0 +1,12 @@ +import { calculateVirtualRange } from '../src/index.js'; + +const range = calculateVirtualRange({ + itemCount: 1000, + itemHeight: 24, + viewportHeight: 240, + scrollOffset: 480, + overscan: 2, +}); + +console.log(`render ${range.startIndex} to ${range.endIndex}`); +console.log(range.items.slice(0, 3)); diff --git a/package-lock.json b/package-lock.json index ad277ca..c32d1d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,11 +7,13 @@ "": { "name": "llm-algorithms", "version": "0.1.0", + "hasInstallScript": true, "license": "MIT", "devDependencies": { "@types/node": "^20.11.24", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "@vitest/coverage-v8": "^1.6.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "prettier": "^3.2.5", @@ -19,9 +21,80 @@ "vitest": "^1.4.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" @@ -38,7 +111,7 @@ }, "node_modules/@esbuild/android-arm": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" @@ -55,7 +128,7 @@ }, "node_modules/@esbuild/android-arm64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" @@ -72,7 +145,7 @@ }, "node_modules/@esbuild/android-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" @@ -89,7 +162,7 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" @@ -106,7 +179,7 @@ }, "node_modules/@esbuild/darwin-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" @@ -123,7 +196,7 @@ }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" @@ -140,7 +213,7 @@ }, "node_modules/@esbuild/freebsd-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" @@ -157,7 +230,7 @@ }, "node_modules/@esbuild/linux-arm": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" @@ -174,7 +247,7 @@ }, "node_modules/@esbuild/linux-arm64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" @@ -191,7 +264,7 @@ }, "node_modules/@esbuild/linux-ia32": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" @@ -208,7 +281,7 @@ }, "node_modules/@esbuild/linux-loong64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" @@ -225,7 +298,7 @@ }, "node_modules/@esbuild/linux-mips64el": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" @@ -242,7 +315,7 @@ }, "node_modules/@esbuild/linux-ppc64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" @@ -259,7 +332,7 @@ }, "node_modules/@esbuild/linux-riscv64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" @@ -276,7 +349,7 @@ }, "node_modules/@esbuild/linux-s390x": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" @@ -293,7 +366,7 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" @@ -310,7 +383,7 @@ }, "node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" @@ -327,7 +400,7 @@ }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" @@ -344,7 +417,7 @@ }, "node_modules/@esbuild/sunos-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" @@ -361,7 +434,7 @@ }, "node_modules/@esbuild/win32-arm64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" @@ -378,7 +451,7 @@ }, "node_modules/@esbuild/win32-ia32": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" @@ -395,7 +468,7 @@ }, "node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" @@ -412,7 +485,7 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", - "resolved": "https://npm.noeon.team/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", @@ -431,7 +504,7 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", - "resolved": "https://npm.noeon.team/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", @@ -441,7 +514,7 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "resolved": "https://npm.noeon.team/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", @@ -465,7 +538,7 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://npm.noeon.team/brace-expansion/-/brace-expansion-1.1.12.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", @@ -476,7 +549,7 @@ }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://npm.noeon.team/minimatch/-/minimatch-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", @@ -489,7 +562,7 @@ }, "node_modules/@eslint/js": { "version": "8.57.1", - "resolved": "https://npm.noeon.team/@eslint/js/-/js-8.57.1.tgz", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", @@ -499,7 +572,7 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", - "resolved": "https://npm.noeon.team/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, @@ -515,7 +588,7 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://npm.noeon.team/brace-expansion/-/brace-expansion-1.1.12.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", @@ -526,7 +599,7 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://npm.noeon.team/minimatch/-/minimatch-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", @@ -539,7 +612,7 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://npm.noeon.team/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", @@ -553,15 +626,25 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "resolved": "https://npm.noeon.team/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://npm.noeon.team/@jest/schemas/-/schemas-29.6.3.tgz", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", @@ -572,16 +655,48 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://npm.noeon.team/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://npm.noeon.team/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", @@ -595,7 +710,7 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://npm.noeon.team/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", @@ -605,7 +720,7 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://npm.noeon.team/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", @@ -619,7 +734,7 @@ }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", "cpu": [ "arm" @@ -633,7 +748,7 @@ }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", "cpu": [ "arm64" @@ -647,7 +762,7 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", "cpu": [ "arm64" @@ -661,7 +776,7 @@ }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", "cpu": [ "x64" @@ -675,7 +790,7 @@ }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", "cpu": [ "arm64" @@ -689,7 +804,7 @@ }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", "cpu": [ "x64" @@ -703,7 +818,7 @@ }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", "cpu": [ "arm" @@ -717,7 +832,7 @@ }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", "cpu": [ "arm" @@ -731,7 +846,7 @@ }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", "cpu": [ "arm64" @@ -745,7 +860,7 @@ }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", "cpu": [ "arm64" @@ -759,7 +874,7 @@ }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", "cpu": [ "loong64" @@ -773,7 +888,7 @@ }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", "cpu": [ "ppc64" @@ -787,7 +902,7 @@ }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", "cpu": [ "riscv64" @@ -801,7 +916,7 @@ }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", "cpu": [ "riscv64" @@ -815,7 +930,7 @@ }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", "cpu": [ "s390x" @@ -829,7 +944,7 @@ }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" @@ -843,7 +958,7 @@ }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", "cpu": [ "x64" @@ -857,7 +972,7 @@ }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", "cpu": [ "arm64" @@ -871,7 +986,7 @@ }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", "cpu": [ "arm64" @@ -885,7 +1000,7 @@ }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", "cpu": [ "ia32" @@ -899,7 +1014,7 @@ }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", "cpu": [ "x64" @@ -913,7 +1028,7 @@ }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", "cpu": [ "x64" @@ -927,28 +1042,28 @@ }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://npm.noeon.team/@sinclair/typebox/-/typebox-0.27.8.tgz", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://npm.noeon.team/@types/estree/-/estree-1.0.8.tgz", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://npm.noeon.team/@types/json-schema/-/json-schema-7.0.15.tgz", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "20.19.19", - "resolved": "https://npm.noeon.team/@types/node/-/node-20.19.19.tgz", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "dev": true, "license": "MIT", @@ -958,14 +1073,14 @@ }, "node_modules/@types/semver": { "version": "7.7.1", - "resolved": "https://npm.noeon.team/@types/semver/-/semver-7.7.1.tgz", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "license": "MIT", @@ -1001,7 +1116,7 @@ }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "license": "BSD-2-Clause", @@ -1030,7 +1145,7 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "license": "MIT", @@ -1048,7 +1163,7 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "license": "MIT", @@ -1076,7 +1191,7 @@ }, "node_modules/@typescript-eslint/types": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/types/-/types-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "license": "MIT", @@ -1090,7 +1205,7 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "license": "BSD-2-Clause", @@ -1119,7 +1234,7 @@ }, "node_modules/@typescript-eslint/utils": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "license": "MIT", @@ -1145,7 +1260,7 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "license": "MIT", @@ -1163,14 +1278,42 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "resolved": "https://npm.noeon.team/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, + "node_modules/@vitest/coverage-v8": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.1.tgz", + "integrity": "sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.1" + } + }, "node_modules/@vitest/expect": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/@vitest/expect/-/expect-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", "dev": true, "license": "MIT", @@ -1185,7 +1328,7 @@ }, "node_modules/@vitest/runner": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/@vitest/runner/-/runner-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", "dev": true, "license": "MIT", @@ -1200,7 +1343,7 @@ }, "node_modules/@vitest/runner/node_modules/p-limit": { "version": "5.0.0", - "resolved": "https://npm.noeon.team/p-limit/-/p-limit-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, "license": "MIT", @@ -1216,7 +1359,7 @@ }, "node_modules/@vitest/runner/node_modules/yocto-queue": { "version": "1.2.1", - "resolved": "https://npm.noeon.team/yocto-queue/-/yocto-queue-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "dev": true, "license": "MIT", @@ -1229,7 +1372,7 @@ }, "node_modules/@vitest/snapshot": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", "dev": true, "license": "MIT", @@ -1244,7 +1387,7 @@ }, "node_modules/@vitest/spy": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/@vitest/spy/-/spy-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", "dev": true, "license": "MIT", @@ -1257,7 +1400,7 @@ }, "node_modules/@vitest/utils": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/@vitest/utils/-/utils-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", "dev": true, "license": "MIT", @@ -1273,7 +1416,7 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://npm.noeon.team/acorn/-/acorn-8.15.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", @@ -1286,7 +1429,7 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://npm.noeon.team/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", @@ -1296,7 +1439,7 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://npm.noeon.team/acorn-walk/-/acorn-walk-8.3.4.tgz", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", @@ -1309,7 +1452,7 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://npm.noeon.team/ajv/-/ajv-6.12.6.tgz", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", @@ -1326,7 +1469,7 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://npm.noeon.team/ansi-regex/-/ansi-regex-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", @@ -1336,7 +1479,7 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://npm.noeon.team/ansi-styles/-/ansi-styles-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", @@ -1352,14 +1495,14 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://npm.noeon.team/argparse/-/argparse-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://npm.noeon.team/array-union/-/array-union-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", @@ -1369,7 +1512,7 @@ }, "node_modules/assertion-error": { "version": "1.1.0", - "resolved": "https://npm.noeon.team/assertion-error/-/assertion-error-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, "license": "MIT", @@ -1379,14 +1522,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://npm.noeon.team/balanced-match/-/balanced-match-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://npm.noeon.team/brace-expansion/-/brace-expansion-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", @@ -1396,7 +1539,7 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://npm.noeon.team/braces/-/braces-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", @@ -1409,7 +1552,7 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://npm.noeon.team/cac/-/cac-6.7.14.tgz", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", @@ -1419,7 +1562,7 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://npm.noeon.team/callsites/-/callsites-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", @@ -1429,7 +1572,7 @@ }, "node_modules/chai": { "version": "4.5.0", - "resolved": "https://npm.noeon.team/chai/-/chai-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "license": "MIT", @@ -1448,7 +1591,7 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://npm.noeon.team/chalk/-/chalk-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", @@ -1465,7 +1608,7 @@ }, "node_modules/check-error": { "version": "1.0.3", - "resolved": "https://npm.noeon.team/check-error/-/check-error-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "license": "MIT", @@ -1478,7 +1621,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://npm.noeon.team/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", @@ -1491,28 +1634,28 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://npm.noeon.team/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://npm.noeon.team/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/confbox": { "version": "0.1.8", - "resolved": "https://npm.noeon.team/confbox/-/confbox-0.1.8.tgz", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://npm.noeon.team/cross-spawn/-/cross-spawn-7.0.6.tgz", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", @@ -1527,7 +1670,7 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://npm.noeon.team/debug/-/debug-4.4.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", @@ -1545,7 +1688,7 @@ }, "node_modules/deep-eql": { "version": "4.1.4", - "resolved": "https://npm.noeon.team/deep-eql/-/deep-eql-4.1.4.tgz", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "license": "MIT", @@ -1558,14 +1701,14 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://npm.noeon.team/deep-is/-/deep-is-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://npm.noeon.team/diff-sequences/-/diff-sequences-29.6.3.tgz", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", @@ -1575,7 +1718,7 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://npm.noeon.team/dir-glob/-/dir-glob-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", @@ -1588,7 +1731,7 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://npm.noeon.team/doctrine/-/doctrine-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", @@ -1601,7 +1744,7 @@ }, "node_modules/esbuild": { "version": "0.21.5", - "resolved": "https://npm.noeon.team/esbuild/-/esbuild-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, @@ -1640,7 +1783,7 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://npm.noeon.team/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", @@ -1653,7 +1796,7 @@ }, "node_modules/eslint": { "version": "8.57.1", - "resolved": "https://npm.noeon.team/eslint/-/eslint-8.57.1.tgz", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, "license": "MIT", @@ -1709,7 +1852,7 @@ }, "node_modules/eslint-config-prettier": { "version": "9.1.2", - "resolved": "https://npm.noeon.team/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, "license": "MIT", @@ -1722,7 +1865,7 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://npm.noeon.team/eslint-scope/-/eslint-scope-7.2.2.tgz", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", @@ -1739,7 +1882,7 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://npm.noeon.team/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", @@ -1752,7 +1895,7 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://npm.noeon.team/brace-expansion/-/brace-expansion-1.1.12.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", @@ -1763,7 +1906,7 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://npm.noeon.team/minimatch/-/minimatch-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", @@ -1776,7 +1919,7 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://npm.noeon.team/espree/-/espree-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", @@ -1794,7 +1937,7 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://npm.noeon.team/esquery/-/esquery-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", @@ -1807,7 +1950,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://npm.noeon.team/esrecurse/-/esrecurse-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", @@ -1820,7 +1963,7 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://npm.noeon.team/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", @@ -1830,7 +1973,7 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://npm.noeon.team/estree-walker/-/estree-walker-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", @@ -1840,7 +1983,7 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://npm.noeon.team/esutils/-/esutils-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", @@ -1850,7 +1993,7 @@ }, "node_modules/execa": { "version": "8.0.1", - "resolved": "https://npm.noeon.team/execa/-/execa-8.0.1.tgz", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", @@ -1874,14 +2017,14 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://npm.noeon.team/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://npm.noeon.team/fast-glob/-/fast-glob-3.3.3.tgz", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", @@ -1898,7 +2041,7 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://npm.noeon.team/glob-parent/-/glob-parent-5.1.2.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", @@ -1911,21 +2054,21 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://npm.noeon.team/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://npm.noeon.team/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", - "resolved": "https://npm.noeon.team/fastq/-/fastq-1.19.1.tgz", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", @@ -1935,7 +2078,7 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://npm.noeon.team/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", @@ -1948,7 +2091,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://npm.noeon.team/fill-range/-/fill-range-7.1.1.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", @@ -1961,7 +2104,7 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://npm.noeon.team/find-up/-/find-up-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", @@ -1978,7 +2121,7 @@ }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://npm.noeon.team/flat-cache/-/flat-cache-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", @@ -1993,21 +2136,21 @@ }, "node_modules/flatted": { "version": "3.3.3", - "resolved": "https://npm.noeon.team/flatted/-/flatted-3.3.3.tgz", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://npm.noeon.team/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://npm.noeon.team/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, @@ -2022,7 +2165,7 @@ }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://npm.noeon.team/get-func-name/-/get-func-name-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "license": "MIT", @@ -2032,7 +2175,7 @@ }, "node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://npm.noeon.team/get-stream/-/get-stream-8.0.1.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", @@ -2045,7 +2188,7 @@ }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://npm.noeon.team/glob/-/glob-7.2.3.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, @@ -2067,7 +2210,7 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://npm.noeon.team/glob-parent/-/glob-parent-6.0.2.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", @@ -2080,7 +2223,7 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://npm.noeon.team/brace-expansion/-/brace-expansion-1.1.12.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", @@ -2091,7 +2234,7 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://npm.noeon.team/minimatch/-/minimatch-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", @@ -2104,7 +2247,7 @@ }, "node_modules/globals": { "version": "13.24.0", - "resolved": "https://npm.noeon.team/globals/-/globals-13.24.0.tgz", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", @@ -2120,7 +2263,7 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://npm.noeon.team/globby/-/globby-11.1.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", @@ -2141,14 +2284,14 @@ }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://npm.noeon.team/graphemer/-/graphemer-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://npm.noeon.team/has-flag/-/has-flag-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", @@ -2156,9 +2299,16 @@ "node": ">=8" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://npm.noeon.team/human-signals/-/human-signals-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", @@ -2168,7 +2318,7 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://npm.noeon.team/ignore/-/ignore-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", @@ -2178,7 +2328,7 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://npm.noeon.team/import-fresh/-/import-fresh-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", @@ -2195,7 +2345,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://npm.noeon.team/imurmurhash/-/imurmurhash-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", @@ -2205,7 +2355,7 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://npm.noeon.team/inflight/-/inflight-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, @@ -2217,14 +2367,14 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://npm.noeon.team/inherits/-/inherits-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://npm.noeon.team/is-extglob/-/is-extglob-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", @@ -2234,7 +2384,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://npm.noeon.team/is-glob/-/is-glob-4.0.3.tgz", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", @@ -2247,7 +2397,7 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://npm.noeon.team/is-number/-/is-number-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", @@ -2257,7 +2407,7 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://npm.noeon.team/is-path-inside/-/is-path-inside-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", @@ -2267,7 +2417,7 @@ }, "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://npm.noeon.team/is-stream/-/is-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", @@ -2280,21 +2430,75 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://npm.noeon.team/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/js-tokens": { "version": "9.0.1", - "resolved": "https://npm.noeon.team/js-tokens/-/js-tokens-9.0.1.tgz", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://npm.noeon.team/js-yaml/-/js-yaml-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", @@ -2307,28 +2511,28 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://npm.noeon.team/json-buffer/-/json-buffer-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://npm.noeon.team/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://npm.noeon.team/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://npm.noeon.team/keyv/-/keyv-4.5.4.tgz", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", @@ -2338,7 +2542,7 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://npm.noeon.team/levn/-/levn-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", @@ -2352,7 +2556,7 @@ }, "node_modules/local-pkg": { "version": "0.5.1", - "resolved": "https://npm.noeon.team/local-pkg/-/local-pkg-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", "dev": true, "license": "MIT", @@ -2369,7 +2573,7 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://npm.noeon.team/locate-path/-/locate-path-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", @@ -2385,14 +2589,14 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://npm.noeon.team/lodash.merge/-/lodash.merge-4.6.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/loupe": { "version": "2.3.7", - "resolved": "https://npm.noeon.team/loupe/-/loupe-2.3.7.tgz", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "license": "MIT", @@ -2402,7 +2606,7 @@ }, "node_modules/magic-string": { "version": "0.30.19", - "resolved": "https://npm.noeon.team/magic-string/-/magic-string-0.30.19.tgz", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, "license": "MIT", @@ -2410,16 +2614,44 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://npm.noeon.team/merge-stream/-/merge-stream-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://npm.noeon.team/merge2/-/merge2-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", @@ -2429,7 +2661,7 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://npm.noeon.team/micromatch/-/micromatch-4.0.8.tgz", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", @@ -2443,7 +2675,7 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://npm.noeon.team/mimic-fn/-/mimic-fn-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", @@ -2456,7 +2688,7 @@ }, "node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://npm.noeon.team/minimatch/-/minimatch-9.0.3.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "license": "ISC", @@ -2472,7 +2704,7 @@ }, "node_modules/mlly": { "version": "1.8.0", - "resolved": "https://npm.noeon.team/mlly/-/mlly-1.8.0.tgz", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, "license": "MIT", @@ -2485,21 +2717,21 @@ }, "node_modules/mlly/node_modules/pathe": { "version": "2.0.3", - "resolved": "https://npm.noeon.team/pathe/-/pathe-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://npm.noeon.team/ms/-/ms-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://npm.noeon.team/nanoid/-/nanoid-3.3.11.tgz", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ @@ -2518,14 +2750,14 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://npm.noeon.team/natural-compare/-/natural-compare-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://npm.noeon.team/npm-run-path/-/npm-run-path-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", @@ -2541,7 +2773,7 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://npm.noeon.team/path-key/-/path-key-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", @@ -2554,7 +2786,7 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://npm.noeon.team/once/-/once-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", @@ -2564,7 +2796,7 @@ }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://npm.noeon.team/onetime/-/onetime-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", @@ -2580,7 +2812,7 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://npm.noeon.team/optionator/-/optionator-0.9.4.tgz", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", @@ -2598,7 +2830,7 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://npm.noeon.team/p-limit/-/p-limit-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", @@ -2614,7 +2846,7 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://npm.noeon.team/p-locate/-/p-locate-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", @@ -2630,7 +2862,7 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://npm.noeon.team/parent-module/-/parent-module-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", @@ -2643,7 +2875,7 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://npm.noeon.team/path-exists/-/path-exists-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", @@ -2653,7 +2885,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://npm.noeon.team/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", @@ -2663,7 +2895,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://npm.noeon.team/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", @@ -2673,7 +2905,7 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://npm.noeon.team/path-type/-/path-type-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", @@ -2683,14 +2915,14 @@ }, "node_modules/pathe": { "version": "1.1.2", - "resolved": "https://npm.noeon.team/pathe/-/pathe-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "1.1.1", - "resolved": "https://npm.noeon.team/pathval/-/pathval-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, "license": "MIT", @@ -2700,14 +2932,14 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://npm.noeon.team/picocolors/-/picocolors-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://npm.noeon.team/picomatch/-/picomatch-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", @@ -2720,7 +2952,7 @@ }, "node_modules/pkg-types": { "version": "1.3.1", - "resolved": "https://npm.noeon.team/pkg-types/-/pkg-types-1.3.1.tgz", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, "license": "MIT", @@ -2732,14 +2964,14 @@ }, "node_modules/pkg-types/node_modules/pathe": { "version": "2.0.3", - "resolved": "https://npm.noeon.team/pathe/-/pathe-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://npm.noeon.team/postcss/-/postcss-8.5.6.tgz", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ @@ -2768,7 +3000,7 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://npm.noeon.team/prelude-ls/-/prelude-ls-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", @@ -2778,7 +3010,7 @@ }, "node_modules/prettier": { "version": "3.6.2", - "resolved": "https://npm.noeon.team/prettier/-/prettier-3.6.2.tgz", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", @@ -2794,7 +3026,7 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://npm.noeon.team/pretty-format/-/pretty-format-29.7.0.tgz", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", @@ -2809,7 +3041,7 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://npm.noeon.team/ansi-styles/-/ansi-styles-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", @@ -2822,7 +3054,7 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://npm.noeon.team/punycode/-/punycode-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", @@ -2832,7 +3064,7 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://npm.noeon.team/queue-microtask/-/queue-microtask-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ @@ -2853,14 +3085,14 @@ }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://npm.noeon.team/react-is/-/react-is-18.3.1.tgz", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://npm.noeon.team/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", @@ -2870,7 +3102,7 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://npm.noeon.team/reusify/-/reusify-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", @@ -2881,7 +3113,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://npm.noeon.team/rimraf/-/rimraf-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, @@ -2898,7 +3130,7 @@ }, "node_modules/rollup": { "version": "4.52.4", - "resolved": "https://npm.noeon.team/rollup/-/rollup-4.52.4.tgz", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, "license": "MIT", @@ -2940,7 +3172,7 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://npm.noeon.team/run-parallel/-/run-parallel-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ @@ -2964,7 +3196,7 @@ }, "node_modules/semver": { "version": "7.7.2", - "resolved": "https://npm.noeon.team/semver/-/semver-7.7.2.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", @@ -2977,7 +3209,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://npm.noeon.team/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", @@ -2990,7 +3222,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://npm.noeon.team/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", @@ -3000,14 +3232,14 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://npm.noeon.team/siginfo/-/siginfo-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://npm.noeon.team/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", @@ -3020,7 +3252,7 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://npm.noeon.team/slash/-/slash-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", @@ -3030,7 +3262,7 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://npm.noeon.team/source-map-js/-/source-map-js-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", @@ -3040,21 +3272,21 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://npm.noeon.team/stackback/-/stackback-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/std-env": { "version": "3.9.0", - "resolved": "https://npm.noeon.team/std-env/-/std-env-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, "license": "MIT" }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://npm.noeon.team/strip-ansi/-/strip-ansi-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", @@ -3067,7 +3299,7 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://npm.noeon.team/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", @@ -3080,7 +3312,7 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://npm.noeon.team/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", @@ -3093,7 +3325,7 @@ }, "node_modules/strip-literal": { "version": "2.1.1", - "resolved": "https://npm.noeon.team/strip-literal/-/strip-literal-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", "dev": true, "license": "MIT", @@ -3106,7 +3338,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://npm.noeon.team/supports-color/-/supports-color-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", @@ -3117,23 +3349,62 @@ "node": ">=8" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://npm.noeon.team/text-table/-/text-table-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://npm.noeon.team/tinybench/-/tinybench-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinypool": { "version": "0.8.4", - "resolved": "https://npm.noeon.team/tinypool/-/tinypool-0.8.4.tgz", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", "dev": true, "license": "MIT", @@ -3143,7 +3414,7 @@ }, "node_modules/tinyspy": { "version": "2.2.1", - "resolved": "https://npm.noeon.team/tinyspy/-/tinyspy-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, "license": "MIT", @@ -3153,7 +3424,7 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://npm.noeon.team/to-regex-range/-/to-regex-range-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", @@ -3166,7 +3437,7 @@ }, "node_modules/ts-api-utils": { "version": "1.4.3", - "resolved": "https://npm.noeon.team/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", @@ -3179,7 +3450,7 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://npm.noeon.team/type-check/-/type-check-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", @@ -3192,7 +3463,7 @@ }, "node_modules/type-detect": { "version": "4.1.0", - "resolved": "https://npm.noeon.team/type-detect/-/type-detect-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, "license": "MIT", @@ -3202,7 +3473,7 @@ }, "node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://npm.noeon.team/type-fest/-/type-fest-0.20.2.tgz", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -3215,7 +3486,7 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://npm.noeon.team/typescript/-/typescript-5.9.3.tgz", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", @@ -3229,21 +3500,21 @@ }, "node_modules/ufo": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/ufo/-/ufo-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true, "license": "MIT" }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://npm.noeon.team/undici-types/-/undici-types-6.21.0.tgz", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://npm.noeon.team/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", @@ -3253,7 +3524,7 @@ }, "node_modules/vite": { "version": "5.4.20", - "resolved": "https://npm.noeon.team/vite/-/vite-5.4.20.tgz", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz", "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==", "dev": true, "license": "MIT", @@ -3313,7 +3584,7 @@ }, "node_modules/vite-node": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/vite-node/-/vite-node-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", "dev": true, "license": "MIT", @@ -3336,7 +3607,7 @@ }, "node_modules/vitest": { "version": "1.6.1", - "resolved": "https://npm.noeon.team/vitest/-/vitest-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", "dev": true, "license": "MIT", @@ -3402,7 +3673,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://npm.noeon.team/which/-/which-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", @@ -3418,7 +3689,7 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://npm.noeon.team/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", @@ -3435,7 +3706,7 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://npm.noeon.team/word-wrap/-/word-wrap-1.2.5.tgz", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", @@ -3445,14 +3716,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://npm.noeon.team/wrappy/-/wrappy-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://npm.noeon.team/yocto-queue/-/yocto-queue-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", diff --git a/package.json b/package.json index 81182b7..f22040f 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ ], "sideEffects": false, "scripts": { + "preinstall": "npm config set registry https://registry.npmjs.org/", "build": "tsc -p tsconfig.build.json", "typecheck": "tsc -p tsconfig.json --noEmit", "test": "vitest run", @@ -42,13 +43,14 @@ "author": "", "license": "MIT", "devDependencies": { + "@types/node": "^20.11.24", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "@vitest/coverage-v8": "^1.6.1", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "prettier": "^3.2.5", "typescript": "^5.4.3", - "vitest": "^1.4.0", - "@types/node": "^20.11.24" + "vitest": "^1.4.0" } } diff --git a/src/index.ts b/src/index.ts index f362f71..99dd041 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,6 +16,12 @@ export { throttle } from './util/throttle.js'; export { LRUCache } from './util/lruCache.js'; export { memoize } from './util/memoize.js'; export { deduplicateRequest, clearRequestDedup } from './util/requestDedup.js'; +export { calculateVirtualRange } from './util/virtualScroll.js'; +export type { + VirtualRange, + VirtualItem, + VirtualScrollOptions, +} from './util/virtualScroll.js'; export { fuzzySearch, fuzzyScore } from './search/fuzzy.js'; export { Trie } from './search/trie.js'; diff --git a/src/util/virtualScroll.ts b/src/util/virtualScroll.ts new file mode 100644 index 0000000..e846581 --- /dev/null +++ b/src/util/virtualScroll.ts @@ -0,0 +1,170 @@ +export interface VirtualScrollOptions { + itemCount: number; + itemHeight: number; + scrollOffset: number; + viewportHeight: number; + overscan?: number; + measurements?: ReadonlyArray; +} + +export interface VirtualItem { + index: number; + offset: number; + size: number; +} + +export interface VirtualRange { + startIndex: number; + endIndex: number; + padFront: number; + padEnd: number; + totalSize: number; + items: VirtualItem[]; +} + +/** + * Calculates the visible window for fixed-height virtual scrolling. + * Useful for: list virtualization, large table rendering, incremental rendering strategies. + */ +export function calculateVirtualRange(options: VirtualScrollOptions): VirtualRange { + validateOptions(options); + + const { + itemCount, + itemHeight, + viewportHeight, + measurements = [], + } = options; + let { scrollOffset, overscan = 1 } = options; + + if (itemCount === 0) { + return { + startIndex: 0, + endIndex: -1, + padFront: 0, + padEnd: 0, + totalSize: 0, + items: [], + }; + } + + overscan = clampInteger(overscan, 0); + scrollOffset = Math.max(0, scrollOffset); + + const totalSize = computeTotalSize(itemCount, itemHeight, measurements); + const maxOffset = Math.max(0, totalSize - viewportHeight); + const normalizedOffset = Math.min(scrollOffset, maxOffset); + + const baseVisible = Math.max(1, Math.ceil(viewportHeight / itemHeight)); + let startIndex = Math.floor(normalizedOffset / itemHeight) - overscan; + startIndex = clampInteger(startIndex, 0, itemCount - 1); + const desiredCount = baseVisible + overscan * 2; + let endIndex = startIndex + desiredCount - 1; + endIndex = clampInteger(endIndex, startIndex, itemCount - 1); + + const padFront = computePadFront(startIndex, itemHeight, measurements); + const items = buildItems(startIndex, endIndex, padFront, itemHeight, measurements); + const lastItem = items.length > 0 ? items[items.length - 1] : undefined; + const renderedSize = lastItem ? lastItem.offset + lastItem.size - padFront : 0; + const padEnd = Math.max(0, totalSize - padFront - renderedSize); + + return { + startIndex, + endIndex, + padFront, + padEnd, + totalSize, + items, + }; +} + +function validateOptions(options: VirtualScrollOptions): void { + const { itemCount, itemHeight, viewportHeight, scrollOffset, overscan, measurements } = options; + if (!Number.isInteger(itemCount) || itemCount < 0) { + throw new TypeError('itemCount must be a non-negative integer'); + } + if (!Number.isFinite(itemHeight) || itemHeight <= 0) { + throw new TypeError('itemHeight must be a positive number'); + } + if (!Number.isFinite(viewportHeight) || viewportHeight < 0) { + throw new TypeError('viewportHeight must be a non-negative number'); + } + if (!Number.isFinite(scrollOffset) || scrollOffset < 0) { + throw new TypeError('scrollOffset must be a non-negative number'); + } + if (overscan !== undefined && (!Number.isFinite(overscan) || overscan < 0)) { + throw new TypeError('overscan must be a non-negative number'); + } + if (measurements) { + measurements.forEach((value, index) => { + if (value === undefined) { + return; + } + if (!Number.isFinite(value) || value <= 0) { + throw new TypeError(`measurements[${index}] must be a positive number when defined`); + } + }); + } +} + +function computeTotalSize( + itemCount: number, + itemHeight: number, + measurements: ReadonlyArray +): number { + let total = itemCount * itemHeight; + for (let index = 0; index < measurements.length && index < itemCount; index += 1) { + const override = measurements[index]; + if (override !== undefined) { + total += override - itemHeight; + } + } + return total; +} + +function computePadFront( + startIndex: number, + itemHeight: number, + measurements: ReadonlyArray +): number { + if (startIndex === 0) { + return 0; + } + let pad = startIndex * itemHeight; + for (let index = 0; index < measurements.length && index < startIndex; index += 1) { + const override = measurements[index]; + if (override !== undefined) { + pad += override - itemHeight; + } + } + return pad; +} + +function buildItems( + startIndex: number, + endIndex: number, + initialOffset: number, + itemHeight: number, + measurements: ReadonlyArray +): VirtualItem[] { + if (endIndex < startIndex) { + return []; + } + const items: VirtualItem[] = []; + let offset = initialOffset; + for (let index = startIndex; index <= endIndex; index += 1) { + const measurement = index < measurements.length ? measurements[index] : undefined; + const size = measurement ?? itemHeight; + items.push({ index, offset, size }); + offset += size; + } + return items; +} + +function clampInteger(value: number, min: number, max?: number): number { + const integer = Math.floor(value); + if (max === undefined) { + return Math.max(min, integer); + } + return Math.min(Math.max(min, integer), max); +} diff --git a/tests/geometry.test.ts b/tests/geometry.test.ts new file mode 100644 index 0000000..6287a3b --- /dev/null +++ b/tests/geometry.test.ts @@ -0,0 +1,68 @@ +import { describe, expect, it } from 'vitest'; +import { convexHull } from '../src/geometry/convexHull.js'; +import { lineIntersection } from '../src/geometry/lineIntersection.js'; +import { pointInPolygon } from '../src/geometry/pointInPolygon.js'; + +describe('convexHull', () => { + it('computes hull for a set including interior points', () => { + const points = [ + { x: 0, y: 0 }, + { x: 1, y: 0 }, + { x: 0, y: 1 }, + { x: 1, y: 1 }, + { x: 0.5, y: 0.5 }, + ]; + const hull = convexHull(points); + expect(hull).toEqual([ + { x: 0, y: 0 }, + { x: 1, y: 0 }, + { x: 1, y: 1 }, + { x: 0, y: 1 }, + ]); + }); + + it('throws when less than three points provided', () => { + expect(() => convexHull([{ x: 0, y: 0 }, { x: 1, y: 1 }])).toThrow(); + }); +}); + +describe('lineIntersection', () => { + it('returns intersection point for crossing segments', () => { + expect( + lineIntersection( + { x: 0, y: 0 }, + { x: 2, y: 2 }, + { x: 0, y: 2 }, + { x: 2, y: 0 } + ) + ).toEqual({ x: 1, y: 1 }); + }); + + it('returns null for parallel segments', () => { + expect( + lineIntersection( + { x: 0, y: 0 }, + { x: 1, y: 0 }, + { x: 0, y: 1 }, + { x: 1, y: 1 } + ) + ).toBeNull(); + }); +}); + +describe('pointInPolygon', () => { + const square = [ + { x: 0, y: 0 }, + { x: 2, y: 0 }, + { x: 2, y: 2 }, + { x: 0, y: 2 }, + ]; + + it('detects points inside polygon', () => { + expect(pointInPolygon({ x: 1, y: 1 }, square)).toBe(true); + }); + + it('rejects points outside polygon', () => { + expect(pointInPolygon({ x: -1, y: 1 }, square)).toBe(false); + }); +}); diff --git a/tests/graph.test.ts b/tests/graph.test.ts new file mode 100644 index 0000000..db46234 --- /dev/null +++ b/tests/graph.test.ts @@ -0,0 +1,61 @@ +import { describe, expect, it } from 'vitest'; +import { graphBFS, graphDFS, topologicalSort } from '../src/graph/traversal.js'; + +describe('graphBFS', () => { + const graph = { + A: [ + { node: 'B' }, + { node: 'C' }, + ], + B: [{ node: 'D' }], + C: [{ node: 'D' }], + D: [], + }; + + it('computes distances from start node', () => { + const distances = graphBFS(graph, 'A'); + expect(Array.from(distances.entries())).toEqual([ + ['A', 0], + ['B', 1], + ['C', 1], + ['D', 2], + ]); + }); + + it('throws when start node missing', () => { + expect(() => graphBFS(graph, 'Z')).toThrow('Start node must exist in graph'); + }); +}); + +describe('graphDFS', () => { + it('visits nodes depth-first without repeats', () => { + const graph = { + A: [{ node: 'B' }, { node: 'C' }], + B: [{ node: 'D' }], + C: [], + D: [], + }; + const visited: string[] = []; + graphDFS(graph, 'A', (node) => visited.push(node)); + expect(visited).toEqual(['A', 'B', 'D', 'C']); + }); +}); + +describe('topologicalSort', () => { + it('produces a valid ordering for DAGs', () => { + const graph = { + cook: [{ node: 'eat' }], + shop: [{ node: 'cook' }], + eat: [], + }; + expect(topologicalSort(graph)).toEqual(['shop', 'cook', 'eat']); + }); + + it('throws on cycles', () => { + const graph = { + A: [{ node: 'B' }], + B: [{ node: 'A' }], + }; + expect(() => topologicalSort(graph)).toThrow('Graph contains a cycle'); + }); +}); diff --git a/tests/levenshtein.test.ts b/tests/levenshtein.test.ts new file mode 100644 index 0000000..ab638fa --- /dev/null +++ b/tests/levenshtein.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest'; +import { levenshteinDistance } from '../src/search/levenshtein.js'; + +describe('levenshteinDistance', () => { + it('computes edit distance between typical strings', () => { + expect(levenshteinDistance('kitten', 'sitting')).toBe(3); + }); + + it('handles empty strings', () => { + expect(levenshteinDistance('', 'abc')).toBe(3); + expect(levenshteinDistance('abc', '')).toBe(3); + }); + + it('returns zero for identical inputs', () => { + expect(levenshteinDistance('same', 'same')).toBe(0); + }); + + it('throws when inputs are not strings', () => { + expect(() => levenshteinDistance('abc', undefined as unknown as string)).toThrow(TypeError); + expect(() => levenshteinDistance(undefined as unknown as string, 'abc')).toThrow(TypeError); + }); +}); diff --git a/tests/search.test.ts b/tests/search.test.ts new file mode 100644 index 0000000..dacf632 --- /dev/null +++ b/tests/search.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, it } from 'vitest'; +import { binarySearch } from '../src/search/binarySearch.js'; +import { fuzzySearch, fuzzyScore } from '../src/search/fuzzy.js'; +import { Trie } from '../src/search/trie.js'; + +describe('binarySearch', () => { + it('finds elements in sorted numeric arrays', () => { + const array = [1, 3, 5, 7, 9]; + expect(binarySearch(array, 1)).toBe(0); + expect(binarySearch(array, 9)).toBe(4); + expect(binarySearch(array, 4)).toBe(-1); + }); + + it('supports custom comparators', () => { + const array = [ + { id: 1, name: 'alpha' }, + { id: 2, name: 'beta' }, + { id: 3, name: 'gamma' }, + ]; + const compare = (a: { id: number }, b: { id: number }) => a.id - b.id; + expect(binarySearch(array, { id: 2, name: '' }, compare)).toBe(1); + }); +}); + +describe('fuzzy matching', () => { + it('ranks matches by score and respects limit', () => { + const items = ['apple', 'grape', 'snap', 'application']; + expect(fuzzySearch('ap', items, 2)).toEqual(['apple', 'application']); + }); + + it('scores consecutive and word-start bonuses', () => { + const base = fuzzyScore('ap', 'map'); + const wordStart = fuzzyScore('ap', 'apple'); + expect(wordStart).toBeGreaterThan(base); + }); + + it('returns empty array for blank queries and throws on invalid items', () => { + expect(fuzzySearch(' ', ['a'])).toEqual([]); + expect(() => fuzzySearch('a', null as unknown as string[])).toThrow(TypeError); + }); +}); + +describe('Trie', () => { + it('supports insert, search, and startsWith operations', () => { + const trie = new Trie(); + trie.insert('cat'); + trie.insert('car'); + trie.insert('cart'); + + expect(trie.search('car')).toBe(true); + expect(trie.search('cap')).toBe(false); + expect(trie.startsWith('ca')).toEqual(['cat', 'car', 'cart']); + }); + + it('throws when inserting non-string values', () => { + const trie = new Trie(); + expect(() => trie.insert(123 as unknown as string)).toThrow(TypeError); + }); +}); diff --git a/tests/spatial.test.ts b/tests/spatial.test.ts index 617880e..6725c51 100644 --- a/tests/spatial.test.ts +++ b/tests/spatial.test.ts @@ -33,6 +33,29 @@ describe('Quadtree', () => { const found = tree.query({ x: 0, y: 0, width: 25, height: 25 }); expect(found.map((p) => ({ x: p.x, y: p.y }))).toEqual([{ x: 10, y: 10 }]); }); + + it('subdivides when capacity exceeded and preserves data', () => { + const tree = new Quadtree<{ id: number }>({ x: 0, y: 0, width: 40, height: 40 }, 1, 0, 4); + tree.insert({ x: 5, y: 5 }, { id: 1 }); + tree.insert({ x: 30, y: 5 }, { id: 2 }); + tree.insert({ x: 5, y: 30 }, { id: 3 }); + + const results = tree.query({ x: 0, y: 0, width: 40, height: 40 }); + expect(results).toHaveLength(3); + expect(results.map((point) => point.data?.id).sort()).toEqual([1, 2, 3]); + }); + + it('supports circular queries and validates inputs', () => { + const tree = new Quadtree({ x: 0, y: 0, width: 40, height: 40 }); + tree.insert({ x: 10, y: 10 }); + tree.insert({ x: 30, y: 10 }); + + const circleHits = tree.queryCircle({ x: 8, y: 8 }, 5); + expect(circleHits.map((p) => ({ x: p.x, y: p.y }))).toEqual([{ x: 10, y: 10 }]); + + expect(() => tree.queryCircle({ x: 'a' as unknown as number, y: 0 }, 5)).toThrow(TypeError); + expect(() => tree.queryCircle({ x: 0, y: 0 }, -1)).toThrow('radius must be a non-negative number.'); + }); }); describe('SAT collision', () => { diff --git a/tests/util.test.ts b/tests/util.test.ts index 9a7f731..fe082db 100644 --- a/tests/util.test.ts +++ b/tests/util.test.ts @@ -2,6 +2,8 @@ import { describe, it, expect } from 'vitest'; import { memoize } from '../src/util/memoize.js'; import { diff } from '../src/data/diff.js'; import { groupBy } from '../src/data/groupBy.js'; +import { deepClone } from '../src/data/deepClone.js'; +import { LRUCache } from '../src/util/lruCache.js'; import { perlin } from '../src/procedural/perlin.js'; describe('memoize', () => { @@ -44,6 +46,59 @@ describe('groupBy', () => { }); }); +describe('deepClone', () => { + it('clones nested collections without sharing references', () => { + const original = { + date: new Date('2024-01-01T00:00:00Z'), + regex: /abc/gi, + map: new Map([ + ['nested', { value: 42 }], + ]), + set: new Set([1, 2]), + list: [1, { inner: ['x', 'y'] }], + }; + const clone = deepClone(original); + + expect(clone).toEqual(original); + expect(clone).not.toBe(original); + expect(clone.map).not.toBe(original.map); + expect(clone.set).not.toBe(original.set); + expect(clone.list).not.toBe(original.list); + expect(clone.list[1]).not.toBe(original.list[1]); + expect(clone.map.get('nested')).not.toBe(original.map.get('nested')); + }); + + it('preserves cyclic references', () => { + const node: { value: number; self?: unknown } = { value: 1 }; + node.self = node; + + const clone = deepClone(node); + expect(clone).not.toBe(node); + expect(clone.self).toBe(clone); + }); +}); + +describe('LRUCache', () => { + it('evicts least recently used entries and updates access order', () => { + const cache = new LRUCache(2); + cache.put('a', 1); + cache.put('b', 2); + expect(cache.get('a')).toBe(1); + + cache.put('c', 3); + expect(cache.get('b')).toBeUndefined(); + expect(cache.get('a')).toBe(1); + expect(cache.get('c')).toBe(3); + + cache.put('a', 4); + expect(cache.get('a')).toBe(4); + }); + + it('throws on invalid capacity', () => { + expect(() => new LRUCache(0)).toThrow('capacity must be a positive integer'); + }); +}); + describe('perlin', () => { it('generates deterministic noise for given seed', () => { const first = perlin({ width: 3, height: 3, seed: 42 }); diff --git a/tests/virtualScroll.test.ts b/tests/virtualScroll.test.ts new file mode 100644 index 0000000..aa6d3a2 --- /dev/null +++ b/tests/virtualScroll.test.ts @@ -0,0 +1,95 @@ +import { describe, expect, it } from 'vitest'; +import { calculateVirtualRange } from '../src/util/virtualScroll.js'; + +describe('calculateVirtualRange', () => { + it('computes window for constant item heights', () => { + const result = calculateVirtualRange({ + itemCount: 1000, + itemHeight: 20, + scrollOffset: 200, + viewportHeight: 100, + }); + + expect(result.startIndex).toBe(9); + expect(result.endIndex).toBe(15); + expect(result.padFront).toBe(180); + expect(result.padEnd).toBe(result.totalSize - result.padFront - result.items.reduce((sum, item) => sum + item.size, 0)); + expect(result.items).toHaveLength(7); + result.items.forEach((item, index) => { + expect(item.offset).toBe(180 + index * 20); + expect(item.size).toBe(20); + }); + }); + + it('honours measurement overrides for specific rows', () => { + const result = calculateVirtualRange({ + itemCount: 5, + itemHeight: 20, + scrollOffset: 0, + viewportHeight: 90, + measurements: [undefined, 40, undefined, 10], + overscan: 0, + }); + + expect(result.startIndex).toBe(0); + expect(result.items[1]).toMatchObject({ index: 1, size: 40 }); + expect(result.items[3]).toMatchObject({ index: 3, size: 10 }); + const totalVisible = result.items.reduce((sum, item) => sum + item.size, 0); + expect(result.totalSize).toBe(5 * 20 + (40 - 20) + (10 - 20)); + expect(result.padEnd).toBe(0); + expect(result.padFront + totalVisible + result.padEnd).toBe(result.totalSize); + }); + + it('returns empty result when list is empty', () => { + const result = calculateVirtualRange({ + itemCount: 0, + itemHeight: 20, + scrollOffset: 0, + viewportHeight: 100, + }); + + expect(result.startIndex).toBe(0); + expect(result.endIndex).toBe(-1); + expect(result.items).toHaveLength(0); + expect(result.totalSize).toBe(0); + }); + + it('validates inputs', () => { + expect(() => + calculateVirtualRange({ + itemCount: -1, + itemHeight: 10, + scrollOffset: 0, + viewportHeight: 10, + }) + ).toThrow(TypeError); + + expect(() => + calculateVirtualRange({ + itemCount: 1, + itemHeight: 0, + scrollOffset: 0, + viewportHeight: 10, + }) + ).toThrow(TypeError); + + expect(() => + calculateVirtualRange({ + itemCount: 1, + itemHeight: 10, + scrollOffset: -1, + viewportHeight: 10, + }) + ).toThrow(TypeError); + + expect(() => + calculateVirtualRange({ + itemCount: 2, + itemHeight: 10, + scrollOffset: 0, + viewportHeight: 10, + measurements: [10, 0], + }) + ).toThrow(TypeError); + }); +}); diff --git a/tests/visual.test.ts b/tests/visual.test.ts new file mode 100644 index 0000000..02ed555 --- /dev/null +++ b/tests/visual.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest'; +import { quadraticBezier, cubicBezier } from '../src/visual/bezier.js'; +import { easing } from '../src/visual/easing.js'; + +describe('quadraticBezier', () => { + it('evaluates curve positions', () => { + const point = quadraticBezier( + { x: 0, y: 0 }, + { x: 1, y: 2 }, + { x: 2, y: 0 }, + 0.5 + ); + expect(point.x).toBeCloseTo(1); + expect(point.y).toBeCloseTo(1); + }); +}); + +describe('cubicBezier', () => { + it('evaluates cubic curve positions', () => { + const point = cubicBezier( + { x: 0, y: 0 }, + { x: 0, y: 1 }, + { x: 1, y: 1 }, + { x: 1, y: 0 }, + 0.5 + ); + expect(point.x).toBeCloseTo(0.5); + expect(point.y).toBeCloseTo(0.75); + }); +}); + +describe('easing', () => { + it('produces expected easing intensities', () => { + expect(easing.linear(0.3)).toBeCloseTo(0.3); + expect(easing.easeInQuad(0.5)).toBeLessThan(easing.linear(0.5)); + expect(easing.easeOutQuad(0.5)).toBeGreaterThan(easing.linear(0.5)); + expect(easing.easeInOutQuad(0)).toBe(0); + expect(easing.easeInOutQuad(1)).toBe(1); + expect(easing.easeInCubic(0.7)).toBeCloseTo(0.343); + expect(easing.easeOutCubic(0)).toBe(0); + expect(easing.easeOutCubic(1)).toBe(1); + }); +}); diff --git a/tests/webPerformance.test.ts b/tests/webPerformance.test.ts new file mode 100644 index 0000000..2321846 --- /dev/null +++ b/tests/webPerformance.test.ts @@ -0,0 +1,86 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { debounce } from '../src/util/debounce.js'; +import { throttle } from '../src/util/throttle.js'; + +afterEach(() => { + vi.clearAllTimers(); + vi.useRealTimers(); + vi.restoreAllMocks(); +}); + +describe('debounce', () => { + it('delays execution until inactivity window closes', () => { + vi.useFakeTimers(); + const spy = vi.fn(); + const debounced = debounce(spy, 100); + + debounced('first'); + vi.advanceTimersByTime(50); + debounced('second'); + vi.advanceTimersByTime(99); + + expect(spy).not.toHaveBeenCalled(); + + vi.advanceTimersByTime(1); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith('second'); + }); + + it('throws when provided invalid arguments', () => { + expect(() => debounce(undefined as unknown as () => void, 10)).toThrow(TypeError); + expect(() => debounce(() => undefined, -1)).toThrow(TypeError); + }); +}); + +describe('throttle', () => { + it('limits call frequency while preserving trailing args', () => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2023-01-01T00:00:00Z')); + const spy = vi.fn(); + const throttled = throttle(spy, 100); + + throttled('initial'); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenLastCalledWith('initial'); + + throttled('second'); + expect(spy).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(90); + throttled('third'); + expect(spy).toHaveBeenCalledTimes(1); + + vi.advanceTimersByTime(10); + expect(spy).toHaveBeenCalledTimes(2); + expect(spy).toHaveBeenLastCalledWith('third'); + }); + + it('clears pending timer when limit elapsed before flush', () => { + vi.useFakeTimers(); + const nowSpy = vi.spyOn(Date, 'now'); + let current = 1_000; + nowSpy.mockImplementation(() => current); + + const spy = vi.fn(); + const clearSpy = vi.spyOn(globalThis, 'clearTimeout'); + const throttled = throttle(spy, 100); + + throttled('first'); + expect(spy).toHaveBeenCalledTimes(1); + + throttled('second'); + expect(spy).toHaveBeenCalledTimes(1); + + current = 1_200; + throttled('third'); + + expect(clearSpy).toHaveBeenCalled(); + expect(spy).toHaveBeenCalledTimes(2); + expect(spy).toHaveBeenLastCalledWith('third'); + }); + + it('throws when provided invalid arguments', () => { + expect(() => throttle(undefined as unknown as () => void, 10)).toThrow(TypeError); + expect(() => throttle(() => undefined, -1)).toThrow(TypeError); + }); +});