├── .gitignore ├── LICENSE ├── README.md ├── jest.config.js ├── package-lock.json ├── package.json ├── src ├── index.ts └── minheap.ts ├── test ├── dummy-data │ ├── embeddings.test.ndjson │ ├── expected-search-results.ts │ └── prompt.test.ndjson ├── hnsw.test.ts ├── minheap.test.ts └── utils.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # Snowpack dependency directory (https://snowpack.dev/) 50 | web_modules/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional stylelint cache 62 | .stylelintcache 63 | 64 | # Microbundle cache 65 | .rpt2_cache/ 66 | .rts2_cache_cjs/ 67 | .rts2_cache_es/ 68 | .rts2_cache_umd/ 69 | 70 | # Optional REPL history 71 | .node_repl_history 72 | 73 | # Output of 'npm pack' 74 | *.tgz 75 | 76 | # Yarn Integrity file 77 | .yarn-integrity 78 | 79 | # dotenv environment variable files 80 | .env 81 | .env.development.local 82 | .env.test.local 83 | .env.production.local 84 | .env.local 85 | 86 | # parcel-bundler cache (https://parceljs.org/) 87 | .cache 88 | .parcel-cache 89 | 90 | # Next.js build output 91 | .next 92 | out 93 | 94 | # Nuxt.js build / generate output 95 | .nuxt 96 | dist 97 | 98 | # Gatsby files 99 | .cache/ 100 | # Comment in the public line in if your project uses Gatsby and not Next.js 101 | # https://nextjs.org/blog/next-9-1#public-directory-support 102 | # public 103 | 104 | # vuepress build output 105 | .vuepress/dist 106 | 107 | # vuepress v2.x temp and cache directory 108 | .temp 109 | 110 | # Docusaurus cache and generated files 111 | .docusaurus 112 | 113 | # Serverless directories 114 | .serverless/ 115 | 116 | # FuseBox cache 117 | .fusebox/ 118 | 119 | # DynamoDB Local files 120 | .dynamodb/ 121 | 122 | # TernJS port file 123 | .tern-port 124 | 125 | # Stores VSCode versions used for testing VSCode extensions 126 | .vscode-test 127 | 128 | # yarn v2 129 | .yarn/cache 130 | .yarn/unplugged 131 | .yarn/build-state.yml 132 | .yarn/install-state.gz 133 | .pnp.* 134 | 135 | ### Node Patch ### 136 | # Serverless Webpack directories 137 | .webpack/ 138 | 139 | # Optional stylelint cache 140 | 141 | # SvelteKit build / generate output 142 | .svelte-kit 143 | 144 | # Turbo 145 | .turbo 146 | 147 | # 148 | **/*.bin 149 | 150 | # End of https://www.toptal.com/developers/gitignore/api/node -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Buildt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # buildt-ssdb: Super Search DataBase 2 | 3 | `buildt-ssdb` is a simple, efficient, and easy-to-use implementation of the Hierarchical Navigable Small World (HNSW) algorithm for approximate nearest neighbor search. It's perfect for searching mid-scale, high-dimensional datasets quickly and with minimal memory overhead. 4 | 5 | This package has no dependencies, so should be usable both in the browser and Node scenarios. 6 | 7 | ## Installation - NPM package not yet available 8 | 9 | To install `buildt-ssdb`, run the following command in your project directory: 10 | 11 | ```sh 12 | npm install buildt-ssdb 13 | ``` 14 | 15 | ## Setup & Building 16 | ```sh 17 | npm i 18 | ``` 19 | followed by 20 | ```sh 21 | npm run build 22 | ``` 23 | 24 | ## Usage 25 | 26 | Here's an example of how to use buildt-ssdb: 27 | 28 | ```typescript 29 | import HNSW from 'buildt-ssdb'; 30 | 31 | // Create an HNSW indexdimensions, M = 16, and ef = 50 32 | const hnsw = new HNSW(); 33 | 34 | // Add nodes to the index 35 | const nodeId1 = 0; 36 | const vector1 = [0.1, 0.2, 0.3, 0.4, 0.5]; 37 | hnsw.addNode(nodeId1, vector1); 38 | 39 | const nodeId2 = 1; 40 | const vector2 = [0.5, 0.4, 0.3, 0.2, 0.1]; 41 | hnsw.addNode(nodeId2, vector2); 42 | 43 | // Perform a k-nearest neighbor search with k = 3 44 | const queryVector = [0.15, 0.25, 0.35, 0.45, 0.55]; 45 | const nearestNeighbors = hnsw.search(queryVector, 3); 46 | 47 | console.log('Nearest neighbors:', nearestNeighbors); 48 | 49 | // Serialize and deserialize 50 | const serialized = hnsw.serialize() // UInt8Array 51 | const deserialized = HNSW.deserialize(serialized) // HNSW instance 52 | 53 | ``` 54 | 55 | ## Performance 56 | The largest dataset I've pushed through this is a 100k vector index at 1536 dimensions per vector. The search method took ~2.36ms per query at this scale. I haven't gone any larger than this yet but likely will give it a try when I have the time. 57 | 58 | ## API 59 | ### HNSW 60 | The main class for working with HNSW indices. 61 | 62 | Constructor 63 | ```typescript 64 | constructor(similarityMetric: 'cosine' | 'euclidean', numDimensions: number, M: number, ef: number) 65 | ``` 66 | 67 | ### Methods 68 | `addNode(id: number, vector: number[]): void`: Add a node to the index. 69 | `deleteNode(id: number): void`: Delete a node from the index. 70 | `search(queryVector: number[], k: number): Node[]`: Perform a k-nearest neighbor search. 71 | `getSize(): number`: Get the total size of the index (number of nodes). 72 | `serialize(): Uint8Array`: Serialize the index to a binary format. 73 | `static deserialize(data: Uint8Array): HNSW`: Deserialize an index from its binary representation. 74 | 75 | ### Plans 76 | I want to add capabilities for sharded indices, as that would be very useful for Buildt, as well as having a temporal component to the vector database – something I haven't yet seen from the main providers. -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testTimeout: 120000, 4 | // testEnvironment: 'node', 5 | // If you have a "src" folder, uncomment the following lines: 6 | roots: ['./test'], 7 | // testMatch: ['/src/**/*.(spec|test).{ts,tsx}'], 8 | }; 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@buildt/ssdb", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@buildt/ssdb", 9 | "version": "0.0.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@types/jest": "^29.5.1", 13 | "jest": "^29.5.0", 14 | "ts-jest": "^29.1.0", 15 | "typescript": "^5.0.4" 16 | } 17 | }, 18 | "node_modules/@ampproject/remapping": { 19 | "version": "2.2.1", 20 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", 21 | "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", 22 | "dev": true, 23 | "dependencies": { 24 | "@jridgewell/gen-mapping": "^0.3.0", 25 | "@jridgewell/trace-mapping": "^0.3.9" 26 | }, 27 | "engines": { 28 | "node": ">=6.0.0" 29 | } 30 | }, 31 | "node_modules/@babel/code-frame": { 32 | "version": "7.21.4", 33 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", 34 | "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", 35 | "dev": true, 36 | "dependencies": { 37 | "@babel/highlight": "^7.18.6" 38 | }, 39 | "engines": { 40 | "node": ">=6.9.0" 41 | } 42 | }, 43 | "node_modules/@babel/compat-data": { 44 | "version": "7.21.7", 45 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", 46 | "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", 47 | "dev": true, 48 | "engines": { 49 | "node": ">=6.9.0" 50 | } 51 | }, 52 | "node_modules/@babel/core": { 53 | "version": "7.21.8", 54 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", 55 | "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", 56 | "dev": true, 57 | "dependencies": { 58 | "@ampproject/remapping": "^2.2.0", 59 | "@babel/code-frame": "^7.21.4", 60 | "@babel/generator": "^7.21.5", 61 | "@babel/helper-compilation-targets": "^7.21.5", 62 | "@babel/helper-module-transforms": "^7.21.5", 63 | "@babel/helpers": "^7.21.5", 64 | "@babel/parser": "^7.21.8", 65 | "@babel/template": "^7.20.7", 66 | "@babel/traverse": "^7.21.5", 67 | "@babel/types": "^7.21.5", 68 | "convert-source-map": "^1.7.0", 69 | "debug": "^4.1.0", 70 | "gensync": "^1.0.0-beta.2", 71 | "json5": "^2.2.2", 72 | "semver": "^6.3.0" 73 | }, 74 | "engines": { 75 | "node": ">=6.9.0" 76 | }, 77 | "funding": { 78 | "type": "opencollective", 79 | "url": "https://opencollective.com/babel" 80 | } 81 | }, 82 | "node_modules/@babel/core/node_modules/convert-source-map": { 83 | "version": "1.9.0", 84 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 85 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 86 | "dev": true 87 | }, 88 | "node_modules/@babel/generator": { 89 | "version": "7.21.5", 90 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", 91 | "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", 92 | "dev": true, 93 | "dependencies": { 94 | "@babel/types": "^7.21.5", 95 | "@jridgewell/gen-mapping": "^0.3.2", 96 | "@jridgewell/trace-mapping": "^0.3.17", 97 | "jsesc": "^2.5.1" 98 | }, 99 | "engines": { 100 | "node": ">=6.9.0" 101 | } 102 | }, 103 | "node_modules/@babel/helper-compilation-targets": { 104 | "version": "7.21.5", 105 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", 106 | "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", 107 | "dev": true, 108 | "dependencies": { 109 | "@babel/compat-data": "^7.21.5", 110 | "@babel/helper-validator-option": "^7.21.0", 111 | "browserslist": "^4.21.3", 112 | "lru-cache": "^5.1.1", 113 | "semver": "^6.3.0" 114 | }, 115 | "engines": { 116 | "node": ">=6.9.0" 117 | }, 118 | "peerDependencies": { 119 | "@babel/core": "^7.0.0" 120 | } 121 | }, 122 | "node_modules/@babel/helper-environment-visitor": { 123 | "version": "7.21.5", 124 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", 125 | "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", 126 | "dev": true, 127 | "engines": { 128 | "node": ">=6.9.0" 129 | } 130 | }, 131 | "node_modules/@babel/helper-function-name": { 132 | "version": "7.21.0", 133 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", 134 | "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", 135 | "dev": true, 136 | "dependencies": { 137 | "@babel/template": "^7.20.7", 138 | "@babel/types": "^7.21.0" 139 | }, 140 | "engines": { 141 | "node": ">=6.9.0" 142 | } 143 | }, 144 | "node_modules/@babel/helper-hoist-variables": { 145 | "version": "7.18.6", 146 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 147 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 148 | "dev": true, 149 | "dependencies": { 150 | "@babel/types": "^7.18.6" 151 | }, 152 | "engines": { 153 | "node": ">=6.9.0" 154 | } 155 | }, 156 | "node_modules/@babel/helper-module-imports": { 157 | "version": "7.21.4", 158 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", 159 | "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", 160 | "dev": true, 161 | "dependencies": { 162 | "@babel/types": "^7.21.4" 163 | }, 164 | "engines": { 165 | "node": ">=6.9.0" 166 | } 167 | }, 168 | "node_modules/@babel/helper-module-transforms": { 169 | "version": "7.21.5", 170 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", 171 | "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", 172 | "dev": true, 173 | "dependencies": { 174 | "@babel/helper-environment-visitor": "^7.21.5", 175 | "@babel/helper-module-imports": "^7.21.4", 176 | "@babel/helper-simple-access": "^7.21.5", 177 | "@babel/helper-split-export-declaration": "^7.18.6", 178 | "@babel/helper-validator-identifier": "^7.19.1", 179 | "@babel/template": "^7.20.7", 180 | "@babel/traverse": "^7.21.5", 181 | "@babel/types": "^7.21.5" 182 | }, 183 | "engines": { 184 | "node": ">=6.9.0" 185 | } 186 | }, 187 | "node_modules/@babel/helper-plugin-utils": { 188 | "version": "7.21.5", 189 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", 190 | "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", 191 | "dev": true, 192 | "engines": { 193 | "node": ">=6.9.0" 194 | } 195 | }, 196 | "node_modules/@babel/helper-simple-access": { 197 | "version": "7.21.5", 198 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", 199 | "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", 200 | "dev": true, 201 | "dependencies": { 202 | "@babel/types": "^7.21.5" 203 | }, 204 | "engines": { 205 | "node": ">=6.9.0" 206 | } 207 | }, 208 | "node_modules/@babel/helper-split-export-declaration": { 209 | "version": "7.18.6", 210 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 211 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 212 | "dev": true, 213 | "dependencies": { 214 | "@babel/types": "^7.18.6" 215 | }, 216 | "engines": { 217 | "node": ">=6.9.0" 218 | } 219 | }, 220 | "node_modules/@babel/helper-string-parser": { 221 | "version": "7.21.5", 222 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", 223 | "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", 224 | "dev": true, 225 | "engines": { 226 | "node": ">=6.9.0" 227 | } 228 | }, 229 | "node_modules/@babel/helper-validator-identifier": { 230 | "version": "7.19.1", 231 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 232 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 233 | "dev": true, 234 | "engines": { 235 | "node": ">=6.9.0" 236 | } 237 | }, 238 | "node_modules/@babel/helper-validator-option": { 239 | "version": "7.21.0", 240 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", 241 | "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", 242 | "dev": true, 243 | "engines": { 244 | "node": ">=6.9.0" 245 | } 246 | }, 247 | "node_modules/@babel/helpers": { 248 | "version": "7.21.5", 249 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", 250 | "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", 251 | "dev": true, 252 | "dependencies": { 253 | "@babel/template": "^7.20.7", 254 | "@babel/traverse": "^7.21.5", 255 | "@babel/types": "^7.21.5" 256 | }, 257 | "engines": { 258 | "node": ">=6.9.0" 259 | } 260 | }, 261 | "node_modules/@babel/highlight": { 262 | "version": "7.18.6", 263 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 264 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 265 | "dev": true, 266 | "dependencies": { 267 | "@babel/helper-validator-identifier": "^7.18.6", 268 | "chalk": "^2.0.0", 269 | "js-tokens": "^4.0.0" 270 | }, 271 | "engines": { 272 | "node": ">=6.9.0" 273 | } 274 | }, 275 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 276 | "version": "3.2.1", 277 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 278 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 279 | "dev": true, 280 | "dependencies": { 281 | "color-convert": "^1.9.0" 282 | }, 283 | "engines": { 284 | "node": ">=4" 285 | } 286 | }, 287 | "node_modules/@babel/highlight/node_modules/chalk": { 288 | "version": "2.4.2", 289 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 290 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 291 | "dev": true, 292 | "dependencies": { 293 | "ansi-styles": "^3.2.1", 294 | "escape-string-regexp": "^1.0.5", 295 | "supports-color": "^5.3.0" 296 | }, 297 | "engines": { 298 | "node": ">=4" 299 | } 300 | }, 301 | "node_modules/@babel/highlight/node_modules/color-convert": { 302 | "version": "1.9.3", 303 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 304 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 305 | "dev": true, 306 | "dependencies": { 307 | "color-name": "1.1.3" 308 | } 309 | }, 310 | "node_modules/@babel/highlight/node_modules/color-name": { 311 | "version": "1.1.3", 312 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 313 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 314 | "dev": true 315 | }, 316 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 317 | "version": "1.0.5", 318 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 319 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 320 | "dev": true, 321 | "engines": { 322 | "node": ">=0.8.0" 323 | } 324 | }, 325 | "node_modules/@babel/highlight/node_modules/has-flag": { 326 | "version": "3.0.0", 327 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 328 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 329 | "dev": true, 330 | "engines": { 331 | "node": ">=4" 332 | } 333 | }, 334 | "node_modules/@babel/highlight/node_modules/supports-color": { 335 | "version": "5.5.0", 336 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 337 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 338 | "dev": true, 339 | "dependencies": { 340 | "has-flag": "^3.0.0" 341 | }, 342 | "engines": { 343 | "node": ">=4" 344 | } 345 | }, 346 | "node_modules/@babel/parser": { 347 | "version": "7.21.8", 348 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", 349 | "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", 350 | "dev": true, 351 | "bin": { 352 | "parser": "bin/babel-parser.js" 353 | }, 354 | "engines": { 355 | "node": ">=6.0.0" 356 | } 357 | }, 358 | "node_modules/@babel/plugin-syntax-async-generators": { 359 | "version": "7.8.4", 360 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 361 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 362 | "dev": true, 363 | "dependencies": { 364 | "@babel/helper-plugin-utils": "^7.8.0" 365 | }, 366 | "peerDependencies": { 367 | "@babel/core": "^7.0.0-0" 368 | } 369 | }, 370 | "node_modules/@babel/plugin-syntax-bigint": { 371 | "version": "7.8.3", 372 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", 373 | "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", 374 | "dev": true, 375 | "dependencies": { 376 | "@babel/helper-plugin-utils": "^7.8.0" 377 | }, 378 | "peerDependencies": { 379 | "@babel/core": "^7.0.0-0" 380 | } 381 | }, 382 | "node_modules/@babel/plugin-syntax-class-properties": { 383 | "version": "7.12.13", 384 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 385 | "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 386 | "dev": true, 387 | "dependencies": { 388 | "@babel/helper-plugin-utils": "^7.12.13" 389 | }, 390 | "peerDependencies": { 391 | "@babel/core": "^7.0.0-0" 392 | } 393 | }, 394 | "node_modules/@babel/plugin-syntax-import-meta": { 395 | "version": "7.10.4", 396 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", 397 | "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", 398 | "dev": true, 399 | "dependencies": { 400 | "@babel/helper-plugin-utils": "^7.10.4" 401 | }, 402 | "peerDependencies": { 403 | "@babel/core": "^7.0.0-0" 404 | } 405 | }, 406 | "node_modules/@babel/plugin-syntax-json-strings": { 407 | "version": "7.8.3", 408 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 409 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 410 | "dev": true, 411 | "dependencies": { 412 | "@babel/helper-plugin-utils": "^7.8.0" 413 | }, 414 | "peerDependencies": { 415 | "@babel/core": "^7.0.0-0" 416 | } 417 | }, 418 | "node_modules/@babel/plugin-syntax-jsx": { 419 | "version": "7.21.4", 420 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", 421 | "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", 422 | "dev": true, 423 | "dependencies": { 424 | "@babel/helper-plugin-utils": "^7.20.2" 425 | }, 426 | "engines": { 427 | "node": ">=6.9.0" 428 | }, 429 | "peerDependencies": { 430 | "@babel/core": "^7.0.0-0" 431 | } 432 | }, 433 | "node_modules/@babel/plugin-syntax-logical-assignment-operators": { 434 | "version": "7.10.4", 435 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 436 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 437 | "dev": true, 438 | "dependencies": { 439 | "@babel/helper-plugin-utils": "^7.10.4" 440 | }, 441 | "peerDependencies": { 442 | "@babel/core": "^7.0.0-0" 443 | } 444 | }, 445 | "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { 446 | "version": "7.8.3", 447 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 448 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 449 | "dev": true, 450 | "dependencies": { 451 | "@babel/helper-plugin-utils": "^7.8.0" 452 | }, 453 | "peerDependencies": { 454 | "@babel/core": "^7.0.0-0" 455 | } 456 | }, 457 | "node_modules/@babel/plugin-syntax-numeric-separator": { 458 | "version": "7.10.4", 459 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 460 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 461 | "dev": true, 462 | "dependencies": { 463 | "@babel/helper-plugin-utils": "^7.10.4" 464 | }, 465 | "peerDependencies": { 466 | "@babel/core": "^7.0.0-0" 467 | } 468 | }, 469 | "node_modules/@babel/plugin-syntax-object-rest-spread": { 470 | "version": "7.8.3", 471 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 472 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 473 | "dev": true, 474 | "dependencies": { 475 | "@babel/helper-plugin-utils": "^7.8.0" 476 | }, 477 | "peerDependencies": { 478 | "@babel/core": "^7.0.0-0" 479 | } 480 | }, 481 | "node_modules/@babel/plugin-syntax-optional-catch-binding": { 482 | "version": "7.8.3", 483 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 484 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 485 | "dev": true, 486 | "dependencies": { 487 | "@babel/helper-plugin-utils": "^7.8.0" 488 | }, 489 | "peerDependencies": { 490 | "@babel/core": "^7.0.0-0" 491 | } 492 | }, 493 | "node_modules/@babel/plugin-syntax-optional-chaining": { 494 | "version": "7.8.3", 495 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 496 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 497 | "dev": true, 498 | "dependencies": { 499 | "@babel/helper-plugin-utils": "^7.8.0" 500 | }, 501 | "peerDependencies": { 502 | "@babel/core": "^7.0.0-0" 503 | } 504 | }, 505 | "node_modules/@babel/plugin-syntax-top-level-await": { 506 | "version": "7.14.5", 507 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", 508 | "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", 509 | "dev": true, 510 | "dependencies": { 511 | "@babel/helper-plugin-utils": "^7.14.5" 512 | }, 513 | "engines": { 514 | "node": ">=6.9.0" 515 | }, 516 | "peerDependencies": { 517 | "@babel/core": "^7.0.0-0" 518 | } 519 | }, 520 | "node_modules/@babel/plugin-syntax-typescript": { 521 | "version": "7.21.4", 522 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", 523 | "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", 524 | "dev": true, 525 | "dependencies": { 526 | "@babel/helper-plugin-utils": "^7.20.2" 527 | }, 528 | "engines": { 529 | "node": ">=6.9.0" 530 | }, 531 | "peerDependencies": { 532 | "@babel/core": "^7.0.0-0" 533 | } 534 | }, 535 | "node_modules/@babel/template": { 536 | "version": "7.20.7", 537 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", 538 | "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", 539 | "dev": true, 540 | "dependencies": { 541 | "@babel/code-frame": "^7.18.6", 542 | "@babel/parser": "^7.20.7", 543 | "@babel/types": "^7.20.7" 544 | }, 545 | "engines": { 546 | "node": ">=6.9.0" 547 | } 548 | }, 549 | "node_modules/@babel/traverse": { 550 | "version": "7.21.5", 551 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", 552 | "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", 553 | "dev": true, 554 | "dependencies": { 555 | "@babel/code-frame": "^7.21.4", 556 | "@babel/generator": "^7.21.5", 557 | "@babel/helper-environment-visitor": "^7.21.5", 558 | "@babel/helper-function-name": "^7.21.0", 559 | "@babel/helper-hoist-variables": "^7.18.6", 560 | "@babel/helper-split-export-declaration": "^7.18.6", 561 | "@babel/parser": "^7.21.5", 562 | "@babel/types": "^7.21.5", 563 | "debug": "^4.1.0", 564 | "globals": "^11.1.0" 565 | }, 566 | "engines": { 567 | "node": ">=6.9.0" 568 | } 569 | }, 570 | "node_modules/@babel/types": { 571 | "version": "7.21.5", 572 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", 573 | "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", 574 | "dev": true, 575 | "dependencies": { 576 | "@babel/helper-string-parser": "^7.21.5", 577 | "@babel/helper-validator-identifier": "^7.19.1", 578 | "to-fast-properties": "^2.0.0" 579 | }, 580 | "engines": { 581 | "node": ">=6.9.0" 582 | } 583 | }, 584 | "node_modules/@bcoe/v8-coverage": { 585 | "version": "0.2.3", 586 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 587 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 588 | "dev": true 589 | }, 590 | "node_modules/@istanbuljs/load-nyc-config": { 591 | "version": "1.1.0", 592 | "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", 593 | "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", 594 | "dev": true, 595 | "dependencies": { 596 | "camelcase": "^5.3.1", 597 | "find-up": "^4.1.0", 598 | "get-package-type": "^0.1.0", 599 | "js-yaml": "^3.13.1", 600 | "resolve-from": "^5.0.0" 601 | }, 602 | "engines": { 603 | "node": ">=8" 604 | } 605 | }, 606 | "node_modules/@istanbuljs/schema": { 607 | "version": "0.1.3", 608 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 609 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 610 | "dev": true, 611 | "engines": { 612 | "node": ">=8" 613 | } 614 | }, 615 | "node_modules/@jest/console": { 616 | "version": "29.5.0", 617 | "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", 618 | "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", 619 | "dev": true, 620 | "dependencies": { 621 | "@jest/types": "^29.5.0", 622 | "@types/node": "*", 623 | "chalk": "^4.0.0", 624 | "jest-message-util": "^29.5.0", 625 | "jest-util": "^29.5.0", 626 | "slash": "^3.0.0" 627 | }, 628 | "engines": { 629 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 630 | } 631 | }, 632 | "node_modules/@jest/core": { 633 | "version": "29.5.0", 634 | "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", 635 | "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", 636 | "dev": true, 637 | "dependencies": { 638 | "@jest/console": "^29.5.0", 639 | "@jest/reporters": "^29.5.0", 640 | "@jest/test-result": "^29.5.0", 641 | "@jest/transform": "^29.5.0", 642 | "@jest/types": "^29.5.0", 643 | "@types/node": "*", 644 | "ansi-escapes": "^4.2.1", 645 | "chalk": "^4.0.0", 646 | "ci-info": "^3.2.0", 647 | "exit": "^0.1.2", 648 | "graceful-fs": "^4.2.9", 649 | "jest-changed-files": "^29.5.0", 650 | "jest-config": "^29.5.0", 651 | "jest-haste-map": "^29.5.0", 652 | "jest-message-util": "^29.5.0", 653 | "jest-regex-util": "^29.4.3", 654 | "jest-resolve": "^29.5.0", 655 | "jest-resolve-dependencies": "^29.5.0", 656 | "jest-runner": "^29.5.0", 657 | "jest-runtime": "^29.5.0", 658 | "jest-snapshot": "^29.5.0", 659 | "jest-util": "^29.5.0", 660 | "jest-validate": "^29.5.0", 661 | "jest-watcher": "^29.5.0", 662 | "micromatch": "^4.0.4", 663 | "pretty-format": "^29.5.0", 664 | "slash": "^3.0.0", 665 | "strip-ansi": "^6.0.0" 666 | }, 667 | "engines": { 668 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 669 | }, 670 | "peerDependencies": { 671 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 672 | }, 673 | "peerDependenciesMeta": { 674 | "node-notifier": { 675 | "optional": true 676 | } 677 | } 678 | }, 679 | "node_modules/@jest/environment": { 680 | "version": "29.5.0", 681 | "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", 682 | "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", 683 | "dev": true, 684 | "dependencies": { 685 | "@jest/fake-timers": "^29.5.0", 686 | "@jest/types": "^29.5.0", 687 | "@types/node": "*", 688 | "jest-mock": "^29.5.0" 689 | }, 690 | "engines": { 691 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 692 | } 693 | }, 694 | "node_modules/@jest/expect": { 695 | "version": "29.5.0", 696 | "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", 697 | "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", 698 | "dev": true, 699 | "dependencies": { 700 | "expect": "^29.5.0", 701 | "jest-snapshot": "^29.5.0" 702 | }, 703 | "engines": { 704 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 705 | } 706 | }, 707 | "node_modules/@jest/expect-utils": { 708 | "version": "29.5.0", 709 | "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", 710 | "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", 711 | "dev": true, 712 | "dependencies": { 713 | "jest-get-type": "^29.4.3" 714 | }, 715 | "engines": { 716 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 717 | } 718 | }, 719 | "node_modules/@jest/fake-timers": { 720 | "version": "29.5.0", 721 | "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", 722 | "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", 723 | "dev": true, 724 | "dependencies": { 725 | "@jest/types": "^29.5.0", 726 | "@sinonjs/fake-timers": "^10.0.2", 727 | "@types/node": "*", 728 | "jest-message-util": "^29.5.0", 729 | "jest-mock": "^29.5.0", 730 | "jest-util": "^29.5.0" 731 | }, 732 | "engines": { 733 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 734 | } 735 | }, 736 | "node_modules/@jest/globals": { 737 | "version": "29.5.0", 738 | "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", 739 | "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", 740 | "dev": true, 741 | "dependencies": { 742 | "@jest/environment": "^29.5.0", 743 | "@jest/expect": "^29.5.0", 744 | "@jest/types": "^29.5.0", 745 | "jest-mock": "^29.5.0" 746 | }, 747 | "engines": { 748 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 749 | } 750 | }, 751 | "node_modules/@jest/reporters": { 752 | "version": "29.5.0", 753 | "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", 754 | "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", 755 | "dev": true, 756 | "dependencies": { 757 | "@bcoe/v8-coverage": "^0.2.3", 758 | "@jest/console": "^29.5.0", 759 | "@jest/test-result": "^29.5.0", 760 | "@jest/transform": "^29.5.0", 761 | "@jest/types": "^29.5.0", 762 | "@jridgewell/trace-mapping": "^0.3.15", 763 | "@types/node": "*", 764 | "chalk": "^4.0.0", 765 | "collect-v8-coverage": "^1.0.0", 766 | "exit": "^0.1.2", 767 | "glob": "^7.1.3", 768 | "graceful-fs": "^4.2.9", 769 | "istanbul-lib-coverage": "^3.0.0", 770 | "istanbul-lib-instrument": "^5.1.0", 771 | "istanbul-lib-report": "^3.0.0", 772 | "istanbul-lib-source-maps": "^4.0.0", 773 | "istanbul-reports": "^3.1.3", 774 | "jest-message-util": "^29.5.0", 775 | "jest-util": "^29.5.0", 776 | "jest-worker": "^29.5.0", 777 | "slash": "^3.0.0", 778 | "string-length": "^4.0.1", 779 | "strip-ansi": "^6.0.0", 780 | "v8-to-istanbul": "^9.0.1" 781 | }, 782 | "engines": { 783 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 784 | }, 785 | "peerDependencies": { 786 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 787 | }, 788 | "peerDependenciesMeta": { 789 | "node-notifier": { 790 | "optional": true 791 | } 792 | } 793 | }, 794 | "node_modules/@jest/schemas": { 795 | "version": "29.4.3", 796 | "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", 797 | "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", 798 | "dev": true, 799 | "dependencies": { 800 | "@sinclair/typebox": "^0.25.16" 801 | }, 802 | "engines": { 803 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 804 | } 805 | }, 806 | "node_modules/@jest/source-map": { 807 | "version": "29.4.3", 808 | "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", 809 | "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", 810 | "dev": true, 811 | "dependencies": { 812 | "@jridgewell/trace-mapping": "^0.3.15", 813 | "callsites": "^3.0.0", 814 | "graceful-fs": "^4.2.9" 815 | }, 816 | "engines": { 817 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 818 | } 819 | }, 820 | "node_modules/@jest/test-result": { 821 | "version": "29.5.0", 822 | "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", 823 | "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", 824 | "dev": true, 825 | "dependencies": { 826 | "@jest/console": "^29.5.0", 827 | "@jest/types": "^29.5.0", 828 | "@types/istanbul-lib-coverage": "^2.0.0", 829 | "collect-v8-coverage": "^1.0.0" 830 | }, 831 | "engines": { 832 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 833 | } 834 | }, 835 | "node_modules/@jest/test-sequencer": { 836 | "version": "29.5.0", 837 | "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", 838 | "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", 839 | "dev": true, 840 | "dependencies": { 841 | "@jest/test-result": "^29.5.0", 842 | "graceful-fs": "^4.2.9", 843 | "jest-haste-map": "^29.5.0", 844 | "slash": "^3.0.0" 845 | }, 846 | "engines": { 847 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 848 | } 849 | }, 850 | "node_modules/@jest/transform": { 851 | "version": "29.5.0", 852 | "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", 853 | "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", 854 | "dev": true, 855 | "dependencies": { 856 | "@babel/core": "^7.11.6", 857 | "@jest/types": "^29.5.0", 858 | "@jridgewell/trace-mapping": "^0.3.15", 859 | "babel-plugin-istanbul": "^6.1.1", 860 | "chalk": "^4.0.0", 861 | "convert-source-map": "^2.0.0", 862 | "fast-json-stable-stringify": "^2.1.0", 863 | "graceful-fs": "^4.2.9", 864 | "jest-haste-map": "^29.5.0", 865 | "jest-regex-util": "^29.4.3", 866 | "jest-util": "^29.5.0", 867 | "micromatch": "^4.0.4", 868 | "pirates": "^4.0.4", 869 | "slash": "^3.0.0", 870 | "write-file-atomic": "^4.0.2" 871 | }, 872 | "engines": { 873 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 874 | } 875 | }, 876 | "node_modules/@jest/types": { 877 | "version": "29.5.0", 878 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", 879 | "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", 880 | "dev": true, 881 | "dependencies": { 882 | "@jest/schemas": "^29.4.3", 883 | "@types/istanbul-lib-coverage": "^2.0.0", 884 | "@types/istanbul-reports": "^3.0.0", 885 | "@types/node": "*", 886 | "@types/yargs": "^17.0.8", 887 | "chalk": "^4.0.0" 888 | }, 889 | "engines": { 890 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 891 | } 892 | }, 893 | "node_modules/@jridgewell/gen-mapping": { 894 | "version": "0.3.3", 895 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 896 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 897 | "dev": true, 898 | "dependencies": { 899 | "@jridgewell/set-array": "^1.0.1", 900 | "@jridgewell/sourcemap-codec": "^1.4.10", 901 | "@jridgewell/trace-mapping": "^0.3.9" 902 | }, 903 | "engines": { 904 | "node": ">=6.0.0" 905 | } 906 | }, 907 | "node_modules/@jridgewell/resolve-uri": { 908 | "version": "3.1.0", 909 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 910 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 911 | "dev": true, 912 | "engines": { 913 | "node": ">=6.0.0" 914 | } 915 | }, 916 | "node_modules/@jridgewell/set-array": { 917 | "version": "1.1.2", 918 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 919 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 920 | "dev": true, 921 | "engines": { 922 | "node": ">=6.0.0" 923 | } 924 | }, 925 | "node_modules/@jridgewell/sourcemap-codec": { 926 | "version": "1.4.15", 927 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 928 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 929 | "dev": true 930 | }, 931 | "node_modules/@jridgewell/trace-mapping": { 932 | "version": "0.3.18", 933 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 934 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 935 | "dev": true, 936 | "dependencies": { 937 | "@jridgewell/resolve-uri": "3.1.0", 938 | "@jridgewell/sourcemap-codec": "1.4.14" 939 | } 940 | }, 941 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 942 | "version": "1.4.14", 943 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 944 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 945 | "dev": true 946 | }, 947 | "node_modules/@sinclair/typebox": { 948 | "version": "0.25.24", 949 | "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", 950 | "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", 951 | "dev": true 952 | }, 953 | "node_modules/@sinonjs/commons": { 954 | "version": "2.0.0", 955 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", 956 | "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", 957 | "dev": true, 958 | "dependencies": { 959 | "type-detect": "4.0.8" 960 | } 961 | }, 962 | "node_modules/@sinonjs/fake-timers": { 963 | "version": "10.0.2", 964 | "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", 965 | "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", 966 | "dev": true, 967 | "dependencies": { 968 | "@sinonjs/commons": "^2.0.0" 969 | } 970 | }, 971 | "node_modules/@types/babel__core": { 972 | "version": "7.20.0", 973 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", 974 | "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", 975 | "dev": true, 976 | "dependencies": { 977 | "@babel/parser": "^7.20.7", 978 | "@babel/types": "^7.20.7", 979 | "@types/babel__generator": "*", 980 | "@types/babel__template": "*", 981 | "@types/babel__traverse": "*" 982 | } 983 | }, 984 | "node_modules/@types/babel__generator": { 985 | "version": "7.6.4", 986 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", 987 | "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", 988 | "dev": true, 989 | "dependencies": { 990 | "@babel/types": "^7.0.0" 991 | } 992 | }, 993 | "node_modules/@types/babel__template": { 994 | "version": "7.4.1", 995 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", 996 | "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", 997 | "dev": true, 998 | "dependencies": { 999 | "@babel/parser": "^7.1.0", 1000 | "@babel/types": "^7.0.0" 1001 | } 1002 | }, 1003 | "node_modules/@types/babel__traverse": { 1004 | "version": "7.18.5", 1005 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", 1006 | "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", 1007 | "dev": true, 1008 | "dependencies": { 1009 | "@babel/types": "^7.3.0" 1010 | } 1011 | }, 1012 | "node_modules/@types/graceful-fs": { 1013 | "version": "4.1.6", 1014 | "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", 1015 | "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", 1016 | "dev": true, 1017 | "dependencies": { 1018 | "@types/node": "*" 1019 | } 1020 | }, 1021 | "node_modules/@types/istanbul-lib-coverage": { 1022 | "version": "2.0.4", 1023 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 1024 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 1025 | "dev": true 1026 | }, 1027 | "node_modules/@types/istanbul-lib-report": { 1028 | "version": "3.0.0", 1029 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1030 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 1031 | "dev": true, 1032 | "dependencies": { 1033 | "@types/istanbul-lib-coverage": "*" 1034 | } 1035 | }, 1036 | "node_modules/@types/istanbul-reports": { 1037 | "version": "3.0.1", 1038 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", 1039 | "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", 1040 | "dev": true, 1041 | "dependencies": { 1042 | "@types/istanbul-lib-report": "*" 1043 | } 1044 | }, 1045 | "node_modules/@types/jest": { 1046 | "version": "29.5.1", 1047 | "dev": true, 1048 | "license": "MIT", 1049 | "dependencies": { 1050 | "expect": "^29.0.0", 1051 | "pretty-format": "^29.0.0" 1052 | } 1053 | }, 1054 | "node_modules/@types/node": { 1055 | "version": "18.16.3", 1056 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", 1057 | "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", 1058 | "dev": true 1059 | }, 1060 | "node_modules/@types/prettier": { 1061 | "version": "2.7.2", 1062 | "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", 1063 | "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", 1064 | "dev": true 1065 | }, 1066 | "node_modules/@types/stack-utils": { 1067 | "version": "2.0.1", 1068 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", 1069 | "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", 1070 | "dev": true 1071 | }, 1072 | "node_modules/@types/yargs": { 1073 | "version": "17.0.24", 1074 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", 1075 | "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", 1076 | "dev": true, 1077 | "dependencies": { 1078 | "@types/yargs-parser": "*" 1079 | } 1080 | }, 1081 | "node_modules/@types/yargs-parser": { 1082 | "version": "21.0.0", 1083 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", 1084 | "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", 1085 | "dev": true 1086 | }, 1087 | "node_modules/ansi-escapes": { 1088 | "version": "4.3.2", 1089 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1090 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1091 | "dev": true, 1092 | "dependencies": { 1093 | "type-fest": "^0.21.3" 1094 | }, 1095 | "engines": { 1096 | "node": ">=8" 1097 | }, 1098 | "funding": { 1099 | "url": "https://github.com/sponsors/sindresorhus" 1100 | } 1101 | }, 1102 | "node_modules/ansi-regex": { 1103 | "version": "5.0.1", 1104 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1105 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1106 | "dev": true, 1107 | "engines": { 1108 | "node": ">=8" 1109 | } 1110 | }, 1111 | "node_modules/ansi-styles": { 1112 | "version": "4.3.0", 1113 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1114 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1115 | "dev": true, 1116 | "dependencies": { 1117 | "color-convert": "^2.0.1" 1118 | }, 1119 | "engines": { 1120 | "node": ">=8" 1121 | }, 1122 | "funding": { 1123 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1124 | } 1125 | }, 1126 | "node_modules/anymatch": { 1127 | "version": "3.1.3", 1128 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1129 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1130 | "dev": true, 1131 | "dependencies": { 1132 | "normalize-path": "^3.0.0", 1133 | "picomatch": "^2.0.4" 1134 | }, 1135 | "engines": { 1136 | "node": ">= 8" 1137 | } 1138 | }, 1139 | "node_modules/argparse": { 1140 | "version": "1.0.10", 1141 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1142 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1143 | "dev": true, 1144 | "dependencies": { 1145 | "sprintf-js": "~1.0.2" 1146 | } 1147 | }, 1148 | "node_modules/babel-jest": { 1149 | "version": "29.5.0", 1150 | "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", 1151 | "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", 1152 | "dev": true, 1153 | "dependencies": { 1154 | "@jest/transform": "^29.5.0", 1155 | "@types/babel__core": "^7.1.14", 1156 | "babel-plugin-istanbul": "^6.1.1", 1157 | "babel-preset-jest": "^29.5.0", 1158 | "chalk": "^4.0.0", 1159 | "graceful-fs": "^4.2.9", 1160 | "slash": "^3.0.0" 1161 | }, 1162 | "engines": { 1163 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1164 | }, 1165 | "peerDependencies": { 1166 | "@babel/core": "^7.8.0" 1167 | } 1168 | }, 1169 | "node_modules/babel-plugin-istanbul": { 1170 | "version": "6.1.1", 1171 | "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", 1172 | "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", 1173 | "dev": true, 1174 | "dependencies": { 1175 | "@babel/helper-plugin-utils": "^7.0.0", 1176 | "@istanbuljs/load-nyc-config": "^1.0.0", 1177 | "@istanbuljs/schema": "^0.1.2", 1178 | "istanbul-lib-instrument": "^5.0.4", 1179 | "test-exclude": "^6.0.0" 1180 | }, 1181 | "engines": { 1182 | "node": ">=8" 1183 | } 1184 | }, 1185 | "node_modules/babel-plugin-jest-hoist": { 1186 | "version": "29.5.0", 1187 | "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", 1188 | "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", 1189 | "dev": true, 1190 | "dependencies": { 1191 | "@babel/template": "^7.3.3", 1192 | "@babel/types": "^7.3.3", 1193 | "@types/babel__core": "^7.1.14", 1194 | "@types/babel__traverse": "^7.0.6" 1195 | }, 1196 | "engines": { 1197 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1198 | } 1199 | }, 1200 | "node_modules/babel-preset-current-node-syntax": { 1201 | "version": "1.0.1", 1202 | "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", 1203 | "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", 1204 | "dev": true, 1205 | "dependencies": { 1206 | "@babel/plugin-syntax-async-generators": "^7.8.4", 1207 | "@babel/plugin-syntax-bigint": "^7.8.3", 1208 | "@babel/plugin-syntax-class-properties": "^7.8.3", 1209 | "@babel/plugin-syntax-import-meta": "^7.8.3", 1210 | "@babel/plugin-syntax-json-strings": "^7.8.3", 1211 | "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", 1212 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 1213 | "@babel/plugin-syntax-numeric-separator": "^7.8.3", 1214 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1215 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 1216 | "@babel/plugin-syntax-optional-chaining": "^7.8.3", 1217 | "@babel/plugin-syntax-top-level-await": "^7.8.3" 1218 | }, 1219 | "peerDependencies": { 1220 | "@babel/core": "^7.0.0" 1221 | } 1222 | }, 1223 | "node_modules/babel-preset-jest": { 1224 | "version": "29.5.0", 1225 | "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", 1226 | "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", 1227 | "dev": true, 1228 | "dependencies": { 1229 | "babel-plugin-jest-hoist": "^29.5.0", 1230 | "babel-preset-current-node-syntax": "^1.0.0" 1231 | }, 1232 | "engines": { 1233 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1234 | }, 1235 | "peerDependencies": { 1236 | "@babel/core": "^7.0.0" 1237 | } 1238 | }, 1239 | "node_modules/balanced-match": { 1240 | "version": "1.0.2", 1241 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1242 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1243 | "dev": true 1244 | }, 1245 | "node_modules/brace-expansion": { 1246 | "version": "1.1.11", 1247 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1248 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1249 | "dev": true, 1250 | "dependencies": { 1251 | "balanced-match": "^1.0.0", 1252 | "concat-map": "0.0.1" 1253 | } 1254 | }, 1255 | "node_modules/braces": { 1256 | "version": "3.0.2", 1257 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1258 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1259 | "dev": true, 1260 | "dependencies": { 1261 | "fill-range": "^7.0.1" 1262 | }, 1263 | "engines": { 1264 | "node": ">=8" 1265 | } 1266 | }, 1267 | "node_modules/browserslist": { 1268 | "version": "4.21.5", 1269 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", 1270 | "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", 1271 | "dev": true, 1272 | "funding": [ 1273 | { 1274 | "type": "opencollective", 1275 | "url": "https://opencollective.com/browserslist" 1276 | }, 1277 | { 1278 | "type": "tidelift", 1279 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1280 | } 1281 | ], 1282 | "dependencies": { 1283 | "caniuse-lite": "^1.0.30001449", 1284 | "electron-to-chromium": "^1.4.284", 1285 | "node-releases": "^2.0.8", 1286 | "update-browserslist-db": "^1.0.10" 1287 | }, 1288 | "bin": { 1289 | "browserslist": "cli.js" 1290 | }, 1291 | "engines": { 1292 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1293 | } 1294 | }, 1295 | "node_modules/bs-logger": { 1296 | "version": "0.2.6", 1297 | "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", 1298 | "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", 1299 | "dev": true, 1300 | "dependencies": { 1301 | "fast-json-stable-stringify": "2.x" 1302 | }, 1303 | "engines": { 1304 | "node": ">= 6" 1305 | } 1306 | }, 1307 | "node_modules/bser": { 1308 | "version": "2.1.1", 1309 | "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", 1310 | "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", 1311 | "dev": true, 1312 | "dependencies": { 1313 | "node-int64": "^0.4.0" 1314 | } 1315 | }, 1316 | "node_modules/buffer-from": { 1317 | "version": "1.1.2", 1318 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1319 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1320 | "dev": true 1321 | }, 1322 | "node_modules/callsites": { 1323 | "version": "3.1.0", 1324 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1325 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1326 | "dev": true, 1327 | "engines": { 1328 | "node": ">=6" 1329 | } 1330 | }, 1331 | "node_modules/camelcase": { 1332 | "version": "5.3.1", 1333 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1334 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 1335 | "dev": true, 1336 | "engines": { 1337 | "node": ">=6" 1338 | } 1339 | }, 1340 | "node_modules/caniuse-lite": { 1341 | "version": "1.0.30001482", 1342 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz", 1343 | "integrity": "sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ==", 1344 | "dev": true, 1345 | "funding": [ 1346 | { 1347 | "type": "opencollective", 1348 | "url": "https://opencollective.com/browserslist" 1349 | }, 1350 | { 1351 | "type": "tidelift", 1352 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1353 | }, 1354 | { 1355 | "type": "github", 1356 | "url": "https://github.com/sponsors/ai" 1357 | } 1358 | ] 1359 | }, 1360 | "node_modules/chalk": { 1361 | "version": "4.1.2", 1362 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1363 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1364 | "dev": true, 1365 | "dependencies": { 1366 | "ansi-styles": "^4.1.0", 1367 | "supports-color": "^7.1.0" 1368 | }, 1369 | "engines": { 1370 | "node": ">=10" 1371 | }, 1372 | "funding": { 1373 | "url": "https://github.com/chalk/chalk?sponsor=1" 1374 | } 1375 | }, 1376 | "node_modules/char-regex": { 1377 | "version": "1.0.2", 1378 | "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", 1379 | "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", 1380 | "dev": true, 1381 | "engines": { 1382 | "node": ">=10" 1383 | } 1384 | }, 1385 | "node_modules/ci-info": { 1386 | "version": "3.8.0", 1387 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", 1388 | "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", 1389 | "dev": true, 1390 | "funding": [ 1391 | { 1392 | "type": "github", 1393 | "url": "https://github.com/sponsors/sibiraj-s" 1394 | } 1395 | ], 1396 | "engines": { 1397 | "node": ">=8" 1398 | } 1399 | }, 1400 | "node_modules/cjs-module-lexer": { 1401 | "version": "1.2.2", 1402 | "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", 1403 | "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", 1404 | "dev": true 1405 | }, 1406 | "node_modules/cliui": { 1407 | "version": "8.0.1", 1408 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 1409 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 1410 | "dev": true, 1411 | "dependencies": { 1412 | "string-width": "^4.2.0", 1413 | "strip-ansi": "^6.0.1", 1414 | "wrap-ansi": "^7.0.0" 1415 | }, 1416 | "engines": { 1417 | "node": ">=12" 1418 | } 1419 | }, 1420 | "node_modules/co": { 1421 | "version": "4.6.0", 1422 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 1423 | "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", 1424 | "dev": true, 1425 | "engines": { 1426 | "iojs": ">= 1.0.0", 1427 | "node": ">= 0.12.0" 1428 | } 1429 | }, 1430 | "node_modules/collect-v8-coverage": { 1431 | "version": "1.0.1", 1432 | "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", 1433 | "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", 1434 | "dev": true 1435 | }, 1436 | "node_modules/color-convert": { 1437 | "version": "2.0.1", 1438 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1439 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1440 | "dev": true, 1441 | "dependencies": { 1442 | "color-name": "~1.1.4" 1443 | }, 1444 | "engines": { 1445 | "node": ">=7.0.0" 1446 | } 1447 | }, 1448 | "node_modules/color-name": { 1449 | "version": "1.1.4", 1450 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1451 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1452 | "dev": true 1453 | }, 1454 | "node_modules/concat-map": { 1455 | "version": "0.0.1", 1456 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1457 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1458 | "dev": true 1459 | }, 1460 | "node_modules/convert-source-map": { 1461 | "version": "2.0.0", 1462 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1463 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1464 | "dev": true 1465 | }, 1466 | "node_modules/cross-spawn": { 1467 | "version": "7.0.3", 1468 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1469 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1470 | "dev": true, 1471 | "dependencies": { 1472 | "path-key": "^3.1.0", 1473 | "shebang-command": "^2.0.0", 1474 | "which": "^2.0.1" 1475 | }, 1476 | "engines": { 1477 | "node": ">= 8" 1478 | } 1479 | }, 1480 | "node_modules/debug": { 1481 | "version": "4.3.4", 1482 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1483 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1484 | "dev": true, 1485 | "dependencies": { 1486 | "ms": "2.1.2" 1487 | }, 1488 | "engines": { 1489 | "node": ">=6.0" 1490 | }, 1491 | "peerDependenciesMeta": { 1492 | "supports-color": { 1493 | "optional": true 1494 | } 1495 | } 1496 | }, 1497 | "node_modules/dedent": { 1498 | "version": "0.7.0", 1499 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 1500 | "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", 1501 | "dev": true 1502 | }, 1503 | "node_modules/deepmerge": { 1504 | "version": "4.3.1", 1505 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 1506 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 1507 | "dev": true, 1508 | "engines": { 1509 | "node": ">=0.10.0" 1510 | } 1511 | }, 1512 | "node_modules/detect-newline": { 1513 | "version": "3.1.0", 1514 | "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", 1515 | "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", 1516 | "dev": true, 1517 | "engines": { 1518 | "node": ">=8" 1519 | } 1520 | }, 1521 | "node_modules/diff-sequences": { 1522 | "version": "29.4.3", 1523 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", 1524 | "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", 1525 | "dev": true, 1526 | "engines": { 1527 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1528 | } 1529 | }, 1530 | "node_modules/electron-to-chromium": { 1531 | "version": "1.4.382", 1532 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.382.tgz", 1533 | "integrity": "sha512-czMavlW52VIPgutbVL9JnZIZuFijzsG1ww/1z2Otu1r1q+9Qe2bTsH3My3sZarlvwyqHM6+mnZfEnt2Vr4dsIg==", 1534 | "dev": true 1535 | }, 1536 | "node_modules/emittery": { 1537 | "version": "0.13.1", 1538 | "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", 1539 | "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", 1540 | "dev": true, 1541 | "engines": { 1542 | "node": ">=12" 1543 | }, 1544 | "funding": { 1545 | "url": "https://github.com/sindresorhus/emittery?sponsor=1" 1546 | } 1547 | }, 1548 | "node_modules/emoji-regex": { 1549 | "version": "8.0.0", 1550 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1551 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1552 | "dev": true 1553 | }, 1554 | "node_modules/error-ex": { 1555 | "version": "1.3.2", 1556 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1557 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1558 | "dev": true, 1559 | "dependencies": { 1560 | "is-arrayish": "^0.2.1" 1561 | } 1562 | }, 1563 | "node_modules/escalade": { 1564 | "version": "3.1.1", 1565 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1566 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1567 | "dev": true, 1568 | "engines": { 1569 | "node": ">=6" 1570 | } 1571 | }, 1572 | "node_modules/escape-string-regexp": { 1573 | "version": "2.0.0", 1574 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1575 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1576 | "dev": true, 1577 | "engines": { 1578 | "node": ">=8" 1579 | } 1580 | }, 1581 | "node_modules/esprima": { 1582 | "version": "4.0.1", 1583 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1584 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1585 | "dev": true, 1586 | "bin": { 1587 | "esparse": "bin/esparse.js", 1588 | "esvalidate": "bin/esvalidate.js" 1589 | }, 1590 | "engines": { 1591 | "node": ">=4" 1592 | } 1593 | }, 1594 | "node_modules/execa": { 1595 | "version": "5.1.1", 1596 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1597 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1598 | "dev": true, 1599 | "dependencies": { 1600 | "cross-spawn": "^7.0.3", 1601 | "get-stream": "^6.0.0", 1602 | "human-signals": "^2.1.0", 1603 | "is-stream": "^2.0.0", 1604 | "merge-stream": "^2.0.0", 1605 | "npm-run-path": "^4.0.1", 1606 | "onetime": "^5.1.2", 1607 | "signal-exit": "^3.0.3", 1608 | "strip-final-newline": "^2.0.0" 1609 | }, 1610 | "engines": { 1611 | "node": ">=10" 1612 | }, 1613 | "funding": { 1614 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1615 | } 1616 | }, 1617 | "node_modules/exit": { 1618 | "version": "0.1.2", 1619 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 1620 | "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", 1621 | "dev": true, 1622 | "engines": { 1623 | "node": ">= 0.8.0" 1624 | } 1625 | }, 1626 | "node_modules/expect": { 1627 | "version": "29.5.0", 1628 | "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", 1629 | "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", 1630 | "dev": true, 1631 | "dependencies": { 1632 | "@jest/expect-utils": "^29.5.0", 1633 | "jest-get-type": "^29.4.3", 1634 | "jest-matcher-utils": "^29.5.0", 1635 | "jest-message-util": "^29.5.0", 1636 | "jest-util": "^29.5.0" 1637 | }, 1638 | "engines": { 1639 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1640 | } 1641 | }, 1642 | "node_modules/fast-json-stable-stringify": { 1643 | "version": "2.1.0", 1644 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1645 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1646 | "dev": true 1647 | }, 1648 | "node_modules/fb-watchman": { 1649 | "version": "2.0.2", 1650 | "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", 1651 | "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", 1652 | "dev": true, 1653 | "dependencies": { 1654 | "bser": "2.1.1" 1655 | } 1656 | }, 1657 | "node_modules/fill-range": { 1658 | "version": "7.0.1", 1659 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1660 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1661 | "dev": true, 1662 | "dependencies": { 1663 | "to-regex-range": "^5.0.1" 1664 | }, 1665 | "engines": { 1666 | "node": ">=8" 1667 | } 1668 | }, 1669 | "node_modules/find-up": { 1670 | "version": "4.1.0", 1671 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1672 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1673 | "dev": true, 1674 | "dependencies": { 1675 | "locate-path": "^5.0.0", 1676 | "path-exists": "^4.0.0" 1677 | }, 1678 | "engines": { 1679 | "node": ">=8" 1680 | } 1681 | }, 1682 | "node_modules/fs.realpath": { 1683 | "version": "1.0.0", 1684 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1685 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1686 | "dev": true 1687 | }, 1688 | "node_modules/fsevents": { 1689 | "version": "2.3.2", 1690 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1691 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1692 | "dev": true, 1693 | "hasInstallScript": true, 1694 | "optional": true, 1695 | "os": [ 1696 | "darwin" 1697 | ], 1698 | "engines": { 1699 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1700 | } 1701 | }, 1702 | "node_modules/function-bind": { 1703 | "version": "1.1.1", 1704 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1705 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1706 | "dev": true 1707 | }, 1708 | "node_modules/gensync": { 1709 | "version": "1.0.0-beta.2", 1710 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1711 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1712 | "dev": true, 1713 | "engines": { 1714 | "node": ">=6.9.0" 1715 | } 1716 | }, 1717 | "node_modules/get-caller-file": { 1718 | "version": "2.0.5", 1719 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1720 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1721 | "dev": true, 1722 | "engines": { 1723 | "node": "6.* || 8.* || >= 10.*" 1724 | } 1725 | }, 1726 | "node_modules/get-package-type": { 1727 | "version": "0.1.0", 1728 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 1729 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 1730 | "dev": true, 1731 | "engines": { 1732 | "node": ">=8.0.0" 1733 | } 1734 | }, 1735 | "node_modules/get-stream": { 1736 | "version": "6.0.1", 1737 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1738 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1739 | "dev": true, 1740 | "engines": { 1741 | "node": ">=10" 1742 | }, 1743 | "funding": { 1744 | "url": "https://github.com/sponsors/sindresorhus" 1745 | } 1746 | }, 1747 | "node_modules/glob": { 1748 | "version": "7.2.3", 1749 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1750 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1751 | "dev": true, 1752 | "dependencies": { 1753 | "fs.realpath": "^1.0.0", 1754 | "inflight": "^1.0.4", 1755 | "inherits": "2", 1756 | "minimatch": "^3.1.1", 1757 | "once": "^1.3.0", 1758 | "path-is-absolute": "^1.0.0" 1759 | }, 1760 | "engines": { 1761 | "node": "*" 1762 | }, 1763 | "funding": { 1764 | "url": "https://github.com/sponsors/isaacs" 1765 | } 1766 | }, 1767 | "node_modules/globals": { 1768 | "version": "11.12.0", 1769 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1770 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1771 | "dev": true, 1772 | "engines": { 1773 | "node": ">=4" 1774 | } 1775 | }, 1776 | "node_modules/graceful-fs": { 1777 | "version": "4.2.11", 1778 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1779 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1780 | "dev": true 1781 | }, 1782 | "node_modules/has": { 1783 | "version": "1.0.3", 1784 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1785 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1786 | "dev": true, 1787 | "dependencies": { 1788 | "function-bind": "^1.1.1" 1789 | }, 1790 | "engines": { 1791 | "node": ">= 0.4.0" 1792 | } 1793 | }, 1794 | "node_modules/has-flag": { 1795 | "version": "4.0.0", 1796 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1797 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1798 | "dev": true, 1799 | "engines": { 1800 | "node": ">=8" 1801 | } 1802 | }, 1803 | "node_modules/html-escaper": { 1804 | "version": "2.0.2", 1805 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1806 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1807 | "dev": true 1808 | }, 1809 | "node_modules/human-signals": { 1810 | "version": "2.1.0", 1811 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1812 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1813 | "dev": true, 1814 | "engines": { 1815 | "node": ">=10.17.0" 1816 | } 1817 | }, 1818 | "node_modules/import-local": { 1819 | "version": "3.1.0", 1820 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 1821 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 1822 | "dev": true, 1823 | "dependencies": { 1824 | "pkg-dir": "^4.2.0", 1825 | "resolve-cwd": "^3.0.0" 1826 | }, 1827 | "bin": { 1828 | "import-local-fixture": "fixtures/cli.js" 1829 | }, 1830 | "engines": { 1831 | "node": ">=8" 1832 | }, 1833 | "funding": { 1834 | "url": "https://github.com/sponsors/sindresorhus" 1835 | } 1836 | }, 1837 | "node_modules/imurmurhash": { 1838 | "version": "0.1.4", 1839 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1840 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1841 | "dev": true, 1842 | "engines": { 1843 | "node": ">=0.8.19" 1844 | } 1845 | }, 1846 | "node_modules/inflight": { 1847 | "version": "1.0.6", 1848 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1849 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1850 | "dev": true, 1851 | "dependencies": { 1852 | "once": "^1.3.0", 1853 | "wrappy": "1" 1854 | } 1855 | }, 1856 | "node_modules/inherits": { 1857 | "version": "2.0.4", 1858 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1859 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1860 | "dev": true 1861 | }, 1862 | "node_modules/is-arrayish": { 1863 | "version": "0.2.1", 1864 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1865 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 1866 | "dev": true 1867 | }, 1868 | "node_modules/is-core-module": { 1869 | "version": "2.12.0", 1870 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", 1871 | "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", 1872 | "dev": true, 1873 | "dependencies": { 1874 | "has": "^1.0.3" 1875 | }, 1876 | "funding": { 1877 | "url": "https://github.com/sponsors/ljharb" 1878 | } 1879 | }, 1880 | "node_modules/is-fullwidth-code-point": { 1881 | "version": "3.0.0", 1882 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1883 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1884 | "dev": true, 1885 | "engines": { 1886 | "node": ">=8" 1887 | } 1888 | }, 1889 | "node_modules/is-generator-fn": { 1890 | "version": "2.1.0", 1891 | "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", 1892 | "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", 1893 | "dev": true, 1894 | "engines": { 1895 | "node": ">=6" 1896 | } 1897 | }, 1898 | "node_modules/is-number": { 1899 | "version": "7.0.0", 1900 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1901 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1902 | "dev": true, 1903 | "engines": { 1904 | "node": ">=0.12.0" 1905 | } 1906 | }, 1907 | "node_modules/is-stream": { 1908 | "version": "2.0.1", 1909 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1910 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1911 | "dev": true, 1912 | "engines": { 1913 | "node": ">=8" 1914 | }, 1915 | "funding": { 1916 | "url": "https://github.com/sponsors/sindresorhus" 1917 | } 1918 | }, 1919 | "node_modules/isexe": { 1920 | "version": "2.0.0", 1921 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1922 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1923 | "dev": true 1924 | }, 1925 | "node_modules/istanbul-lib-coverage": { 1926 | "version": "3.2.0", 1927 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 1928 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 1929 | "dev": true, 1930 | "engines": { 1931 | "node": ">=8" 1932 | } 1933 | }, 1934 | "node_modules/istanbul-lib-instrument": { 1935 | "version": "5.2.1", 1936 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", 1937 | "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", 1938 | "dev": true, 1939 | "dependencies": { 1940 | "@babel/core": "^7.12.3", 1941 | "@babel/parser": "^7.14.7", 1942 | "@istanbuljs/schema": "^0.1.2", 1943 | "istanbul-lib-coverage": "^3.2.0", 1944 | "semver": "^6.3.0" 1945 | }, 1946 | "engines": { 1947 | "node": ">=8" 1948 | } 1949 | }, 1950 | "node_modules/istanbul-lib-report": { 1951 | "version": "3.0.0", 1952 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1953 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 1954 | "dev": true, 1955 | "dependencies": { 1956 | "istanbul-lib-coverage": "^3.0.0", 1957 | "make-dir": "^3.0.0", 1958 | "supports-color": "^7.1.0" 1959 | }, 1960 | "engines": { 1961 | "node": ">=8" 1962 | } 1963 | }, 1964 | "node_modules/istanbul-lib-source-maps": { 1965 | "version": "4.0.1", 1966 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", 1967 | "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", 1968 | "dev": true, 1969 | "dependencies": { 1970 | "debug": "^4.1.1", 1971 | "istanbul-lib-coverage": "^3.0.0", 1972 | "source-map": "^0.6.1" 1973 | }, 1974 | "engines": { 1975 | "node": ">=10" 1976 | } 1977 | }, 1978 | "node_modules/istanbul-reports": { 1979 | "version": "3.1.5", 1980 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", 1981 | "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", 1982 | "dev": true, 1983 | "dependencies": { 1984 | "html-escaper": "^2.0.0", 1985 | "istanbul-lib-report": "^3.0.0" 1986 | }, 1987 | "engines": { 1988 | "node": ">=8" 1989 | } 1990 | }, 1991 | "node_modules/jest": { 1992 | "version": "29.5.0", 1993 | "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", 1994 | "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", 1995 | "dev": true, 1996 | "dependencies": { 1997 | "@jest/core": "^29.5.0", 1998 | "@jest/types": "^29.5.0", 1999 | "import-local": "^3.0.2", 2000 | "jest-cli": "^29.5.0" 2001 | }, 2002 | "bin": { 2003 | "jest": "bin/jest.js" 2004 | }, 2005 | "engines": { 2006 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2007 | }, 2008 | "peerDependencies": { 2009 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 2010 | }, 2011 | "peerDependenciesMeta": { 2012 | "node-notifier": { 2013 | "optional": true 2014 | } 2015 | } 2016 | }, 2017 | "node_modules/jest-changed-files": { 2018 | "version": "29.5.0", 2019 | "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", 2020 | "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", 2021 | "dev": true, 2022 | "dependencies": { 2023 | "execa": "^5.0.0", 2024 | "p-limit": "^3.1.0" 2025 | }, 2026 | "engines": { 2027 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2028 | } 2029 | }, 2030 | "node_modules/jest-circus": { 2031 | "version": "29.5.0", 2032 | "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", 2033 | "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", 2034 | "dev": true, 2035 | "dependencies": { 2036 | "@jest/environment": "^29.5.0", 2037 | "@jest/expect": "^29.5.0", 2038 | "@jest/test-result": "^29.5.0", 2039 | "@jest/types": "^29.5.0", 2040 | "@types/node": "*", 2041 | "chalk": "^4.0.0", 2042 | "co": "^4.6.0", 2043 | "dedent": "^0.7.0", 2044 | "is-generator-fn": "^2.0.0", 2045 | "jest-each": "^29.5.0", 2046 | "jest-matcher-utils": "^29.5.0", 2047 | "jest-message-util": "^29.5.0", 2048 | "jest-runtime": "^29.5.0", 2049 | "jest-snapshot": "^29.5.0", 2050 | "jest-util": "^29.5.0", 2051 | "p-limit": "^3.1.0", 2052 | "pretty-format": "^29.5.0", 2053 | "pure-rand": "^6.0.0", 2054 | "slash": "^3.0.0", 2055 | "stack-utils": "^2.0.3" 2056 | }, 2057 | "engines": { 2058 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2059 | } 2060 | }, 2061 | "node_modules/jest-cli": { 2062 | "version": "29.5.0", 2063 | "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", 2064 | "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", 2065 | "dev": true, 2066 | "dependencies": { 2067 | "@jest/core": "^29.5.0", 2068 | "@jest/test-result": "^29.5.0", 2069 | "@jest/types": "^29.5.0", 2070 | "chalk": "^4.0.0", 2071 | "exit": "^0.1.2", 2072 | "graceful-fs": "^4.2.9", 2073 | "import-local": "^3.0.2", 2074 | "jest-config": "^29.5.0", 2075 | "jest-util": "^29.5.0", 2076 | "jest-validate": "^29.5.0", 2077 | "prompts": "^2.0.1", 2078 | "yargs": "^17.3.1" 2079 | }, 2080 | "bin": { 2081 | "jest": "bin/jest.js" 2082 | }, 2083 | "engines": { 2084 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2085 | }, 2086 | "peerDependencies": { 2087 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 2088 | }, 2089 | "peerDependenciesMeta": { 2090 | "node-notifier": { 2091 | "optional": true 2092 | } 2093 | } 2094 | }, 2095 | "node_modules/jest-config": { 2096 | "version": "29.5.0", 2097 | "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", 2098 | "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", 2099 | "dev": true, 2100 | "dependencies": { 2101 | "@babel/core": "^7.11.6", 2102 | "@jest/test-sequencer": "^29.5.0", 2103 | "@jest/types": "^29.5.0", 2104 | "babel-jest": "^29.5.0", 2105 | "chalk": "^4.0.0", 2106 | "ci-info": "^3.2.0", 2107 | "deepmerge": "^4.2.2", 2108 | "glob": "^7.1.3", 2109 | "graceful-fs": "^4.2.9", 2110 | "jest-circus": "^29.5.0", 2111 | "jest-environment-node": "^29.5.0", 2112 | "jest-get-type": "^29.4.3", 2113 | "jest-regex-util": "^29.4.3", 2114 | "jest-resolve": "^29.5.0", 2115 | "jest-runner": "^29.5.0", 2116 | "jest-util": "^29.5.0", 2117 | "jest-validate": "^29.5.0", 2118 | "micromatch": "^4.0.4", 2119 | "parse-json": "^5.2.0", 2120 | "pretty-format": "^29.5.0", 2121 | "slash": "^3.0.0", 2122 | "strip-json-comments": "^3.1.1" 2123 | }, 2124 | "engines": { 2125 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2126 | }, 2127 | "peerDependencies": { 2128 | "@types/node": "*", 2129 | "ts-node": ">=9.0.0" 2130 | }, 2131 | "peerDependenciesMeta": { 2132 | "@types/node": { 2133 | "optional": true 2134 | }, 2135 | "ts-node": { 2136 | "optional": true 2137 | } 2138 | } 2139 | }, 2140 | "node_modules/jest-diff": { 2141 | "version": "29.5.0", 2142 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", 2143 | "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", 2144 | "dev": true, 2145 | "dependencies": { 2146 | "chalk": "^4.0.0", 2147 | "diff-sequences": "^29.4.3", 2148 | "jest-get-type": "^29.4.3", 2149 | "pretty-format": "^29.5.0" 2150 | }, 2151 | "engines": { 2152 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2153 | } 2154 | }, 2155 | "node_modules/jest-docblock": { 2156 | "version": "29.4.3", 2157 | "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", 2158 | "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", 2159 | "dev": true, 2160 | "dependencies": { 2161 | "detect-newline": "^3.0.0" 2162 | }, 2163 | "engines": { 2164 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2165 | } 2166 | }, 2167 | "node_modules/jest-each": { 2168 | "version": "29.5.0", 2169 | "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", 2170 | "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", 2171 | "dev": true, 2172 | "dependencies": { 2173 | "@jest/types": "^29.5.0", 2174 | "chalk": "^4.0.0", 2175 | "jest-get-type": "^29.4.3", 2176 | "jest-util": "^29.5.0", 2177 | "pretty-format": "^29.5.0" 2178 | }, 2179 | "engines": { 2180 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2181 | } 2182 | }, 2183 | "node_modules/jest-environment-node": { 2184 | "version": "29.5.0", 2185 | "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", 2186 | "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", 2187 | "dev": true, 2188 | "dependencies": { 2189 | "@jest/environment": "^29.5.0", 2190 | "@jest/fake-timers": "^29.5.0", 2191 | "@jest/types": "^29.5.0", 2192 | "@types/node": "*", 2193 | "jest-mock": "^29.5.0", 2194 | "jest-util": "^29.5.0" 2195 | }, 2196 | "engines": { 2197 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2198 | } 2199 | }, 2200 | "node_modules/jest-get-type": { 2201 | "version": "29.4.3", 2202 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", 2203 | "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", 2204 | "dev": true, 2205 | "engines": { 2206 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2207 | } 2208 | }, 2209 | "node_modules/jest-haste-map": { 2210 | "version": "29.5.0", 2211 | "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", 2212 | "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", 2213 | "dev": true, 2214 | "dependencies": { 2215 | "@jest/types": "^29.5.0", 2216 | "@types/graceful-fs": "^4.1.3", 2217 | "@types/node": "*", 2218 | "anymatch": "^3.0.3", 2219 | "fb-watchman": "^2.0.0", 2220 | "graceful-fs": "^4.2.9", 2221 | "jest-regex-util": "^29.4.3", 2222 | "jest-util": "^29.5.0", 2223 | "jest-worker": "^29.5.0", 2224 | "micromatch": "^4.0.4", 2225 | "walker": "^1.0.8" 2226 | }, 2227 | "engines": { 2228 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2229 | }, 2230 | "optionalDependencies": { 2231 | "fsevents": "^2.3.2" 2232 | } 2233 | }, 2234 | "node_modules/jest-leak-detector": { 2235 | "version": "29.5.0", 2236 | "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", 2237 | "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", 2238 | "dev": true, 2239 | "dependencies": { 2240 | "jest-get-type": "^29.4.3", 2241 | "pretty-format": "^29.5.0" 2242 | }, 2243 | "engines": { 2244 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2245 | } 2246 | }, 2247 | "node_modules/jest-matcher-utils": { 2248 | "version": "29.5.0", 2249 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", 2250 | "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", 2251 | "dev": true, 2252 | "dependencies": { 2253 | "chalk": "^4.0.0", 2254 | "jest-diff": "^29.5.0", 2255 | "jest-get-type": "^29.4.3", 2256 | "pretty-format": "^29.5.0" 2257 | }, 2258 | "engines": { 2259 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2260 | } 2261 | }, 2262 | "node_modules/jest-message-util": { 2263 | "version": "29.5.0", 2264 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", 2265 | "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", 2266 | "dev": true, 2267 | "dependencies": { 2268 | "@babel/code-frame": "^7.12.13", 2269 | "@jest/types": "^29.5.0", 2270 | "@types/stack-utils": "^2.0.0", 2271 | "chalk": "^4.0.0", 2272 | "graceful-fs": "^4.2.9", 2273 | "micromatch": "^4.0.4", 2274 | "pretty-format": "^29.5.0", 2275 | "slash": "^3.0.0", 2276 | "stack-utils": "^2.0.3" 2277 | }, 2278 | "engines": { 2279 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2280 | } 2281 | }, 2282 | "node_modules/jest-mock": { 2283 | "version": "29.5.0", 2284 | "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", 2285 | "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", 2286 | "dev": true, 2287 | "dependencies": { 2288 | "@jest/types": "^29.5.0", 2289 | "@types/node": "*", 2290 | "jest-util": "^29.5.0" 2291 | }, 2292 | "engines": { 2293 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2294 | } 2295 | }, 2296 | "node_modules/jest-pnp-resolver": { 2297 | "version": "1.2.3", 2298 | "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", 2299 | "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", 2300 | "dev": true, 2301 | "engines": { 2302 | "node": ">=6" 2303 | }, 2304 | "peerDependencies": { 2305 | "jest-resolve": "*" 2306 | }, 2307 | "peerDependenciesMeta": { 2308 | "jest-resolve": { 2309 | "optional": true 2310 | } 2311 | } 2312 | }, 2313 | "node_modules/jest-regex-util": { 2314 | "version": "29.4.3", 2315 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", 2316 | "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", 2317 | "dev": true, 2318 | "engines": { 2319 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2320 | } 2321 | }, 2322 | "node_modules/jest-resolve": { 2323 | "version": "29.5.0", 2324 | "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", 2325 | "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", 2326 | "dev": true, 2327 | "dependencies": { 2328 | "chalk": "^4.0.0", 2329 | "graceful-fs": "^4.2.9", 2330 | "jest-haste-map": "^29.5.0", 2331 | "jest-pnp-resolver": "^1.2.2", 2332 | "jest-util": "^29.5.0", 2333 | "jest-validate": "^29.5.0", 2334 | "resolve": "^1.20.0", 2335 | "resolve.exports": "^2.0.0", 2336 | "slash": "^3.0.0" 2337 | }, 2338 | "engines": { 2339 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2340 | } 2341 | }, 2342 | "node_modules/jest-resolve-dependencies": { 2343 | "version": "29.5.0", 2344 | "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", 2345 | "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", 2346 | "dev": true, 2347 | "dependencies": { 2348 | "jest-regex-util": "^29.4.3", 2349 | "jest-snapshot": "^29.5.0" 2350 | }, 2351 | "engines": { 2352 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2353 | } 2354 | }, 2355 | "node_modules/jest-runner": { 2356 | "version": "29.5.0", 2357 | "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", 2358 | "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", 2359 | "dev": true, 2360 | "dependencies": { 2361 | "@jest/console": "^29.5.0", 2362 | "@jest/environment": "^29.5.0", 2363 | "@jest/test-result": "^29.5.0", 2364 | "@jest/transform": "^29.5.0", 2365 | "@jest/types": "^29.5.0", 2366 | "@types/node": "*", 2367 | "chalk": "^4.0.0", 2368 | "emittery": "^0.13.1", 2369 | "graceful-fs": "^4.2.9", 2370 | "jest-docblock": "^29.4.3", 2371 | "jest-environment-node": "^29.5.0", 2372 | "jest-haste-map": "^29.5.0", 2373 | "jest-leak-detector": "^29.5.0", 2374 | "jest-message-util": "^29.5.0", 2375 | "jest-resolve": "^29.5.0", 2376 | "jest-runtime": "^29.5.0", 2377 | "jest-util": "^29.5.0", 2378 | "jest-watcher": "^29.5.0", 2379 | "jest-worker": "^29.5.0", 2380 | "p-limit": "^3.1.0", 2381 | "source-map-support": "0.5.13" 2382 | }, 2383 | "engines": { 2384 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2385 | } 2386 | }, 2387 | "node_modules/jest-runtime": { 2388 | "version": "29.5.0", 2389 | "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", 2390 | "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", 2391 | "dev": true, 2392 | "dependencies": { 2393 | "@jest/environment": "^29.5.0", 2394 | "@jest/fake-timers": "^29.5.0", 2395 | "@jest/globals": "^29.5.0", 2396 | "@jest/source-map": "^29.4.3", 2397 | "@jest/test-result": "^29.5.0", 2398 | "@jest/transform": "^29.5.0", 2399 | "@jest/types": "^29.5.0", 2400 | "@types/node": "*", 2401 | "chalk": "^4.0.0", 2402 | "cjs-module-lexer": "^1.0.0", 2403 | "collect-v8-coverage": "^1.0.0", 2404 | "glob": "^7.1.3", 2405 | "graceful-fs": "^4.2.9", 2406 | "jest-haste-map": "^29.5.0", 2407 | "jest-message-util": "^29.5.0", 2408 | "jest-mock": "^29.5.0", 2409 | "jest-regex-util": "^29.4.3", 2410 | "jest-resolve": "^29.5.0", 2411 | "jest-snapshot": "^29.5.0", 2412 | "jest-util": "^29.5.0", 2413 | "slash": "^3.0.0", 2414 | "strip-bom": "^4.0.0" 2415 | }, 2416 | "engines": { 2417 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2418 | } 2419 | }, 2420 | "node_modules/jest-snapshot": { 2421 | "version": "29.5.0", 2422 | "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", 2423 | "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", 2424 | "dev": true, 2425 | "dependencies": { 2426 | "@babel/core": "^7.11.6", 2427 | "@babel/generator": "^7.7.2", 2428 | "@babel/plugin-syntax-jsx": "^7.7.2", 2429 | "@babel/plugin-syntax-typescript": "^7.7.2", 2430 | "@babel/traverse": "^7.7.2", 2431 | "@babel/types": "^7.3.3", 2432 | "@jest/expect-utils": "^29.5.0", 2433 | "@jest/transform": "^29.5.0", 2434 | "@jest/types": "^29.5.0", 2435 | "@types/babel__traverse": "^7.0.6", 2436 | "@types/prettier": "^2.1.5", 2437 | "babel-preset-current-node-syntax": "^1.0.0", 2438 | "chalk": "^4.0.0", 2439 | "expect": "^29.5.0", 2440 | "graceful-fs": "^4.2.9", 2441 | "jest-diff": "^29.5.0", 2442 | "jest-get-type": "^29.4.3", 2443 | "jest-matcher-utils": "^29.5.0", 2444 | "jest-message-util": "^29.5.0", 2445 | "jest-util": "^29.5.0", 2446 | "natural-compare": "^1.4.0", 2447 | "pretty-format": "^29.5.0", 2448 | "semver": "^7.3.5" 2449 | }, 2450 | "engines": { 2451 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2452 | } 2453 | }, 2454 | "node_modules/jest-snapshot/node_modules/lru-cache": { 2455 | "version": "6.0.0", 2456 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2457 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2458 | "dev": true, 2459 | "dependencies": { 2460 | "yallist": "^4.0.0" 2461 | }, 2462 | "engines": { 2463 | "node": ">=10" 2464 | } 2465 | }, 2466 | "node_modules/jest-snapshot/node_modules/semver": { 2467 | "version": "7.5.0", 2468 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", 2469 | "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", 2470 | "dev": true, 2471 | "dependencies": { 2472 | "lru-cache": "^6.0.0" 2473 | }, 2474 | "bin": { 2475 | "semver": "bin/semver.js" 2476 | }, 2477 | "engines": { 2478 | "node": ">=10" 2479 | } 2480 | }, 2481 | "node_modules/jest-snapshot/node_modules/yallist": { 2482 | "version": "4.0.0", 2483 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2484 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2485 | "dev": true 2486 | }, 2487 | "node_modules/jest-util": { 2488 | "version": "29.5.0", 2489 | "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", 2490 | "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", 2491 | "dev": true, 2492 | "dependencies": { 2493 | "@jest/types": "^29.5.0", 2494 | "@types/node": "*", 2495 | "chalk": "^4.0.0", 2496 | "ci-info": "^3.2.0", 2497 | "graceful-fs": "^4.2.9", 2498 | "picomatch": "^2.2.3" 2499 | }, 2500 | "engines": { 2501 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2502 | } 2503 | }, 2504 | "node_modules/jest-validate": { 2505 | "version": "29.5.0", 2506 | "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", 2507 | "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", 2508 | "dev": true, 2509 | "dependencies": { 2510 | "@jest/types": "^29.5.0", 2511 | "camelcase": "^6.2.0", 2512 | "chalk": "^4.0.0", 2513 | "jest-get-type": "^29.4.3", 2514 | "leven": "^3.1.0", 2515 | "pretty-format": "^29.5.0" 2516 | }, 2517 | "engines": { 2518 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2519 | } 2520 | }, 2521 | "node_modules/jest-validate/node_modules/camelcase": { 2522 | "version": "6.3.0", 2523 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 2524 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 2525 | "dev": true, 2526 | "engines": { 2527 | "node": ">=10" 2528 | }, 2529 | "funding": { 2530 | "url": "https://github.com/sponsors/sindresorhus" 2531 | } 2532 | }, 2533 | "node_modules/jest-watcher": { 2534 | "version": "29.5.0", 2535 | "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", 2536 | "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", 2537 | "dev": true, 2538 | "dependencies": { 2539 | "@jest/test-result": "^29.5.0", 2540 | "@jest/types": "^29.5.0", 2541 | "@types/node": "*", 2542 | "ansi-escapes": "^4.2.1", 2543 | "chalk": "^4.0.0", 2544 | "emittery": "^0.13.1", 2545 | "jest-util": "^29.5.0", 2546 | "string-length": "^4.0.1" 2547 | }, 2548 | "engines": { 2549 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2550 | } 2551 | }, 2552 | "node_modules/jest-worker": { 2553 | "version": "29.5.0", 2554 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", 2555 | "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", 2556 | "dev": true, 2557 | "dependencies": { 2558 | "@types/node": "*", 2559 | "jest-util": "^29.5.0", 2560 | "merge-stream": "^2.0.0", 2561 | "supports-color": "^8.0.0" 2562 | }, 2563 | "engines": { 2564 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2565 | } 2566 | }, 2567 | "node_modules/jest-worker/node_modules/supports-color": { 2568 | "version": "8.1.1", 2569 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2570 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2571 | "dev": true, 2572 | "dependencies": { 2573 | "has-flag": "^4.0.0" 2574 | }, 2575 | "engines": { 2576 | "node": ">=10" 2577 | }, 2578 | "funding": { 2579 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2580 | } 2581 | }, 2582 | "node_modules/js-tokens": { 2583 | "version": "4.0.0", 2584 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2585 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2586 | "dev": true 2587 | }, 2588 | "node_modules/js-yaml": { 2589 | "version": "3.14.1", 2590 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 2591 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 2592 | "dev": true, 2593 | "dependencies": { 2594 | "argparse": "^1.0.7", 2595 | "esprima": "^4.0.0" 2596 | }, 2597 | "bin": { 2598 | "js-yaml": "bin/js-yaml.js" 2599 | } 2600 | }, 2601 | "node_modules/jsesc": { 2602 | "version": "2.5.2", 2603 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2604 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2605 | "dev": true, 2606 | "bin": { 2607 | "jsesc": "bin/jsesc" 2608 | }, 2609 | "engines": { 2610 | "node": ">=4" 2611 | } 2612 | }, 2613 | "node_modules/json-parse-even-better-errors": { 2614 | "version": "2.3.1", 2615 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2616 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2617 | "dev": true 2618 | }, 2619 | "node_modules/json5": { 2620 | "version": "2.2.3", 2621 | "dev": true, 2622 | "license": "MIT", 2623 | "bin": { 2624 | "json5": "lib/cli.js" 2625 | }, 2626 | "engines": { 2627 | "node": ">=6" 2628 | } 2629 | }, 2630 | "node_modules/kleur": { 2631 | "version": "3.0.3", 2632 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 2633 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 2634 | "dev": true, 2635 | "engines": { 2636 | "node": ">=6" 2637 | } 2638 | }, 2639 | "node_modules/leven": { 2640 | "version": "3.1.0", 2641 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 2642 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 2643 | "dev": true, 2644 | "engines": { 2645 | "node": ">=6" 2646 | } 2647 | }, 2648 | "node_modules/lines-and-columns": { 2649 | "version": "1.2.4", 2650 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2651 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2652 | "dev": true 2653 | }, 2654 | "node_modules/locate-path": { 2655 | "version": "5.0.0", 2656 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2657 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2658 | "dev": true, 2659 | "dependencies": { 2660 | "p-locate": "^4.1.0" 2661 | }, 2662 | "engines": { 2663 | "node": ">=8" 2664 | } 2665 | }, 2666 | "node_modules/lodash.memoize": { 2667 | "version": "4.1.2", 2668 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", 2669 | "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", 2670 | "dev": true 2671 | }, 2672 | "node_modules/lru-cache": { 2673 | "version": "5.1.1", 2674 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2675 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2676 | "dev": true, 2677 | "dependencies": { 2678 | "yallist": "^3.0.2" 2679 | } 2680 | }, 2681 | "node_modules/make-dir": { 2682 | "version": "3.1.0", 2683 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2684 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2685 | "dev": true, 2686 | "dependencies": { 2687 | "semver": "^6.0.0" 2688 | }, 2689 | "engines": { 2690 | "node": ">=8" 2691 | }, 2692 | "funding": { 2693 | "url": "https://github.com/sponsors/sindresorhus" 2694 | } 2695 | }, 2696 | "node_modules/make-error": { 2697 | "version": "1.3.6", 2698 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2699 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 2700 | "dev": true 2701 | }, 2702 | "node_modules/makeerror": { 2703 | "version": "1.0.12", 2704 | "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", 2705 | "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", 2706 | "dev": true, 2707 | "dependencies": { 2708 | "tmpl": "1.0.5" 2709 | } 2710 | }, 2711 | "node_modules/merge-stream": { 2712 | "version": "2.0.0", 2713 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2714 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2715 | "dev": true 2716 | }, 2717 | "node_modules/micromatch": { 2718 | "version": "4.0.5", 2719 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2720 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2721 | "dev": true, 2722 | "dependencies": { 2723 | "braces": "^3.0.2", 2724 | "picomatch": "^2.3.1" 2725 | }, 2726 | "engines": { 2727 | "node": ">=8.6" 2728 | } 2729 | }, 2730 | "node_modules/mimic-fn": { 2731 | "version": "2.1.0", 2732 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2733 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2734 | "dev": true, 2735 | "engines": { 2736 | "node": ">=6" 2737 | } 2738 | }, 2739 | "node_modules/minimatch": { 2740 | "version": "3.1.2", 2741 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2742 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2743 | "dev": true, 2744 | "dependencies": { 2745 | "brace-expansion": "^1.1.7" 2746 | }, 2747 | "engines": { 2748 | "node": "*" 2749 | } 2750 | }, 2751 | "node_modules/ms": { 2752 | "version": "2.1.2", 2753 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2754 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2755 | "dev": true 2756 | }, 2757 | "node_modules/natural-compare": { 2758 | "version": "1.4.0", 2759 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2760 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2761 | "dev": true 2762 | }, 2763 | "node_modules/node-int64": { 2764 | "version": "0.4.0", 2765 | "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 2766 | "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", 2767 | "dev": true 2768 | }, 2769 | "node_modules/node-releases": { 2770 | "version": "2.0.10", 2771 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", 2772 | "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", 2773 | "dev": true 2774 | }, 2775 | "node_modules/normalize-path": { 2776 | "version": "3.0.0", 2777 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2778 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2779 | "dev": true, 2780 | "engines": { 2781 | "node": ">=0.10.0" 2782 | } 2783 | }, 2784 | "node_modules/npm-run-path": { 2785 | "version": "4.0.1", 2786 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2787 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2788 | "dev": true, 2789 | "dependencies": { 2790 | "path-key": "^3.0.0" 2791 | }, 2792 | "engines": { 2793 | "node": ">=8" 2794 | } 2795 | }, 2796 | "node_modules/once": { 2797 | "version": "1.4.0", 2798 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2799 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2800 | "dev": true, 2801 | "dependencies": { 2802 | "wrappy": "1" 2803 | } 2804 | }, 2805 | "node_modules/onetime": { 2806 | "version": "5.1.2", 2807 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2808 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2809 | "dev": true, 2810 | "dependencies": { 2811 | "mimic-fn": "^2.1.0" 2812 | }, 2813 | "engines": { 2814 | "node": ">=6" 2815 | }, 2816 | "funding": { 2817 | "url": "https://github.com/sponsors/sindresorhus" 2818 | } 2819 | }, 2820 | "node_modules/p-limit": { 2821 | "version": "3.1.0", 2822 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2823 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2824 | "dev": true, 2825 | "dependencies": { 2826 | "yocto-queue": "^0.1.0" 2827 | }, 2828 | "engines": { 2829 | "node": ">=10" 2830 | }, 2831 | "funding": { 2832 | "url": "https://github.com/sponsors/sindresorhus" 2833 | } 2834 | }, 2835 | "node_modules/p-locate": { 2836 | "version": "4.1.0", 2837 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2838 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2839 | "dev": true, 2840 | "dependencies": { 2841 | "p-limit": "^2.2.0" 2842 | }, 2843 | "engines": { 2844 | "node": ">=8" 2845 | } 2846 | }, 2847 | "node_modules/p-locate/node_modules/p-limit": { 2848 | "version": "2.3.0", 2849 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2850 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2851 | "dev": true, 2852 | "dependencies": { 2853 | "p-try": "^2.0.0" 2854 | }, 2855 | "engines": { 2856 | "node": ">=6" 2857 | }, 2858 | "funding": { 2859 | "url": "https://github.com/sponsors/sindresorhus" 2860 | } 2861 | }, 2862 | "node_modules/p-try": { 2863 | "version": "2.2.0", 2864 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2865 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2866 | "dev": true, 2867 | "engines": { 2868 | "node": ">=6" 2869 | } 2870 | }, 2871 | "node_modules/parse-json": { 2872 | "version": "5.2.0", 2873 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2874 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2875 | "dev": true, 2876 | "dependencies": { 2877 | "@babel/code-frame": "^7.0.0", 2878 | "error-ex": "^1.3.1", 2879 | "json-parse-even-better-errors": "^2.3.0", 2880 | "lines-and-columns": "^1.1.6" 2881 | }, 2882 | "engines": { 2883 | "node": ">=8" 2884 | }, 2885 | "funding": { 2886 | "url": "https://github.com/sponsors/sindresorhus" 2887 | } 2888 | }, 2889 | "node_modules/path-exists": { 2890 | "version": "4.0.0", 2891 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2892 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2893 | "dev": true, 2894 | "engines": { 2895 | "node": ">=8" 2896 | } 2897 | }, 2898 | "node_modules/path-is-absolute": { 2899 | "version": "1.0.1", 2900 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2901 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2902 | "dev": true, 2903 | "engines": { 2904 | "node": ">=0.10.0" 2905 | } 2906 | }, 2907 | "node_modules/path-key": { 2908 | "version": "3.1.1", 2909 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2910 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2911 | "dev": true, 2912 | "engines": { 2913 | "node": ">=8" 2914 | } 2915 | }, 2916 | "node_modules/path-parse": { 2917 | "version": "1.0.7", 2918 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2919 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2920 | "dev": true 2921 | }, 2922 | "node_modules/picocolors": { 2923 | "version": "1.0.0", 2924 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2925 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2926 | "dev": true 2927 | }, 2928 | "node_modules/picomatch": { 2929 | "version": "2.3.1", 2930 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2931 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2932 | "dev": true, 2933 | "engines": { 2934 | "node": ">=8.6" 2935 | }, 2936 | "funding": { 2937 | "url": "https://github.com/sponsors/jonschlinkert" 2938 | } 2939 | }, 2940 | "node_modules/pirates": { 2941 | "version": "4.0.5", 2942 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", 2943 | "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", 2944 | "dev": true, 2945 | "engines": { 2946 | "node": ">= 6" 2947 | } 2948 | }, 2949 | "node_modules/pkg-dir": { 2950 | "version": "4.2.0", 2951 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2952 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2953 | "dev": true, 2954 | "dependencies": { 2955 | "find-up": "^4.0.0" 2956 | }, 2957 | "engines": { 2958 | "node": ">=8" 2959 | } 2960 | }, 2961 | "node_modules/pretty-format": { 2962 | "version": "29.5.0", 2963 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", 2964 | "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", 2965 | "dev": true, 2966 | "dependencies": { 2967 | "@jest/schemas": "^29.4.3", 2968 | "ansi-styles": "^5.0.0", 2969 | "react-is": "^18.0.0" 2970 | }, 2971 | "engines": { 2972 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2973 | } 2974 | }, 2975 | "node_modules/pretty-format/node_modules/ansi-styles": { 2976 | "version": "5.2.0", 2977 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 2978 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 2979 | "dev": true, 2980 | "engines": { 2981 | "node": ">=10" 2982 | }, 2983 | "funding": { 2984 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2985 | } 2986 | }, 2987 | "node_modules/prompts": { 2988 | "version": "2.4.2", 2989 | "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 2990 | "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 2991 | "dev": true, 2992 | "dependencies": { 2993 | "kleur": "^3.0.3", 2994 | "sisteransi": "^1.0.5" 2995 | }, 2996 | "engines": { 2997 | "node": ">= 6" 2998 | } 2999 | }, 3000 | "node_modules/pure-rand": { 3001 | "version": "6.0.2", 3002 | "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", 3003 | "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", 3004 | "dev": true, 3005 | "funding": [ 3006 | { 3007 | "type": "individual", 3008 | "url": "https://github.com/sponsors/dubzzz" 3009 | }, 3010 | { 3011 | "type": "opencollective", 3012 | "url": "https://opencollective.com/fast-check" 3013 | } 3014 | ] 3015 | }, 3016 | "node_modules/react-is": { 3017 | "version": "18.2.0", 3018 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", 3019 | "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", 3020 | "dev": true 3021 | }, 3022 | "node_modules/require-directory": { 3023 | "version": "2.1.1", 3024 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3025 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 3026 | "dev": true, 3027 | "engines": { 3028 | "node": ">=0.10.0" 3029 | } 3030 | }, 3031 | "node_modules/resolve": { 3032 | "version": "1.22.2", 3033 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", 3034 | "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", 3035 | "dev": true, 3036 | "dependencies": { 3037 | "is-core-module": "^2.11.0", 3038 | "path-parse": "^1.0.7", 3039 | "supports-preserve-symlinks-flag": "^1.0.0" 3040 | }, 3041 | "bin": { 3042 | "resolve": "bin/resolve" 3043 | }, 3044 | "funding": { 3045 | "url": "https://github.com/sponsors/ljharb" 3046 | } 3047 | }, 3048 | "node_modules/resolve-cwd": { 3049 | "version": "3.0.0", 3050 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 3051 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 3052 | "dev": true, 3053 | "dependencies": { 3054 | "resolve-from": "^5.0.0" 3055 | }, 3056 | "engines": { 3057 | "node": ">=8" 3058 | } 3059 | }, 3060 | "node_modules/resolve-from": { 3061 | "version": "5.0.0", 3062 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 3063 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 3064 | "dev": true, 3065 | "engines": { 3066 | "node": ">=8" 3067 | } 3068 | }, 3069 | "node_modules/resolve.exports": { 3070 | "version": "2.0.2", 3071 | "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", 3072 | "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", 3073 | "dev": true, 3074 | "engines": { 3075 | "node": ">=10" 3076 | } 3077 | }, 3078 | "node_modules/semver": { 3079 | "version": "6.3.0", 3080 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 3081 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 3082 | "dev": true, 3083 | "bin": { 3084 | "semver": "bin/semver.js" 3085 | } 3086 | }, 3087 | "node_modules/shebang-command": { 3088 | "version": "2.0.0", 3089 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3090 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3091 | "dev": true, 3092 | "dependencies": { 3093 | "shebang-regex": "^3.0.0" 3094 | }, 3095 | "engines": { 3096 | "node": ">=8" 3097 | } 3098 | }, 3099 | "node_modules/shebang-regex": { 3100 | "version": "3.0.0", 3101 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3102 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3103 | "dev": true, 3104 | "engines": { 3105 | "node": ">=8" 3106 | } 3107 | }, 3108 | "node_modules/signal-exit": { 3109 | "version": "3.0.7", 3110 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3111 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 3112 | "dev": true 3113 | }, 3114 | "node_modules/sisteransi": { 3115 | "version": "1.0.5", 3116 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 3117 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 3118 | "dev": true 3119 | }, 3120 | "node_modules/slash": { 3121 | "version": "3.0.0", 3122 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3123 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3124 | "dev": true, 3125 | "engines": { 3126 | "node": ">=8" 3127 | } 3128 | }, 3129 | "node_modules/source-map": { 3130 | "version": "0.6.1", 3131 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3132 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3133 | "dev": true, 3134 | "engines": { 3135 | "node": ">=0.10.0" 3136 | } 3137 | }, 3138 | "node_modules/source-map-support": { 3139 | "version": "0.5.13", 3140 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", 3141 | "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", 3142 | "dev": true, 3143 | "dependencies": { 3144 | "buffer-from": "^1.0.0", 3145 | "source-map": "^0.6.0" 3146 | } 3147 | }, 3148 | "node_modules/sprintf-js": { 3149 | "version": "1.0.3", 3150 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3151 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 3152 | "dev": true 3153 | }, 3154 | "node_modules/stack-utils": { 3155 | "version": "2.0.6", 3156 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", 3157 | "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", 3158 | "dev": true, 3159 | "dependencies": { 3160 | "escape-string-regexp": "^2.0.0" 3161 | }, 3162 | "engines": { 3163 | "node": ">=10" 3164 | } 3165 | }, 3166 | "node_modules/string-length": { 3167 | "version": "4.0.2", 3168 | "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", 3169 | "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", 3170 | "dev": true, 3171 | "dependencies": { 3172 | "char-regex": "^1.0.2", 3173 | "strip-ansi": "^6.0.0" 3174 | }, 3175 | "engines": { 3176 | "node": ">=10" 3177 | } 3178 | }, 3179 | "node_modules/string-width": { 3180 | "version": "4.2.3", 3181 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3182 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3183 | "dev": true, 3184 | "dependencies": { 3185 | "emoji-regex": "^8.0.0", 3186 | "is-fullwidth-code-point": "^3.0.0", 3187 | "strip-ansi": "^6.0.1" 3188 | }, 3189 | "engines": { 3190 | "node": ">=8" 3191 | } 3192 | }, 3193 | "node_modules/strip-ansi": { 3194 | "version": "6.0.1", 3195 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3196 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3197 | "dev": true, 3198 | "dependencies": { 3199 | "ansi-regex": "^5.0.1" 3200 | }, 3201 | "engines": { 3202 | "node": ">=8" 3203 | } 3204 | }, 3205 | "node_modules/strip-bom": { 3206 | "version": "4.0.0", 3207 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 3208 | "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 3209 | "dev": true, 3210 | "engines": { 3211 | "node": ">=8" 3212 | } 3213 | }, 3214 | "node_modules/strip-final-newline": { 3215 | "version": "2.0.0", 3216 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3217 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 3218 | "dev": true, 3219 | "engines": { 3220 | "node": ">=6" 3221 | } 3222 | }, 3223 | "node_modules/strip-json-comments": { 3224 | "version": "3.1.1", 3225 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3226 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3227 | "dev": true, 3228 | "engines": { 3229 | "node": ">=8" 3230 | }, 3231 | "funding": { 3232 | "url": "https://github.com/sponsors/sindresorhus" 3233 | } 3234 | }, 3235 | "node_modules/supports-color": { 3236 | "version": "7.2.0", 3237 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3238 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3239 | "dev": true, 3240 | "dependencies": { 3241 | "has-flag": "^4.0.0" 3242 | }, 3243 | "engines": { 3244 | "node": ">=8" 3245 | } 3246 | }, 3247 | "node_modules/supports-preserve-symlinks-flag": { 3248 | "version": "1.0.0", 3249 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3250 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3251 | "dev": true, 3252 | "engines": { 3253 | "node": ">= 0.4" 3254 | }, 3255 | "funding": { 3256 | "url": "https://github.com/sponsors/ljharb" 3257 | } 3258 | }, 3259 | "node_modules/test-exclude": { 3260 | "version": "6.0.0", 3261 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 3262 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 3263 | "dev": true, 3264 | "dependencies": { 3265 | "@istanbuljs/schema": "^0.1.2", 3266 | "glob": "^7.1.4", 3267 | "minimatch": "^3.0.4" 3268 | }, 3269 | "engines": { 3270 | "node": ">=8" 3271 | } 3272 | }, 3273 | "node_modules/tmpl": { 3274 | "version": "1.0.5", 3275 | "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", 3276 | "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", 3277 | "dev": true 3278 | }, 3279 | "node_modules/to-fast-properties": { 3280 | "version": "2.0.0", 3281 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3282 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 3283 | "dev": true, 3284 | "engines": { 3285 | "node": ">=4" 3286 | } 3287 | }, 3288 | "node_modules/to-regex-range": { 3289 | "version": "5.0.1", 3290 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3291 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3292 | "dev": true, 3293 | "dependencies": { 3294 | "is-number": "^7.0.0" 3295 | }, 3296 | "engines": { 3297 | "node": ">=8.0" 3298 | } 3299 | }, 3300 | "node_modules/ts-jest": { 3301 | "version": "29.1.0", 3302 | "dev": true, 3303 | "license": "MIT", 3304 | "dependencies": { 3305 | "bs-logger": "0.x", 3306 | "fast-json-stable-stringify": "2.x", 3307 | "jest-util": "^29.0.0", 3308 | "json5": "^2.2.3", 3309 | "lodash.memoize": "4.x", 3310 | "make-error": "1.x", 3311 | "semver": "7.x", 3312 | "yargs-parser": "^21.0.1" 3313 | }, 3314 | "bin": { 3315 | "ts-jest": "cli.js" 3316 | }, 3317 | "engines": { 3318 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3319 | }, 3320 | "peerDependencies": { 3321 | "@babel/core": ">=7.0.0-beta.0 <8", 3322 | "@jest/types": "^29.0.0", 3323 | "babel-jest": "^29.0.0", 3324 | "jest": "^29.0.0", 3325 | "typescript": ">=4.3 <6" 3326 | }, 3327 | "peerDependenciesMeta": { 3328 | "@babel/core": { 3329 | "optional": true 3330 | }, 3331 | "@jest/types": { 3332 | "optional": true 3333 | }, 3334 | "babel-jest": { 3335 | "optional": true 3336 | }, 3337 | "esbuild": { 3338 | "optional": true 3339 | } 3340 | } 3341 | }, 3342 | "node_modules/ts-jest/node_modules/lru-cache": { 3343 | "version": "6.0.0", 3344 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 3345 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 3346 | "dev": true, 3347 | "dependencies": { 3348 | "yallist": "^4.0.0" 3349 | }, 3350 | "engines": { 3351 | "node": ">=10" 3352 | } 3353 | }, 3354 | "node_modules/ts-jest/node_modules/semver": { 3355 | "version": "7.5.0", 3356 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", 3357 | "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", 3358 | "dev": true, 3359 | "dependencies": { 3360 | "lru-cache": "^6.0.0" 3361 | }, 3362 | "bin": { 3363 | "semver": "bin/semver.js" 3364 | }, 3365 | "engines": { 3366 | "node": ">=10" 3367 | } 3368 | }, 3369 | "node_modules/ts-jest/node_modules/yallist": { 3370 | "version": "4.0.0", 3371 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3372 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3373 | "dev": true 3374 | }, 3375 | "node_modules/type-detect": { 3376 | "version": "4.0.8", 3377 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 3378 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 3379 | "dev": true, 3380 | "engines": { 3381 | "node": ">=4" 3382 | } 3383 | }, 3384 | "node_modules/type-fest": { 3385 | "version": "0.21.3", 3386 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 3387 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 3388 | "dev": true, 3389 | "engines": { 3390 | "node": ">=10" 3391 | }, 3392 | "funding": { 3393 | "url": "https://github.com/sponsors/sindresorhus" 3394 | } 3395 | }, 3396 | "node_modules/typescript": { 3397 | "version": "5.0.4", 3398 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 3399 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 3400 | "dev": true, 3401 | "bin": { 3402 | "tsc": "bin/tsc", 3403 | "tsserver": "bin/tsserver" 3404 | }, 3405 | "engines": { 3406 | "node": ">=12.20" 3407 | } 3408 | }, 3409 | "node_modules/update-browserslist-db": { 3410 | "version": "1.0.11", 3411 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", 3412 | "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", 3413 | "dev": true, 3414 | "funding": [ 3415 | { 3416 | "type": "opencollective", 3417 | "url": "https://opencollective.com/browserslist" 3418 | }, 3419 | { 3420 | "type": "tidelift", 3421 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3422 | }, 3423 | { 3424 | "type": "github", 3425 | "url": "https://github.com/sponsors/ai" 3426 | } 3427 | ], 3428 | "dependencies": { 3429 | "escalade": "^3.1.1", 3430 | "picocolors": "^1.0.0" 3431 | }, 3432 | "bin": { 3433 | "update-browserslist-db": "cli.js" 3434 | }, 3435 | "peerDependencies": { 3436 | "browserslist": ">= 4.21.0" 3437 | } 3438 | }, 3439 | "node_modules/v8-to-istanbul": { 3440 | "version": "9.1.0", 3441 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", 3442 | "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", 3443 | "dev": true, 3444 | "dependencies": { 3445 | "@jridgewell/trace-mapping": "^0.3.12", 3446 | "@types/istanbul-lib-coverage": "^2.0.1", 3447 | "convert-source-map": "^1.6.0" 3448 | }, 3449 | "engines": { 3450 | "node": ">=10.12.0" 3451 | } 3452 | }, 3453 | "node_modules/v8-to-istanbul/node_modules/convert-source-map": { 3454 | "version": "1.9.0", 3455 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 3456 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 3457 | "dev": true 3458 | }, 3459 | "node_modules/walker": { 3460 | "version": "1.0.8", 3461 | "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", 3462 | "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", 3463 | "dev": true, 3464 | "dependencies": { 3465 | "makeerror": "1.0.12" 3466 | } 3467 | }, 3468 | "node_modules/which": { 3469 | "version": "2.0.2", 3470 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3471 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3472 | "dev": true, 3473 | "dependencies": { 3474 | "isexe": "^2.0.0" 3475 | }, 3476 | "bin": { 3477 | "node-which": "bin/node-which" 3478 | }, 3479 | "engines": { 3480 | "node": ">= 8" 3481 | } 3482 | }, 3483 | "node_modules/wrap-ansi": { 3484 | "version": "7.0.0", 3485 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3486 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3487 | "dev": true, 3488 | "dependencies": { 3489 | "ansi-styles": "^4.0.0", 3490 | "string-width": "^4.1.0", 3491 | "strip-ansi": "^6.0.0" 3492 | }, 3493 | "engines": { 3494 | "node": ">=10" 3495 | }, 3496 | "funding": { 3497 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3498 | } 3499 | }, 3500 | "node_modules/wrappy": { 3501 | "version": "1.0.2", 3502 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3503 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3504 | "dev": true 3505 | }, 3506 | "node_modules/write-file-atomic": { 3507 | "version": "4.0.2", 3508 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", 3509 | "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", 3510 | "dev": true, 3511 | "dependencies": { 3512 | "imurmurhash": "^0.1.4", 3513 | "signal-exit": "^3.0.7" 3514 | }, 3515 | "engines": { 3516 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 3517 | } 3518 | }, 3519 | "node_modules/y18n": { 3520 | "version": "5.0.8", 3521 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3522 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3523 | "dev": true, 3524 | "engines": { 3525 | "node": ">=10" 3526 | } 3527 | }, 3528 | "node_modules/yallist": { 3529 | "version": "3.1.1", 3530 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3531 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3532 | "dev": true 3533 | }, 3534 | "node_modules/yargs": { 3535 | "version": "17.7.2", 3536 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 3537 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 3538 | "dev": true, 3539 | "dependencies": { 3540 | "cliui": "^8.0.1", 3541 | "escalade": "^3.1.1", 3542 | "get-caller-file": "^2.0.5", 3543 | "require-directory": "^2.1.1", 3544 | "string-width": "^4.2.3", 3545 | "y18n": "^5.0.5", 3546 | "yargs-parser": "^21.1.1" 3547 | }, 3548 | "engines": { 3549 | "node": ">=12" 3550 | } 3551 | }, 3552 | "node_modules/yargs-parser": { 3553 | "version": "21.1.1", 3554 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3555 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3556 | "dev": true, 3557 | "engines": { 3558 | "node": ">=12" 3559 | } 3560 | }, 3561 | "node_modules/yocto-queue": { 3562 | "version": "0.1.0", 3563 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3564 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3565 | "dev": true, 3566 | "engines": { 3567 | "node": ">=10" 3568 | }, 3569 | "funding": { 3570 | "url": "https://github.com/sponsors/sindresorhus" 3571 | } 3572 | } 3573 | } 3574 | } 3575 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@buildt/ssdb", 3 | "version": "0.0.0", 4 | "description": "A pure TypeScript implementation of the HNSW algorithm for approximate nearest neighbour search.", 5 | "main": "./dist/index.js", 6 | "private": true, 7 | "scripts": { 8 | "test": "jest", 9 | "build": "tsc" 10 | }, 11 | "keywords": [ 12 | "hnsw", 13 | "ts", 14 | "typescript", 15 | "nearest", 16 | "neighbour", 17 | "search", 18 | "algorithm" 19 | ], 20 | "author": "Alistair Pullen", 21 | "license": "ISC", 22 | "devDependencies": { 23 | "@types/jest": "^29.5.1", 24 | "jest": "^29.5.0", 25 | "ts-jest": "^29.1.0", 26 | "typescript": "^5.0.4" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { MinHeap } from "./minheap" 2 | 3 | export class Node { 4 | public node_id: number 5 | public vector: number[] 6 | public level: number | null 7 | public neighbors: Set 8 | 9 | constructor(node_id: number, vector: number[]) { 10 | this.node_id = node_id 11 | this.vector = vector 12 | this.level = null 13 | this.neighbors = new Set() 14 | } 15 | 16 | public addNeighbor(node_id: number) { 17 | this.neighbors.add(node_id) 18 | } 19 | } 20 | 21 | export default class HNSW { 22 | private M: number 23 | private ef_construction: number 24 | private nodes: { [id: number]: Node } 25 | private levels: Node[][] 26 | private enter_point: number | null 27 | 28 | constructor(M = 12, ef_construction = 50) { 29 | this.M = M 30 | this.ef_construction = ef_construction 31 | this.nodes = {} 32 | this.levels = [] 33 | this.enter_point = null 34 | } 35 | 36 | private cosineSimilarity(a: number[], b: number[]): number { 37 | let dotProduct = 0 38 | for (let i = 0; i < a.length; i++) { 39 | dotProduct += a[i] * b[i] 40 | } 41 | return dotProduct 42 | } 43 | 44 | private insertNode(node: Node, level: number): number { 45 | const node_id = node.node_id 46 | node.level = level 47 | this.nodes[node_id] = node 48 | while (level >= this.levels.length) { 49 | this.levels.push([]) 50 | } 51 | this.levels[level].push(node) 52 | return node_id 53 | } 54 | 55 | public deleteNode(nodeId: number): void { 56 | if (!(nodeId in this.nodes)) { 57 | console.log(`Node with ID ${nodeId} not found.`) 58 | return 59 | } 60 | 61 | const node = this.nodes[nodeId] 62 | const level = node.level as number 63 | 64 | for (const neighborId of node.neighbors) { 65 | const neighbor = this.nodes[neighborId] 66 | neighbor.neighbors.delete(nodeId) 67 | } 68 | 69 | const indexInLevel = this.levels[level].findIndex(n => n.node_id === nodeId) 70 | if (indexInLevel !== -1) { 71 | this.levels[level].splice(indexInLevel, 1) 72 | } 73 | 74 | delete this.nodes[nodeId] 75 | 76 | if (this.levels[level].length === 0) { 77 | this.levels.splice(level, 1) 78 | } 79 | } 80 | 81 | private searchLayer(node_id: number, query: number[], ef: number): [number, number][] { 82 | const visited = new Set() 83 | const candidates: [number, number][] = [[-1.0, node_id]] 84 | const bestCandidates: [number, number][] = [] 85 | 86 | const minHeap = new MinHeap<[number, number]>((a, b) => a[0] - b[0]) 87 | 88 | let bestSim = -Infinity 89 | 90 | while (candidates.length > 0) { 91 | const [dist, curNodeId] = candidates.pop() as [number, number] 92 | if (!visited.has(curNodeId)) { 93 | visited.add(curNodeId) 94 | const curNode = this.nodes[curNodeId] 95 | 96 | if (bestCandidates.length < ef || dist > bestCandidates[0][0]) { 97 | minHeap.push([dist, curNodeId]) 98 | if (minHeap.size() > ef) { 99 | minHeap.pop() 100 | } 101 | } 102 | 103 | if (dist > bestSim) { 104 | bestSim = dist 105 | } 106 | 107 | if (curNode) { 108 | for (const neighborId of curNode.neighbors) { 109 | if (!visited.has(neighborId)) { 110 | const neighbor = this.nodes[neighborId] 111 | const sim = this.cosineSimilarity(query, neighbor.vector) 112 | if (sim > bestSim) candidates.push([sim, neighborId]) 113 | } 114 | } 115 | } else { 116 | return [] 117 | } 118 | } 119 | } 120 | 121 | while (minHeap.size() > 0) { 122 | bestCandidates.push(minHeap.pop() as [number, number]) 123 | } 124 | 125 | return bestCandidates 126 | } 127 | 128 | public search(query: number[], ef?: number): [number, number][] { 129 | if (ef === undefined) { 130 | ef = this.ef_construction 131 | } 132 | 133 | let curNodeId = this.enter_point 134 | let curLevel = this.levels.length - 1 135 | 136 | while (curLevel > 0) { 137 | const candidates = this.searchLayer(curNodeId as number, query, 1) 138 | curNodeId = candidates[0][1] 139 | curLevel -= 1 140 | } 141 | 142 | return this.searchLayer(curNodeId as number, query, ef as number) 143 | } 144 | 145 | public addNode(node_id: number, vector: number[]) { 146 | if (this.enter_point === null) { 147 | const node = new Node(node_id, vector) 148 | this.insertNode(node, 0) 149 | this.enter_point = node_id 150 | return 151 | } 152 | 153 | const maxLevel = Math.floor(Math.log2(Object.keys(this.nodes).length)) + 1 154 | let curLevel = 0 155 | while (Math.random() < 0.5 && curLevel < maxLevel) { 156 | curLevel += 1 157 | } 158 | 159 | const node = new Node(node_id, vector) 160 | this.insertNode(node, curLevel) 161 | 162 | let curNodeId = this.enter_point 163 | let startLevel = this.levels.length - 1 164 | 165 | // Skipping unnecessary levels above the current node's level 166 | if (curLevel < startLevel) { 167 | startLevel = curLevel 168 | } 169 | 170 | while (startLevel > (node.level as number)) { 171 | const candidates = this.searchLayer(curNodeId, vector, 1) 172 | curNodeId = candidates[0][1] 173 | startLevel -= 1 174 | } 175 | 176 | while (startLevel >= 0) { 177 | const candidates = this.searchLayer(curNodeId, vector, this.M) 178 | curNodeId = candidates[0][1] 179 | 180 | if (candidates.length > this.M) { 181 | candidates.splice(0, candidates.length - this.M) 182 | } 183 | 184 | for (const [, neighborId] of candidates) { 185 | node.addNeighbor(neighborId) 186 | this.nodes[neighborId].addNeighbor(node_id) 187 | } 188 | 189 | startLevel -= 1 190 | } 191 | } 192 | 193 | public serialize(): Uint8Array { 194 | // Compute the size needed for the buffer 195 | let bufferSize = 16 // M (4 bytes) + ef_construction (4 bytes) + nodesCount (4 bytes) + enter_point (4 bytes) 196 | for (const nodeId in this.nodes) { 197 | const node = this.nodes[nodeId] 198 | bufferSize += 12 + node.vector.length * 4 + 4 + node.neighbors.size * 4 199 | } 200 | bufferSize += 4 // levelsCount (4 bytes) 201 | for (const level of this.levels) { 202 | bufferSize += 4 + level.length * 4 203 | } 204 | 205 | const buffer = new ArrayBuffer(bufferSize) 206 | const view = new DataView(buffer) 207 | let offset = 0 208 | 209 | // Serialize M, ef_construction, and enter_point 210 | view.setInt32(offset, this.M) 211 | offset += 4 212 | view.setInt32(offset, this.ef_construction) 213 | offset += 4 214 | view.setInt32(offset, this.enter_point !== null ? this.enter_point : -1) 215 | offset += 4 216 | 217 | // Serialize nodes 218 | const nodeIds = Object.keys(this.nodes).map(k => parseInt(k)) 219 | view.setInt32(offset, nodeIds.length) 220 | offset += 4 221 | for (const nodeId of nodeIds) { 222 | const node = this.nodes[nodeId] 223 | view.setInt32(offset, node.node_id) 224 | offset += 4 225 | view.setInt32(offset, node.vector.length) 226 | offset += 4 227 | for (const value of node.vector) { 228 | view.setFloat32(offset, value) 229 | offset += 4 230 | } 231 | view.setInt32(offset, node.level as number) 232 | offset += 4 233 | view.setInt32(offset, node.neighbors.size) 234 | offset += 4 235 | for (const neighborId of node.neighbors) { 236 | view.setInt32(offset, neighborId) 237 | offset += 4 238 | } 239 | } 240 | 241 | // Serialize levels 242 | view.setInt32(offset, this.levels.length) 243 | offset += 4 244 | for (const level of this.levels) { 245 | view.setInt32(offset, level.length) 246 | offset += 4 247 | for (const node of level) { 248 | view.setInt32(offset, node.node_id) 249 | offset += 4 250 | } 251 | } 252 | 253 | return new Uint8Array(buffer) 254 | } 255 | 256 | public static deserialize(data: Uint8Array): HNSW { 257 | const buffer = data.buffer 258 | const view = new DataView(buffer) 259 | let offset = 0 260 | 261 | // Deserialize M, ef_construction, and enter_point 262 | const M = view.getInt32(offset) 263 | offset += 4 264 | const ef_construction = view.getInt32(offset) 265 | offset += 4 266 | const enter_point = view.getInt32(offset) 267 | offset += 4 268 | 269 | const hnsw = new HNSW(M, ef_construction) 270 | hnsw.enter_point = enter_point !== -1 ? enter_point : null 271 | 272 | // Deserialize nodes 273 | const nodesCount = view.getInt32(offset) 274 | offset += 4 275 | for (let i = 0; i < nodesCount; i++) { 276 | const node_id = view.getInt32(offset) 277 | offset += 4 278 | const vectorLen = view.getInt32(offset) 279 | offset += 4 280 | const vector: number[] = [] 281 | for (let j = 0; j < vectorLen; j++) { 282 | vector.push(view.getFloat32(offset)) 283 | offset += 4 284 | } 285 | const level = view.getInt32(offset) 286 | offset += 4 287 | const neighborsCount = view.getInt32(offset) 288 | offset += 4 289 | const neighbors = new Set() 290 | for (let j = 0; j < neighborsCount; j++) { 291 | neighbors.add(view.getInt32(offset)) 292 | offset += 4 293 | } 294 | 295 | const node = new Node(node_id, vector) 296 | node.level = level 297 | node.neighbors = neighbors 298 | hnsw.nodes[node_id] = node 299 | } 300 | 301 | // Deserialize levels 302 | const levelsCount = view.getInt32(offset) 303 | offset += 4 304 | for (let i = 0; i < levelsCount; i++) { 305 | const levelLen = view.getInt32(offset) 306 | offset += 4 307 | const level: Node[] = [] 308 | for (let j = 0; j < levelLen; j++) { 309 | const nodeId = view.getInt32(offset) 310 | offset += 4 311 | level.push(hnsw.nodes[nodeId]) 312 | } 313 | hnsw.levels.push(level) 314 | } 315 | 316 | return hnsw 317 | } 318 | 319 | public getSize(): number { 320 | return Object.keys(this.nodes).length 321 | } 322 | 323 | public getEntryPoint(): number | null { 324 | return this.enter_point 325 | } 326 | 327 | public clear(): void { 328 | this.nodes = {} 329 | this.levels = [] 330 | this.enter_point = null 331 | } 332 | } 333 | -------------------------------------------------------------------------------- /src/minheap.ts: -------------------------------------------------------------------------------- 1 | export class MinHeap { 2 | private heap: T[] 3 | private compare: (a: T, b: T) => number 4 | 5 | constructor(compare: (a: T, b: T) => number) { 6 | this.heap = [] 7 | this.compare = compare 8 | } 9 | 10 | size() { 11 | return this.heap.length 12 | } 13 | 14 | peek(): T | undefined { 15 | return this.heap.length > 0 ? this.heap[0] : undefined 16 | } 17 | 18 | push(val: T) { 19 | this.heap.push(val) 20 | let idx = this.heap.length - 1 21 | while (idx > 0) { 22 | const parentIdx = Math.floor((idx - 1) / 2) 23 | if (this.compare(this.heap[idx], this.heap[parentIdx]) < 0) { 24 | // eslint-disable-next-line @typescript-eslint/no-extra-semi 25 | ;[this.heap[idx], this.heap[parentIdx]] = [this.heap[parentIdx], this.heap[idx]] 26 | idx = parentIdx 27 | } else { 28 | break 29 | } 30 | } 31 | } 32 | 33 | pop(): T | undefined { 34 | if (this.heap.length === 0) { 35 | return undefined 36 | } 37 | const result = this.heap[0] 38 | const end = this.heap.pop() 39 | if (this.heap.length > 0 && end) { 40 | this.heap[0] = end 41 | let idx = 0 42 | const length = this.heap.length 43 | const element = this.heap[0] 44 | while (true) { 45 | const leftChildIdx = 2 * idx + 1 46 | const rightChildIdx = 2 * idx + 2 47 | let leftChild: T | null = null 48 | let rightChild: T | null = null 49 | let swapIdx: number | null = null 50 | 51 | if (leftChildIdx < length) { 52 | leftChild = this.heap[leftChildIdx] 53 | if (this.compare(leftChild, element) < 0) { 54 | swapIdx = leftChildIdx 55 | } 56 | } 57 | if (rightChildIdx < length) { 58 | rightChild = this.heap[rightChildIdx] 59 | if ( 60 | (swapIdx === null && this.compare(rightChild, element) < 0) || 61 | (leftChild !== null && swapIdx !== null && this.compare(rightChild, leftChild as T) < 0) 62 | ) { 63 | swapIdx = rightChildIdx 64 | } 65 | } 66 | if (swapIdx === null) break 67 | this.heap[idx] = this.heap[swapIdx] 68 | this.heap[swapIdx] = element 69 | idx = swapIdx 70 | } 71 | } 72 | return result 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /test/dummy-data/expected-search-results.ts: -------------------------------------------------------------------------------- 1 | export const EXPECTED_SEARCH_RESULTS = [ 2 | { nodeId: 39, cosineSimilarity: 0.9999999706887713 }, 3 | { nodeId: 50, cosineSimilarity: 0.9999999706887713 }, 4 | { nodeId: 57, cosineSimilarity: 0.9999999706887713 }, 5 | { nodeId: 32, cosineSimilarity: 0.9957496663341306 }, 6 | { nodeId: 59, cosineSimilarity: 0.905288066584071 }, 7 | { nodeId: 411, cosineSimilarity: 0.905288066584071 }, 8 | { nodeId: 37, cosineSimilarity: 0.9034056376264982 }, 9 | { nodeId: 399, cosineSimilarity: 0.9033951124543393 }, 10 | { nodeId: 33, cosineSimilarity: 0.9020005319976175 }, 11 | { nodeId: 405, cosineSimilarity: 0.8888862386196966 }, 12 | ] 13 | -------------------------------------------------------------------------------- /test/dummy-data/prompt.test.ndjson: -------------------------------------------------------------------------------- 1 | {"vector":[-0.005659573,0.011722181,-0.020261066,-0.012091061,-0.03434681,0.0020185923,-0.011086888,0.0012073983,0.0020869034,-0.010998083,0.035139218,0.0066090967,-0.013088402,-0.012869807,-0.0011271328,0.0029049285,0.009898275,0.0035146049,0.023949863,-0.0074732318,0.010178351,-0.00974799,0.009857289,0.0082109915,-0.021859545,-0.016749876,0.016736215,-0.042270895,0.018170746,-0.024004513,0.020547973,-0.026313428,-0.054812808,-0.04000297,-0.015247033,-0.017610596,-0.023662958,-0.025452707,-0.004662231,0.013839824,0.02195518,-0.004522193,-0.006428072,0.0035863316,-0.011886127,0.014495611,0.0051882262,-0.0071453387,-0.0060899328,-0.00054606167,0.015506615,0.027597675,-0.033335805,-0.015247033,-0.021845883,0.025780601,-0.0106906835,-0.009058049,0.012917625,-0.030056875,-0.0008620004,-0.005215551,-0.022542655,0.0023516088,-0.0032037895,-0.0044743754,0.012070567,0.01189979,-0.024755934,0.001285956,0.018580614,-0.0060455306,0.0021842467,0.0027221965,0.023362389,-0.0049867085,0.0046144133,0.003958627,-0.00733661,-0.011858803,0.007022379,-0.008436418,-0.02256998,0.02755669,0.004136236,0.016107753,0.007165832,0.03754377,0.00039897938,-0.015848171,0.004228456,-0.0018888013,-0.004348,0.011886127,-0.013648554,0.0024916467,-0.00050165947,0.03675136,0.017788205,-0.00820416,-0.012883469,0.017159743,-0.023389714,-0.0067593814,0.0057552084,-0.022242088,0.011189355,-0.011271328,0.02237871,-0.01986486,-0.022542655,0.010335466,0.011503586,-0.014413637,-0.018116098,-0.013990109,0.002886143,-0.004044016,-0.014577584,-0.013088402,0.025876237,0.030603362,0.015684223,-0.024086487,0.011059564,-0.010062221,-0.0035658383,-0.023963526,-0.005980635,-0.028581355,0.021777572,0.018198071,0.02830811,-0.007732814,-0.022214763,0.026736956,0.00029971485,0.027146822,-0.03472935,0.018020462,0.0052804463,0.013190869,-0.010253493,-0.010485751,-0.023376051,0.019468658,0.0016343426,0.005785948,0.025329748,0.019618941,-0.014113069,-0.014154055,-0.00039919285,-0.00912636,-0.0046588155,-0.0024045499,-0.01942767,0.013853487,0.02362197,-0.00949524,0.020151768,0.025083829,0.013081571,0.008538885,0.044511497,0.014700544,-0.013190869,0.007930916,-0.003576085,0.02183222,-0.0011894667,0.011209848,-0.021354044,0.0025684966,0.0054546394,0.012405292,0.025616655,-0.0056254175,-0.041095946,-0.0023020834,-0.015069424,-0.007363934,0.005488795,0.031286474,-0.027884582,0.011059564,0.0020732412,-0.021859545,0.014686882,-0.0024438289,-0.003903978,0.014413637,-0.0020561635,-0.034456108,-0.65185165,-0.022324061,0.026245115,-0.04568645,-0.013334323,0.017965814,0.009577213,-0.006626175,-0.027761621,0.027720636,-0.010287648,0.025616655,-0.010649697,-0.009365449,-0.00888044,-0.019933173,0.016968472,-0.030739985,0.0037195382,0.011688026,-0.016053103,0.0065510324,-0.0027221965,-0.021258408,0.0026368075,0.014741531,0.018484978,-0.005994297,-0.019946834,0.023512673,-0.037762363,0.013757851,0.009037555,0.008306627,0.04538588,-0.009297138,-0.0360136,0.040440157,0.007780632,0.02904587,-0.006404164,-0.0018256136,0.043828387,-0.0012774172,-0.0038117582,0.012514589,0.036587413,-0.005304355,-0.022119127,-0.0028912665,0.0041328203,-0.0101441955,0.021135448,0.041943002,-0.013764682,-0.022651954,0.0038322515,0.009167347,-0.015137735,-0.0162717,-0.005987466,-0.017583271,-0.029018546,-0.0064109946,-0.018840196,0.016995797,-0.004341169,-0.00043889869,0.010929773,0.00010492155,0.015110411,0.0146595575,0.0093108,0.004348,-0.00090682955,0.007814787,0.039292533,-0.031641692,-0.008224654,0.0038595758,0.014727868,-0.0049047354,-0.047708455,-0.0137441885,0.0121525405,0.0042626113,-0.004511947,-0.041341864,0.012815158,-0.017624259,0.022351384,0.021367704,0.012746847,-0.025671303,0.0038561604,0.017337352,-0.0126238875,0.015329006,-0.0012381383,0.01695481,-0.005505873,0.012740016,0.0046144133,0.0031098619,0.02855403,-0.004508531,-0.011175692,0.011851972,0.039128587,-0.01746031,-0.0135051,-0.02102615,-0.0008551693,-0.022433357,-0.0035043582,-0.034538083,0.018703572,-0.0045051156,0.017979477,0.01874456,-0.006100179,-0.0139286285,0.0042967666,-0.006827692,-0.004662231,0.0076918276,-0.005717637,-0.021777572,-0.007083859,-0.000083414234,0.018225396,-0.0018597691,0.004853502,-0.008887271,0.025507357,-0.011018577,0.0093859425,0.0065749413,0.024933543,-0.019031467,-0.027584013,-0.015834508,0.011571896,-0.013593905,-0.021914193,0.004990124,0.0006399894,-0.0046656467,-0.012944949,0.020192755,-0.009283476,-0.01356658,-0.004494869,0.022829562,0.0043548313,-0.008238316,-0.0051506553,-0.00095635507,0.013286505,-0.009303968,-0.009604538,0.03330848,0.009713835,0.0057757017,0.013942291,-0.020493323,-0.031177176,-0.007350272,0.000666033,-0.029510386,-0.023157455,0.00801289,-0.013914967,0.013593905,0.0073775966,0.03002955,-0.03803561,0.00037763218,0.0018170747,0.00046579615,0.01867625,0.004829593,-0.027215134,0.002940792,0.042270895,0.018525964,-0.0052326284,0.007903592,-0.014645895,-0.0041533136,0.001408916,0.0047202953,0.0015984792,-0.0005426461,0.015820846,0.009618199,-0.007527881,0.012965443,-0.0005943064,-0.004187469,0.021313056,-0.013423127,0.01979655,-0.045604475,-0.006270957,-0.033581726,-0.01658593,-0.020944176,0.012241345,0.0015276065,-0.0067867055,-0.014850829,0.0069472366,-0.0031064462,-0.0017641336,0.024591988,-0.024660299,0.001011004,-0.0035248515,-0.010533568,0.034674704,-0.017187066,0.012200358,0.006448566,-0.032570723,-0.009447422,0.0030347197,0.001883678,-0.0012740016,-0.008859946,0.009153685,0.023580983,-0.0056083393,0.0053453417,0.0121525405,0.023662958,0.007992396,-0.029182492,0.02718781,-0.03675136,-0.002932253,0.032516073,0.034182865,-0.013341154,0.00955672,0.000053528132,0.021313056,-0.0032259906,-0.00060113746,0.020602621,-0.007268299,0.0033711516,-0.018607937,0.010786319,0.022460682,-0.019127103,0.021477003,0.0063495147,0.03390962,0.045741096,-0.0015967714,-0.003284055,0.010000742,-0.035439786,0.014782517,-0.0007369057,-0.008163174,-0.006325606,-0.018853858,-0.016421983,0.0023106223,0.008395432,-0.0010186889,0.0005383767,0.012261839,0.013798838,0.028198812,0.031723663,-0.009324462,-0.007514219,-0.0016164109,-0.018198071,0.030302795,0.0083681075,-0.009420098,-0.0061684903,-0.017132418,0.013559749,-0.0013892766,0.010342297,-0.023690281,0.009959755,0.009973417,-0.0027375664,-0.003208913,0.0017607181,0.017282702,-0.0011134705,0.0011612884,-0.0011365255,0.013204532,0.017118756,-0.016763538,-0.015206046,0.017856516,0.024018176,0.002734151,0.003284055,0.023225766,-0.0007796002,0.010526737,-0.019523306,-0.013798838,-0.023417037,-0.003965458,-0.008101694,-0.015260695,-0.020083457,0.01874456,0.01997416,-0.015369993,-0.0020476247,-0.02348535,0.030439416,-0.0052018887,-0.010260324,0.0006493822,0.018730897,-0.02491988,-0.020957839,-0.032242827,-0.030903932,0.013300166,-0.023362389,-0.038828015,0.001584817,0.0016462969,0.0025155554,-0.0026231455,0.0023789334,0.014140394,-0.0040235226,-0.006824277,-0.004450467,-0.01751496,0.0061889836,0.03336313,0.0020100535,0.012787834,0.02416846,0.009905106,0.054348294,0.010028066,-0.0016667903,-0.012569238,0.025739614,0.004873995,0.04074073,0.017870178,0.043691766,0.022979846,0.027706973,0.016968472,0.009713835,0.01282882,-0.01153091,0.006110426,-0.014072082,-0.00081503653,-0.021750247,-0.017856516,0.0009888029,0.017596934,0.016312685,0.00003436901,0.015014775,-0.025917223,-0.02448269,0.020957839,0.013375309,0.04248949,0.016053103,-0.003284055,-0.051287957,-0.008730155,0.0108204745,0.006899419,0.010472088,-0.0016112876,-0.033007912,-0.019386685,-0.013737358,-0.011066395,0.004829593,0.0063870857,-0.01479618,-0.031067878,-0.0020766568,0.02627244,0.017788205,-0.0011621423,-0.013423127,-0.0101441955,0.018539626,-0.009208334,-0.02515214,0.0036785516,-0.019127103,-0.017091433,-0.0186216,0.018689912,0.016503956,-0.004607582,0.020670932,-0.008115356,0.0080812005,0.017405663,-0.015670562,0.015889157,0.009502071,-0.01226867,0.029155169,0.0016275115,-0.015533939,0.029674333,-0.008197329,0.025370734,-0.030056875,-0.00078088103,0.009051218,0.0130679095,-0.002525802,-0.015124072,-0.023225766,0.018594276,0.008764312,0.019072453,-0.004955969,0.02929179,-0.0020561635,-0.007937747,0.012903962,0.0051574865,-0.023662958,0.0068037836,-0.009208334,0.02053431,0.035740357,-0.009488408,0.009379111,0.0072068186,-0.031696342,-0.017105093,0.0032721006,0.0025616654,0.029838279,-0.007944578,-0.0026231455,-0.012705861,-0.021408692,0.012931287,0.025876237,-0.0061138417,0.0028844352,-0.013867149,-0.013149883,0.012186697,-0.027611338,-0.013539256,-0.02515214,0.0026897488,-0.0028349098,0.027802609,0.03071266,-0.013976446,-0.0034394627,-0.0215863,-0.018648924,-0.016831849,-0.026654983,0.009570382,0.016818188,0.021668274,0.02565764,0.012815158,0.015274357,0.04243484,0.0070565343,-0.0031901274,0.020056132,0.025439046,-0.0045017,-0.011271328,0.018239059,0.02688724,0.01208423,0.027952893,0.004242118,0.009399604,-0.0002856257,-0.030903932,-0.030166171,-0.016244374,-0.030138848,-0.010349128,0.01646297,0.0073707653,0.0077601383,-0.016872836,-0.00040068716,0.015424642,-0.0046109976,0.029810954,-0.0017427864,0.024496352,-0.007234143,0.011640208,-0.025452707,0.02139503,-0.01177683,-0.0075893607,-0.011353301,-0.022105465,-0.0049730465,0.013675878,0.028417408,0.0058132727,0.030821959,-0.010834137,0.011599221,-0.008532054,0.017596934,-0.0024609065,-0.027338093,-0.014782517,-0.025302423,-0.018799208,0.0124940965,0.016531281,0.027078511,-0.0021108123,0.010267155,-0.015424642,-0.014113069,-0.011913452,-0.0033216262,0.046478856,0.0074459077,0.025411721,0.013593905,0.01825272,-0.030439416,-0.01140795,0.0030415507,-0.013061078,0.0110049145,0.02552102,-0.026422724,-0.017651582,0.03502992,0.0015361453,-0.0071316767,-0.024469027,0.01793849,-0.00049440144,-0.011510417,-0.0018426913,0.021299394,-0.0067969523,-0.009666017,-0.031040553,0.00249677,0.012439447,-0.0140584195,-0.026832592,0.0038766537,0.00082656404,0.0108204745,0.015943805,0.017897502,0.013764682,0.001378176,-0.004453882,-0.020821217,0.02065727,0.031641692,-0.018484978,-0.01664058,0.01886752,0.018580614,-0.020547973,-0.008354445,0.0025018933,0.02392254,-0.019454995,-0.0033404117,0.0077054896,0.015807183,0.01849864,0.0072546364,-0.00678329,-0.010636034,-0.0007151316,-0.010656528,0.033936944,0.014277015,-0.01997416,-0.025138477,-0.0063597616,-0.0018153669,-0.021996167,-0.006424657,-0.00095891673,-0.0067627965,-0.0055810153,0.008197329,-0.007097521,0.0076986584,0.0019434502,-0.00801972,0.006400748,0.036587413,-0.031477746,0.0012091061,-0.04841889,0.012009088,-0.031614367,0.013218193,-0.016818188,-0.03587698,0.010806813,-0.0054307305,-0.035685707,0.015069424,0.012692198,0.028499382,0.0019588203,-0.000050672945,0.020588959,0.018157085,-0.0071385074,-0.02288421,-0.013990109,0.035904303,-0.012405292,-0.013621229,0.002618022,-0.016162401,-0.005543444,-0.015206046,0.0031713417,0.0013158421,-0.0077738008,-0.022774914,0.0031252317,-0.0061275037,-0.02349901,-0.0012014211,-0.0037571094,-0.0010272278,-0.0067183943,0.012856144,0.0062128925,-0.016872836,-0.010369621,0.0045905043,0.013949122,0.029373763,-0.020834878,-0.017911164,-0.023389714,-0.020452337,-0.019304711,0.0063153594,0.014604908,0.038472798,0.0026026522,-0.0024472445,-0.0056459107,-0.0024933543,-0.01825272,-0.005765455,-0.062245056,0.015984792,0.0059430636,0.0026521776,0.0018426913,0.0002726039,-0.011366963,0.018471316,-0.03396427,0.0031747574,-0.012405292,-0.01572521,0.01356658,-0.005167733,-0.011073226,-0.0027153653,0.04970314,0.0044607134,0.026491037,0.042954005,-0.023321401,-0.009467916,-0.036478117,-0.02718781,-0.005222382,-0.00066432526,0.01670889,-0.015260695,-0.015506615,0.006919912,0.005468302,-0.0011476261,-0.0018870935,0.010581386,-0.016695227,0.003972289,-0.016804526,-0.0016727676,-0.01904513,-0.006776459,0.043746416,-0.012056905,0.004419727,-0.0019844368,0.011742675,0.00022713434,-0.017214391,0.004945722,-0.011974932,-0.019632604,-0.0025616654,-0.027078511,-0.02269294,-0.0047886064,-0.0144273,-0.0008521807,-0.015028438,-0.015834508,-0.010451595,-0.0180068,-0.013853487,0.022870548,-0.024277758,0.014755193,0.0146595575,-0.009160516,-0.015301681,-0.037817013,-0.008272472,0.0054853796,0.012671705,0.006346099,-0.021545313,-0.023539998,-0.0043377536,0.022050817,0.00062120386,0.038554773,0.21028882,-0.012336981,0.017473973,0.019236399,-0.030412093,0.016066765,-0.006547617,-0.0067047323,0.0041464823,0.008696,-0.034865975,0.008381769,0.0039927824,-0.00220474,-0.0073571033,-0.013143051,-0.020875866,0.005212135,-0.044675443,0.027966555,0.030794634,-0.010472088,-0.021313056,-0.019837538,0.039975643,-0.016107753,-0.0028844352,0.003835667,0.04087735,0.0127263535,-0.019509643,-0.0049969554,-0.0026760865,0.02774796,0.004242118,-0.0121525405,0.025821587,-0.0065134615,0.027174147,0.00009275364,-0.0034514172,-0.002121059,0.018471316,-0.01042427,-0.0022406033,-0.0049354755,-0.00820416,-0.022037154,0.00079966657,0.026381738,-0.033772998,0.011974932,-0.0106906835,0.023526335,-0.02399085,-0.005106253,-0.004033769,0.0018683079,-0.008402263,0.018225396,-0.024277758,-0.0052326284,-0.011510417,-0.013108896,-0.0057449616,0.017555946,-0.03502992,-0.008101694,0.0027905076,-0.007978734,-0.004464129,0.0032498995,0.003798096,0.010752164,-0.03951113,-0.016394658,0.0035077739,0.037188552,0.001600187,0.027898245,0.01079315,-0.019564293,-0.025794264,-0.01603944,-0.012002257,-0.019099778,0.0167772,-0.0058508436,-0.032160856,-0.008170005,-0.014755193,-0.015793521,-0.027160484,0.005895246,-0.014454624,0.02237871,0.010103208,0.011052732,-0.006062608,0.00400986,-0.037844338,0.029264465,0.027720636,-0.00998708,-0.01646297,0.0042387024,0.018239059,0.013853487,-0.012514589,0.00782845,-0.023020834,-0.021039812,-0.005396575,-0.007937747,-0.0012526544,0.0069096657,-0.003576085,-0.011660701,-0.0029988564,-0.005717637,-0.004033769,-0.012384798,-0.009167347,0.0123096565,-0.024127472,0.016285362,-0.014318002,0.0039791204,0.017528623,-0.02664132,0.020602621,0.0011237173,0.020862203,-0.013634891,-0.0020083457,-0.0083407825,0.008805298,-0.003903978,0.004815931,0.0050174487,0.006950652,-0.0065510324,0.007049703,-0.0019554046,-0.0014652726,0.0051643173,-0.0016420275,0.018935831,-0.012091061,-0.015834508,-0.028936572,0.010881955,0.015247033,-0.027078511,0.010506243,-0.023676619,-0.006530539,-0.03546711,0.019277386,0.005881584,-0.030056875,-0.021367704,0.003767356,-0.0102739865,-0.029373763,-0.027051186,-0.17607863,0.026764281,0.0047134645,-0.00031359054,0.015643237,0.0012970566,0.012521421,0.00832712,-0.0038629915,-0.012036412,0.022843225,-0.014126731,-0.023512673,0.021873208,-0.0060250373,0.011756336,0.0042250403,0.018157085,0.014413637,0.02114911,0.046396885,-0.01134647,-0.014195042,-0.0013107188,-0.012234514,-0.017706232,-0.016517619,-0.02595821,-0.01547929,-0.012159372,-0.045249257,-0.007070197,0.0012270377,-0.011619714,-0.00918784,-0.014126731,-0.004149898,-0.022651954,0.008047045,0.006393917,-0.00064212416,0.027515702,-0.019468658,0.019769225,0.015069424,0.014919139,0.01467322,0.0042489492,0.009399604,-0.012842483,0.020725582,-0.028280787,-0.018321032,0.012719523,0.013723696,-0.012289163,-0.04033086,0.005191642,-0.0016334887,-0.022856887,-0.014017433,-0.029209817,-0.0029544542,-0.0018939247,0.0024643221,0.009085373,-0.008477405,-0.0039552115,-0.01602578,0.015247033,0.006124088,-0.026791604,0.0144273,-0.009631862,0.0065578637,0.003828836,-0.01602578,0.013026923,0.016107753,0.00013993097,-0.01942767,0.025985533,-0.0043070135,0.010581386,0.003914225,0.0023277,0.009283476,0.011633377,-0.048063673,-0.013894473,0.024264095,0.004815931,0.0002350328,-0.022856887,-0.03390962,0.00632219,0.025766939,-0.0135119315,0.026791604,-0.0135051,-0.00019244512,-0.01220719,-0.0288546,-0.008251978,0.04169708,0.0077738008,-0.00456318,-0.007268299,0.024045499,-0.0123096565,-0.016913824,0.01972824,0.011920284,0.017132418,0.0042967666,0.02929179,0.020698257,-0.007971902,0.023676619,-0.006592019,0.07071563,0.002978363,-0.017788205,0.01387398,0.0015703009,0.007097521,-0.08273838,-0.010314973,0.01634001,-0.0024848154,-0.0062368014,0.013149883,-0.02071192,0.041533135,-0.011790492,0.008538885,-0.03349975,-0.023157455,-0.004426558,0.0056288326,0.008395432,0.007814787,-0.03410089,-0.02151799,0.008620858,0.03538514,0.0068174456,-0.0134846065,0.016818188,-0.021873208,-0.025616655,-0.002549711,-0.034319486,0.020916851,0.00801289,-0.010663359,0.021927856,0.009959755,0.036642063,-0.012719523,-0.010390115,-0.0070565343,-0.029100519,-0.0062914505,0.008839454,-0.004149898,-0.007910423,-0.0030227653,0.020438675,-0.027843595,0.016244374,-0.012603394,-0.013539256,0.03625952,0.015397317,-0.012630719,-0.036860656,-0.010595048,0.0057210526,-0.054922108,0.02953771,0.0046554,0.015438303,0.032953262,-0.011080056,0.008696,-0.00666033,-0.006708148,-0.021121785,0.020629946,0.010492582,0.019933173,-0.024660299,-0.014604908,0.007678165,-0.018102435,-0.020069795,0.0011647039,-0.028034866,0.015820846,-0.002879312,0.008641351,-0.01079315,-0.0010895617,-0.0017359552,-0.022788575,-0.00030675944,-0.00031337707,-0.0035419294,-0.01362806,0.0059328172,0.012145709,0.0048090997,0.015274357,-0.0005259953,-0.031149851,0.008361276,0.0068720942,0.015643237,-0.020206416,-0.012261839,-0.0062333858,-0.026094832,0.011947608,-0.012364306,0.015615912,-0.019714577,-0.008969245,-0.05063217,0.027310768,-0.0021842467,0.013108896,-0.008689169,0.002879312,0.0037434471,-0.021408692,0.02207814,0.02553468,-0.021422355,0.008832622,-0.022283074,-0.03538514,-0.02755669,-0.0076986584,0.015055762,0.006356346,0.0096728485,-0.0044812066,0.0035282671,0.007787463,0.02806219,0.015506615,-0.0077054896,0.0035795006,0.0133274915,0.0028144163,-0.007930916,-0.010089546,-0.0029817785,-0.015697885,-0.0021535067,-0.012671705,0.010465257,-0.023075482,-0.0070770276,0.01874456,0.026532022,0.011155199,-0.023471687,-0.024045499,0.006158244,-0.028663328,0.019386685,-0.013395802,-0.018894844,0.011414781,0.008661845,0.011688026,0.03699728,0.0038527448,-0.03317186,-0.017501298,0.0059157396,-0.027092174,0.021012487,-0.018826533,-0.0020664101,0.006919912,0.011360132,0.012671705,0.024004513,-0.010192012,0.001531022,-0.010922941,-0.01479618,0.023417037,0.031477746,-0.017050445,-0.014823504,-0.009112698,0.0013055955,-0.008846285,0.015424642,-0.0060762702,-0.0070018857,0.0016360503,-0.002411381,0.015684223,0.035603736,-0.009720666,-0.00650663,0.031669017,0.009631862,0.034784,0.000083414234,-0.014823504,0.0072614676,-0.007527881,-0.053747155,0.0028502797,-0.017911164,0.02602652,0.008292965,0.018607937,-0.011141537,0.02053431,0.017815528,0.00918784,-0.0033267494,-0.00050507503,0.0022850055,0.007999227,0.007159001,-0.00955672,-0.027119499,-0.0075073875,-0.003705876,-0.0012193527,-0.0053555886,0.01103907,-0.0061138417,0.017091433,-0.0073571033,0.013306998,0.01325235,-0.0052872775,-0.004897904,0.022706602,0.01597113,0.0140857445,0.025042841,-0.021873208,0.036040924,0.0073844274,-0.014823504,-0.023335064,0.016080428,-0.006677408,-0.0034667873,-0.012227683,-0.0155202765,-0.004723711,0.001951989,0.013518763,-0.0009905107,0.0024848154,0.021244746,0.06639837,0.0056151706,-0.012111554,-0.0028690654,0.028007543,0.0070155477,-0.006339268,0.014044758,0.00070915435,0.0028776042,0.02146334,0.02713316,0.023949863,-0.022870548,-0.030821959,-0.017501298,-0.004570011,0.018170746,-0.004112327,-0.013293336,0.013887642,0.02602652,0.015602251,-0.0017641336,-0.018594276,-0.009584044,0.022009829,0.029674333,0.005680066,-0.016968472,0.030794634,0.019769225,-0.021176435,-0.011401119,0.02190053,-0.0031184007,-0.0028758964,-0.013901304,0.010656528,0.026477374,-0.006086517,-0.011763168,-0.026723294,-0.009823133,0.01042427,0.019577956,-0.0064963833,0.007862605,-0.012958611]} 2 | -------------------------------------------------------------------------------- /test/hnsw.test.ts: -------------------------------------------------------------------------------- 1 | import HNSW from "../src/index" 2 | import { readNdjson } from "./utils" 3 | import { readFileSync } from "fs" 4 | import { join } from "path" 5 | 6 | describe("HNSW", () => { 7 | let hnsw: HNSW 8 | const dummyData = join(__dirname, "dummy-data") 9 | 10 | beforeEach(() => { 11 | hnsw = new HNSW() 12 | }) 13 | 14 | describe("constructor", () => { 15 | it("should initialize with default values", () => { 16 | expect(hnsw.getSize()).toBe(0) 17 | expect(hnsw.getEntryPoint()).toBeNull() 18 | }) 19 | 20 | it("should accept custom values", () => { 21 | const customHnsw = new HNSW(10, 100) 22 | expect(customHnsw.getSize()).toBe(0) 23 | expect(customHnsw.getEntryPoint()).toBeNull() 24 | }) 25 | }) 26 | 27 | describe("addNode", () => { 28 | it("should add a node", () => { 29 | hnsw.addNode(1, [1, 2]) 30 | expect(hnsw.getSize()).toBe(1) 31 | expect(hnsw.getEntryPoint()).toBe(1) 32 | }) 33 | 34 | it("should contain the correct number of vectors when reading from a known index", async () => { 35 | const embeddings = readNdjson(join(dummyData, "embeddings.test.ndjson")) 36 | const index = new HNSW() 37 | 38 | for (const [nodeId, vector] of Object.entries(embeddings)) { 39 | index.addNode(parseInt(nodeId), vector) 40 | } 41 | 42 | expect(index.getSize()).toBe(420) 43 | }) 44 | }) 45 | 46 | describe("deleteNode", () => { 47 | it("should delete a node", () => { 48 | hnsw.addNode(1, [1, 2]) 49 | hnsw.deleteNode(1) 50 | expect(hnsw.getSize()).toBe(0) 51 | }) 52 | 53 | it("should handle deletion of non-existent node", () => { 54 | // Capture console output 55 | const consoleOutput: string[] = [] 56 | console.log = (output: string) => consoleOutput.push(output) 57 | 58 | hnsw.deleteNode(1) 59 | expect(consoleOutput.length).toBe(1) 60 | expect(consoleOutput[0]).toBe("Node with ID 1 not found.") 61 | }) 62 | }) 63 | 64 | describe("search", () => { 65 | it("should return an empty array if no nodes have been added", () => { 66 | const result = hnsw.search([1, 2]) 67 | expect(result).toEqual([]) 68 | }) 69 | }) 70 | 71 | describe("serialize & deserialize", () => { 72 | it("should serialize and deserialize correctly", () => { 73 | hnsw.addNode(1, [1, 2]) 74 | const serialized = hnsw.serialize() 75 | const deserializedHnsw = HNSW.deserialize(serialized) 76 | 77 | expect(deserializedHnsw.getSize()).toBe(1) 78 | expect(deserializedHnsw.getEntryPoint()).toBe(1) 79 | }) 80 | 81 | it("should have the same results after deserializing the index", async () => { 82 | const embeddings = readNdjson(join(dummyData, "embeddings.test.ndjson")) 83 | const queryVector = JSON.parse(readFileSync(join(dummyData, "prompt.test.ndjson"), "utf8").split("\n")[0])["vector"] as number[] 84 | const cleanIndex = new HNSW() 85 | 86 | for (const [nodeId, vector] of Object.entries(embeddings)) { 87 | cleanIndex.addNode(parseInt(nodeId), vector) 88 | } 89 | 90 | const cleanResults = cleanIndex.search(queryVector, 10) 91 | expect(cleanResults.length).toBe(10) 92 | 93 | const serialized = cleanIndex.serialize() 94 | 95 | const deserializedIndex = HNSW.deserialize(serialized) 96 | 97 | const deserializedResults = deserializedIndex.search(queryVector, 10) 98 | expect(deserializedResults.length).toBe(10) 99 | 100 | for (const [index, [cleanScore, cleanNodeId]] of cleanResults.entries()) { 101 | const [deserializedScore, deserializedNodeId] = deserializedResults[index] 102 | expect(cleanScore).toBeCloseTo(deserializedScore, 4) 103 | expect(cleanNodeId).toBe(deserializedNodeId) 104 | } 105 | }) 106 | }) 107 | 108 | describe("clear", () => { 109 | it("should clear all nodes", () => { 110 | hnsw.addNode(1, [1, 2]) 111 | hnsw.clear() 112 | expect(hnsw.getSize()).toBe(0) 113 | expect(hnsw.getEntryPoint()).toBeNull() 114 | }) 115 | }) 116 | }) 117 | -------------------------------------------------------------------------------- /test/minheap.test.ts: -------------------------------------------------------------------------------- 1 | import { MinHeap } from "../src/minheap" 2 | 3 | describe("MinHeap", () => { 4 | test("should create an empty heap", () => { 5 | const heap = new MinHeap((a, b) => a - b) 6 | expect(heap.size()).toBe(0) 7 | }) 8 | 9 | test("should push values into the heap", () => { 10 | const heap = new MinHeap((a, b) => a - b) 11 | heap.push(3) 12 | heap.push(2) 13 | heap.push(1) 14 | expect(heap.size()).toBe(3) 15 | }) 16 | 17 | test("should pop the minimum value from the heap", () => { 18 | const heap = new MinHeap((a, b) => a - b) 19 | heap.push(3) 20 | heap.push(2) 21 | heap.push(1) 22 | expect(heap.pop()).toBe(1) 23 | }) 24 | 25 | test("should maintain the min-heap property", () => { 26 | const heap = new MinHeap((a, b) => a - b) 27 | heap.push(5) 28 | heap.push(2) 29 | heap.push(8) 30 | heap.push(4) 31 | heap.push(1) 32 | expect(heap.pop()).toBe(1) 33 | expect(heap.pop()).toBe(2) 34 | expect(heap.pop()).toBe(4) 35 | expect(heap.pop()).toBe(5) 36 | expect(heap.pop()).toBe(8) 37 | }) 38 | 39 | test("should return undefined when popping from an empty heap", () => { 40 | const heap = new MinHeap((a, b) => a - b) 41 | expect(heap.pop()).toBeUndefined() 42 | }) 43 | 44 | test("should handle custom comparison functions", () => { 45 | interface Person { 46 | name: string 47 | age: number 48 | } 49 | 50 | const peopleHeap = new MinHeap((a, b) => a.age - b.age) 51 | 52 | peopleHeap.push({ name: "Alice", age: 28 }) 53 | peopleHeap.push({ name: "Bob", age: 25 }) 54 | peopleHeap.push({ name: "Charlie", age: 30 }) 55 | 56 | expect(peopleHeap.pop()?.name).toBe("Bob") 57 | expect(peopleHeap.pop()?.name).toBe("Alice") 58 | expect(peopleHeap.pop()?.name).toBe("Charlie") 59 | }) 60 | }) 61 | -------------------------------------------------------------------------------- /test/utils.ts: -------------------------------------------------------------------------------- 1 | import * as fs from "fs" 2 | 3 | export function readNdjson(filePath: string): { [id: string]: number[] } { 4 | const data: { [id: string]: number[] } = {} 5 | const fileContents = fs.readFileSync(filePath, "utf8") 6 | const lines = fileContents.split("\n") 7 | 8 | for (const line of lines) { 9 | if (line.trim() === "") continue 10 | const item = JSON.parse(line) 11 | const nodeId = String(item["node_id"]) 12 | const vector = item["vector"] as number[] 13 | data[nodeId] = vector 14 | } 15 | 16 | return data 17 | } 18 | -------------------------------------------------------------------------------- /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": "./", /* 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 | "include": [ 110 | "src/**/*" // or any other specific folders you want to include 111 | ], 112 | "exclude": [ 113 | "node_modules", 114 | "test" // Add this line to exclude the test directory 115 | ] 116 | } 117 | --------------------------------------------------------------------------------