├── .gitignore ├── .prettierrc ├── README.md ├── jestconfig.json ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── src ├── db.ts ├── index.ts ├── main.ts ├── node.ts ├── pqueue.ts └── similarity.ts ├── tests └── HNSW.test.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | # Typescript 133 | /dist -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "trailingComma": "all", 4 | "singleQuote": true 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HNSW 2 | 3 | This is a small Typescript package that implements the Hierarchical Navigable Small Worlds algorithm for approximate nearest neighbor search. 4 | 5 | I wrote this package because I wanted to do efficient vector search directly in the client browser. All the other implementations I found for TS were either bindings for libraries written in other languages, or dealt with WASM compilation complexity. 6 | 7 | This is not the fastest, most fully featured, or most memory efficient implementation of HNSW. It is, however, a simple and easy to use implementation that is fast enough for many use cases. 8 | 9 | Included is a simple persistent storage layer that uses IndexedDB to store the graph. 10 | 11 | ## Installation 12 | 13 | ```bash 14 | npm install hnsw 15 | ``` 16 | 17 | ## Usage 18 | 19 | Ephemeral index in-memory: 20 | ```typescript 21 | import { HNSW } from '../src/hnsw'; 22 | 23 | // Simple example 24 | const hnsw = new HNSW(200, 16, 5, 'cosine'); 25 | 26 | // Make some data 27 | const data = [ 28 | {id: 1, vector: [1, 2, 3, 4, 5]}, 29 | {id: 2, vector: [2, 3, 4, 5, 6]}, 30 | {id: 3, vector: [3, 4, 5, 6, 7]}, 31 | {id: 4, vector: [4, 5, 6, 7, 8]}, 32 | {id: 5, vector: [5, 6, 7, 8, 9]} 33 | ] 34 | 35 | // Build the index 36 | await hnsw.buildIndex(data); 37 | 38 | // Search for nearest neighbors 39 | const results = hnsw.searchKNN([6, 7, 8, 9, 10], 2); 40 | console.log(results); 41 | ``` 42 | 43 | Persistent index using IndexedDB: 44 | ```typescript 45 | import { HNSWWithDB } from 'hnsw'; 46 | 47 | // With persistence 48 | const index = await HNSWWithDB.create(200, 16, 'my-index'); 49 | 50 | // Make some data 51 | const data = [ 52 | {id: 1, vector: [1, 2, 3, 4, 5]}, 53 | {id: 2, vector: [2, 3, 4, 5, 6]}, 54 | {id: 3, vector: [3, 4, 5, 6, 7]}, 55 | {id: 4, vector: [4, 5, 6, 7, 8]}, 56 | {id: 5, vector: [5, 6, 7, 8, 9]} 57 | ] 58 | 59 | // Build the index 60 | await index.buildIndex(data); 61 | await index.saveIndex(); 62 | 63 | // Load the index 64 | const index2 = await HNSWWithDB.create(200, 16, 'my-index-2'); 65 | await index2.loadIndex(); 66 | 67 | // Search for nearest neighbors 68 | const results2 = index2.searchKNN([6, 7, 8, 9, 10], 2); 69 | console.log(results2); 70 | 71 | // Delete the index 72 | await index2.deleteIndex(); 73 | ``` 74 | 75 | -------------------------------------------------------------------------------- /jestconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "transform": { 3 | "^.+\\.(t|j)sx?$": "ts-jest" 4 | }, 5 | "testRegex": "(/tests/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", 6 | "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"] 7 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hnsw", 3 | "version": "1.0.3", 4 | "description": "A TypeScript implementation of HNSW (Hierarchical Navigable Small World) algorithm for approximate nearest neighbor search", 5 | "homepage": "https://github.com/deepfates/hnsw#readme", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/deepfates/hnsw.git" 9 | }, 10 | "main": "dist/index.js", 11 | "types": "dist/index.d.ts", 12 | "scripts": { 13 | "test": "jest --config jestconfig.json", 14 | "build": "tsc", 15 | "format": "prettier --write \"src/**/*.ts\"", 16 | "lint": "tslint -p tsconfig.json", 17 | "prepare": "npm run build", 18 | "prepublishOnly": "npm test && npm run lint", 19 | "preversion": "npm run lint", 20 | "version": "npm run format && git add -A src", 21 | "postversion": "git push && git push --tags" 22 | }, 23 | "keywords": [ 24 | "nearest neighbor", 25 | "vector search" 26 | ], 27 | "author": "deepfates.com", 28 | "license": "MIT", 29 | "dependencies": { 30 | "idb": "^7.1.1" 31 | }, 32 | "devDependencies": { 33 | "@types/jest": "^29.5.1", 34 | "jest": "^29.5.0", 35 | "prettier": "^2.8.8", 36 | "ts-jest": "^29.1.0", 37 | "tslint": "^6.1.3", 38 | "tslint-config-prettier": "^1.18.0", 39 | "typescript": "^5.0.4" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | idb: 12 | specifier: ^7.1.1 13 | version: 7.1.1 14 | devDependencies: 15 | '@types/jest': 16 | specifier: ^29.5.1 17 | version: 29.5.14 18 | jest: 19 | specifier: ^29.5.0 20 | version: 29.7.0(@types/node@22.10.5) 21 | prettier: 22 | specifier: ^2.8.8 23 | version: 2.8.8 24 | ts-jest: 25 | specifier: ^29.1.0 26 | version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.10.5))(typescript@5.7.2) 27 | tslint: 28 | specifier: ^6.1.3 29 | version: 6.1.3(typescript@5.7.2) 30 | tslint-config-prettier: 31 | specifier: ^1.18.0 32 | version: 1.18.0 33 | typescript: 34 | specifier: ^5.0.4 35 | version: 5.7.2 36 | 37 | packages: 38 | 39 | '@ampproject/remapping@2.3.0': 40 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 41 | engines: {node: '>=6.0.0'} 42 | 43 | '@babel/code-frame@7.26.2': 44 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 45 | engines: {node: '>=6.9.0'} 46 | 47 | '@babel/compat-data@7.26.3': 48 | resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} 49 | engines: {node: '>=6.9.0'} 50 | 51 | '@babel/core@7.26.0': 52 | resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} 53 | engines: {node: '>=6.9.0'} 54 | 55 | '@babel/generator@7.26.3': 56 | resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} 57 | engines: {node: '>=6.9.0'} 58 | 59 | '@babel/helper-compilation-targets@7.25.9': 60 | resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} 61 | engines: {node: '>=6.9.0'} 62 | 63 | '@babel/helper-module-imports@7.25.9': 64 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 65 | engines: {node: '>=6.9.0'} 66 | 67 | '@babel/helper-module-transforms@7.26.0': 68 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 69 | engines: {node: '>=6.9.0'} 70 | peerDependencies: 71 | '@babel/core': ^7.0.0 72 | 73 | '@babel/helper-plugin-utils@7.25.9': 74 | resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} 75 | engines: {node: '>=6.9.0'} 76 | 77 | '@babel/helper-string-parser@7.25.9': 78 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 79 | engines: {node: '>=6.9.0'} 80 | 81 | '@babel/helper-validator-identifier@7.25.9': 82 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 83 | engines: {node: '>=6.9.0'} 84 | 85 | '@babel/helper-validator-option@7.25.9': 86 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 87 | engines: {node: '>=6.9.0'} 88 | 89 | '@babel/helpers@7.26.0': 90 | resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} 91 | engines: {node: '>=6.9.0'} 92 | 93 | '@babel/parser@7.26.3': 94 | resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} 95 | engines: {node: '>=6.0.0'} 96 | hasBin: true 97 | 98 | '@babel/plugin-syntax-async-generators@7.8.4': 99 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 100 | peerDependencies: 101 | '@babel/core': ^7.0.0-0 102 | 103 | '@babel/plugin-syntax-bigint@7.8.3': 104 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 105 | peerDependencies: 106 | '@babel/core': ^7.0.0-0 107 | 108 | '@babel/plugin-syntax-class-properties@7.12.13': 109 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 110 | peerDependencies: 111 | '@babel/core': ^7.0.0-0 112 | 113 | '@babel/plugin-syntax-class-static-block@7.14.5': 114 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 115 | engines: {node: '>=6.9.0'} 116 | peerDependencies: 117 | '@babel/core': ^7.0.0-0 118 | 119 | '@babel/plugin-syntax-import-attributes@7.26.0': 120 | resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} 121 | engines: {node: '>=6.9.0'} 122 | peerDependencies: 123 | '@babel/core': ^7.0.0-0 124 | 125 | '@babel/plugin-syntax-import-meta@7.10.4': 126 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 127 | peerDependencies: 128 | '@babel/core': ^7.0.0-0 129 | 130 | '@babel/plugin-syntax-json-strings@7.8.3': 131 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 132 | peerDependencies: 133 | '@babel/core': ^7.0.0-0 134 | 135 | '@babel/plugin-syntax-jsx@7.25.9': 136 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 137 | engines: {node: '>=6.9.0'} 138 | peerDependencies: 139 | '@babel/core': ^7.0.0-0 140 | 141 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 142 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 143 | peerDependencies: 144 | '@babel/core': ^7.0.0-0 145 | 146 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 147 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 148 | peerDependencies: 149 | '@babel/core': ^7.0.0-0 150 | 151 | '@babel/plugin-syntax-numeric-separator@7.10.4': 152 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 153 | peerDependencies: 154 | '@babel/core': ^7.0.0-0 155 | 156 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 157 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 158 | peerDependencies: 159 | '@babel/core': ^7.0.0-0 160 | 161 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 162 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 163 | peerDependencies: 164 | '@babel/core': ^7.0.0-0 165 | 166 | '@babel/plugin-syntax-optional-chaining@7.8.3': 167 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 168 | peerDependencies: 169 | '@babel/core': ^7.0.0-0 170 | 171 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 172 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 173 | engines: {node: '>=6.9.0'} 174 | peerDependencies: 175 | '@babel/core': ^7.0.0-0 176 | 177 | '@babel/plugin-syntax-top-level-await@7.14.5': 178 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 179 | engines: {node: '>=6.9.0'} 180 | peerDependencies: 181 | '@babel/core': ^7.0.0-0 182 | 183 | '@babel/plugin-syntax-typescript@7.25.9': 184 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 185 | engines: {node: '>=6.9.0'} 186 | peerDependencies: 187 | '@babel/core': ^7.0.0-0 188 | 189 | '@babel/template@7.25.9': 190 | resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} 191 | engines: {node: '>=6.9.0'} 192 | 193 | '@babel/traverse@7.26.4': 194 | resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} 195 | engines: {node: '>=6.9.0'} 196 | 197 | '@babel/types@7.26.3': 198 | resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} 199 | engines: {node: '>=6.9.0'} 200 | 201 | '@bcoe/v8-coverage@0.2.3': 202 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 203 | 204 | '@istanbuljs/load-nyc-config@1.1.0': 205 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 206 | engines: {node: '>=8'} 207 | 208 | '@istanbuljs/schema@0.1.3': 209 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 210 | engines: {node: '>=8'} 211 | 212 | '@jest/console@29.7.0': 213 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 214 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 215 | 216 | '@jest/core@29.7.0': 217 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 218 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 219 | peerDependencies: 220 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 221 | peerDependenciesMeta: 222 | node-notifier: 223 | optional: true 224 | 225 | '@jest/environment@29.7.0': 226 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 227 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 228 | 229 | '@jest/expect-utils@29.7.0': 230 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 231 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 232 | 233 | '@jest/expect@29.7.0': 234 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 235 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 236 | 237 | '@jest/fake-timers@29.7.0': 238 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 239 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 240 | 241 | '@jest/globals@29.7.0': 242 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 243 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 244 | 245 | '@jest/reporters@29.7.0': 246 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 247 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 248 | peerDependencies: 249 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 250 | peerDependenciesMeta: 251 | node-notifier: 252 | optional: true 253 | 254 | '@jest/schemas@29.6.3': 255 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 256 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 257 | 258 | '@jest/source-map@29.6.3': 259 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 260 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 261 | 262 | '@jest/test-result@29.7.0': 263 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 264 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 265 | 266 | '@jest/test-sequencer@29.7.0': 267 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 268 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 269 | 270 | '@jest/transform@29.7.0': 271 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 272 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 273 | 274 | '@jest/types@29.6.3': 275 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 276 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 277 | 278 | '@jridgewell/gen-mapping@0.3.8': 279 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 280 | engines: {node: '>=6.0.0'} 281 | 282 | '@jridgewell/resolve-uri@3.1.2': 283 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 284 | engines: {node: '>=6.0.0'} 285 | 286 | '@jridgewell/set-array@1.2.1': 287 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 288 | engines: {node: '>=6.0.0'} 289 | 290 | '@jridgewell/sourcemap-codec@1.5.0': 291 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 292 | 293 | '@jridgewell/trace-mapping@0.3.25': 294 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 295 | 296 | '@sinclair/typebox@0.27.8': 297 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 298 | 299 | '@sinonjs/commons@3.0.1': 300 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 301 | 302 | '@sinonjs/fake-timers@10.3.0': 303 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 304 | 305 | '@types/babel__core@7.20.5': 306 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 307 | 308 | '@types/babel__generator@7.6.8': 309 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 310 | 311 | '@types/babel__template@7.4.4': 312 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 313 | 314 | '@types/babel__traverse@7.20.6': 315 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 316 | 317 | '@types/graceful-fs@4.1.9': 318 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 319 | 320 | '@types/istanbul-lib-coverage@2.0.6': 321 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 322 | 323 | '@types/istanbul-lib-report@3.0.3': 324 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 325 | 326 | '@types/istanbul-reports@3.0.4': 327 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 328 | 329 | '@types/jest@29.5.14': 330 | resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} 331 | 332 | '@types/node@22.10.5': 333 | resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} 334 | 335 | '@types/stack-utils@2.0.3': 336 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 337 | 338 | '@types/yargs-parser@21.0.3': 339 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 340 | 341 | '@types/yargs@17.0.33': 342 | resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} 343 | 344 | ansi-escapes@4.3.2: 345 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 346 | engines: {node: '>=8'} 347 | 348 | ansi-regex@5.0.1: 349 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 350 | engines: {node: '>=8'} 351 | 352 | ansi-styles@3.2.1: 353 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 354 | engines: {node: '>=4'} 355 | 356 | ansi-styles@4.3.0: 357 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 358 | engines: {node: '>=8'} 359 | 360 | ansi-styles@5.2.0: 361 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 362 | engines: {node: '>=10'} 363 | 364 | anymatch@3.1.3: 365 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 366 | engines: {node: '>= 8'} 367 | 368 | argparse@1.0.10: 369 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 370 | 371 | async@3.2.6: 372 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 373 | 374 | babel-jest@29.7.0: 375 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 376 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 377 | peerDependencies: 378 | '@babel/core': ^7.8.0 379 | 380 | babel-plugin-istanbul@6.1.1: 381 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 382 | engines: {node: '>=8'} 383 | 384 | babel-plugin-jest-hoist@29.6.3: 385 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 386 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 387 | 388 | babel-preset-current-node-syntax@1.1.0: 389 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 390 | peerDependencies: 391 | '@babel/core': ^7.0.0 392 | 393 | babel-preset-jest@29.6.3: 394 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 395 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 396 | peerDependencies: 397 | '@babel/core': ^7.0.0 398 | 399 | balanced-match@1.0.2: 400 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 401 | 402 | brace-expansion@1.1.11: 403 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 404 | 405 | brace-expansion@2.0.1: 406 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 407 | 408 | braces@3.0.3: 409 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 410 | engines: {node: '>=8'} 411 | 412 | browserslist@4.24.3: 413 | resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} 414 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 415 | hasBin: true 416 | 417 | bs-logger@0.2.6: 418 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 419 | engines: {node: '>= 6'} 420 | 421 | bser@2.1.1: 422 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 423 | 424 | buffer-from@1.1.2: 425 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 426 | 427 | builtin-modules@1.1.1: 428 | resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} 429 | engines: {node: '>=0.10.0'} 430 | 431 | callsites@3.1.0: 432 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 433 | engines: {node: '>=6'} 434 | 435 | camelcase@5.3.1: 436 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 437 | engines: {node: '>=6'} 438 | 439 | camelcase@6.3.0: 440 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 441 | engines: {node: '>=10'} 442 | 443 | caniuse-lite@1.0.30001690: 444 | resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} 445 | 446 | chalk@2.4.2: 447 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 448 | engines: {node: '>=4'} 449 | 450 | chalk@4.1.2: 451 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 452 | engines: {node: '>=10'} 453 | 454 | char-regex@1.0.2: 455 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 456 | engines: {node: '>=10'} 457 | 458 | ci-info@3.9.0: 459 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 460 | engines: {node: '>=8'} 461 | 462 | cjs-module-lexer@1.4.1: 463 | resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} 464 | 465 | cliui@8.0.1: 466 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 467 | engines: {node: '>=12'} 468 | 469 | co@4.6.0: 470 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 471 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 472 | 473 | collect-v8-coverage@1.0.2: 474 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 475 | 476 | color-convert@1.9.3: 477 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 478 | 479 | color-convert@2.0.1: 480 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 481 | engines: {node: '>=7.0.0'} 482 | 483 | color-name@1.1.3: 484 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 485 | 486 | color-name@1.1.4: 487 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 488 | 489 | commander@2.20.3: 490 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 491 | 492 | concat-map@0.0.1: 493 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 494 | 495 | convert-source-map@2.0.0: 496 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 497 | 498 | create-jest@29.7.0: 499 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 500 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 501 | hasBin: true 502 | 503 | cross-spawn@7.0.6: 504 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 505 | engines: {node: '>= 8'} 506 | 507 | debug@4.4.0: 508 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 509 | engines: {node: '>=6.0'} 510 | peerDependencies: 511 | supports-color: '*' 512 | peerDependenciesMeta: 513 | supports-color: 514 | optional: true 515 | 516 | dedent@1.5.3: 517 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 518 | peerDependencies: 519 | babel-plugin-macros: ^3.1.0 520 | peerDependenciesMeta: 521 | babel-plugin-macros: 522 | optional: true 523 | 524 | deepmerge@4.3.1: 525 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 526 | engines: {node: '>=0.10.0'} 527 | 528 | detect-newline@3.1.0: 529 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 530 | engines: {node: '>=8'} 531 | 532 | diff-sequences@29.6.3: 533 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 534 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 535 | 536 | diff@4.0.2: 537 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 538 | engines: {node: '>=0.3.1'} 539 | 540 | ejs@3.1.10: 541 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 542 | engines: {node: '>=0.10.0'} 543 | hasBin: true 544 | 545 | electron-to-chromium@1.5.76: 546 | resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} 547 | 548 | emittery@0.13.1: 549 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 550 | engines: {node: '>=12'} 551 | 552 | emoji-regex@8.0.0: 553 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 554 | 555 | error-ex@1.3.2: 556 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 557 | 558 | escalade@3.2.0: 559 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 560 | engines: {node: '>=6'} 561 | 562 | escape-string-regexp@1.0.5: 563 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 564 | engines: {node: '>=0.8.0'} 565 | 566 | escape-string-regexp@2.0.0: 567 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 568 | engines: {node: '>=8'} 569 | 570 | esprima@4.0.1: 571 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 572 | engines: {node: '>=4'} 573 | hasBin: true 574 | 575 | execa@5.1.1: 576 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 577 | engines: {node: '>=10'} 578 | 579 | exit@0.1.2: 580 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 581 | engines: {node: '>= 0.8.0'} 582 | 583 | expect@29.7.0: 584 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 585 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 586 | 587 | fast-json-stable-stringify@2.1.0: 588 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 589 | 590 | fb-watchman@2.0.2: 591 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 592 | 593 | filelist@1.0.4: 594 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 595 | 596 | fill-range@7.1.1: 597 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 598 | engines: {node: '>=8'} 599 | 600 | find-up@4.1.0: 601 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 602 | engines: {node: '>=8'} 603 | 604 | fs.realpath@1.0.0: 605 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 606 | 607 | fsevents@2.3.3: 608 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 609 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 610 | os: [darwin] 611 | 612 | function-bind@1.1.2: 613 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 614 | 615 | gensync@1.0.0-beta.2: 616 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 617 | engines: {node: '>=6.9.0'} 618 | 619 | get-caller-file@2.0.5: 620 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 621 | engines: {node: 6.* || 8.* || >= 10.*} 622 | 623 | get-package-type@0.1.0: 624 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 625 | engines: {node: '>=8.0.0'} 626 | 627 | get-stream@6.0.1: 628 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 629 | engines: {node: '>=10'} 630 | 631 | glob@7.2.3: 632 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 633 | deprecated: Glob versions prior to v9 are no longer supported 634 | 635 | globals@11.12.0: 636 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 637 | engines: {node: '>=4'} 638 | 639 | graceful-fs@4.2.11: 640 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 641 | 642 | has-flag@3.0.0: 643 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 644 | engines: {node: '>=4'} 645 | 646 | has-flag@4.0.0: 647 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 648 | engines: {node: '>=8'} 649 | 650 | hasown@2.0.2: 651 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 652 | engines: {node: '>= 0.4'} 653 | 654 | html-escaper@2.0.2: 655 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 656 | 657 | human-signals@2.1.0: 658 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 659 | engines: {node: '>=10.17.0'} 660 | 661 | idb@7.1.1: 662 | resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} 663 | 664 | import-local@3.2.0: 665 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 666 | engines: {node: '>=8'} 667 | hasBin: true 668 | 669 | imurmurhash@0.1.4: 670 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 671 | engines: {node: '>=0.8.19'} 672 | 673 | inflight@1.0.6: 674 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 675 | 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. 676 | 677 | inherits@2.0.4: 678 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 679 | 680 | is-arrayish@0.2.1: 681 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 682 | 683 | is-core-module@2.16.1: 684 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 685 | engines: {node: '>= 0.4'} 686 | 687 | is-fullwidth-code-point@3.0.0: 688 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 689 | engines: {node: '>=8'} 690 | 691 | is-generator-fn@2.1.0: 692 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 693 | engines: {node: '>=6'} 694 | 695 | is-number@7.0.0: 696 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 697 | engines: {node: '>=0.12.0'} 698 | 699 | is-stream@2.0.1: 700 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 701 | engines: {node: '>=8'} 702 | 703 | isexe@2.0.0: 704 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 705 | 706 | istanbul-lib-coverage@3.2.2: 707 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 708 | engines: {node: '>=8'} 709 | 710 | istanbul-lib-instrument@5.2.1: 711 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 712 | engines: {node: '>=8'} 713 | 714 | istanbul-lib-instrument@6.0.3: 715 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 716 | engines: {node: '>=10'} 717 | 718 | istanbul-lib-report@3.0.1: 719 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 720 | engines: {node: '>=10'} 721 | 722 | istanbul-lib-source-maps@4.0.1: 723 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 724 | engines: {node: '>=10'} 725 | 726 | istanbul-reports@3.1.7: 727 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 728 | engines: {node: '>=8'} 729 | 730 | jake@10.9.2: 731 | resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} 732 | engines: {node: '>=10'} 733 | hasBin: true 734 | 735 | jest-changed-files@29.7.0: 736 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 737 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 738 | 739 | jest-circus@29.7.0: 740 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 741 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 742 | 743 | jest-cli@29.7.0: 744 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 745 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 746 | hasBin: true 747 | peerDependencies: 748 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 749 | peerDependenciesMeta: 750 | node-notifier: 751 | optional: true 752 | 753 | jest-config@29.7.0: 754 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 755 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 756 | peerDependencies: 757 | '@types/node': '*' 758 | ts-node: '>=9.0.0' 759 | peerDependenciesMeta: 760 | '@types/node': 761 | optional: true 762 | ts-node: 763 | optional: true 764 | 765 | jest-diff@29.7.0: 766 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 767 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 768 | 769 | jest-docblock@29.7.0: 770 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 771 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 772 | 773 | jest-each@29.7.0: 774 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 775 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 776 | 777 | jest-environment-node@29.7.0: 778 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 779 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 780 | 781 | jest-get-type@29.6.3: 782 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 783 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 784 | 785 | jest-haste-map@29.7.0: 786 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 787 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 788 | 789 | jest-leak-detector@29.7.0: 790 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 791 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 792 | 793 | jest-matcher-utils@29.7.0: 794 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 795 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 796 | 797 | jest-message-util@29.7.0: 798 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 799 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 800 | 801 | jest-mock@29.7.0: 802 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 803 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 804 | 805 | jest-pnp-resolver@1.2.3: 806 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 807 | engines: {node: '>=6'} 808 | peerDependencies: 809 | jest-resolve: '*' 810 | peerDependenciesMeta: 811 | jest-resolve: 812 | optional: true 813 | 814 | jest-regex-util@29.6.3: 815 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 816 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 817 | 818 | jest-resolve-dependencies@29.7.0: 819 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 820 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 821 | 822 | jest-resolve@29.7.0: 823 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 824 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 825 | 826 | jest-runner@29.7.0: 827 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 828 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 829 | 830 | jest-runtime@29.7.0: 831 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 832 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 833 | 834 | jest-snapshot@29.7.0: 835 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 836 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 837 | 838 | jest-util@29.7.0: 839 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 840 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 841 | 842 | jest-validate@29.7.0: 843 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 844 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 845 | 846 | jest-watcher@29.7.0: 847 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 848 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 849 | 850 | jest-worker@29.7.0: 851 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 852 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 853 | 854 | jest@29.7.0: 855 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 856 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 857 | hasBin: true 858 | peerDependencies: 859 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 860 | peerDependenciesMeta: 861 | node-notifier: 862 | optional: true 863 | 864 | js-tokens@4.0.0: 865 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 866 | 867 | js-yaml@3.14.1: 868 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 869 | hasBin: true 870 | 871 | jsesc@3.1.0: 872 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 873 | engines: {node: '>=6'} 874 | hasBin: true 875 | 876 | json-parse-even-better-errors@2.3.1: 877 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 878 | 879 | json5@2.2.3: 880 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 881 | engines: {node: '>=6'} 882 | hasBin: true 883 | 884 | kleur@3.0.3: 885 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 886 | engines: {node: '>=6'} 887 | 888 | leven@3.1.0: 889 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 890 | engines: {node: '>=6'} 891 | 892 | lines-and-columns@1.2.4: 893 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 894 | 895 | locate-path@5.0.0: 896 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 897 | engines: {node: '>=8'} 898 | 899 | lodash.memoize@4.1.2: 900 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 901 | 902 | lru-cache@5.1.1: 903 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 904 | 905 | make-dir@4.0.0: 906 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 907 | engines: {node: '>=10'} 908 | 909 | make-error@1.3.6: 910 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 911 | 912 | makeerror@1.0.12: 913 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 914 | 915 | merge-stream@2.0.0: 916 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 917 | 918 | micromatch@4.0.8: 919 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 920 | engines: {node: '>=8.6'} 921 | 922 | mimic-fn@2.1.0: 923 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 924 | engines: {node: '>=6'} 925 | 926 | minimatch@3.1.2: 927 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 928 | 929 | minimatch@5.1.6: 930 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 931 | engines: {node: '>=10'} 932 | 933 | minimist@1.2.8: 934 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 935 | 936 | mkdirp@0.5.6: 937 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 938 | hasBin: true 939 | 940 | ms@2.1.3: 941 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 942 | 943 | natural-compare@1.4.0: 944 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 945 | 946 | node-int64@0.4.0: 947 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 948 | 949 | node-releases@2.0.19: 950 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 951 | 952 | normalize-path@3.0.0: 953 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 954 | engines: {node: '>=0.10.0'} 955 | 956 | npm-run-path@4.0.1: 957 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 958 | engines: {node: '>=8'} 959 | 960 | once@1.4.0: 961 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 962 | 963 | onetime@5.1.2: 964 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 965 | engines: {node: '>=6'} 966 | 967 | p-limit@2.3.0: 968 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 969 | engines: {node: '>=6'} 970 | 971 | p-limit@3.1.0: 972 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 973 | engines: {node: '>=10'} 974 | 975 | p-locate@4.1.0: 976 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 977 | engines: {node: '>=8'} 978 | 979 | p-try@2.2.0: 980 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 981 | engines: {node: '>=6'} 982 | 983 | parse-json@5.2.0: 984 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 985 | engines: {node: '>=8'} 986 | 987 | path-exists@4.0.0: 988 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 989 | engines: {node: '>=8'} 990 | 991 | path-is-absolute@1.0.1: 992 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 993 | engines: {node: '>=0.10.0'} 994 | 995 | path-key@3.1.1: 996 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 997 | engines: {node: '>=8'} 998 | 999 | path-parse@1.0.7: 1000 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1001 | 1002 | picocolors@1.1.1: 1003 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1004 | 1005 | picomatch@2.3.1: 1006 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1007 | engines: {node: '>=8.6'} 1008 | 1009 | pirates@4.0.6: 1010 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1011 | engines: {node: '>= 6'} 1012 | 1013 | pkg-dir@4.2.0: 1014 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1015 | engines: {node: '>=8'} 1016 | 1017 | prettier@2.8.8: 1018 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 1019 | engines: {node: '>=10.13.0'} 1020 | hasBin: true 1021 | 1022 | pretty-format@29.7.0: 1023 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1024 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1025 | 1026 | prompts@2.4.2: 1027 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1028 | engines: {node: '>= 6'} 1029 | 1030 | pure-rand@6.1.0: 1031 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 1032 | 1033 | react-is@18.3.1: 1034 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 1035 | 1036 | require-directory@2.1.1: 1037 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1038 | engines: {node: '>=0.10.0'} 1039 | 1040 | resolve-cwd@3.0.0: 1041 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1042 | engines: {node: '>=8'} 1043 | 1044 | resolve-from@5.0.0: 1045 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1046 | engines: {node: '>=8'} 1047 | 1048 | resolve.exports@2.0.3: 1049 | resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} 1050 | engines: {node: '>=10'} 1051 | 1052 | resolve@1.22.10: 1053 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1054 | engines: {node: '>= 0.4'} 1055 | hasBin: true 1056 | 1057 | semver@5.7.2: 1058 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1059 | hasBin: true 1060 | 1061 | semver@6.3.1: 1062 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1063 | hasBin: true 1064 | 1065 | semver@7.6.3: 1066 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1067 | engines: {node: '>=10'} 1068 | hasBin: true 1069 | 1070 | shebang-command@2.0.0: 1071 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1072 | engines: {node: '>=8'} 1073 | 1074 | shebang-regex@3.0.0: 1075 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1076 | engines: {node: '>=8'} 1077 | 1078 | signal-exit@3.0.7: 1079 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1080 | 1081 | sisteransi@1.0.5: 1082 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1083 | 1084 | slash@3.0.0: 1085 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1086 | engines: {node: '>=8'} 1087 | 1088 | source-map-support@0.5.13: 1089 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1090 | 1091 | source-map@0.6.1: 1092 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1093 | engines: {node: '>=0.10.0'} 1094 | 1095 | sprintf-js@1.0.3: 1096 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1097 | 1098 | stack-utils@2.0.6: 1099 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1100 | engines: {node: '>=10'} 1101 | 1102 | string-length@4.0.2: 1103 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1104 | engines: {node: '>=10'} 1105 | 1106 | string-width@4.2.3: 1107 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1108 | engines: {node: '>=8'} 1109 | 1110 | strip-ansi@6.0.1: 1111 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1112 | engines: {node: '>=8'} 1113 | 1114 | strip-bom@4.0.0: 1115 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1116 | engines: {node: '>=8'} 1117 | 1118 | strip-final-newline@2.0.0: 1119 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1120 | engines: {node: '>=6'} 1121 | 1122 | strip-json-comments@3.1.1: 1123 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1124 | engines: {node: '>=8'} 1125 | 1126 | supports-color@5.5.0: 1127 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1128 | engines: {node: '>=4'} 1129 | 1130 | supports-color@7.2.0: 1131 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1132 | engines: {node: '>=8'} 1133 | 1134 | supports-color@8.1.1: 1135 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1136 | engines: {node: '>=10'} 1137 | 1138 | supports-preserve-symlinks-flag@1.0.0: 1139 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1140 | engines: {node: '>= 0.4'} 1141 | 1142 | test-exclude@6.0.0: 1143 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1144 | engines: {node: '>=8'} 1145 | 1146 | tmpl@1.0.5: 1147 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1148 | 1149 | to-regex-range@5.0.1: 1150 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1151 | engines: {node: '>=8.0'} 1152 | 1153 | ts-jest@29.2.5: 1154 | resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} 1155 | engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} 1156 | hasBin: true 1157 | peerDependencies: 1158 | '@babel/core': '>=7.0.0-beta.0 <8' 1159 | '@jest/transform': ^29.0.0 1160 | '@jest/types': ^29.0.0 1161 | babel-jest: ^29.0.0 1162 | esbuild: '*' 1163 | jest: ^29.0.0 1164 | typescript: '>=4.3 <6' 1165 | peerDependenciesMeta: 1166 | '@babel/core': 1167 | optional: true 1168 | '@jest/transform': 1169 | optional: true 1170 | '@jest/types': 1171 | optional: true 1172 | babel-jest: 1173 | optional: true 1174 | esbuild: 1175 | optional: true 1176 | 1177 | tslib@1.14.1: 1178 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1179 | 1180 | tslint-config-prettier@1.18.0: 1181 | resolution: {integrity: sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==} 1182 | engines: {node: '>=4.0.0'} 1183 | hasBin: true 1184 | 1185 | tslint@6.1.3: 1186 | resolution: {integrity: sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==} 1187 | engines: {node: '>=4.8.0'} 1188 | deprecated: TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information. 1189 | hasBin: true 1190 | peerDependencies: 1191 | typescript: '>=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev' 1192 | 1193 | tsutils@2.29.0: 1194 | resolution: {integrity: sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==} 1195 | peerDependencies: 1196 | typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev' 1197 | 1198 | type-detect@4.0.8: 1199 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1200 | engines: {node: '>=4'} 1201 | 1202 | type-fest@0.21.3: 1203 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1204 | engines: {node: '>=10'} 1205 | 1206 | typescript@5.7.2: 1207 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 1208 | engines: {node: '>=14.17'} 1209 | hasBin: true 1210 | 1211 | undici-types@6.20.0: 1212 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1213 | 1214 | update-browserslist-db@1.1.1: 1215 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 1216 | hasBin: true 1217 | peerDependencies: 1218 | browserslist: '>= 4.21.0' 1219 | 1220 | v8-to-istanbul@9.3.0: 1221 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 1222 | engines: {node: '>=10.12.0'} 1223 | 1224 | walker@1.0.8: 1225 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1226 | 1227 | which@2.0.2: 1228 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1229 | engines: {node: '>= 8'} 1230 | hasBin: true 1231 | 1232 | wrap-ansi@7.0.0: 1233 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1234 | engines: {node: '>=10'} 1235 | 1236 | wrappy@1.0.2: 1237 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1238 | 1239 | write-file-atomic@4.0.2: 1240 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1241 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1242 | 1243 | y18n@5.0.8: 1244 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1245 | engines: {node: '>=10'} 1246 | 1247 | yallist@3.1.1: 1248 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1249 | 1250 | yargs-parser@21.1.1: 1251 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1252 | engines: {node: '>=12'} 1253 | 1254 | yargs@17.7.2: 1255 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1256 | engines: {node: '>=12'} 1257 | 1258 | yocto-queue@0.1.0: 1259 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1260 | engines: {node: '>=10'} 1261 | 1262 | snapshots: 1263 | 1264 | '@ampproject/remapping@2.3.0': 1265 | dependencies: 1266 | '@jridgewell/gen-mapping': 0.3.8 1267 | '@jridgewell/trace-mapping': 0.3.25 1268 | 1269 | '@babel/code-frame@7.26.2': 1270 | dependencies: 1271 | '@babel/helper-validator-identifier': 7.25.9 1272 | js-tokens: 4.0.0 1273 | picocolors: 1.1.1 1274 | 1275 | '@babel/compat-data@7.26.3': {} 1276 | 1277 | '@babel/core@7.26.0': 1278 | dependencies: 1279 | '@ampproject/remapping': 2.3.0 1280 | '@babel/code-frame': 7.26.2 1281 | '@babel/generator': 7.26.3 1282 | '@babel/helper-compilation-targets': 7.25.9 1283 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) 1284 | '@babel/helpers': 7.26.0 1285 | '@babel/parser': 7.26.3 1286 | '@babel/template': 7.25.9 1287 | '@babel/traverse': 7.26.4 1288 | '@babel/types': 7.26.3 1289 | convert-source-map: 2.0.0 1290 | debug: 4.4.0 1291 | gensync: 1.0.0-beta.2 1292 | json5: 2.2.3 1293 | semver: 6.3.1 1294 | transitivePeerDependencies: 1295 | - supports-color 1296 | 1297 | '@babel/generator@7.26.3': 1298 | dependencies: 1299 | '@babel/parser': 7.26.3 1300 | '@babel/types': 7.26.3 1301 | '@jridgewell/gen-mapping': 0.3.8 1302 | '@jridgewell/trace-mapping': 0.3.25 1303 | jsesc: 3.1.0 1304 | 1305 | '@babel/helper-compilation-targets@7.25.9': 1306 | dependencies: 1307 | '@babel/compat-data': 7.26.3 1308 | '@babel/helper-validator-option': 7.25.9 1309 | browserslist: 4.24.3 1310 | lru-cache: 5.1.1 1311 | semver: 6.3.1 1312 | 1313 | '@babel/helper-module-imports@7.25.9': 1314 | dependencies: 1315 | '@babel/traverse': 7.26.4 1316 | '@babel/types': 7.26.3 1317 | transitivePeerDependencies: 1318 | - supports-color 1319 | 1320 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': 1321 | dependencies: 1322 | '@babel/core': 7.26.0 1323 | '@babel/helper-module-imports': 7.25.9 1324 | '@babel/helper-validator-identifier': 7.25.9 1325 | '@babel/traverse': 7.26.4 1326 | transitivePeerDependencies: 1327 | - supports-color 1328 | 1329 | '@babel/helper-plugin-utils@7.25.9': {} 1330 | 1331 | '@babel/helper-string-parser@7.25.9': {} 1332 | 1333 | '@babel/helper-validator-identifier@7.25.9': {} 1334 | 1335 | '@babel/helper-validator-option@7.25.9': {} 1336 | 1337 | '@babel/helpers@7.26.0': 1338 | dependencies: 1339 | '@babel/template': 7.25.9 1340 | '@babel/types': 7.26.3 1341 | 1342 | '@babel/parser@7.26.3': 1343 | dependencies: 1344 | '@babel/types': 7.26.3 1345 | 1346 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': 1347 | dependencies: 1348 | '@babel/core': 7.26.0 1349 | '@babel/helper-plugin-utils': 7.25.9 1350 | 1351 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': 1352 | dependencies: 1353 | '@babel/core': 7.26.0 1354 | '@babel/helper-plugin-utils': 7.25.9 1355 | 1356 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': 1357 | dependencies: 1358 | '@babel/core': 7.26.0 1359 | '@babel/helper-plugin-utils': 7.25.9 1360 | 1361 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': 1362 | dependencies: 1363 | '@babel/core': 7.26.0 1364 | '@babel/helper-plugin-utils': 7.25.9 1365 | 1366 | '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': 1367 | dependencies: 1368 | '@babel/core': 7.26.0 1369 | '@babel/helper-plugin-utils': 7.25.9 1370 | 1371 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': 1372 | dependencies: 1373 | '@babel/core': 7.26.0 1374 | '@babel/helper-plugin-utils': 7.25.9 1375 | 1376 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': 1377 | dependencies: 1378 | '@babel/core': 7.26.0 1379 | '@babel/helper-plugin-utils': 7.25.9 1380 | 1381 | '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': 1382 | dependencies: 1383 | '@babel/core': 7.26.0 1384 | '@babel/helper-plugin-utils': 7.25.9 1385 | 1386 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': 1387 | dependencies: 1388 | '@babel/core': 7.26.0 1389 | '@babel/helper-plugin-utils': 7.25.9 1390 | 1391 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': 1392 | dependencies: 1393 | '@babel/core': 7.26.0 1394 | '@babel/helper-plugin-utils': 7.25.9 1395 | 1396 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': 1397 | dependencies: 1398 | '@babel/core': 7.26.0 1399 | '@babel/helper-plugin-utils': 7.25.9 1400 | 1401 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': 1402 | dependencies: 1403 | '@babel/core': 7.26.0 1404 | '@babel/helper-plugin-utils': 7.25.9 1405 | 1406 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': 1407 | dependencies: 1408 | '@babel/core': 7.26.0 1409 | '@babel/helper-plugin-utils': 7.25.9 1410 | 1411 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': 1412 | dependencies: 1413 | '@babel/core': 7.26.0 1414 | '@babel/helper-plugin-utils': 7.25.9 1415 | 1416 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': 1417 | dependencies: 1418 | '@babel/core': 7.26.0 1419 | '@babel/helper-plugin-utils': 7.25.9 1420 | 1421 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': 1422 | dependencies: 1423 | '@babel/core': 7.26.0 1424 | '@babel/helper-plugin-utils': 7.25.9 1425 | 1426 | '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': 1427 | dependencies: 1428 | '@babel/core': 7.26.0 1429 | '@babel/helper-plugin-utils': 7.25.9 1430 | 1431 | '@babel/template@7.25.9': 1432 | dependencies: 1433 | '@babel/code-frame': 7.26.2 1434 | '@babel/parser': 7.26.3 1435 | '@babel/types': 7.26.3 1436 | 1437 | '@babel/traverse@7.26.4': 1438 | dependencies: 1439 | '@babel/code-frame': 7.26.2 1440 | '@babel/generator': 7.26.3 1441 | '@babel/parser': 7.26.3 1442 | '@babel/template': 7.25.9 1443 | '@babel/types': 7.26.3 1444 | debug: 4.4.0 1445 | globals: 11.12.0 1446 | transitivePeerDependencies: 1447 | - supports-color 1448 | 1449 | '@babel/types@7.26.3': 1450 | dependencies: 1451 | '@babel/helper-string-parser': 7.25.9 1452 | '@babel/helper-validator-identifier': 7.25.9 1453 | 1454 | '@bcoe/v8-coverage@0.2.3': {} 1455 | 1456 | '@istanbuljs/load-nyc-config@1.1.0': 1457 | dependencies: 1458 | camelcase: 5.3.1 1459 | find-up: 4.1.0 1460 | get-package-type: 0.1.0 1461 | js-yaml: 3.14.1 1462 | resolve-from: 5.0.0 1463 | 1464 | '@istanbuljs/schema@0.1.3': {} 1465 | 1466 | '@jest/console@29.7.0': 1467 | dependencies: 1468 | '@jest/types': 29.6.3 1469 | '@types/node': 22.10.5 1470 | chalk: 4.1.2 1471 | jest-message-util: 29.7.0 1472 | jest-util: 29.7.0 1473 | slash: 3.0.0 1474 | 1475 | '@jest/core@29.7.0': 1476 | dependencies: 1477 | '@jest/console': 29.7.0 1478 | '@jest/reporters': 29.7.0 1479 | '@jest/test-result': 29.7.0 1480 | '@jest/transform': 29.7.0 1481 | '@jest/types': 29.6.3 1482 | '@types/node': 22.10.5 1483 | ansi-escapes: 4.3.2 1484 | chalk: 4.1.2 1485 | ci-info: 3.9.0 1486 | exit: 0.1.2 1487 | graceful-fs: 4.2.11 1488 | jest-changed-files: 29.7.0 1489 | jest-config: 29.7.0(@types/node@22.10.5) 1490 | jest-haste-map: 29.7.0 1491 | jest-message-util: 29.7.0 1492 | jest-regex-util: 29.6.3 1493 | jest-resolve: 29.7.0 1494 | jest-resolve-dependencies: 29.7.0 1495 | jest-runner: 29.7.0 1496 | jest-runtime: 29.7.0 1497 | jest-snapshot: 29.7.0 1498 | jest-util: 29.7.0 1499 | jest-validate: 29.7.0 1500 | jest-watcher: 29.7.0 1501 | micromatch: 4.0.8 1502 | pretty-format: 29.7.0 1503 | slash: 3.0.0 1504 | strip-ansi: 6.0.1 1505 | transitivePeerDependencies: 1506 | - babel-plugin-macros 1507 | - supports-color 1508 | - ts-node 1509 | 1510 | '@jest/environment@29.7.0': 1511 | dependencies: 1512 | '@jest/fake-timers': 29.7.0 1513 | '@jest/types': 29.6.3 1514 | '@types/node': 22.10.5 1515 | jest-mock: 29.7.0 1516 | 1517 | '@jest/expect-utils@29.7.0': 1518 | dependencies: 1519 | jest-get-type: 29.6.3 1520 | 1521 | '@jest/expect@29.7.0': 1522 | dependencies: 1523 | expect: 29.7.0 1524 | jest-snapshot: 29.7.0 1525 | transitivePeerDependencies: 1526 | - supports-color 1527 | 1528 | '@jest/fake-timers@29.7.0': 1529 | dependencies: 1530 | '@jest/types': 29.6.3 1531 | '@sinonjs/fake-timers': 10.3.0 1532 | '@types/node': 22.10.5 1533 | jest-message-util: 29.7.0 1534 | jest-mock: 29.7.0 1535 | jest-util: 29.7.0 1536 | 1537 | '@jest/globals@29.7.0': 1538 | dependencies: 1539 | '@jest/environment': 29.7.0 1540 | '@jest/expect': 29.7.0 1541 | '@jest/types': 29.6.3 1542 | jest-mock: 29.7.0 1543 | transitivePeerDependencies: 1544 | - supports-color 1545 | 1546 | '@jest/reporters@29.7.0': 1547 | dependencies: 1548 | '@bcoe/v8-coverage': 0.2.3 1549 | '@jest/console': 29.7.0 1550 | '@jest/test-result': 29.7.0 1551 | '@jest/transform': 29.7.0 1552 | '@jest/types': 29.6.3 1553 | '@jridgewell/trace-mapping': 0.3.25 1554 | '@types/node': 22.10.5 1555 | chalk: 4.1.2 1556 | collect-v8-coverage: 1.0.2 1557 | exit: 0.1.2 1558 | glob: 7.2.3 1559 | graceful-fs: 4.2.11 1560 | istanbul-lib-coverage: 3.2.2 1561 | istanbul-lib-instrument: 6.0.3 1562 | istanbul-lib-report: 3.0.1 1563 | istanbul-lib-source-maps: 4.0.1 1564 | istanbul-reports: 3.1.7 1565 | jest-message-util: 29.7.0 1566 | jest-util: 29.7.0 1567 | jest-worker: 29.7.0 1568 | slash: 3.0.0 1569 | string-length: 4.0.2 1570 | strip-ansi: 6.0.1 1571 | v8-to-istanbul: 9.3.0 1572 | transitivePeerDependencies: 1573 | - supports-color 1574 | 1575 | '@jest/schemas@29.6.3': 1576 | dependencies: 1577 | '@sinclair/typebox': 0.27.8 1578 | 1579 | '@jest/source-map@29.6.3': 1580 | dependencies: 1581 | '@jridgewell/trace-mapping': 0.3.25 1582 | callsites: 3.1.0 1583 | graceful-fs: 4.2.11 1584 | 1585 | '@jest/test-result@29.7.0': 1586 | dependencies: 1587 | '@jest/console': 29.7.0 1588 | '@jest/types': 29.6.3 1589 | '@types/istanbul-lib-coverage': 2.0.6 1590 | collect-v8-coverage: 1.0.2 1591 | 1592 | '@jest/test-sequencer@29.7.0': 1593 | dependencies: 1594 | '@jest/test-result': 29.7.0 1595 | graceful-fs: 4.2.11 1596 | jest-haste-map: 29.7.0 1597 | slash: 3.0.0 1598 | 1599 | '@jest/transform@29.7.0': 1600 | dependencies: 1601 | '@babel/core': 7.26.0 1602 | '@jest/types': 29.6.3 1603 | '@jridgewell/trace-mapping': 0.3.25 1604 | babel-plugin-istanbul: 6.1.1 1605 | chalk: 4.1.2 1606 | convert-source-map: 2.0.0 1607 | fast-json-stable-stringify: 2.1.0 1608 | graceful-fs: 4.2.11 1609 | jest-haste-map: 29.7.0 1610 | jest-regex-util: 29.6.3 1611 | jest-util: 29.7.0 1612 | micromatch: 4.0.8 1613 | pirates: 4.0.6 1614 | slash: 3.0.0 1615 | write-file-atomic: 4.0.2 1616 | transitivePeerDependencies: 1617 | - supports-color 1618 | 1619 | '@jest/types@29.6.3': 1620 | dependencies: 1621 | '@jest/schemas': 29.6.3 1622 | '@types/istanbul-lib-coverage': 2.0.6 1623 | '@types/istanbul-reports': 3.0.4 1624 | '@types/node': 22.10.5 1625 | '@types/yargs': 17.0.33 1626 | chalk: 4.1.2 1627 | 1628 | '@jridgewell/gen-mapping@0.3.8': 1629 | dependencies: 1630 | '@jridgewell/set-array': 1.2.1 1631 | '@jridgewell/sourcemap-codec': 1.5.0 1632 | '@jridgewell/trace-mapping': 0.3.25 1633 | 1634 | '@jridgewell/resolve-uri@3.1.2': {} 1635 | 1636 | '@jridgewell/set-array@1.2.1': {} 1637 | 1638 | '@jridgewell/sourcemap-codec@1.5.0': {} 1639 | 1640 | '@jridgewell/trace-mapping@0.3.25': 1641 | dependencies: 1642 | '@jridgewell/resolve-uri': 3.1.2 1643 | '@jridgewell/sourcemap-codec': 1.5.0 1644 | 1645 | '@sinclair/typebox@0.27.8': {} 1646 | 1647 | '@sinonjs/commons@3.0.1': 1648 | dependencies: 1649 | type-detect: 4.0.8 1650 | 1651 | '@sinonjs/fake-timers@10.3.0': 1652 | dependencies: 1653 | '@sinonjs/commons': 3.0.1 1654 | 1655 | '@types/babel__core@7.20.5': 1656 | dependencies: 1657 | '@babel/parser': 7.26.3 1658 | '@babel/types': 7.26.3 1659 | '@types/babel__generator': 7.6.8 1660 | '@types/babel__template': 7.4.4 1661 | '@types/babel__traverse': 7.20.6 1662 | 1663 | '@types/babel__generator@7.6.8': 1664 | dependencies: 1665 | '@babel/types': 7.26.3 1666 | 1667 | '@types/babel__template@7.4.4': 1668 | dependencies: 1669 | '@babel/parser': 7.26.3 1670 | '@babel/types': 7.26.3 1671 | 1672 | '@types/babel__traverse@7.20.6': 1673 | dependencies: 1674 | '@babel/types': 7.26.3 1675 | 1676 | '@types/graceful-fs@4.1.9': 1677 | dependencies: 1678 | '@types/node': 22.10.5 1679 | 1680 | '@types/istanbul-lib-coverage@2.0.6': {} 1681 | 1682 | '@types/istanbul-lib-report@3.0.3': 1683 | dependencies: 1684 | '@types/istanbul-lib-coverage': 2.0.6 1685 | 1686 | '@types/istanbul-reports@3.0.4': 1687 | dependencies: 1688 | '@types/istanbul-lib-report': 3.0.3 1689 | 1690 | '@types/jest@29.5.14': 1691 | dependencies: 1692 | expect: 29.7.0 1693 | pretty-format: 29.7.0 1694 | 1695 | '@types/node@22.10.5': 1696 | dependencies: 1697 | undici-types: 6.20.0 1698 | 1699 | '@types/stack-utils@2.0.3': {} 1700 | 1701 | '@types/yargs-parser@21.0.3': {} 1702 | 1703 | '@types/yargs@17.0.33': 1704 | dependencies: 1705 | '@types/yargs-parser': 21.0.3 1706 | 1707 | ansi-escapes@4.3.2: 1708 | dependencies: 1709 | type-fest: 0.21.3 1710 | 1711 | ansi-regex@5.0.1: {} 1712 | 1713 | ansi-styles@3.2.1: 1714 | dependencies: 1715 | color-convert: 1.9.3 1716 | 1717 | ansi-styles@4.3.0: 1718 | dependencies: 1719 | color-convert: 2.0.1 1720 | 1721 | ansi-styles@5.2.0: {} 1722 | 1723 | anymatch@3.1.3: 1724 | dependencies: 1725 | normalize-path: 3.0.0 1726 | picomatch: 2.3.1 1727 | 1728 | argparse@1.0.10: 1729 | dependencies: 1730 | sprintf-js: 1.0.3 1731 | 1732 | async@3.2.6: {} 1733 | 1734 | babel-jest@29.7.0(@babel/core@7.26.0): 1735 | dependencies: 1736 | '@babel/core': 7.26.0 1737 | '@jest/transform': 29.7.0 1738 | '@types/babel__core': 7.20.5 1739 | babel-plugin-istanbul: 6.1.1 1740 | babel-preset-jest: 29.6.3(@babel/core@7.26.0) 1741 | chalk: 4.1.2 1742 | graceful-fs: 4.2.11 1743 | slash: 3.0.0 1744 | transitivePeerDependencies: 1745 | - supports-color 1746 | 1747 | babel-plugin-istanbul@6.1.1: 1748 | dependencies: 1749 | '@babel/helper-plugin-utils': 7.25.9 1750 | '@istanbuljs/load-nyc-config': 1.1.0 1751 | '@istanbuljs/schema': 0.1.3 1752 | istanbul-lib-instrument: 5.2.1 1753 | test-exclude: 6.0.0 1754 | transitivePeerDependencies: 1755 | - supports-color 1756 | 1757 | babel-plugin-jest-hoist@29.6.3: 1758 | dependencies: 1759 | '@babel/template': 7.25.9 1760 | '@babel/types': 7.26.3 1761 | '@types/babel__core': 7.20.5 1762 | '@types/babel__traverse': 7.20.6 1763 | 1764 | babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): 1765 | dependencies: 1766 | '@babel/core': 7.26.0 1767 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) 1768 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) 1769 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) 1770 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) 1771 | '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) 1772 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) 1773 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) 1774 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) 1775 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) 1776 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) 1777 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) 1778 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) 1779 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) 1780 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) 1781 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) 1782 | 1783 | babel-preset-jest@29.6.3(@babel/core@7.26.0): 1784 | dependencies: 1785 | '@babel/core': 7.26.0 1786 | babel-plugin-jest-hoist: 29.6.3 1787 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) 1788 | 1789 | balanced-match@1.0.2: {} 1790 | 1791 | brace-expansion@1.1.11: 1792 | dependencies: 1793 | balanced-match: 1.0.2 1794 | concat-map: 0.0.1 1795 | 1796 | brace-expansion@2.0.1: 1797 | dependencies: 1798 | balanced-match: 1.0.2 1799 | 1800 | braces@3.0.3: 1801 | dependencies: 1802 | fill-range: 7.1.1 1803 | 1804 | browserslist@4.24.3: 1805 | dependencies: 1806 | caniuse-lite: 1.0.30001690 1807 | electron-to-chromium: 1.5.76 1808 | node-releases: 2.0.19 1809 | update-browserslist-db: 1.1.1(browserslist@4.24.3) 1810 | 1811 | bs-logger@0.2.6: 1812 | dependencies: 1813 | fast-json-stable-stringify: 2.1.0 1814 | 1815 | bser@2.1.1: 1816 | dependencies: 1817 | node-int64: 0.4.0 1818 | 1819 | buffer-from@1.1.2: {} 1820 | 1821 | builtin-modules@1.1.1: {} 1822 | 1823 | callsites@3.1.0: {} 1824 | 1825 | camelcase@5.3.1: {} 1826 | 1827 | camelcase@6.3.0: {} 1828 | 1829 | caniuse-lite@1.0.30001690: {} 1830 | 1831 | chalk@2.4.2: 1832 | dependencies: 1833 | ansi-styles: 3.2.1 1834 | escape-string-regexp: 1.0.5 1835 | supports-color: 5.5.0 1836 | 1837 | chalk@4.1.2: 1838 | dependencies: 1839 | ansi-styles: 4.3.0 1840 | supports-color: 7.2.0 1841 | 1842 | char-regex@1.0.2: {} 1843 | 1844 | ci-info@3.9.0: {} 1845 | 1846 | cjs-module-lexer@1.4.1: {} 1847 | 1848 | cliui@8.0.1: 1849 | dependencies: 1850 | string-width: 4.2.3 1851 | strip-ansi: 6.0.1 1852 | wrap-ansi: 7.0.0 1853 | 1854 | co@4.6.0: {} 1855 | 1856 | collect-v8-coverage@1.0.2: {} 1857 | 1858 | color-convert@1.9.3: 1859 | dependencies: 1860 | color-name: 1.1.3 1861 | 1862 | color-convert@2.0.1: 1863 | dependencies: 1864 | color-name: 1.1.4 1865 | 1866 | color-name@1.1.3: {} 1867 | 1868 | color-name@1.1.4: {} 1869 | 1870 | commander@2.20.3: {} 1871 | 1872 | concat-map@0.0.1: {} 1873 | 1874 | convert-source-map@2.0.0: {} 1875 | 1876 | create-jest@29.7.0(@types/node@22.10.5): 1877 | dependencies: 1878 | '@jest/types': 29.6.3 1879 | chalk: 4.1.2 1880 | exit: 0.1.2 1881 | graceful-fs: 4.2.11 1882 | jest-config: 29.7.0(@types/node@22.10.5) 1883 | jest-util: 29.7.0 1884 | prompts: 2.4.2 1885 | transitivePeerDependencies: 1886 | - '@types/node' 1887 | - babel-plugin-macros 1888 | - supports-color 1889 | - ts-node 1890 | 1891 | cross-spawn@7.0.6: 1892 | dependencies: 1893 | path-key: 3.1.1 1894 | shebang-command: 2.0.0 1895 | which: 2.0.2 1896 | 1897 | debug@4.4.0: 1898 | dependencies: 1899 | ms: 2.1.3 1900 | 1901 | dedent@1.5.3: {} 1902 | 1903 | deepmerge@4.3.1: {} 1904 | 1905 | detect-newline@3.1.0: {} 1906 | 1907 | diff-sequences@29.6.3: {} 1908 | 1909 | diff@4.0.2: {} 1910 | 1911 | ejs@3.1.10: 1912 | dependencies: 1913 | jake: 10.9.2 1914 | 1915 | electron-to-chromium@1.5.76: {} 1916 | 1917 | emittery@0.13.1: {} 1918 | 1919 | emoji-regex@8.0.0: {} 1920 | 1921 | error-ex@1.3.2: 1922 | dependencies: 1923 | is-arrayish: 0.2.1 1924 | 1925 | escalade@3.2.0: {} 1926 | 1927 | escape-string-regexp@1.0.5: {} 1928 | 1929 | escape-string-regexp@2.0.0: {} 1930 | 1931 | esprima@4.0.1: {} 1932 | 1933 | execa@5.1.1: 1934 | dependencies: 1935 | cross-spawn: 7.0.6 1936 | get-stream: 6.0.1 1937 | human-signals: 2.1.0 1938 | is-stream: 2.0.1 1939 | merge-stream: 2.0.0 1940 | npm-run-path: 4.0.1 1941 | onetime: 5.1.2 1942 | signal-exit: 3.0.7 1943 | strip-final-newline: 2.0.0 1944 | 1945 | exit@0.1.2: {} 1946 | 1947 | expect@29.7.0: 1948 | dependencies: 1949 | '@jest/expect-utils': 29.7.0 1950 | jest-get-type: 29.6.3 1951 | jest-matcher-utils: 29.7.0 1952 | jest-message-util: 29.7.0 1953 | jest-util: 29.7.0 1954 | 1955 | fast-json-stable-stringify@2.1.0: {} 1956 | 1957 | fb-watchman@2.0.2: 1958 | dependencies: 1959 | bser: 2.1.1 1960 | 1961 | filelist@1.0.4: 1962 | dependencies: 1963 | minimatch: 5.1.6 1964 | 1965 | fill-range@7.1.1: 1966 | dependencies: 1967 | to-regex-range: 5.0.1 1968 | 1969 | find-up@4.1.0: 1970 | dependencies: 1971 | locate-path: 5.0.0 1972 | path-exists: 4.0.0 1973 | 1974 | fs.realpath@1.0.0: {} 1975 | 1976 | fsevents@2.3.3: 1977 | optional: true 1978 | 1979 | function-bind@1.1.2: {} 1980 | 1981 | gensync@1.0.0-beta.2: {} 1982 | 1983 | get-caller-file@2.0.5: {} 1984 | 1985 | get-package-type@0.1.0: {} 1986 | 1987 | get-stream@6.0.1: {} 1988 | 1989 | glob@7.2.3: 1990 | dependencies: 1991 | fs.realpath: 1.0.0 1992 | inflight: 1.0.6 1993 | inherits: 2.0.4 1994 | minimatch: 3.1.2 1995 | once: 1.4.0 1996 | path-is-absolute: 1.0.1 1997 | 1998 | globals@11.12.0: {} 1999 | 2000 | graceful-fs@4.2.11: {} 2001 | 2002 | has-flag@3.0.0: {} 2003 | 2004 | has-flag@4.0.0: {} 2005 | 2006 | hasown@2.0.2: 2007 | dependencies: 2008 | function-bind: 1.1.2 2009 | 2010 | html-escaper@2.0.2: {} 2011 | 2012 | human-signals@2.1.0: {} 2013 | 2014 | idb@7.1.1: {} 2015 | 2016 | import-local@3.2.0: 2017 | dependencies: 2018 | pkg-dir: 4.2.0 2019 | resolve-cwd: 3.0.0 2020 | 2021 | imurmurhash@0.1.4: {} 2022 | 2023 | inflight@1.0.6: 2024 | dependencies: 2025 | once: 1.4.0 2026 | wrappy: 1.0.2 2027 | 2028 | inherits@2.0.4: {} 2029 | 2030 | is-arrayish@0.2.1: {} 2031 | 2032 | is-core-module@2.16.1: 2033 | dependencies: 2034 | hasown: 2.0.2 2035 | 2036 | is-fullwidth-code-point@3.0.0: {} 2037 | 2038 | is-generator-fn@2.1.0: {} 2039 | 2040 | is-number@7.0.0: {} 2041 | 2042 | is-stream@2.0.1: {} 2043 | 2044 | isexe@2.0.0: {} 2045 | 2046 | istanbul-lib-coverage@3.2.2: {} 2047 | 2048 | istanbul-lib-instrument@5.2.1: 2049 | dependencies: 2050 | '@babel/core': 7.26.0 2051 | '@babel/parser': 7.26.3 2052 | '@istanbuljs/schema': 0.1.3 2053 | istanbul-lib-coverage: 3.2.2 2054 | semver: 6.3.1 2055 | transitivePeerDependencies: 2056 | - supports-color 2057 | 2058 | istanbul-lib-instrument@6.0.3: 2059 | dependencies: 2060 | '@babel/core': 7.26.0 2061 | '@babel/parser': 7.26.3 2062 | '@istanbuljs/schema': 0.1.3 2063 | istanbul-lib-coverage: 3.2.2 2064 | semver: 7.6.3 2065 | transitivePeerDependencies: 2066 | - supports-color 2067 | 2068 | istanbul-lib-report@3.0.1: 2069 | dependencies: 2070 | istanbul-lib-coverage: 3.2.2 2071 | make-dir: 4.0.0 2072 | supports-color: 7.2.0 2073 | 2074 | istanbul-lib-source-maps@4.0.1: 2075 | dependencies: 2076 | debug: 4.4.0 2077 | istanbul-lib-coverage: 3.2.2 2078 | source-map: 0.6.1 2079 | transitivePeerDependencies: 2080 | - supports-color 2081 | 2082 | istanbul-reports@3.1.7: 2083 | dependencies: 2084 | html-escaper: 2.0.2 2085 | istanbul-lib-report: 3.0.1 2086 | 2087 | jake@10.9.2: 2088 | dependencies: 2089 | async: 3.2.6 2090 | chalk: 4.1.2 2091 | filelist: 1.0.4 2092 | minimatch: 3.1.2 2093 | 2094 | jest-changed-files@29.7.0: 2095 | dependencies: 2096 | execa: 5.1.1 2097 | jest-util: 29.7.0 2098 | p-limit: 3.1.0 2099 | 2100 | jest-circus@29.7.0: 2101 | dependencies: 2102 | '@jest/environment': 29.7.0 2103 | '@jest/expect': 29.7.0 2104 | '@jest/test-result': 29.7.0 2105 | '@jest/types': 29.6.3 2106 | '@types/node': 22.10.5 2107 | chalk: 4.1.2 2108 | co: 4.6.0 2109 | dedent: 1.5.3 2110 | is-generator-fn: 2.1.0 2111 | jest-each: 29.7.0 2112 | jest-matcher-utils: 29.7.0 2113 | jest-message-util: 29.7.0 2114 | jest-runtime: 29.7.0 2115 | jest-snapshot: 29.7.0 2116 | jest-util: 29.7.0 2117 | p-limit: 3.1.0 2118 | pretty-format: 29.7.0 2119 | pure-rand: 6.1.0 2120 | slash: 3.0.0 2121 | stack-utils: 2.0.6 2122 | transitivePeerDependencies: 2123 | - babel-plugin-macros 2124 | - supports-color 2125 | 2126 | jest-cli@29.7.0(@types/node@22.10.5): 2127 | dependencies: 2128 | '@jest/core': 29.7.0 2129 | '@jest/test-result': 29.7.0 2130 | '@jest/types': 29.6.3 2131 | chalk: 4.1.2 2132 | create-jest: 29.7.0(@types/node@22.10.5) 2133 | exit: 0.1.2 2134 | import-local: 3.2.0 2135 | jest-config: 29.7.0(@types/node@22.10.5) 2136 | jest-util: 29.7.0 2137 | jest-validate: 29.7.0 2138 | yargs: 17.7.2 2139 | transitivePeerDependencies: 2140 | - '@types/node' 2141 | - babel-plugin-macros 2142 | - supports-color 2143 | - ts-node 2144 | 2145 | jest-config@29.7.0(@types/node@22.10.5): 2146 | dependencies: 2147 | '@babel/core': 7.26.0 2148 | '@jest/test-sequencer': 29.7.0 2149 | '@jest/types': 29.6.3 2150 | babel-jest: 29.7.0(@babel/core@7.26.0) 2151 | chalk: 4.1.2 2152 | ci-info: 3.9.0 2153 | deepmerge: 4.3.1 2154 | glob: 7.2.3 2155 | graceful-fs: 4.2.11 2156 | jest-circus: 29.7.0 2157 | jest-environment-node: 29.7.0 2158 | jest-get-type: 29.6.3 2159 | jest-regex-util: 29.6.3 2160 | jest-resolve: 29.7.0 2161 | jest-runner: 29.7.0 2162 | jest-util: 29.7.0 2163 | jest-validate: 29.7.0 2164 | micromatch: 4.0.8 2165 | parse-json: 5.2.0 2166 | pretty-format: 29.7.0 2167 | slash: 3.0.0 2168 | strip-json-comments: 3.1.1 2169 | optionalDependencies: 2170 | '@types/node': 22.10.5 2171 | transitivePeerDependencies: 2172 | - babel-plugin-macros 2173 | - supports-color 2174 | 2175 | jest-diff@29.7.0: 2176 | dependencies: 2177 | chalk: 4.1.2 2178 | diff-sequences: 29.6.3 2179 | jest-get-type: 29.6.3 2180 | pretty-format: 29.7.0 2181 | 2182 | jest-docblock@29.7.0: 2183 | dependencies: 2184 | detect-newline: 3.1.0 2185 | 2186 | jest-each@29.7.0: 2187 | dependencies: 2188 | '@jest/types': 29.6.3 2189 | chalk: 4.1.2 2190 | jest-get-type: 29.6.3 2191 | jest-util: 29.7.0 2192 | pretty-format: 29.7.0 2193 | 2194 | jest-environment-node@29.7.0: 2195 | dependencies: 2196 | '@jest/environment': 29.7.0 2197 | '@jest/fake-timers': 29.7.0 2198 | '@jest/types': 29.6.3 2199 | '@types/node': 22.10.5 2200 | jest-mock: 29.7.0 2201 | jest-util: 29.7.0 2202 | 2203 | jest-get-type@29.6.3: {} 2204 | 2205 | jest-haste-map@29.7.0: 2206 | dependencies: 2207 | '@jest/types': 29.6.3 2208 | '@types/graceful-fs': 4.1.9 2209 | '@types/node': 22.10.5 2210 | anymatch: 3.1.3 2211 | fb-watchman: 2.0.2 2212 | graceful-fs: 4.2.11 2213 | jest-regex-util: 29.6.3 2214 | jest-util: 29.7.0 2215 | jest-worker: 29.7.0 2216 | micromatch: 4.0.8 2217 | walker: 1.0.8 2218 | optionalDependencies: 2219 | fsevents: 2.3.3 2220 | 2221 | jest-leak-detector@29.7.0: 2222 | dependencies: 2223 | jest-get-type: 29.6.3 2224 | pretty-format: 29.7.0 2225 | 2226 | jest-matcher-utils@29.7.0: 2227 | dependencies: 2228 | chalk: 4.1.2 2229 | jest-diff: 29.7.0 2230 | jest-get-type: 29.6.3 2231 | pretty-format: 29.7.0 2232 | 2233 | jest-message-util@29.7.0: 2234 | dependencies: 2235 | '@babel/code-frame': 7.26.2 2236 | '@jest/types': 29.6.3 2237 | '@types/stack-utils': 2.0.3 2238 | chalk: 4.1.2 2239 | graceful-fs: 4.2.11 2240 | micromatch: 4.0.8 2241 | pretty-format: 29.7.0 2242 | slash: 3.0.0 2243 | stack-utils: 2.0.6 2244 | 2245 | jest-mock@29.7.0: 2246 | dependencies: 2247 | '@jest/types': 29.6.3 2248 | '@types/node': 22.10.5 2249 | jest-util: 29.7.0 2250 | 2251 | jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2252 | optionalDependencies: 2253 | jest-resolve: 29.7.0 2254 | 2255 | jest-regex-util@29.6.3: {} 2256 | 2257 | jest-resolve-dependencies@29.7.0: 2258 | dependencies: 2259 | jest-regex-util: 29.6.3 2260 | jest-snapshot: 29.7.0 2261 | transitivePeerDependencies: 2262 | - supports-color 2263 | 2264 | jest-resolve@29.7.0: 2265 | dependencies: 2266 | chalk: 4.1.2 2267 | graceful-fs: 4.2.11 2268 | jest-haste-map: 29.7.0 2269 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2270 | jest-util: 29.7.0 2271 | jest-validate: 29.7.0 2272 | resolve: 1.22.10 2273 | resolve.exports: 2.0.3 2274 | slash: 3.0.0 2275 | 2276 | jest-runner@29.7.0: 2277 | dependencies: 2278 | '@jest/console': 29.7.0 2279 | '@jest/environment': 29.7.0 2280 | '@jest/test-result': 29.7.0 2281 | '@jest/transform': 29.7.0 2282 | '@jest/types': 29.6.3 2283 | '@types/node': 22.10.5 2284 | chalk: 4.1.2 2285 | emittery: 0.13.1 2286 | graceful-fs: 4.2.11 2287 | jest-docblock: 29.7.0 2288 | jest-environment-node: 29.7.0 2289 | jest-haste-map: 29.7.0 2290 | jest-leak-detector: 29.7.0 2291 | jest-message-util: 29.7.0 2292 | jest-resolve: 29.7.0 2293 | jest-runtime: 29.7.0 2294 | jest-util: 29.7.0 2295 | jest-watcher: 29.7.0 2296 | jest-worker: 29.7.0 2297 | p-limit: 3.1.0 2298 | source-map-support: 0.5.13 2299 | transitivePeerDependencies: 2300 | - supports-color 2301 | 2302 | jest-runtime@29.7.0: 2303 | dependencies: 2304 | '@jest/environment': 29.7.0 2305 | '@jest/fake-timers': 29.7.0 2306 | '@jest/globals': 29.7.0 2307 | '@jest/source-map': 29.6.3 2308 | '@jest/test-result': 29.7.0 2309 | '@jest/transform': 29.7.0 2310 | '@jest/types': 29.6.3 2311 | '@types/node': 22.10.5 2312 | chalk: 4.1.2 2313 | cjs-module-lexer: 1.4.1 2314 | collect-v8-coverage: 1.0.2 2315 | glob: 7.2.3 2316 | graceful-fs: 4.2.11 2317 | jest-haste-map: 29.7.0 2318 | jest-message-util: 29.7.0 2319 | jest-mock: 29.7.0 2320 | jest-regex-util: 29.6.3 2321 | jest-resolve: 29.7.0 2322 | jest-snapshot: 29.7.0 2323 | jest-util: 29.7.0 2324 | slash: 3.0.0 2325 | strip-bom: 4.0.0 2326 | transitivePeerDependencies: 2327 | - supports-color 2328 | 2329 | jest-snapshot@29.7.0: 2330 | dependencies: 2331 | '@babel/core': 7.26.0 2332 | '@babel/generator': 7.26.3 2333 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) 2334 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) 2335 | '@babel/types': 7.26.3 2336 | '@jest/expect-utils': 29.7.0 2337 | '@jest/transform': 29.7.0 2338 | '@jest/types': 29.6.3 2339 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) 2340 | chalk: 4.1.2 2341 | expect: 29.7.0 2342 | graceful-fs: 4.2.11 2343 | jest-diff: 29.7.0 2344 | jest-get-type: 29.6.3 2345 | jest-matcher-utils: 29.7.0 2346 | jest-message-util: 29.7.0 2347 | jest-util: 29.7.0 2348 | natural-compare: 1.4.0 2349 | pretty-format: 29.7.0 2350 | semver: 7.6.3 2351 | transitivePeerDependencies: 2352 | - supports-color 2353 | 2354 | jest-util@29.7.0: 2355 | dependencies: 2356 | '@jest/types': 29.6.3 2357 | '@types/node': 22.10.5 2358 | chalk: 4.1.2 2359 | ci-info: 3.9.0 2360 | graceful-fs: 4.2.11 2361 | picomatch: 2.3.1 2362 | 2363 | jest-validate@29.7.0: 2364 | dependencies: 2365 | '@jest/types': 29.6.3 2366 | camelcase: 6.3.0 2367 | chalk: 4.1.2 2368 | jest-get-type: 29.6.3 2369 | leven: 3.1.0 2370 | pretty-format: 29.7.0 2371 | 2372 | jest-watcher@29.7.0: 2373 | dependencies: 2374 | '@jest/test-result': 29.7.0 2375 | '@jest/types': 29.6.3 2376 | '@types/node': 22.10.5 2377 | ansi-escapes: 4.3.2 2378 | chalk: 4.1.2 2379 | emittery: 0.13.1 2380 | jest-util: 29.7.0 2381 | string-length: 4.0.2 2382 | 2383 | jest-worker@29.7.0: 2384 | dependencies: 2385 | '@types/node': 22.10.5 2386 | jest-util: 29.7.0 2387 | merge-stream: 2.0.0 2388 | supports-color: 8.1.1 2389 | 2390 | jest@29.7.0(@types/node@22.10.5): 2391 | dependencies: 2392 | '@jest/core': 29.7.0 2393 | '@jest/types': 29.6.3 2394 | import-local: 3.2.0 2395 | jest-cli: 29.7.0(@types/node@22.10.5) 2396 | transitivePeerDependencies: 2397 | - '@types/node' 2398 | - babel-plugin-macros 2399 | - supports-color 2400 | - ts-node 2401 | 2402 | js-tokens@4.0.0: {} 2403 | 2404 | js-yaml@3.14.1: 2405 | dependencies: 2406 | argparse: 1.0.10 2407 | esprima: 4.0.1 2408 | 2409 | jsesc@3.1.0: {} 2410 | 2411 | json-parse-even-better-errors@2.3.1: {} 2412 | 2413 | json5@2.2.3: {} 2414 | 2415 | kleur@3.0.3: {} 2416 | 2417 | leven@3.1.0: {} 2418 | 2419 | lines-and-columns@1.2.4: {} 2420 | 2421 | locate-path@5.0.0: 2422 | dependencies: 2423 | p-locate: 4.1.0 2424 | 2425 | lodash.memoize@4.1.2: {} 2426 | 2427 | lru-cache@5.1.1: 2428 | dependencies: 2429 | yallist: 3.1.1 2430 | 2431 | make-dir@4.0.0: 2432 | dependencies: 2433 | semver: 7.6.3 2434 | 2435 | make-error@1.3.6: {} 2436 | 2437 | makeerror@1.0.12: 2438 | dependencies: 2439 | tmpl: 1.0.5 2440 | 2441 | merge-stream@2.0.0: {} 2442 | 2443 | micromatch@4.0.8: 2444 | dependencies: 2445 | braces: 3.0.3 2446 | picomatch: 2.3.1 2447 | 2448 | mimic-fn@2.1.0: {} 2449 | 2450 | minimatch@3.1.2: 2451 | dependencies: 2452 | brace-expansion: 1.1.11 2453 | 2454 | minimatch@5.1.6: 2455 | dependencies: 2456 | brace-expansion: 2.0.1 2457 | 2458 | minimist@1.2.8: {} 2459 | 2460 | mkdirp@0.5.6: 2461 | dependencies: 2462 | minimist: 1.2.8 2463 | 2464 | ms@2.1.3: {} 2465 | 2466 | natural-compare@1.4.0: {} 2467 | 2468 | node-int64@0.4.0: {} 2469 | 2470 | node-releases@2.0.19: {} 2471 | 2472 | normalize-path@3.0.0: {} 2473 | 2474 | npm-run-path@4.0.1: 2475 | dependencies: 2476 | path-key: 3.1.1 2477 | 2478 | once@1.4.0: 2479 | dependencies: 2480 | wrappy: 1.0.2 2481 | 2482 | onetime@5.1.2: 2483 | dependencies: 2484 | mimic-fn: 2.1.0 2485 | 2486 | p-limit@2.3.0: 2487 | dependencies: 2488 | p-try: 2.2.0 2489 | 2490 | p-limit@3.1.0: 2491 | dependencies: 2492 | yocto-queue: 0.1.0 2493 | 2494 | p-locate@4.1.0: 2495 | dependencies: 2496 | p-limit: 2.3.0 2497 | 2498 | p-try@2.2.0: {} 2499 | 2500 | parse-json@5.2.0: 2501 | dependencies: 2502 | '@babel/code-frame': 7.26.2 2503 | error-ex: 1.3.2 2504 | json-parse-even-better-errors: 2.3.1 2505 | lines-and-columns: 1.2.4 2506 | 2507 | path-exists@4.0.0: {} 2508 | 2509 | path-is-absolute@1.0.1: {} 2510 | 2511 | path-key@3.1.1: {} 2512 | 2513 | path-parse@1.0.7: {} 2514 | 2515 | picocolors@1.1.1: {} 2516 | 2517 | picomatch@2.3.1: {} 2518 | 2519 | pirates@4.0.6: {} 2520 | 2521 | pkg-dir@4.2.0: 2522 | dependencies: 2523 | find-up: 4.1.0 2524 | 2525 | prettier@2.8.8: {} 2526 | 2527 | pretty-format@29.7.0: 2528 | dependencies: 2529 | '@jest/schemas': 29.6.3 2530 | ansi-styles: 5.2.0 2531 | react-is: 18.3.1 2532 | 2533 | prompts@2.4.2: 2534 | dependencies: 2535 | kleur: 3.0.3 2536 | sisteransi: 1.0.5 2537 | 2538 | pure-rand@6.1.0: {} 2539 | 2540 | react-is@18.3.1: {} 2541 | 2542 | require-directory@2.1.1: {} 2543 | 2544 | resolve-cwd@3.0.0: 2545 | dependencies: 2546 | resolve-from: 5.0.0 2547 | 2548 | resolve-from@5.0.0: {} 2549 | 2550 | resolve.exports@2.0.3: {} 2551 | 2552 | resolve@1.22.10: 2553 | dependencies: 2554 | is-core-module: 2.16.1 2555 | path-parse: 1.0.7 2556 | supports-preserve-symlinks-flag: 1.0.0 2557 | 2558 | semver@5.7.2: {} 2559 | 2560 | semver@6.3.1: {} 2561 | 2562 | semver@7.6.3: {} 2563 | 2564 | shebang-command@2.0.0: 2565 | dependencies: 2566 | shebang-regex: 3.0.0 2567 | 2568 | shebang-regex@3.0.0: {} 2569 | 2570 | signal-exit@3.0.7: {} 2571 | 2572 | sisteransi@1.0.5: {} 2573 | 2574 | slash@3.0.0: {} 2575 | 2576 | source-map-support@0.5.13: 2577 | dependencies: 2578 | buffer-from: 1.1.2 2579 | source-map: 0.6.1 2580 | 2581 | source-map@0.6.1: {} 2582 | 2583 | sprintf-js@1.0.3: {} 2584 | 2585 | stack-utils@2.0.6: 2586 | dependencies: 2587 | escape-string-regexp: 2.0.0 2588 | 2589 | string-length@4.0.2: 2590 | dependencies: 2591 | char-regex: 1.0.2 2592 | strip-ansi: 6.0.1 2593 | 2594 | string-width@4.2.3: 2595 | dependencies: 2596 | emoji-regex: 8.0.0 2597 | is-fullwidth-code-point: 3.0.0 2598 | strip-ansi: 6.0.1 2599 | 2600 | strip-ansi@6.0.1: 2601 | dependencies: 2602 | ansi-regex: 5.0.1 2603 | 2604 | strip-bom@4.0.0: {} 2605 | 2606 | strip-final-newline@2.0.0: {} 2607 | 2608 | strip-json-comments@3.1.1: {} 2609 | 2610 | supports-color@5.5.0: 2611 | dependencies: 2612 | has-flag: 3.0.0 2613 | 2614 | supports-color@7.2.0: 2615 | dependencies: 2616 | has-flag: 4.0.0 2617 | 2618 | supports-color@8.1.1: 2619 | dependencies: 2620 | has-flag: 4.0.0 2621 | 2622 | supports-preserve-symlinks-flag@1.0.0: {} 2623 | 2624 | test-exclude@6.0.0: 2625 | dependencies: 2626 | '@istanbuljs/schema': 0.1.3 2627 | glob: 7.2.3 2628 | minimatch: 3.1.2 2629 | 2630 | tmpl@1.0.5: {} 2631 | 2632 | to-regex-range@5.0.1: 2633 | dependencies: 2634 | is-number: 7.0.0 2635 | 2636 | ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.10.5))(typescript@5.7.2): 2637 | dependencies: 2638 | bs-logger: 0.2.6 2639 | ejs: 3.1.10 2640 | fast-json-stable-stringify: 2.1.0 2641 | jest: 29.7.0(@types/node@22.10.5) 2642 | jest-util: 29.7.0 2643 | json5: 2.2.3 2644 | lodash.memoize: 4.1.2 2645 | make-error: 1.3.6 2646 | semver: 7.6.3 2647 | typescript: 5.7.2 2648 | yargs-parser: 21.1.1 2649 | optionalDependencies: 2650 | '@babel/core': 7.26.0 2651 | '@jest/transform': 29.7.0 2652 | '@jest/types': 29.6.3 2653 | babel-jest: 29.7.0(@babel/core@7.26.0) 2654 | 2655 | tslib@1.14.1: {} 2656 | 2657 | tslint-config-prettier@1.18.0: {} 2658 | 2659 | tslint@6.1.3(typescript@5.7.2): 2660 | dependencies: 2661 | '@babel/code-frame': 7.26.2 2662 | builtin-modules: 1.1.1 2663 | chalk: 2.4.2 2664 | commander: 2.20.3 2665 | diff: 4.0.2 2666 | glob: 7.2.3 2667 | js-yaml: 3.14.1 2668 | minimatch: 3.1.2 2669 | mkdirp: 0.5.6 2670 | resolve: 1.22.10 2671 | semver: 5.7.2 2672 | tslib: 1.14.1 2673 | tsutils: 2.29.0(typescript@5.7.2) 2674 | typescript: 5.7.2 2675 | 2676 | tsutils@2.29.0(typescript@5.7.2): 2677 | dependencies: 2678 | tslib: 1.14.1 2679 | typescript: 5.7.2 2680 | 2681 | type-detect@4.0.8: {} 2682 | 2683 | type-fest@0.21.3: {} 2684 | 2685 | typescript@5.7.2: {} 2686 | 2687 | undici-types@6.20.0: {} 2688 | 2689 | update-browserslist-db@1.1.1(browserslist@4.24.3): 2690 | dependencies: 2691 | browserslist: 4.24.3 2692 | escalade: 3.2.0 2693 | picocolors: 1.1.1 2694 | 2695 | v8-to-istanbul@9.3.0: 2696 | dependencies: 2697 | '@jridgewell/trace-mapping': 0.3.25 2698 | '@types/istanbul-lib-coverage': 2.0.6 2699 | convert-source-map: 2.0.0 2700 | 2701 | walker@1.0.8: 2702 | dependencies: 2703 | makeerror: 1.0.12 2704 | 2705 | which@2.0.2: 2706 | dependencies: 2707 | isexe: 2.0.0 2708 | 2709 | wrap-ansi@7.0.0: 2710 | dependencies: 2711 | ansi-styles: 4.3.0 2712 | string-width: 4.2.3 2713 | strip-ansi: 6.0.1 2714 | 2715 | wrappy@1.0.2: {} 2716 | 2717 | write-file-atomic@4.0.2: 2718 | dependencies: 2719 | imurmurhash: 0.1.4 2720 | signal-exit: 3.0.7 2721 | 2722 | y18n@5.0.8: {} 2723 | 2724 | yallist@3.1.1: {} 2725 | 2726 | yargs-parser@21.1.1: {} 2727 | 2728 | yargs@17.7.2: 2729 | dependencies: 2730 | cliui: 8.0.1 2731 | escalade: 3.2.0 2732 | get-caller-file: 2.0.5 2733 | require-directory: 2.1.1 2734 | string-width: 4.2.3 2735 | y18n: 5.0.8 2736 | yargs-parser: 21.1.1 2737 | 2738 | yocto-queue@0.1.0: {} 2739 | -------------------------------------------------------------------------------- /src/db.ts: -------------------------------------------------------------------------------- 1 | import { HNSW } from './main'; 2 | import { openDB, deleteDB, DBSchema, IDBPDatabase } from 'idb'; 3 | 4 | interface HNSWDB extends DBSchema { 5 | 'hnsw-index': { 6 | key: string; 7 | value: any; 8 | }; 9 | } 10 | 11 | export class HNSWWithDB extends HNSW { 12 | dbName: string; 13 | db: IDBPDatabase | null = null; 14 | 15 | private constructor(M: number, efConstruction: number, dbName: string) { 16 | super(M, efConstruction); 17 | this.dbName = dbName; 18 | } 19 | 20 | static async create(M: number, efConstruction: number, dbName: string) { 21 | const instance = new HNSWWithDB(M, efConstruction, dbName); 22 | await instance.initDB(); 23 | return instance; 24 | } 25 | 26 | private async initDB() { 27 | this.db = await openDB(this.dbName, 1, { 28 | upgrade(db) { 29 | db.createObjectStore('hnsw-index'); 30 | }, 31 | }); 32 | } 33 | 34 | async saveIndex() { 35 | if (!this.db) { 36 | // console.error('Database is not initialized'); 37 | return; 38 | } 39 | 40 | await this.db.put('hnsw-index', this.toJSON(), 'hnsw'); 41 | } 42 | 43 | async loadIndex() { 44 | if (!this.db) { 45 | // console.error('Database is not initialized'); 46 | return; 47 | } 48 | 49 | const loadedHNSW: HNSW | undefined = await this.db.get('hnsw-index', 'hnsw'); 50 | 51 | if (!loadedHNSW) { 52 | // console.error('No saved HNSW index found'); 53 | return; 54 | } 55 | 56 | // Update this HNSW instance with loaded data 57 | const hnsw = HNSW.fromJSON(loadedHNSW); 58 | this.M = hnsw.M; 59 | this.efConstruction = hnsw.efConstruction; 60 | this.levelMax = hnsw.levelMax; 61 | this.entryPointId = hnsw.entryPointId; 62 | this.nodes = hnsw.nodes; 63 | } 64 | 65 | async deleteIndex() { 66 | if (!this.db) { 67 | // console.error('Database is not initialized'); 68 | return; 69 | } 70 | 71 | try { 72 | await deleteDB(this.dbName); 73 | this.initDB(); 74 | } catch (error) { 75 | // console.error('Failed to delete index:', error); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { HNSW } from './main'; 2 | export { HNSWWithDB } from './db'; 3 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { PriorityQueue } from './pqueue'; 2 | import { Node } from './node'; 3 | import { cosineSimilarity, euclideanSimilarity } from './similarity'; 4 | 5 | type Metric = 'cosine' | 'euclidean'; 6 | 7 | export class HNSW { 8 | metric: Metric; // Metric to use 9 | similarityFunction: (a: number[] | Float32Array, b: number[] | Float32Array) => number; 10 | d: number | null = null; // Dimension of the vectors 11 | M: number; // Max number of neighbors 12 | efConstruction: number; // Max number of nodes to visit during construction 13 | levelMax: number; // Max level of the graph 14 | entryPointId: number; // Id of the entry point 15 | nodes: Map; // Map of nodes 16 | probs: number[]; // Probabilities for the levels 17 | 18 | constructor(M = 16, efConstruction = 200, d: number | null = null, metric = 'cosine') { 19 | this.metric = metric as Metric; 20 | this.d = d; 21 | this.M = M; 22 | this.efConstruction = efConstruction; 23 | this.entryPointId = -1; 24 | this.nodes = new Map(); 25 | this.probs = this.set_probs(M, 1 / Math.log(M)); 26 | this.levelMax = this.probs.length - 1; 27 | this.similarityFunction = this.getMetric(metric as Metric); 28 | } 29 | 30 | private getMetric(metric: Metric): (a: number[] | Float32Array, b: number[] | Float32Array) => number { 31 | if (metric === 'cosine') { 32 | return cosineSimilarity; 33 | } else if (metric === 'euclidean') { 34 | return euclideanSimilarity; 35 | } else { 36 | throw new Error('Invalid metric'); 37 | } 38 | } 39 | 40 | private set_probs(M: number, levelMult: number): number[] { 41 | let level = 0; 42 | const probs = []; 43 | while (true) { 44 | const prob = Math.exp(-level / levelMult) * (1 - Math.exp(-1 / levelMult)); 45 | if (prob < 1e-9) break; 46 | probs.push(prob); 47 | level++; 48 | } 49 | return probs; 50 | } 51 | 52 | private selectLevel(): number { 53 | let r = Math.random(); 54 | this.probs.forEach((p, i) => { 55 | if (r < p) { 56 | return i; 57 | } 58 | r -= p; 59 | }); 60 | return this.probs.length - 1; 61 | } 62 | 63 | private async addNodeToGraph(node: Node) { 64 | if (this.entryPointId === -1) { 65 | this.entryPointId = node.id; 66 | return; 67 | } 68 | 69 | let currentNode = this.nodes.get(this.entryPointId)!; 70 | let closestNode = currentNode; 71 | 72 | for (let level = this.levelMax; level >= 0; level--) { 73 | while (true) { 74 | let nextNode = null; 75 | let maxSimilarity = -Infinity; 76 | 77 | for (const neighborId of currentNode.neighbors[level]) { 78 | if (neighborId === -1) break; 79 | 80 | const neighborNode = this.nodes.get(neighborId)!; 81 | const similarity = this.similarityFunction(node.vector, neighborNode.vector); 82 | if (similarity > maxSimilarity) { 83 | maxSimilarity = similarity; 84 | nextNode = neighborNode; 85 | } 86 | } 87 | 88 | if (nextNode && maxSimilarity > this.similarityFunction(node.vector, closestNode.vector)) { 89 | currentNode = nextNode; 90 | closestNode = currentNode; 91 | } else { 92 | break; 93 | } 94 | } 95 | } 96 | 97 | const closestLevel = Math.min(node.level, closestNode.level); 98 | for (let level = 0; level <= closestLevel; level++) { 99 | // Add new neighbor to closestNode's neighbors 100 | closestNode.neighbors[level] = closestNode.neighbors[level].filter((id) => id !== -1); 101 | closestNode.neighbors[level].push(node.id); 102 | // If the number of neighbors exceeds M, remove the farthest one 103 | if (closestNode.neighbors[level].length > this.M) { 104 | closestNode.neighbors[level].pop(); 105 | } 106 | 107 | // Add new neighbor to node's neighbors 108 | node.neighbors[level] = node.neighbors[level].filter((id) => id !== -1); 109 | node.neighbors[level].push(closestNode.id); 110 | // If the number of neighbors exceeds M, remove the farthest one 111 | if (node.neighbors[level].length > this.M) { 112 | node.neighbors[level].pop(); 113 | } 114 | } 115 | } 116 | 117 | async addPoint(id: number, vector: Float32Array | number[]) { 118 | if (this.d !== null && vector.length !== this.d) { 119 | throw new Error('All vectors must be of the same dimension'); 120 | } 121 | this.d = vector.length; 122 | 123 | this.nodes.set(id, new Node(id, vector, this.selectLevel(), this.M)); 124 | const node = this.nodes.get(id)!; 125 | this.levelMax = Math.max(this.levelMax, node.level); 126 | 127 | await this.addNodeToGraph(node); 128 | } 129 | 130 | searchKNN(query: Float32Array | number[], k: number): { id: number; score: number }[] { 131 | // Check if there's only one node in the graph 132 | if (this.nodes.size === 1) { 133 | const onlyNode = this.nodes.get(this.entryPointId)!; 134 | const similarity = this.similarityFunction(onlyNode.vector, query); 135 | return [{ id: this.entryPointId, score: similarity }]; 136 | } 137 | 138 | const result: { id: number; score: number }[] = []; 139 | const visited: Set = new Set(); 140 | 141 | const candidates = new PriorityQueue((a, b) => { 142 | const aNode = this.nodes.get(a)!; 143 | const bNode = this.nodes.get(b)!; 144 | return this.similarityFunction(query, bNode.vector) - this.similarityFunction(query, aNode.vector); 145 | }); 146 | 147 | candidates.push(this.entryPointId); 148 | let level = this.levelMax; 149 | 150 | while (!candidates.isEmpty() && result.length < k) { 151 | const currentId = candidates.pop()!; 152 | if (visited.has(currentId)) continue; 153 | 154 | visited.add(currentId); 155 | 156 | const currentNode = this.nodes.get(currentId)!; 157 | const similarity = this.similarityFunction(currentNode.vector, query); 158 | 159 | if (similarity > 0) { 160 | result.push({ id: currentId, score: similarity }); 161 | } 162 | 163 | if (currentNode.level === 0) { 164 | continue; 165 | } 166 | 167 | level = Math.min(level, currentNode.level - 1); 168 | 169 | for (let i = level; i >= 0; i--) { 170 | const neighbors = currentNode.neighbors[i]; 171 | for (const neighborId of neighbors) { 172 | if (!visited.has(neighborId)) { 173 | candidates.push(neighborId); 174 | } 175 | } 176 | } 177 | } 178 | 179 | return result.slice(0, k); 180 | } 181 | 182 | async buildIndex(data: { id: number; vector: Float32Array | number[] }[]) { 183 | // Clear existing index 184 | this.nodes.clear(); 185 | this.levelMax = 0; 186 | this.entryPointId = -1; 187 | 188 | // Add points to the index 189 | for (const item of data) { 190 | await this.addPoint(item.id, item.vector); 191 | } 192 | } 193 | 194 | toJSON() { 195 | const entries = Array.from(this.nodes.entries()); 196 | return { 197 | M: this.M, 198 | efConstruction: this.efConstruction, 199 | levelMax: this.levelMax, 200 | entryPointId: this.entryPointId, 201 | nodes: entries.map(([id, node]) => { 202 | return [ 203 | id, 204 | { 205 | id: node.id, 206 | level: node.level, 207 | vector: Array.from(node.vector), 208 | neighbors: node.neighbors.map((level) => Array.from(level)), 209 | }, 210 | ]; 211 | }), 212 | }; 213 | } 214 | 215 | static fromJSON(json: any): HNSW { 216 | const hnsw = new HNSW(json.M, json.efConstruction); 217 | hnsw.levelMax = json.levelMax; 218 | hnsw.entryPointId = json.entryPointId; 219 | hnsw.nodes = new Map( 220 | json.nodes.map(([id, node]: [number, any]) => { 221 | return [ 222 | id, 223 | { 224 | ...node, 225 | vector: new Float32Array(node.vector), 226 | }, 227 | ]; 228 | }), 229 | ); 230 | return hnsw; 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /src/node.ts: -------------------------------------------------------------------------------- 1 | export class Node { 2 | id: number; 3 | level: number; 4 | vector: Float32Array | number[]; 5 | neighbors: number[][]; 6 | 7 | constructor(id: number, vector: Float32Array | number[], level: number, M: number) { 8 | this.id = id; 9 | this.vector = vector; 10 | this.level = level; 11 | this.neighbors = Array.from({ length: level + 1 }, () => new Array(M).fill(-1)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/pqueue.ts: -------------------------------------------------------------------------------- 1 | export class PriorityQueue { 2 | private items: T[] = []; 3 | 4 | constructor(private compare: (a: T, b: T) => number) {} 5 | 6 | push(item: T) { 7 | let i = 0; 8 | while (i < this.items.length && this.compare(item, this.items[i]) > 0) { 9 | i++; 10 | } 11 | this.items.splice(i, 0, item); 12 | } 13 | 14 | pop(): T | undefined { 15 | return this.items.shift(); 16 | } 17 | 18 | isEmpty(): boolean { 19 | return this.items.length === 0; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/similarity.ts: -------------------------------------------------------------------------------- 1 | // Note: Similarity functions 2 | function dotProduct(a: Float32Array | number[], b: Float32Array | number[]): number { 3 | let dP = 0.0; 4 | for (let i = 0; i < a.length; i++) { 5 | dP += a[i] * b[i]; 6 | } 7 | return dP; 8 | } 9 | 10 | export function cosineSimilarity(a: Float32Array | number[], b: Float32Array | number[]): number { 11 | return dotProduct(a, b) / (Math.sqrt(dotProduct(a, a)) * Math.sqrt(dotProduct(b, b))); 12 | } 13 | 14 | function euclideanDistance(a: Float32Array | number[], b: Float32Array | number[]): number { 15 | let sum = 0.0; 16 | for (let i = 0; i < a.length; i++) { 17 | sum += (a[i] - b[i]) ** 2; 18 | } 19 | return Math.sqrt(sum); 20 | } 21 | 22 | export function euclideanSimilarity(a: Float32Array | number[], b: Float32Array | number[]): number { 23 | return 1 / (1 + euclideanDistance(a, b)); 24 | } 25 | -------------------------------------------------------------------------------- /tests/HNSW.test.ts: -------------------------------------------------------------------------------- 1 | import { HNSW, HNSWWithDB } from '../src'; 2 | 3 | async function main(): Promise<{ id: number; score: number }[]> { 4 | // Simple example 5 | const hnsw = new HNSW(200, 16, 5, 'cosine'); 6 | 7 | // Make some data 8 | const data = [ 9 | { id: 1, vector: [1, 2, 3, 4, 5] }, 10 | { id: 2, vector: [2, 3, 4, 5, 6] }, 11 | { id: 3, vector: [3, 4, 5, 6, 7] }, 12 | { id: 4, vector: [4, 5, 6, 7, 8] }, 13 | { id: 5, vector: [5, 6, 7, 8, 9] }, 14 | ]; 15 | 16 | // Build the index 17 | await hnsw.buildIndex(data); 18 | 19 | // Search for nearest neighbors 20 | const results = hnsw.searchKNN([6, 7, 8, 9, 10], 2); 21 | console.log(results); 22 | return results; 23 | 24 | // // Persistence is hard to test without a real database, but here's an example 25 | // const index = await HNSWWithPersistence.create(200, 16, 'my-index'); 26 | // await index.buildIndex(data); 27 | // await index.saveIndex(); 28 | 29 | // // Load the index 30 | // const index2 = await HNSWWithPersistence.create(200, 16, 'my-index-2'); 31 | // await index2.loadIndex(); 32 | 33 | // // Search for nearest neighbors 34 | // const results2 = index2.searchKNN([6, 7, 8, 9, 10], 2); 35 | // console.log(results2); 36 | } 37 | 38 | test('HNSW', async () => { 39 | const results = await main(); 40 | expect(results).toEqual([ 41 | { id: 1, score: 0.9649505047327671 }, 42 | { id: 2, score: 0.9864400504156211 }, 43 | ]); 44 | }); 45 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | "rootDir": "./src", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./src", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "resolveJsonModule": true, /* Enable importing .json files. */ 43 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 44 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 45 | 46 | /* JavaScript Support */ 47 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 48 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 49 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 50 | 51 | /* Emit */ 52 | "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 53 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 54 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 55 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 56 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 57 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 58 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 59 | // "removeComments": true, /* Disable emitting comments. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 62 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 75 | 76 | /* Interop Constraints */ 77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 92 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 93 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 94 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 95 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 96 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 97 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 98 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 99 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 100 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 101 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 102 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 103 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 104 | 105 | /* Completeness */ 106 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 107 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 108 | }, 109 | "exclude": ["node_modules", "dist", "tests"] 110 | } 111 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["tslint:recommended", "tslint-config-prettier"] 3 | } --------------------------------------------------------------------------------