├── .gitignore ├── README.md ├── benchmark.mjs ├── jest.config.js ├── package.json ├── pnpm-lock.yaml ├── src └── index.ts ├── tests └── unit.test.ts └── tsconfig.build.json /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | .idea/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # stable-hash 2 | 3 | A tiny and fast (481b [unpkg](https://unpkg.com/stable-hash@0.0.3/dist/index.mjs)) lib for "stably hashing" a JavaScript value. Originally created for [SWR](https://github.com/vercel/swr). 4 | 5 | It's similar to `JSON.stringify(value)`, but: 6 | 1. Supports any JavaScript value (BigInt, NaN, Symbol, function, class, ...) 7 | 2. Sorts object keys (stable) 8 | 3. Supports circular objects 9 | 10 | ## Use 11 | 12 | ```bash 13 | yarn add stable-hash 14 | ``` 15 | 16 | ```js 17 | import hash from 'stable-hash' 18 | 19 | hash(anyJavaScriptValueHere) // returns a string 20 | ``` 21 | 22 | ## Examples 23 | 24 | ### Primitive Value 25 | 26 | ```js 27 | hash(1) 28 | hash('foo') 29 | hash(true) 30 | hash(undefined) 31 | hash(null) 32 | hash(NaN) 33 | ``` 34 | 35 | BigInt: 36 | 37 | ```js 38 | hash(1) === hash(1n) 39 | hash(1) !== hash(2n) 40 | ``` 41 | 42 | Symbol: 43 | 44 | ```js 45 | hash(Symbol.for('foo')) === hash(Symbol.for('foo')) 46 | hash(Symbol.for('foo')) === hash(Symbol('foo')) 47 | hash(Symbol('foo')) === hash(Symbol('foo')) 48 | hash(Symbol('foo')) !== hash(Symbol('bar')) 49 | ``` 50 | 51 | _Since Symbols cannot be serialized, stable-hash simply uses its description as the hash._ 52 | 53 | ### Regex 54 | 55 | ```js 56 | hash(/foo/) === hash(/foo/) 57 | hash(/foo/) !== hash(/bar/) 58 | ``` 59 | 60 | ### Date 61 | 62 | ```js 63 | hash(new Date(1)) === hash(new Date(1)) 64 | ``` 65 | 66 | ### Array 67 | 68 | ```js 69 | hash([1, '2', [new Date(3)]]) === hash([1, '2', [new Date(3)]]) 70 | hash([1, 2]) !== hash([2, 1]) 71 | ``` 72 | 73 | Circular: 74 | 75 | ```js 76 | const foo = [] 77 | foo.push(foo) 78 | hash(foo) === hash(foo) 79 | ``` 80 | 81 | ### Object 82 | 83 | ```js 84 | hash({ foo: 'bar' }) === hash({ foo: 'bar' }) 85 | hash({ foo: { bar: 1 } }) === hash({ foo: { bar: 1 } }) 86 | ``` 87 | 88 | Stable: 89 | 90 | ```js 91 | hash({ a: 1, b: 2, c: 3 }) === hash({ c: 3, b: 2, a: 1 }) 92 | ``` 93 | 94 | Circular: 95 | 96 | ```js 97 | const foo = {} 98 | foo.foo = foo 99 | hash(foo) === hash(foo) 100 | ``` 101 | 102 | ### Function, Class, Set, Map, Buffer... 103 | 104 | `stable-hash` guarantees reference consistency (`===`) for objects that the constructor isn't `Object`. 105 | 106 | ```js 107 | const foo = () => {} 108 | hash(foo) === hash(foo) 109 | hash(foo) !== hash(() => {}) 110 | ``` 111 | 112 | ```js 113 | class Foo {} 114 | hash(Foo) === hash(Foo) 115 | hash(Foo) !== hash(class {}) 116 | ``` 117 | 118 | ```js 119 | const foo = new Set([1]) 120 | hash(foo) === hash(foo) 121 | hash(foo) !== hash(new Set([1])) 122 | ``` 123 | 124 | ## Notes 125 | 126 | This function does something similar to `JSON.stringify`, but more than it. It doesn't generate a secure checksum, which usually has a fixed length and is hard to be reversed. With `stable-hash` it's still possible to get the original data. Also, the output might include any charaters, not just alphabets and numbers like other hash algorithms. So: 127 | 128 | - Use another encoding layer on top of it if you want to display the output. 129 | - Use another crypto layer on top of it if you want to have a secure and fixed length hash. 130 | 131 | ```js 132 | import crypto from 'crypto' 133 | import hash from 'stable-hash' 134 | 135 | const weakHash = hash(anyJavaScriptValueHere) 136 | const encodedHash = Buffer.from(weakHash).toString('base64') 137 | const safeHash = crypto.createHash('MD5').update(weakHash).digest('hex') 138 | ``` 139 | 140 | Also, the consistency of this lib is sometimes guaranteed by the singularity of the WeakMap instance. So it might not generate the consistent results when running in different runtimes, e.g. server/client or parent/worker scenarios. 141 | 142 | ## License 143 | 144 | Created by Shu Ding. Released under the MIT License. 145 | -------------------------------------------------------------------------------- /benchmark.mjs: -------------------------------------------------------------------------------- 1 | import stringify from 'json-stringify-deterministic' 2 | import hash from 'stable-hash' 3 | import { escape } from 'base64-url' 4 | import hashObject from 'hash-obj' 5 | import { flattie } from 'flattie' 6 | import bench from 'nanobench' 7 | import crypto from 'node:crypto' 8 | 9 | // this is an example of payload 10 | const payload = { 11 | url: 'https://example.com/', 12 | query: { 13 | screenshot: true, 14 | ttl: 86400000, 15 | staleTtl: false, 16 | prerender: 'auto', 17 | meta: true, 18 | data: false, 19 | video: false, 20 | audio: false, 21 | pdf: false, 22 | insights: false, 23 | iframe: false, 24 | ping: true, 25 | headers: { 26 | 'upgrade-insecure-requests': '1', 27 | dnt: '1', 28 | accept: '*/*', 29 | 'sec-fetch-site': 'same-origin', 30 | 'sec-fetch-mode': 'navigate', 31 | 'sec-fetch-user': '?1', 32 | 'sec-fetch-dest': 'document', 33 | 'accept-encoding': 'gzip, deflate, br', 34 | 'accept-language': 'en' 35 | } 36 | } 37 | } 38 | 39 | /*** 40 | * benchmarking `hash-obj` vs. `stable-hash` 41 | * 42 | * The goal is to represent a real use-case. Because that: 43 | * 44 | * - ensure the input is flatten 45 | * - output is base64 URL safe 46 | * - sha512 is used as algorithm 47 | * 48 | */ 49 | const getHashOne = obj => 50 | escape( 51 | hashObject(flattie(obj), { 52 | encoding: 'base64', 53 | algorithm: 'sha512' 54 | }) 55 | ) 56 | 57 | const getHashTwo = obj => { 58 | return escape( 59 | crypto 60 | .createHash('sha512') 61 | .update(hash(flattie(obj))) 62 | .digest('base64') 63 | ) 64 | } 65 | 66 | const getHashThree = obj => { 67 | return escape( 68 | crypto 69 | .createHash('sha512') 70 | .update(stringify(flattie(obj))) 71 | .digest('base64') 72 | ) 73 | } 74 | 75 | bench('`hash-obj` 200.000 times', function (b) { 76 | b.start() 77 | 78 | for (let i = 0; i < 200000; i++) { 79 | getHashOne(payload) 80 | } 81 | 82 | b.end() 83 | }) 84 | 85 | bench('`stable-hash` 200.000 times', function (b) { 86 | b.start() 87 | 88 | for (let i = 0; i < 200000; i++) { 89 | getHashTwo(payload) 90 | } 91 | 92 | b.end() 93 | }) 94 | 95 | bench('`json-stringify-deterministic` 200.000 times', function (b) { 96 | b.start() 97 | 98 | for (let i = 0; i < 200000; i++) { 99 | getHashThree(payload) 100 | } 101 | 102 | b.end() 103 | }) 104 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: "ts-jest", 3 | testEnvironment: "node" 4 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stable-hash", 3 | "version": "0.0.5", 4 | "description": "Stable JS value hash.", 5 | "repository": "https://github.com/shuding/stable-hash", 6 | "author": "Shu Ding", 7 | "license": "MIT", 8 | "packageManager": "pnpm@9.15.0", 9 | "main": "./dist/index.js", 10 | "module": "./dist/index.mjs", 11 | "types": "./dist/index.d.ts", 12 | "exports": { 13 | "require": "./dist/index.js", 14 | "import": "./dist/index.mjs", 15 | "types": "./dist/index.d.ts" 16 | }, 17 | "files": [ 18 | "dist/**" 19 | ], 20 | "scripts": { 21 | "build:mjs": "esbuild src/index.ts --minify --target=es6 --outdir=dist --out-extension:.js=.mjs", 22 | "build:cjs": "esbuild src/index.ts --minify --target=es6 --outdir=dist --format=cjs", 23 | "build:types": "tsc --emitDeclarationOnly --declaration -p tsconfig.build.json", 24 | "build": "pnpm build:mjs && pnpm build:cjs && pnpm build:types", 25 | "test": "jest" 26 | }, 27 | "devDependencies": { 28 | "@types/jest": "^28.1.3", 29 | "@types/node": "^22.14.0", 30 | "base64-url": "^2.3.3", 31 | "esbuild": "^0.12.28", 32 | "flattie": "^1.1.0", 33 | "hash-obj": "^4.0.0", 34 | "jest": "^28.1.1", 35 | "json-stringify-deterministic": "^1.0.7", 36 | "nanobench": "^2.1.1", 37 | "prettier": "^2.7.1", 38 | "ts-jest": "^28.0.5", 39 | "typescript": "^4.7.4" 40 | }, 41 | "prettier": { 42 | "semi": false 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/jest': 12 | specifier: ^28.1.3 13 | version: 28.1.8 14 | '@types/node': 15 | specifier: ^22.14.0 16 | version: 22.14.0 17 | base64-url: 18 | specifier: ^2.3.3 19 | version: 2.3.3 20 | esbuild: 21 | specifier: ^0.12.28 22 | version: 0.12.29 23 | flattie: 24 | specifier: ^1.1.0 25 | version: 1.1.0 26 | hash-obj: 27 | specifier: ^4.0.0 28 | version: 4.0.0 29 | jest: 30 | specifier: ^28.1.1 31 | version: 28.1.3(@types/node@22.14.0) 32 | json-stringify-deterministic: 33 | specifier: ^1.0.7 34 | version: 1.0.12 35 | nanobench: 36 | specifier: ^2.1.1 37 | version: 2.1.1 38 | prettier: 39 | specifier: ^2.7.1 40 | version: 2.8.8 41 | ts-jest: 42 | specifier: ^28.0.5 43 | version: 28.0.8(@babel/core@7.23.9)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.23.9))(esbuild@0.12.29)(jest@28.1.3(@types/node@22.14.0))(typescript@4.9.5) 44 | typescript: 45 | specifier: ^4.7.4 46 | version: 4.9.5 47 | 48 | packages: 49 | 50 | '@ampproject/remapping@2.2.1': 51 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 52 | engines: {node: '>=6.0.0'} 53 | 54 | '@babel/code-frame@7.23.5': 55 | resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} 56 | engines: {node: '>=6.9.0'} 57 | 58 | '@babel/compat-data@7.23.5': 59 | resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} 60 | engines: {node: '>=6.9.0'} 61 | 62 | '@babel/core@7.23.9': 63 | resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} 64 | engines: {node: '>=6.9.0'} 65 | 66 | '@babel/generator@7.23.6': 67 | resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} 68 | engines: {node: '>=6.9.0'} 69 | 70 | '@babel/helper-compilation-targets@7.23.6': 71 | resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} 72 | engines: {node: '>=6.9.0'} 73 | 74 | '@babel/helper-environment-visitor@7.22.20': 75 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 76 | engines: {node: '>=6.9.0'} 77 | 78 | '@babel/helper-function-name@7.23.0': 79 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 80 | engines: {node: '>=6.9.0'} 81 | 82 | '@babel/helper-hoist-variables@7.22.5': 83 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 84 | engines: {node: '>=6.9.0'} 85 | 86 | '@babel/helper-module-imports@7.22.15': 87 | resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} 88 | engines: {node: '>=6.9.0'} 89 | 90 | '@babel/helper-module-transforms@7.23.3': 91 | resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} 92 | engines: {node: '>=6.9.0'} 93 | peerDependencies: 94 | '@babel/core': ^7.0.0 95 | 96 | '@babel/helper-plugin-utils@7.22.5': 97 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 98 | engines: {node: '>=6.9.0'} 99 | 100 | '@babel/helper-simple-access@7.22.5': 101 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 102 | engines: {node: '>=6.9.0'} 103 | 104 | '@babel/helper-split-export-declaration@7.22.6': 105 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 106 | engines: {node: '>=6.9.0'} 107 | 108 | '@babel/helper-string-parser@7.23.4': 109 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 110 | engines: {node: '>=6.9.0'} 111 | 112 | '@babel/helper-validator-identifier@7.22.20': 113 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 114 | engines: {node: '>=6.9.0'} 115 | 116 | '@babel/helper-validator-option@7.23.5': 117 | resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} 118 | engines: {node: '>=6.9.0'} 119 | 120 | '@babel/helpers@7.23.9': 121 | resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} 122 | engines: {node: '>=6.9.0'} 123 | 124 | '@babel/highlight@7.23.4': 125 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 126 | engines: {node: '>=6.9.0'} 127 | 128 | '@babel/parser@7.23.9': 129 | resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} 130 | engines: {node: '>=6.0.0'} 131 | hasBin: true 132 | 133 | '@babel/plugin-syntax-async-generators@7.8.4': 134 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 135 | peerDependencies: 136 | '@babel/core': ^7.0.0-0 137 | 138 | '@babel/plugin-syntax-bigint@7.8.3': 139 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 140 | peerDependencies: 141 | '@babel/core': ^7.0.0-0 142 | 143 | '@babel/plugin-syntax-class-properties@7.12.13': 144 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 145 | peerDependencies: 146 | '@babel/core': ^7.0.0-0 147 | 148 | '@babel/plugin-syntax-import-meta@7.10.4': 149 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 150 | peerDependencies: 151 | '@babel/core': ^7.0.0-0 152 | 153 | '@babel/plugin-syntax-json-strings@7.8.3': 154 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 155 | peerDependencies: 156 | '@babel/core': ^7.0.0-0 157 | 158 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 159 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 160 | peerDependencies: 161 | '@babel/core': ^7.0.0-0 162 | 163 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 164 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 165 | peerDependencies: 166 | '@babel/core': ^7.0.0-0 167 | 168 | '@babel/plugin-syntax-numeric-separator@7.10.4': 169 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 170 | peerDependencies: 171 | '@babel/core': ^7.0.0-0 172 | 173 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 174 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 175 | peerDependencies: 176 | '@babel/core': ^7.0.0-0 177 | 178 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 179 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 180 | peerDependencies: 181 | '@babel/core': ^7.0.0-0 182 | 183 | '@babel/plugin-syntax-optional-chaining@7.8.3': 184 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 185 | peerDependencies: 186 | '@babel/core': ^7.0.0-0 187 | 188 | '@babel/plugin-syntax-top-level-await@7.14.5': 189 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 190 | engines: {node: '>=6.9.0'} 191 | peerDependencies: 192 | '@babel/core': ^7.0.0-0 193 | 194 | '@babel/plugin-syntax-typescript@7.23.3': 195 | resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} 196 | engines: {node: '>=6.9.0'} 197 | peerDependencies: 198 | '@babel/core': ^7.0.0-0 199 | 200 | '@babel/template@7.23.9': 201 | resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} 202 | engines: {node: '>=6.9.0'} 203 | 204 | '@babel/traverse@7.23.9': 205 | resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} 206 | engines: {node: '>=6.9.0'} 207 | 208 | '@babel/types@7.23.9': 209 | resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} 210 | engines: {node: '>=6.9.0'} 211 | 212 | '@bcoe/v8-coverage@0.2.3': 213 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 214 | 215 | '@istanbuljs/load-nyc-config@1.1.0': 216 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 217 | engines: {node: '>=8'} 218 | 219 | '@istanbuljs/schema@0.1.3': 220 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 221 | engines: {node: '>=8'} 222 | 223 | '@jest/console@28.1.3': 224 | resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} 225 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 226 | 227 | '@jest/core@28.1.3': 228 | resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} 229 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 230 | peerDependencies: 231 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 232 | peerDependenciesMeta: 233 | node-notifier: 234 | optional: true 235 | 236 | '@jest/environment@28.1.3': 237 | resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} 238 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 239 | 240 | '@jest/expect-utils@28.1.3': 241 | resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} 242 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 243 | 244 | '@jest/expect@28.1.3': 245 | resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} 246 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 247 | 248 | '@jest/fake-timers@28.1.3': 249 | resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} 250 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 251 | 252 | '@jest/globals@28.1.3': 253 | resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} 254 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 255 | 256 | '@jest/reporters@28.1.3': 257 | resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} 258 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 259 | peerDependencies: 260 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 261 | peerDependenciesMeta: 262 | node-notifier: 263 | optional: true 264 | 265 | '@jest/schemas@28.1.3': 266 | resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} 267 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 268 | 269 | '@jest/source-map@28.1.2': 270 | resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} 271 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 272 | 273 | '@jest/test-result@28.1.3': 274 | resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} 275 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 276 | 277 | '@jest/test-sequencer@28.1.3': 278 | resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} 279 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 280 | 281 | '@jest/transform@28.1.3': 282 | resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} 283 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 284 | 285 | '@jest/types@28.1.3': 286 | resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} 287 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 288 | 289 | '@jridgewell/gen-mapping@0.3.3': 290 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 291 | engines: {node: '>=6.0.0'} 292 | 293 | '@jridgewell/resolve-uri@3.1.1': 294 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 295 | engines: {node: '>=6.0.0'} 296 | 297 | '@jridgewell/set-array@1.1.2': 298 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 299 | engines: {node: '>=6.0.0'} 300 | 301 | '@jridgewell/sourcemap-codec@1.4.15': 302 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 303 | 304 | '@jridgewell/trace-mapping@0.3.22': 305 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} 306 | 307 | '@sinclair/typebox@0.24.51': 308 | resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} 309 | 310 | '@sinonjs/commons@1.8.6': 311 | resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} 312 | 313 | '@sinonjs/fake-timers@9.1.2': 314 | resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} 315 | 316 | '@types/babel__core@7.20.5': 317 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 318 | 319 | '@types/babel__generator@7.6.8': 320 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 321 | 322 | '@types/babel__template@7.4.4': 323 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 324 | 325 | '@types/babel__traverse@7.20.5': 326 | resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} 327 | 328 | '@types/graceful-fs@4.1.9': 329 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 330 | 331 | '@types/istanbul-lib-coverage@2.0.6': 332 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 333 | 334 | '@types/istanbul-lib-report@3.0.3': 335 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 336 | 337 | '@types/istanbul-reports@3.0.4': 338 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 339 | 340 | '@types/jest@28.1.8': 341 | resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} 342 | 343 | '@types/node@22.14.0': 344 | resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} 345 | 346 | '@types/prettier@2.7.3': 347 | resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} 348 | 349 | '@types/stack-utils@2.0.3': 350 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 351 | 352 | '@types/yargs-parser@21.0.3': 353 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 354 | 355 | '@types/yargs@17.0.32': 356 | resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} 357 | 358 | ansi-escapes@4.3.2: 359 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 360 | engines: {node: '>=8'} 361 | 362 | ansi-regex@2.1.1: 363 | resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} 364 | engines: {node: '>=0.10.0'} 365 | 366 | ansi-regex@5.0.1: 367 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 368 | engines: {node: '>=8'} 369 | 370 | ansi-styles@2.2.1: 371 | resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} 372 | engines: {node: '>=0.10.0'} 373 | 374 | ansi-styles@3.2.1: 375 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 376 | engines: {node: '>=4'} 377 | 378 | ansi-styles@4.3.0: 379 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 380 | engines: {node: '>=8'} 381 | 382 | ansi-styles@5.2.0: 383 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 384 | engines: {node: '>=10'} 385 | 386 | anymatch@3.1.3: 387 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 388 | engines: {node: '>= 8'} 389 | 390 | argparse@1.0.10: 391 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 392 | 393 | babel-jest@28.1.3: 394 | resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} 395 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 396 | peerDependencies: 397 | '@babel/core': ^7.8.0 398 | 399 | babel-plugin-istanbul@6.1.1: 400 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 401 | engines: {node: '>=8'} 402 | 403 | babel-plugin-jest-hoist@28.1.3: 404 | resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} 405 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 406 | 407 | babel-preset-current-node-syntax@1.0.1: 408 | resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} 409 | peerDependencies: 410 | '@babel/core': ^7.0.0 411 | 412 | babel-preset-jest@28.1.3: 413 | resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} 414 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 415 | peerDependencies: 416 | '@babel/core': ^7.0.0 417 | 418 | balanced-match@1.0.2: 419 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 420 | 421 | base64-url@2.3.3: 422 | resolution: {integrity: sha512-dLMhIsK7OplcDauDH/tZLvK7JmUZK3A7KiQpjNzsBrM6Etw7hzNI1tLEywqJk9NnwkgWuFKSlx/IUO7vF6Mo8Q==} 423 | engines: {node: '>=6'} 424 | 425 | brace-expansion@1.1.11: 426 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 427 | 428 | braces@3.0.2: 429 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 430 | engines: {node: '>=8'} 431 | 432 | browser-process-hrtime@0.1.3: 433 | resolution: {integrity: sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==} 434 | 435 | browserslist@4.22.3: 436 | resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} 437 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 438 | hasBin: true 439 | 440 | bs-logger@0.2.6: 441 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 442 | engines: {node: '>= 6'} 443 | 444 | bser@2.1.1: 445 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 446 | 447 | buffer-from@1.1.2: 448 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 449 | 450 | callsites@3.1.0: 451 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 452 | engines: {node: '>=6'} 453 | 454 | camelcase@5.3.1: 455 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 456 | engines: {node: '>=6'} 457 | 458 | camelcase@6.3.0: 459 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 460 | engines: {node: '>=10'} 461 | 462 | caniuse-lite@1.0.30001587: 463 | resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} 464 | 465 | chalk@1.1.3: 466 | resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} 467 | engines: {node: '>=0.10.0'} 468 | 469 | chalk@2.4.2: 470 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 471 | engines: {node: '>=4'} 472 | 473 | chalk@4.1.2: 474 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 475 | engines: {node: '>=10'} 476 | 477 | char-regex@1.0.2: 478 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 479 | engines: {node: '>=10'} 480 | 481 | ci-info@3.9.0: 482 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 483 | engines: {node: '>=8'} 484 | 485 | cjs-module-lexer@1.2.3: 486 | resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} 487 | 488 | cliui@8.0.1: 489 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 490 | engines: {node: '>=12'} 491 | 492 | co@4.6.0: 493 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 494 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 495 | 496 | collect-v8-coverage@1.0.2: 497 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 498 | 499 | color-convert@1.9.3: 500 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 501 | 502 | color-convert@2.0.1: 503 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 504 | engines: {node: '>=7.0.0'} 505 | 506 | color-name@1.1.3: 507 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 508 | 509 | color-name@1.1.4: 510 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 511 | 512 | concat-map@0.0.1: 513 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 514 | 515 | convert-source-map@1.9.0: 516 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 517 | 518 | convert-source-map@2.0.0: 519 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 520 | 521 | cross-spawn@7.0.3: 522 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 523 | engines: {node: '>= 8'} 524 | 525 | debug@4.3.4: 526 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 527 | engines: {node: '>=6.0'} 528 | peerDependencies: 529 | supports-color: '*' 530 | peerDependenciesMeta: 531 | supports-color: 532 | optional: true 533 | 534 | dedent@0.7.0: 535 | resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} 536 | 537 | deepmerge@4.3.1: 538 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 539 | engines: {node: '>=0.10.0'} 540 | 541 | detect-newline@3.1.0: 542 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 543 | engines: {node: '>=8'} 544 | 545 | diff-sequences@28.1.1: 546 | resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} 547 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 548 | 549 | electron-to-chromium@1.4.668: 550 | resolution: {integrity: sha512-ZOBocMYCehr9W31+GpMclR+KBaDZOoAEabLdhpZ8oU1JFDwIaFY0UDbpXVEUFc0BIP2O2Qn3rkfCjQmMR4T/bQ==} 551 | 552 | emittery@0.10.2: 553 | resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} 554 | engines: {node: '>=12'} 555 | 556 | emoji-regex@8.0.0: 557 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 558 | 559 | error-ex@1.3.2: 560 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 561 | 562 | esbuild@0.12.29: 563 | resolution: {integrity: sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==} 564 | hasBin: true 565 | 566 | escalade@3.1.2: 567 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 568 | engines: {node: '>=6'} 569 | 570 | escape-string-regexp@1.0.5: 571 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 572 | engines: {node: '>=0.8.0'} 573 | 574 | escape-string-regexp@2.0.0: 575 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 576 | engines: {node: '>=8'} 577 | 578 | esprima@4.0.1: 579 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 580 | engines: {node: '>=4'} 581 | hasBin: true 582 | 583 | execa@5.1.1: 584 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 585 | engines: {node: '>=10'} 586 | 587 | exit@0.1.2: 588 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 589 | engines: {node: '>= 0.8.0'} 590 | 591 | expect@28.1.3: 592 | resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} 593 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 594 | 595 | fast-json-stable-stringify@2.1.0: 596 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 597 | 598 | fb-watchman@2.0.2: 599 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 600 | 601 | fill-range@7.0.1: 602 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 603 | engines: {node: '>=8'} 604 | 605 | find-up@4.1.0: 606 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 607 | engines: {node: '>=8'} 608 | 609 | flattie@1.1.0: 610 | resolution: {integrity: sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==} 611 | engines: {node: '>=8'} 612 | 613 | fs.realpath@1.0.0: 614 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 615 | 616 | fsevents@2.3.3: 617 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 618 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 619 | os: [darwin] 620 | 621 | function-bind@1.1.2: 622 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 623 | 624 | gensync@1.0.0-beta.2: 625 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 626 | engines: {node: '>=6.9.0'} 627 | 628 | get-caller-file@2.0.5: 629 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 630 | engines: {node: 6.* || 8.* || >= 10.*} 631 | 632 | get-package-type@0.1.0: 633 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 634 | engines: {node: '>=8.0.0'} 635 | 636 | get-stream@6.0.1: 637 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 638 | engines: {node: '>=10'} 639 | 640 | glob@7.2.3: 641 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 642 | 643 | globals@11.12.0: 644 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 645 | engines: {node: '>=4'} 646 | 647 | graceful-fs@4.2.11: 648 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 649 | 650 | has-ansi@2.0.0: 651 | resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} 652 | engines: {node: '>=0.10.0'} 653 | 654 | has-flag@3.0.0: 655 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 656 | engines: {node: '>=4'} 657 | 658 | has-flag@4.0.0: 659 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 660 | engines: {node: '>=8'} 661 | 662 | hash-obj@4.0.0: 663 | resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} 664 | engines: {node: '>=12'} 665 | 666 | hasown@2.0.1: 667 | resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} 668 | engines: {node: '>= 0.4'} 669 | 670 | html-escaper@2.0.2: 671 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 672 | 673 | human-signals@2.1.0: 674 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 675 | engines: {node: '>=10.17.0'} 676 | 677 | import-local@3.1.0: 678 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} 679 | engines: {node: '>=8'} 680 | hasBin: true 681 | 682 | imurmurhash@0.1.4: 683 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 684 | engines: {node: '>=0.8.19'} 685 | 686 | inflight@1.0.6: 687 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 688 | 689 | inherits@2.0.4: 690 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 691 | 692 | is-arrayish@0.2.1: 693 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 694 | 695 | is-core-module@2.13.1: 696 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 697 | 698 | is-fullwidth-code-point@3.0.0: 699 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 700 | engines: {node: '>=8'} 701 | 702 | is-generator-fn@2.1.0: 703 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 704 | engines: {node: '>=6'} 705 | 706 | is-number@7.0.0: 707 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 708 | engines: {node: '>=0.12.0'} 709 | 710 | is-obj@3.0.0: 711 | resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} 712 | engines: {node: '>=12'} 713 | 714 | is-plain-obj@4.1.0: 715 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 716 | engines: {node: '>=12'} 717 | 718 | is-stream@2.0.1: 719 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 720 | engines: {node: '>=8'} 721 | 722 | isexe@2.0.0: 723 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 724 | 725 | istanbul-lib-coverage@3.2.2: 726 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 727 | engines: {node: '>=8'} 728 | 729 | istanbul-lib-instrument@5.2.1: 730 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 731 | engines: {node: '>=8'} 732 | 733 | istanbul-lib-report@3.0.1: 734 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 735 | engines: {node: '>=10'} 736 | 737 | istanbul-lib-source-maps@4.0.1: 738 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 739 | engines: {node: '>=10'} 740 | 741 | istanbul-reports@3.1.6: 742 | resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} 743 | engines: {node: '>=8'} 744 | 745 | jest-changed-files@28.1.3: 746 | resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} 747 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 748 | 749 | jest-circus@28.1.3: 750 | resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} 751 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 752 | 753 | jest-cli@28.1.3: 754 | resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} 755 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 756 | hasBin: true 757 | peerDependencies: 758 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 759 | peerDependenciesMeta: 760 | node-notifier: 761 | optional: true 762 | 763 | jest-config@28.1.3: 764 | resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} 765 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 766 | peerDependencies: 767 | '@types/node': '*' 768 | ts-node: '>=9.0.0' 769 | peerDependenciesMeta: 770 | '@types/node': 771 | optional: true 772 | ts-node: 773 | optional: true 774 | 775 | jest-diff@28.1.3: 776 | resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} 777 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 778 | 779 | jest-docblock@28.1.1: 780 | resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} 781 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 782 | 783 | jest-each@28.1.3: 784 | resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} 785 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 786 | 787 | jest-environment-node@28.1.3: 788 | resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} 789 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 790 | 791 | jest-get-type@28.0.2: 792 | resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} 793 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 794 | 795 | jest-haste-map@28.1.3: 796 | resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} 797 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 798 | 799 | jest-leak-detector@28.1.3: 800 | resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} 801 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 802 | 803 | jest-matcher-utils@28.1.3: 804 | resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} 805 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 806 | 807 | jest-message-util@28.1.3: 808 | resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} 809 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 810 | 811 | jest-mock@28.1.3: 812 | resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} 813 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 814 | 815 | jest-pnp-resolver@1.2.3: 816 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 817 | engines: {node: '>=6'} 818 | peerDependencies: 819 | jest-resolve: '*' 820 | peerDependenciesMeta: 821 | jest-resolve: 822 | optional: true 823 | 824 | jest-regex-util@28.0.2: 825 | resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} 826 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 827 | 828 | jest-resolve-dependencies@28.1.3: 829 | resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} 830 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 831 | 832 | jest-resolve@28.1.3: 833 | resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} 834 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 835 | 836 | jest-runner@28.1.3: 837 | resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} 838 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 839 | 840 | jest-runtime@28.1.3: 841 | resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} 842 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 843 | 844 | jest-snapshot@28.1.3: 845 | resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} 846 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 847 | 848 | jest-util@28.1.3: 849 | resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} 850 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 851 | 852 | jest-validate@28.1.3: 853 | resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} 854 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 855 | 856 | jest-watcher@28.1.3: 857 | resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} 858 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 859 | 860 | jest-worker@28.1.3: 861 | resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} 862 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 863 | 864 | jest@28.1.3: 865 | resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} 866 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 867 | hasBin: true 868 | peerDependencies: 869 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 870 | peerDependenciesMeta: 871 | node-notifier: 872 | optional: true 873 | 874 | js-tokens@4.0.0: 875 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 876 | 877 | js-yaml@3.14.1: 878 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 879 | hasBin: true 880 | 881 | jsesc@2.5.2: 882 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 883 | engines: {node: '>=4'} 884 | hasBin: true 885 | 886 | json-parse-even-better-errors@2.3.1: 887 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 888 | 889 | json-stringify-deterministic@1.0.12: 890 | resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==} 891 | engines: {node: '>= 4'} 892 | 893 | json5@2.2.3: 894 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 895 | engines: {node: '>=6'} 896 | hasBin: true 897 | 898 | kleur@3.0.3: 899 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 900 | engines: {node: '>=6'} 901 | 902 | leven@3.1.0: 903 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 904 | engines: {node: '>=6'} 905 | 906 | lines-and-columns@1.2.4: 907 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 908 | 909 | locate-path@5.0.0: 910 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 911 | engines: {node: '>=8'} 912 | 913 | lodash.memoize@4.1.2: 914 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 915 | 916 | lru-cache@5.1.1: 917 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 918 | 919 | lru-cache@6.0.0: 920 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 921 | engines: {node: '>=10'} 922 | 923 | make-dir@4.0.0: 924 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 925 | engines: {node: '>=10'} 926 | 927 | make-error@1.3.6: 928 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 929 | 930 | makeerror@1.0.12: 931 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 932 | 933 | merge-stream@2.0.0: 934 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 935 | 936 | micromatch@4.0.5: 937 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 938 | engines: {node: '>=8.6'} 939 | 940 | mimic-fn@2.1.0: 941 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 942 | engines: {node: '>=6'} 943 | 944 | minimatch@3.1.2: 945 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 946 | 947 | ms@2.1.2: 948 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 949 | 950 | mutexify@1.4.0: 951 | resolution: {integrity: sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==} 952 | 953 | nanobench@2.1.1: 954 | resolution: {integrity: sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==} 955 | hasBin: true 956 | 957 | natural-compare@1.4.0: 958 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 959 | 960 | node-int64@0.4.0: 961 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 962 | 963 | node-releases@2.0.14: 964 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 965 | 966 | normalize-path@3.0.0: 967 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 968 | engines: {node: '>=0.10.0'} 969 | 970 | npm-run-path@4.0.1: 971 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 972 | engines: {node: '>=8'} 973 | 974 | once@1.4.0: 975 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 976 | 977 | onetime@5.1.2: 978 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 979 | engines: {node: '>=6'} 980 | 981 | p-limit@2.3.0: 982 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 983 | engines: {node: '>=6'} 984 | 985 | p-limit@3.1.0: 986 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 987 | engines: {node: '>=10'} 988 | 989 | p-locate@4.1.0: 990 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 991 | engines: {node: '>=8'} 992 | 993 | p-try@2.2.0: 994 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 995 | engines: {node: '>=6'} 996 | 997 | parse-json@5.2.0: 998 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 999 | engines: {node: '>=8'} 1000 | 1001 | path-exists@4.0.0: 1002 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1003 | engines: {node: '>=8'} 1004 | 1005 | path-is-absolute@1.0.1: 1006 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1007 | engines: {node: '>=0.10.0'} 1008 | 1009 | path-key@3.1.1: 1010 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1011 | engines: {node: '>=8'} 1012 | 1013 | path-parse@1.0.7: 1014 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1015 | 1016 | picocolors@1.0.0: 1017 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1018 | 1019 | picomatch@2.3.1: 1020 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1021 | engines: {node: '>=8.6'} 1022 | 1023 | pirates@4.0.6: 1024 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1025 | engines: {node: '>= 6'} 1026 | 1027 | pkg-dir@4.2.0: 1028 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1029 | engines: {node: '>=8'} 1030 | 1031 | prettier@2.8.8: 1032 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 1033 | engines: {node: '>=10.13.0'} 1034 | hasBin: true 1035 | 1036 | pretty-format@28.1.3: 1037 | resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} 1038 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 1039 | 1040 | pretty-hrtime@1.0.3: 1041 | resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} 1042 | engines: {node: '>= 0.8'} 1043 | 1044 | prompts@2.4.2: 1045 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1046 | engines: {node: '>= 6'} 1047 | 1048 | queue-tick@1.0.1: 1049 | resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} 1050 | 1051 | react-is@18.2.0: 1052 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 1053 | 1054 | require-directory@2.1.1: 1055 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1056 | engines: {node: '>=0.10.0'} 1057 | 1058 | resolve-cwd@3.0.0: 1059 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1060 | engines: {node: '>=8'} 1061 | 1062 | resolve-from@5.0.0: 1063 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1064 | engines: {node: '>=8'} 1065 | 1066 | resolve.exports@1.1.1: 1067 | resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} 1068 | engines: {node: '>=10'} 1069 | 1070 | resolve@1.22.8: 1071 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1072 | hasBin: true 1073 | 1074 | rimraf@3.0.2: 1075 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1076 | hasBin: true 1077 | 1078 | semver@6.3.1: 1079 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1080 | hasBin: true 1081 | 1082 | semver@7.6.0: 1083 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 1084 | engines: {node: '>=10'} 1085 | hasBin: true 1086 | 1087 | shebang-command@2.0.0: 1088 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1089 | engines: {node: '>=8'} 1090 | 1091 | shebang-regex@3.0.0: 1092 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1093 | engines: {node: '>=8'} 1094 | 1095 | signal-exit@3.0.7: 1096 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1097 | 1098 | sisteransi@1.0.5: 1099 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1100 | 1101 | slash@3.0.0: 1102 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1103 | engines: {node: '>=8'} 1104 | 1105 | sort-keys@5.0.0: 1106 | resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} 1107 | engines: {node: '>=12'} 1108 | 1109 | source-map-support@0.5.13: 1110 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1111 | 1112 | source-map@0.6.1: 1113 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1114 | engines: {node: '>=0.10.0'} 1115 | 1116 | sprintf-js@1.0.3: 1117 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1118 | 1119 | stack-utils@2.0.6: 1120 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1121 | engines: {node: '>=10'} 1122 | 1123 | string-length@4.0.2: 1124 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1125 | engines: {node: '>=10'} 1126 | 1127 | string-width@4.2.3: 1128 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1129 | engines: {node: '>=8'} 1130 | 1131 | strip-ansi@3.0.1: 1132 | resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} 1133 | engines: {node: '>=0.10.0'} 1134 | 1135 | strip-ansi@6.0.1: 1136 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1137 | engines: {node: '>=8'} 1138 | 1139 | strip-bom@4.0.0: 1140 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1141 | engines: {node: '>=8'} 1142 | 1143 | strip-final-newline@2.0.0: 1144 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1145 | engines: {node: '>=6'} 1146 | 1147 | strip-json-comments@3.1.1: 1148 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1149 | engines: {node: '>=8'} 1150 | 1151 | supports-color@2.0.0: 1152 | resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} 1153 | engines: {node: '>=0.8.0'} 1154 | 1155 | supports-color@5.5.0: 1156 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1157 | engines: {node: '>=4'} 1158 | 1159 | supports-color@7.2.0: 1160 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1161 | engines: {node: '>=8'} 1162 | 1163 | supports-color@8.1.1: 1164 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1165 | engines: {node: '>=10'} 1166 | 1167 | supports-hyperlinks@2.3.0: 1168 | resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} 1169 | engines: {node: '>=8'} 1170 | 1171 | supports-preserve-symlinks-flag@1.0.0: 1172 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1173 | engines: {node: '>= 0.4'} 1174 | 1175 | terminal-link@2.1.1: 1176 | resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} 1177 | engines: {node: '>=8'} 1178 | 1179 | test-exclude@6.0.0: 1180 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1181 | engines: {node: '>=8'} 1182 | 1183 | tmpl@1.0.5: 1184 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1185 | 1186 | to-fast-properties@2.0.0: 1187 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1188 | engines: {node: '>=4'} 1189 | 1190 | to-regex-range@5.0.1: 1191 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1192 | engines: {node: '>=8.0'} 1193 | 1194 | ts-jest@28.0.8: 1195 | resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==} 1196 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} 1197 | hasBin: true 1198 | peerDependencies: 1199 | '@babel/core': '>=7.0.0-beta.0 <8' 1200 | '@jest/types': ^28.0.0 1201 | babel-jest: ^28.0.0 1202 | esbuild: '*' 1203 | jest: ^28.0.0 1204 | typescript: '>=4.3' 1205 | peerDependenciesMeta: 1206 | '@babel/core': 1207 | optional: true 1208 | '@jest/types': 1209 | optional: true 1210 | babel-jest: 1211 | optional: true 1212 | esbuild: 1213 | optional: true 1214 | 1215 | type-detect@4.0.8: 1216 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1217 | engines: {node: '>=4'} 1218 | 1219 | type-fest@0.21.3: 1220 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1221 | engines: {node: '>=10'} 1222 | 1223 | type-fest@1.4.0: 1224 | resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} 1225 | engines: {node: '>=10'} 1226 | 1227 | typescript@4.9.5: 1228 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 1229 | engines: {node: '>=4.2.0'} 1230 | hasBin: true 1231 | 1232 | undici-types@6.21.0: 1233 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1234 | 1235 | update-browserslist-db@1.0.13: 1236 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 1237 | hasBin: true 1238 | peerDependencies: 1239 | browserslist: '>= 4.21.0' 1240 | 1241 | v8-to-istanbul@9.2.0: 1242 | resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} 1243 | engines: {node: '>=10.12.0'} 1244 | 1245 | walker@1.0.8: 1246 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1247 | 1248 | which@2.0.2: 1249 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1250 | engines: {node: '>= 8'} 1251 | hasBin: true 1252 | 1253 | wrap-ansi@7.0.0: 1254 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1255 | engines: {node: '>=10'} 1256 | 1257 | wrappy@1.0.2: 1258 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1259 | 1260 | write-file-atomic@4.0.2: 1261 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1262 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1263 | 1264 | y18n@5.0.8: 1265 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1266 | engines: {node: '>=10'} 1267 | 1268 | yallist@3.1.1: 1269 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1270 | 1271 | yallist@4.0.0: 1272 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1273 | 1274 | yargs-parser@21.1.1: 1275 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1276 | engines: {node: '>=12'} 1277 | 1278 | yargs@17.7.2: 1279 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1280 | engines: {node: '>=12'} 1281 | 1282 | yocto-queue@0.1.0: 1283 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1284 | engines: {node: '>=10'} 1285 | 1286 | snapshots: 1287 | 1288 | '@ampproject/remapping@2.2.1': 1289 | dependencies: 1290 | '@jridgewell/gen-mapping': 0.3.3 1291 | '@jridgewell/trace-mapping': 0.3.22 1292 | 1293 | '@babel/code-frame@7.23.5': 1294 | dependencies: 1295 | '@babel/highlight': 7.23.4 1296 | chalk: 2.4.2 1297 | 1298 | '@babel/compat-data@7.23.5': {} 1299 | 1300 | '@babel/core@7.23.9': 1301 | dependencies: 1302 | '@ampproject/remapping': 2.2.1 1303 | '@babel/code-frame': 7.23.5 1304 | '@babel/generator': 7.23.6 1305 | '@babel/helper-compilation-targets': 7.23.6 1306 | '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) 1307 | '@babel/helpers': 7.23.9 1308 | '@babel/parser': 7.23.9 1309 | '@babel/template': 7.23.9 1310 | '@babel/traverse': 7.23.9 1311 | '@babel/types': 7.23.9 1312 | convert-source-map: 2.0.0 1313 | debug: 4.3.4 1314 | gensync: 1.0.0-beta.2 1315 | json5: 2.2.3 1316 | semver: 6.3.1 1317 | transitivePeerDependencies: 1318 | - supports-color 1319 | 1320 | '@babel/generator@7.23.6': 1321 | dependencies: 1322 | '@babel/types': 7.23.9 1323 | '@jridgewell/gen-mapping': 0.3.3 1324 | '@jridgewell/trace-mapping': 0.3.22 1325 | jsesc: 2.5.2 1326 | 1327 | '@babel/helper-compilation-targets@7.23.6': 1328 | dependencies: 1329 | '@babel/compat-data': 7.23.5 1330 | '@babel/helper-validator-option': 7.23.5 1331 | browserslist: 4.22.3 1332 | lru-cache: 5.1.1 1333 | semver: 6.3.1 1334 | 1335 | '@babel/helper-environment-visitor@7.22.20': {} 1336 | 1337 | '@babel/helper-function-name@7.23.0': 1338 | dependencies: 1339 | '@babel/template': 7.23.9 1340 | '@babel/types': 7.23.9 1341 | 1342 | '@babel/helper-hoist-variables@7.22.5': 1343 | dependencies: 1344 | '@babel/types': 7.23.9 1345 | 1346 | '@babel/helper-module-imports@7.22.15': 1347 | dependencies: 1348 | '@babel/types': 7.23.9 1349 | 1350 | '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': 1351 | dependencies: 1352 | '@babel/core': 7.23.9 1353 | '@babel/helper-environment-visitor': 7.22.20 1354 | '@babel/helper-module-imports': 7.22.15 1355 | '@babel/helper-simple-access': 7.22.5 1356 | '@babel/helper-split-export-declaration': 7.22.6 1357 | '@babel/helper-validator-identifier': 7.22.20 1358 | 1359 | '@babel/helper-plugin-utils@7.22.5': {} 1360 | 1361 | '@babel/helper-simple-access@7.22.5': 1362 | dependencies: 1363 | '@babel/types': 7.23.9 1364 | 1365 | '@babel/helper-split-export-declaration@7.22.6': 1366 | dependencies: 1367 | '@babel/types': 7.23.9 1368 | 1369 | '@babel/helper-string-parser@7.23.4': {} 1370 | 1371 | '@babel/helper-validator-identifier@7.22.20': {} 1372 | 1373 | '@babel/helper-validator-option@7.23.5': {} 1374 | 1375 | '@babel/helpers@7.23.9': 1376 | dependencies: 1377 | '@babel/template': 7.23.9 1378 | '@babel/traverse': 7.23.9 1379 | '@babel/types': 7.23.9 1380 | transitivePeerDependencies: 1381 | - supports-color 1382 | 1383 | '@babel/highlight@7.23.4': 1384 | dependencies: 1385 | '@babel/helper-validator-identifier': 7.22.20 1386 | chalk: 2.4.2 1387 | js-tokens: 4.0.0 1388 | 1389 | '@babel/parser@7.23.9': 1390 | dependencies: 1391 | '@babel/types': 7.23.9 1392 | 1393 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': 1394 | dependencies: 1395 | '@babel/core': 7.23.9 1396 | '@babel/helper-plugin-utils': 7.22.5 1397 | 1398 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9)': 1399 | dependencies: 1400 | '@babel/core': 7.23.9 1401 | '@babel/helper-plugin-utils': 7.22.5 1402 | 1403 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': 1404 | dependencies: 1405 | '@babel/core': 7.23.9 1406 | '@babel/helper-plugin-utils': 7.22.5 1407 | 1408 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': 1409 | dependencies: 1410 | '@babel/core': 7.23.9 1411 | '@babel/helper-plugin-utils': 7.22.5 1412 | 1413 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': 1414 | dependencies: 1415 | '@babel/core': 7.23.9 1416 | '@babel/helper-plugin-utils': 7.22.5 1417 | 1418 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': 1419 | dependencies: 1420 | '@babel/core': 7.23.9 1421 | '@babel/helper-plugin-utils': 7.22.5 1422 | 1423 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': 1424 | dependencies: 1425 | '@babel/core': 7.23.9 1426 | '@babel/helper-plugin-utils': 7.22.5 1427 | 1428 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': 1429 | dependencies: 1430 | '@babel/core': 7.23.9 1431 | '@babel/helper-plugin-utils': 7.22.5 1432 | 1433 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': 1434 | dependencies: 1435 | '@babel/core': 7.23.9 1436 | '@babel/helper-plugin-utils': 7.22.5 1437 | 1438 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': 1439 | dependencies: 1440 | '@babel/core': 7.23.9 1441 | '@babel/helper-plugin-utils': 7.22.5 1442 | 1443 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': 1444 | dependencies: 1445 | '@babel/core': 7.23.9 1446 | '@babel/helper-plugin-utils': 7.22.5 1447 | 1448 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': 1449 | dependencies: 1450 | '@babel/core': 7.23.9 1451 | '@babel/helper-plugin-utils': 7.22.5 1452 | 1453 | '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': 1454 | dependencies: 1455 | '@babel/core': 7.23.9 1456 | '@babel/helper-plugin-utils': 7.22.5 1457 | 1458 | '@babel/template@7.23.9': 1459 | dependencies: 1460 | '@babel/code-frame': 7.23.5 1461 | '@babel/parser': 7.23.9 1462 | '@babel/types': 7.23.9 1463 | 1464 | '@babel/traverse@7.23.9': 1465 | dependencies: 1466 | '@babel/code-frame': 7.23.5 1467 | '@babel/generator': 7.23.6 1468 | '@babel/helper-environment-visitor': 7.22.20 1469 | '@babel/helper-function-name': 7.23.0 1470 | '@babel/helper-hoist-variables': 7.22.5 1471 | '@babel/helper-split-export-declaration': 7.22.6 1472 | '@babel/parser': 7.23.9 1473 | '@babel/types': 7.23.9 1474 | debug: 4.3.4 1475 | globals: 11.12.0 1476 | transitivePeerDependencies: 1477 | - supports-color 1478 | 1479 | '@babel/types@7.23.9': 1480 | dependencies: 1481 | '@babel/helper-string-parser': 7.23.4 1482 | '@babel/helper-validator-identifier': 7.22.20 1483 | to-fast-properties: 2.0.0 1484 | 1485 | '@bcoe/v8-coverage@0.2.3': {} 1486 | 1487 | '@istanbuljs/load-nyc-config@1.1.0': 1488 | dependencies: 1489 | camelcase: 5.3.1 1490 | find-up: 4.1.0 1491 | get-package-type: 0.1.0 1492 | js-yaml: 3.14.1 1493 | resolve-from: 5.0.0 1494 | 1495 | '@istanbuljs/schema@0.1.3': {} 1496 | 1497 | '@jest/console@28.1.3': 1498 | dependencies: 1499 | '@jest/types': 28.1.3 1500 | '@types/node': 22.14.0 1501 | chalk: 4.1.2 1502 | jest-message-util: 28.1.3 1503 | jest-util: 28.1.3 1504 | slash: 3.0.0 1505 | 1506 | '@jest/core@28.1.3': 1507 | dependencies: 1508 | '@jest/console': 28.1.3 1509 | '@jest/reporters': 28.1.3 1510 | '@jest/test-result': 28.1.3 1511 | '@jest/transform': 28.1.3 1512 | '@jest/types': 28.1.3 1513 | '@types/node': 22.14.0 1514 | ansi-escapes: 4.3.2 1515 | chalk: 4.1.2 1516 | ci-info: 3.9.0 1517 | exit: 0.1.2 1518 | graceful-fs: 4.2.11 1519 | jest-changed-files: 28.1.3 1520 | jest-config: 28.1.3(@types/node@22.14.0) 1521 | jest-haste-map: 28.1.3 1522 | jest-message-util: 28.1.3 1523 | jest-regex-util: 28.0.2 1524 | jest-resolve: 28.1.3 1525 | jest-resolve-dependencies: 28.1.3 1526 | jest-runner: 28.1.3 1527 | jest-runtime: 28.1.3 1528 | jest-snapshot: 28.1.3 1529 | jest-util: 28.1.3 1530 | jest-validate: 28.1.3 1531 | jest-watcher: 28.1.3 1532 | micromatch: 4.0.5 1533 | pretty-format: 28.1.3 1534 | rimraf: 3.0.2 1535 | slash: 3.0.0 1536 | strip-ansi: 6.0.1 1537 | transitivePeerDependencies: 1538 | - supports-color 1539 | - ts-node 1540 | 1541 | '@jest/environment@28.1.3': 1542 | dependencies: 1543 | '@jest/fake-timers': 28.1.3 1544 | '@jest/types': 28.1.3 1545 | '@types/node': 22.14.0 1546 | jest-mock: 28.1.3 1547 | 1548 | '@jest/expect-utils@28.1.3': 1549 | dependencies: 1550 | jest-get-type: 28.0.2 1551 | 1552 | '@jest/expect@28.1.3': 1553 | dependencies: 1554 | expect: 28.1.3 1555 | jest-snapshot: 28.1.3 1556 | transitivePeerDependencies: 1557 | - supports-color 1558 | 1559 | '@jest/fake-timers@28.1.3': 1560 | dependencies: 1561 | '@jest/types': 28.1.3 1562 | '@sinonjs/fake-timers': 9.1.2 1563 | '@types/node': 22.14.0 1564 | jest-message-util: 28.1.3 1565 | jest-mock: 28.1.3 1566 | jest-util: 28.1.3 1567 | 1568 | '@jest/globals@28.1.3': 1569 | dependencies: 1570 | '@jest/environment': 28.1.3 1571 | '@jest/expect': 28.1.3 1572 | '@jest/types': 28.1.3 1573 | transitivePeerDependencies: 1574 | - supports-color 1575 | 1576 | '@jest/reporters@28.1.3': 1577 | dependencies: 1578 | '@bcoe/v8-coverage': 0.2.3 1579 | '@jest/console': 28.1.3 1580 | '@jest/test-result': 28.1.3 1581 | '@jest/transform': 28.1.3 1582 | '@jest/types': 28.1.3 1583 | '@jridgewell/trace-mapping': 0.3.22 1584 | '@types/node': 22.14.0 1585 | chalk: 4.1.2 1586 | collect-v8-coverage: 1.0.2 1587 | exit: 0.1.2 1588 | glob: 7.2.3 1589 | graceful-fs: 4.2.11 1590 | istanbul-lib-coverage: 3.2.2 1591 | istanbul-lib-instrument: 5.2.1 1592 | istanbul-lib-report: 3.0.1 1593 | istanbul-lib-source-maps: 4.0.1 1594 | istanbul-reports: 3.1.6 1595 | jest-message-util: 28.1.3 1596 | jest-util: 28.1.3 1597 | jest-worker: 28.1.3 1598 | slash: 3.0.0 1599 | string-length: 4.0.2 1600 | strip-ansi: 6.0.1 1601 | terminal-link: 2.1.1 1602 | v8-to-istanbul: 9.2.0 1603 | transitivePeerDependencies: 1604 | - supports-color 1605 | 1606 | '@jest/schemas@28.1.3': 1607 | dependencies: 1608 | '@sinclair/typebox': 0.24.51 1609 | 1610 | '@jest/source-map@28.1.2': 1611 | dependencies: 1612 | '@jridgewell/trace-mapping': 0.3.22 1613 | callsites: 3.1.0 1614 | graceful-fs: 4.2.11 1615 | 1616 | '@jest/test-result@28.1.3': 1617 | dependencies: 1618 | '@jest/console': 28.1.3 1619 | '@jest/types': 28.1.3 1620 | '@types/istanbul-lib-coverage': 2.0.6 1621 | collect-v8-coverage: 1.0.2 1622 | 1623 | '@jest/test-sequencer@28.1.3': 1624 | dependencies: 1625 | '@jest/test-result': 28.1.3 1626 | graceful-fs: 4.2.11 1627 | jest-haste-map: 28.1.3 1628 | slash: 3.0.0 1629 | 1630 | '@jest/transform@28.1.3': 1631 | dependencies: 1632 | '@babel/core': 7.23.9 1633 | '@jest/types': 28.1.3 1634 | '@jridgewell/trace-mapping': 0.3.22 1635 | babel-plugin-istanbul: 6.1.1 1636 | chalk: 4.1.2 1637 | convert-source-map: 1.9.0 1638 | fast-json-stable-stringify: 2.1.0 1639 | graceful-fs: 4.2.11 1640 | jest-haste-map: 28.1.3 1641 | jest-regex-util: 28.0.2 1642 | jest-util: 28.1.3 1643 | micromatch: 4.0.5 1644 | pirates: 4.0.6 1645 | slash: 3.0.0 1646 | write-file-atomic: 4.0.2 1647 | transitivePeerDependencies: 1648 | - supports-color 1649 | 1650 | '@jest/types@28.1.3': 1651 | dependencies: 1652 | '@jest/schemas': 28.1.3 1653 | '@types/istanbul-lib-coverage': 2.0.6 1654 | '@types/istanbul-reports': 3.0.4 1655 | '@types/node': 22.14.0 1656 | '@types/yargs': 17.0.32 1657 | chalk: 4.1.2 1658 | 1659 | '@jridgewell/gen-mapping@0.3.3': 1660 | dependencies: 1661 | '@jridgewell/set-array': 1.1.2 1662 | '@jridgewell/sourcemap-codec': 1.4.15 1663 | '@jridgewell/trace-mapping': 0.3.22 1664 | 1665 | '@jridgewell/resolve-uri@3.1.1': {} 1666 | 1667 | '@jridgewell/set-array@1.1.2': {} 1668 | 1669 | '@jridgewell/sourcemap-codec@1.4.15': {} 1670 | 1671 | '@jridgewell/trace-mapping@0.3.22': 1672 | dependencies: 1673 | '@jridgewell/resolve-uri': 3.1.1 1674 | '@jridgewell/sourcemap-codec': 1.4.15 1675 | 1676 | '@sinclair/typebox@0.24.51': {} 1677 | 1678 | '@sinonjs/commons@1.8.6': 1679 | dependencies: 1680 | type-detect: 4.0.8 1681 | 1682 | '@sinonjs/fake-timers@9.1.2': 1683 | dependencies: 1684 | '@sinonjs/commons': 1.8.6 1685 | 1686 | '@types/babel__core@7.20.5': 1687 | dependencies: 1688 | '@babel/parser': 7.23.9 1689 | '@babel/types': 7.23.9 1690 | '@types/babel__generator': 7.6.8 1691 | '@types/babel__template': 7.4.4 1692 | '@types/babel__traverse': 7.20.5 1693 | 1694 | '@types/babel__generator@7.6.8': 1695 | dependencies: 1696 | '@babel/types': 7.23.9 1697 | 1698 | '@types/babel__template@7.4.4': 1699 | dependencies: 1700 | '@babel/parser': 7.23.9 1701 | '@babel/types': 7.23.9 1702 | 1703 | '@types/babel__traverse@7.20.5': 1704 | dependencies: 1705 | '@babel/types': 7.23.9 1706 | 1707 | '@types/graceful-fs@4.1.9': 1708 | dependencies: 1709 | '@types/node': 22.14.0 1710 | 1711 | '@types/istanbul-lib-coverage@2.0.6': {} 1712 | 1713 | '@types/istanbul-lib-report@3.0.3': 1714 | dependencies: 1715 | '@types/istanbul-lib-coverage': 2.0.6 1716 | 1717 | '@types/istanbul-reports@3.0.4': 1718 | dependencies: 1719 | '@types/istanbul-lib-report': 3.0.3 1720 | 1721 | '@types/jest@28.1.8': 1722 | dependencies: 1723 | expect: 28.1.3 1724 | pretty-format: 28.1.3 1725 | 1726 | '@types/node@22.14.0': 1727 | dependencies: 1728 | undici-types: 6.21.0 1729 | 1730 | '@types/prettier@2.7.3': {} 1731 | 1732 | '@types/stack-utils@2.0.3': {} 1733 | 1734 | '@types/yargs-parser@21.0.3': {} 1735 | 1736 | '@types/yargs@17.0.32': 1737 | dependencies: 1738 | '@types/yargs-parser': 21.0.3 1739 | 1740 | ansi-escapes@4.3.2: 1741 | dependencies: 1742 | type-fest: 0.21.3 1743 | 1744 | ansi-regex@2.1.1: {} 1745 | 1746 | ansi-regex@5.0.1: {} 1747 | 1748 | ansi-styles@2.2.1: {} 1749 | 1750 | ansi-styles@3.2.1: 1751 | dependencies: 1752 | color-convert: 1.9.3 1753 | 1754 | ansi-styles@4.3.0: 1755 | dependencies: 1756 | color-convert: 2.0.1 1757 | 1758 | ansi-styles@5.2.0: {} 1759 | 1760 | anymatch@3.1.3: 1761 | dependencies: 1762 | normalize-path: 3.0.0 1763 | picomatch: 2.3.1 1764 | 1765 | argparse@1.0.10: 1766 | dependencies: 1767 | sprintf-js: 1.0.3 1768 | 1769 | babel-jest@28.1.3(@babel/core@7.23.9): 1770 | dependencies: 1771 | '@babel/core': 7.23.9 1772 | '@jest/transform': 28.1.3 1773 | '@types/babel__core': 7.20.5 1774 | babel-plugin-istanbul: 6.1.1 1775 | babel-preset-jest: 28.1.3(@babel/core@7.23.9) 1776 | chalk: 4.1.2 1777 | graceful-fs: 4.2.11 1778 | slash: 3.0.0 1779 | transitivePeerDependencies: 1780 | - supports-color 1781 | 1782 | babel-plugin-istanbul@6.1.1: 1783 | dependencies: 1784 | '@babel/helper-plugin-utils': 7.22.5 1785 | '@istanbuljs/load-nyc-config': 1.1.0 1786 | '@istanbuljs/schema': 0.1.3 1787 | istanbul-lib-instrument: 5.2.1 1788 | test-exclude: 6.0.0 1789 | transitivePeerDependencies: 1790 | - supports-color 1791 | 1792 | babel-plugin-jest-hoist@28.1.3: 1793 | dependencies: 1794 | '@babel/template': 7.23.9 1795 | '@babel/types': 7.23.9 1796 | '@types/babel__core': 7.20.5 1797 | '@types/babel__traverse': 7.20.5 1798 | 1799 | babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): 1800 | dependencies: 1801 | '@babel/core': 7.23.9 1802 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) 1803 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) 1804 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) 1805 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) 1806 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) 1807 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) 1808 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) 1809 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) 1810 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) 1811 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) 1812 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) 1813 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) 1814 | 1815 | babel-preset-jest@28.1.3(@babel/core@7.23.9): 1816 | dependencies: 1817 | '@babel/core': 7.23.9 1818 | babel-plugin-jest-hoist: 28.1.3 1819 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) 1820 | 1821 | balanced-match@1.0.2: {} 1822 | 1823 | base64-url@2.3.3: {} 1824 | 1825 | brace-expansion@1.1.11: 1826 | dependencies: 1827 | balanced-match: 1.0.2 1828 | concat-map: 0.0.1 1829 | 1830 | braces@3.0.2: 1831 | dependencies: 1832 | fill-range: 7.0.1 1833 | 1834 | browser-process-hrtime@0.1.3: {} 1835 | 1836 | browserslist@4.22.3: 1837 | dependencies: 1838 | caniuse-lite: 1.0.30001587 1839 | electron-to-chromium: 1.4.668 1840 | node-releases: 2.0.14 1841 | update-browserslist-db: 1.0.13(browserslist@4.22.3) 1842 | 1843 | bs-logger@0.2.6: 1844 | dependencies: 1845 | fast-json-stable-stringify: 2.1.0 1846 | 1847 | bser@2.1.1: 1848 | dependencies: 1849 | node-int64: 0.4.0 1850 | 1851 | buffer-from@1.1.2: {} 1852 | 1853 | callsites@3.1.0: {} 1854 | 1855 | camelcase@5.3.1: {} 1856 | 1857 | camelcase@6.3.0: {} 1858 | 1859 | caniuse-lite@1.0.30001587: {} 1860 | 1861 | chalk@1.1.3: 1862 | dependencies: 1863 | ansi-styles: 2.2.1 1864 | escape-string-regexp: 1.0.5 1865 | has-ansi: 2.0.0 1866 | strip-ansi: 3.0.1 1867 | supports-color: 2.0.0 1868 | 1869 | chalk@2.4.2: 1870 | dependencies: 1871 | ansi-styles: 3.2.1 1872 | escape-string-regexp: 1.0.5 1873 | supports-color: 5.5.0 1874 | 1875 | chalk@4.1.2: 1876 | dependencies: 1877 | ansi-styles: 4.3.0 1878 | supports-color: 7.2.0 1879 | 1880 | char-regex@1.0.2: {} 1881 | 1882 | ci-info@3.9.0: {} 1883 | 1884 | cjs-module-lexer@1.2.3: {} 1885 | 1886 | cliui@8.0.1: 1887 | dependencies: 1888 | string-width: 4.2.3 1889 | strip-ansi: 6.0.1 1890 | wrap-ansi: 7.0.0 1891 | 1892 | co@4.6.0: {} 1893 | 1894 | collect-v8-coverage@1.0.2: {} 1895 | 1896 | color-convert@1.9.3: 1897 | dependencies: 1898 | color-name: 1.1.3 1899 | 1900 | color-convert@2.0.1: 1901 | dependencies: 1902 | color-name: 1.1.4 1903 | 1904 | color-name@1.1.3: {} 1905 | 1906 | color-name@1.1.4: {} 1907 | 1908 | concat-map@0.0.1: {} 1909 | 1910 | convert-source-map@1.9.0: {} 1911 | 1912 | convert-source-map@2.0.0: {} 1913 | 1914 | cross-spawn@7.0.3: 1915 | dependencies: 1916 | path-key: 3.1.1 1917 | shebang-command: 2.0.0 1918 | which: 2.0.2 1919 | 1920 | debug@4.3.4: 1921 | dependencies: 1922 | ms: 2.1.2 1923 | 1924 | dedent@0.7.0: {} 1925 | 1926 | deepmerge@4.3.1: {} 1927 | 1928 | detect-newline@3.1.0: {} 1929 | 1930 | diff-sequences@28.1.1: {} 1931 | 1932 | electron-to-chromium@1.4.668: {} 1933 | 1934 | emittery@0.10.2: {} 1935 | 1936 | emoji-regex@8.0.0: {} 1937 | 1938 | error-ex@1.3.2: 1939 | dependencies: 1940 | is-arrayish: 0.2.1 1941 | 1942 | esbuild@0.12.29: {} 1943 | 1944 | escalade@3.1.2: {} 1945 | 1946 | escape-string-regexp@1.0.5: {} 1947 | 1948 | escape-string-regexp@2.0.0: {} 1949 | 1950 | esprima@4.0.1: {} 1951 | 1952 | execa@5.1.1: 1953 | dependencies: 1954 | cross-spawn: 7.0.3 1955 | get-stream: 6.0.1 1956 | human-signals: 2.1.0 1957 | is-stream: 2.0.1 1958 | merge-stream: 2.0.0 1959 | npm-run-path: 4.0.1 1960 | onetime: 5.1.2 1961 | signal-exit: 3.0.7 1962 | strip-final-newline: 2.0.0 1963 | 1964 | exit@0.1.2: {} 1965 | 1966 | expect@28.1.3: 1967 | dependencies: 1968 | '@jest/expect-utils': 28.1.3 1969 | jest-get-type: 28.0.2 1970 | jest-matcher-utils: 28.1.3 1971 | jest-message-util: 28.1.3 1972 | jest-util: 28.1.3 1973 | 1974 | fast-json-stable-stringify@2.1.0: {} 1975 | 1976 | fb-watchman@2.0.2: 1977 | dependencies: 1978 | bser: 2.1.1 1979 | 1980 | fill-range@7.0.1: 1981 | dependencies: 1982 | to-regex-range: 5.0.1 1983 | 1984 | find-up@4.1.0: 1985 | dependencies: 1986 | locate-path: 5.0.0 1987 | path-exists: 4.0.0 1988 | 1989 | flattie@1.1.0: {} 1990 | 1991 | fs.realpath@1.0.0: {} 1992 | 1993 | fsevents@2.3.3: 1994 | optional: true 1995 | 1996 | function-bind@1.1.2: {} 1997 | 1998 | gensync@1.0.0-beta.2: {} 1999 | 2000 | get-caller-file@2.0.5: {} 2001 | 2002 | get-package-type@0.1.0: {} 2003 | 2004 | get-stream@6.0.1: {} 2005 | 2006 | glob@7.2.3: 2007 | dependencies: 2008 | fs.realpath: 1.0.0 2009 | inflight: 1.0.6 2010 | inherits: 2.0.4 2011 | minimatch: 3.1.2 2012 | once: 1.4.0 2013 | path-is-absolute: 1.0.1 2014 | 2015 | globals@11.12.0: {} 2016 | 2017 | graceful-fs@4.2.11: {} 2018 | 2019 | has-ansi@2.0.0: 2020 | dependencies: 2021 | ansi-regex: 2.1.1 2022 | 2023 | has-flag@3.0.0: {} 2024 | 2025 | has-flag@4.0.0: {} 2026 | 2027 | hash-obj@4.0.0: 2028 | dependencies: 2029 | is-obj: 3.0.0 2030 | sort-keys: 5.0.0 2031 | type-fest: 1.4.0 2032 | 2033 | hasown@2.0.1: 2034 | dependencies: 2035 | function-bind: 1.1.2 2036 | 2037 | html-escaper@2.0.2: {} 2038 | 2039 | human-signals@2.1.0: {} 2040 | 2041 | import-local@3.1.0: 2042 | dependencies: 2043 | pkg-dir: 4.2.0 2044 | resolve-cwd: 3.0.0 2045 | 2046 | imurmurhash@0.1.4: {} 2047 | 2048 | inflight@1.0.6: 2049 | dependencies: 2050 | once: 1.4.0 2051 | wrappy: 1.0.2 2052 | 2053 | inherits@2.0.4: {} 2054 | 2055 | is-arrayish@0.2.1: {} 2056 | 2057 | is-core-module@2.13.1: 2058 | dependencies: 2059 | hasown: 2.0.1 2060 | 2061 | is-fullwidth-code-point@3.0.0: {} 2062 | 2063 | is-generator-fn@2.1.0: {} 2064 | 2065 | is-number@7.0.0: {} 2066 | 2067 | is-obj@3.0.0: {} 2068 | 2069 | is-plain-obj@4.1.0: {} 2070 | 2071 | is-stream@2.0.1: {} 2072 | 2073 | isexe@2.0.0: {} 2074 | 2075 | istanbul-lib-coverage@3.2.2: {} 2076 | 2077 | istanbul-lib-instrument@5.2.1: 2078 | dependencies: 2079 | '@babel/core': 7.23.9 2080 | '@babel/parser': 7.23.9 2081 | '@istanbuljs/schema': 0.1.3 2082 | istanbul-lib-coverage: 3.2.2 2083 | semver: 6.3.1 2084 | transitivePeerDependencies: 2085 | - supports-color 2086 | 2087 | istanbul-lib-report@3.0.1: 2088 | dependencies: 2089 | istanbul-lib-coverage: 3.2.2 2090 | make-dir: 4.0.0 2091 | supports-color: 7.2.0 2092 | 2093 | istanbul-lib-source-maps@4.0.1: 2094 | dependencies: 2095 | debug: 4.3.4 2096 | istanbul-lib-coverage: 3.2.2 2097 | source-map: 0.6.1 2098 | transitivePeerDependencies: 2099 | - supports-color 2100 | 2101 | istanbul-reports@3.1.6: 2102 | dependencies: 2103 | html-escaper: 2.0.2 2104 | istanbul-lib-report: 3.0.1 2105 | 2106 | jest-changed-files@28.1.3: 2107 | dependencies: 2108 | execa: 5.1.1 2109 | p-limit: 3.1.0 2110 | 2111 | jest-circus@28.1.3: 2112 | dependencies: 2113 | '@jest/environment': 28.1.3 2114 | '@jest/expect': 28.1.3 2115 | '@jest/test-result': 28.1.3 2116 | '@jest/types': 28.1.3 2117 | '@types/node': 22.14.0 2118 | chalk: 4.1.2 2119 | co: 4.6.0 2120 | dedent: 0.7.0 2121 | is-generator-fn: 2.1.0 2122 | jest-each: 28.1.3 2123 | jest-matcher-utils: 28.1.3 2124 | jest-message-util: 28.1.3 2125 | jest-runtime: 28.1.3 2126 | jest-snapshot: 28.1.3 2127 | jest-util: 28.1.3 2128 | p-limit: 3.1.0 2129 | pretty-format: 28.1.3 2130 | slash: 3.0.0 2131 | stack-utils: 2.0.6 2132 | transitivePeerDependencies: 2133 | - supports-color 2134 | 2135 | jest-cli@28.1.3(@types/node@22.14.0): 2136 | dependencies: 2137 | '@jest/core': 28.1.3 2138 | '@jest/test-result': 28.1.3 2139 | '@jest/types': 28.1.3 2140 | chalk: 4.1.2 2141 | exit: 0.1.2 2142 | graceful-fs: 4.2.11 2143 | import-local: 3.1.0 2144 | jest-config: 28.1.3(@types/node@22.14.0) 2145 | jest-util: 28.1.3 2146 | jest-validate: 28.1.3 2147 | prompts: 2.4.2 2148 | yargs: 17.7.2 2149 | transitivePeerDependencies: 2150 | - '@types/node' 2151 | - supports-color 2152 | - ts-node 2153 | 2154 | jest-config@28.1.3(@types/node@22.14.0): 2155 | dependencies: 2156 | '@babel/core': 7.23.9 2157 | '@jest/test-sequencer': 28.1.3 2158 | '@jest/types': 28.1.3 2159 | babel-jest: 28.1.3(@babel/core@7.23.9) 2160 | chalk: 4.1.2 2161 | ci-info: 3.9.0 2162 | deepmerge: 4.3.1 2163 | glob: 7.2.3 2164 | graceful-fs: 4.2.11 2165 | jest-circus: 28.1.3 2166 | jest-environment-node: 28.1.3 2167 | jest-get-type: 28.0.2 2168 | jest-regex-util: 28.0.2 2169 | jest-resolve: 28.1.3 2170 | jest-runner: 28.1.3 2171 | jest-util: 28.1.3 2172 | jest-validate: 28.1.3 2173 | micromatch: 4.0.5 2174 | parse-json: 5.2.0 2175 | pretty-format: 28.1.3 2176 | slash: 3.0.0 2177 | strip-json-comments: 3.1.1 2178 | optionalDependencies: 2179 | '@types/node': 22.14.0 2180 | transitivePeerDependencies: 2181 | - supports-color 2182 | 2183 | jest-diff@28.1.3: 2184 | dependencies: 2185 | chalk: 4.1.2 2186 | diff-sequences: 28.1.1 2187 | jest-get-type: 28.0.2 2188 | pretty-format: 28.1.3 2189 | 2190 | jest-docblock@28.1.1: 2191 | dependencies: 2192 | detect-newline: 3.1.0 2193 | 2194 | jest-each@28.1.3: 2195 | dependencies: 2196 | '@jest/types': 28.1.3 2197 | chalk: 4.1.2 2198 | jest-get-type: 28.0.2 2199 | jest-util: 28.1.3 2200 | pretty-format: 28.1.3 2201 | 2202 | jest-environment-node@28.1.3: 2203 | dependencies: 2204 | '@jest/environment': 28.1.3 2205 | '@jest/fake-timers': 28.1.3 2206 | '@jest/types': 28.1.3 2207 | '@types/node': 22.14.0 2208 | jest-mock: 28.1.3 2209 | jest-util: 28.1.3 2210 | 2211 | jest-get-type@28.0.2: {} 2212 | 2213 | jest-haste-map@28.1.3: 2214 | dependencies: 2215 | '@jest/types': 28.1.3 2216 | '@types/graceful-fs': 4.1.9 2217 | '@types/node': 22.14.0 2218 | anymatch: 3.1.3 2219 | fb-watchman: 2.0.2 2220 | graceful-fs: 4.2.11 2221 | jest-regex-util: 28.0.2 2222 | jest-util: 28.1.3 2223 | jest-worker: 28.1.3 2224 | micromatch: 4.0.5 2225 | walker: 1.0.8 2226 | optionalDependencies: 2227 | fsevents: 2.3.3 2228 | 2229 | jest-leak-detector@28.1.3: 2230 | dependencies: 2231 | jest-get-type: 28.0.2 2232 | pretty-format: 28.1.3 2233 | 2234 | jest-matcher-utils@28.1.3: 2235 | dependencies: 2236 | chalk: 4.1.2 2237 | jest-diff: 28.1.3 2238 | jest-get-type: 28.0.2 2239 | pretty-format: 28.1.3 2240 | 2241 | jest-message-util@28.1.3: 2242 | dependencies: 2243 | '@babel/code-frame': 7.23.5 2244 | '@jest/types': 28.1.3 2245 | '@types/stack-utils': 2.0.3 2246 | chalk: 4.1.2 2247 | graceful-fs: 4.2.11 2248 | micromatch: 4.0.5 2249 | pretty-format: 28.1.3 2250 | slash: 3.0.0 2251 | stack-utils: 2.0.6 2252 | 2253 | jest-mock@28.1.3: 2254 | dependencies: 2255 | '@jest/types': 28.1.3 2256 | '@types/node': 22.14.0 2257 | 2258 | jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): 2259 | optionalDependencies: 2260 | jest-resolve: 28.1.3 2261 | 2262 | jest-regex-util@28.0.2: {} 2263 | 2264 | jest-resolve-dependencies@28.1.3: 2265 | dependencies: 2266 | jest-regex-util: 28.0.2 2267 | jest-snapshot: 28.1.3 2268 | transitivePeerDependencies: 2269 | - supports-color 2270 | 2271 | jest-resolve@28.1.3: 2272 | dependencies: 2273 | chalk: 4.1.2 2274 | graceful-fs: 4.2.11 2275 | jest-haste-map: 28.1.3 2276 | jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) 2277 | jest-util: 28.1.3 2278 | jest-validate: 28.1.3 2279 | resolve: 1.22.8 2280 | resolve.exports: 1.1.1 2281 | slash: 3.0.0 2282 | 2283 | jest-runner@28.1.3: 2284 | dependencies: 2285 | '@jest/console': 28.1.3 2286 | '@jest/environment': 28.1.3 2287 | '@jest/test-result': 28.1.3 2288 | '@jest/transform': 28.1.3 2289 | '@jest/types': 28.1.3 2290 | '@types/node': 22.14.0 2291 | chalk: 4.1.2 2292 | emittery: 0.10.2 2293 | graceful-fs: 4.2.11 2294 | jest-docblock: 28.1.1 2295 | jest-environment-node: 28.1.3 2296 | jest-haste-map: 28.1.3 2297 | jest-leak-detector: 28.1.3 2298 | jest-message-util: 28.1.3 2299 | jest-resolve: 28.1.3 2300 | jest-runtime: 28.1.3 2301 | jest-util: 28.1.3 2302 | jest-watcher: 28.1.3 2303 | jest-worker: 28.1.3 2304 | p-limit: 3.1.0 2305 | source-map-support: 0.5.13 2306 | transitivePeerDependencies: 2307 | - supports-color 2308 | 2309 | jest-runtime@28.1.3: 2310 | dependencies: 2311 | '@jest/environment': 28.1.3 2312 | '@jest/fake-timers': 28.1.3 2313 | '@jest/globals': 28.1.3 2314 | '@jest/source-map': 28.1.2 2315 | '@jest/test-result': 28.1.3 2316 | '@jest/transform': 28.1.3 2317 | '@jest/types': 28.1.3 2318 | chalk: 4.1.2 2319 | cjs-module-lexer: 1.2.3 2320 | collect-v8-coverage: 1.0.2 2321 | execa: 5.1.1 2322 | glob: 7.2.3 2323 | graceful-fs: 4.2.11 2324 | jest-haste-map: 28.1.3 2325 | jest-message-util: 28.1.3 2326 | jest-mock: 28.1.3 2327 | jest-regex-util: 28.0.2 2328 | jest-resolve: 28.1.3 2329 | jest-snapshot: 28.1.3 2330 | jest-util: 28.1.3 2331 | slash: 3.0.0 2332 | strip-bom: 4.0.0 2333 | transitivePeerDependencies: 2334 | - supports-color 2335 | 2336 | jest-snapshot@28.1.3: 2337 | dependencies: 2338 | '@babel/core': 7.23.9 2339 | '@babel/generator': 7.23.6 2340 | '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) 2341 | '@babel/traverse': 7.23.9 2342 | '@babel/types': 7.23.9 2343 | '@jest/expect-utils': 28.1.3 2344 | '@jest/transform': 28.1.3 2345 | '@jest/types': 28.1.3 2346 | '@types/babel__traverse': 7.20.5 2347 | '@types/prettier': 2.7.3 2348 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) 2349 | chalk: 4.1.2 2350 | expect: 28.1.3 2351 | graceful-fs: 4.2.11 2352 | jest-diff: 28.1.3 2353 | jest-get-type: 28.0.2 2354 | jest-haste-map: 28.1.3 2355 | jest-matcher-utils: 28.1.3 2356 | jest-message-util: 28.1.3 2357 | jest-util: 28.1.3 2358 | natural-compare: 1.4.0 2359 | pretty-format: 28.1.3 2360 | semver: 7.6.0 2361 | transitivePeerDependencies: 2362 | - supports-color 2363 | 2364 | jest-util@28.1.3: 2365 | dependencies: 2366 | '@jest/types': 28.1.3 2367 | '@types/node': 22.14.0 2368 | chalk: 4.1.2 2369 | ci-info: 3.9.0 2370 | graceful-fs: 4.2.11 2371 | picomatch: 2.3.1 2372 | 2373 | jest-validate@28.1.3: 2374 | dependencies: 2375 | '@jest/types': 28.1.3 2376 | camelcase: 6.3.0 2377 | chalk: 4.1.2 2378 | jest-get-type: 28.0.2 2379 | leven: 3.1.0 2380 | pretty-format: 28.1.3 2381 | 2382 | jest-watcher@28.1.3: 2383 | dependencies: 2384 | '@jest/test-result': 28.1.3 2385 | '@jest/types': 28.1.3 2386 | '@types/node': 22.14.0 2387 | ansi-escapes: 4.3.2 2388 | chalk: 4.1.2 2389 | emittery: 0.10.2 2390 | jest-util: 28.1.3 2391 | string-length: 4.0.2 2392 | 2393 | jest-worker@28.1.3: 2394 | dependencies: 2395 | '@types/node': 22.14.0 2396 | merge-stream: 2.0.0 2397 | supports-color: 8.1.1 2398 | 2399 | jest@28.1.3(@types/node@22.14.0): 2400 | dependencies: 2401 | '@jest/core': 28.1.3 2402 | '@jest/types': 28.1.3 2403 | import-local: 3.1.0 2404 | jest-cli: 28.1.3(@types/node@22.14.0) 2405 | transitivePeerDependencies: 2406 | - '@types/node' 2407 | - supports-color 2408 | - ts-node 2409 | 2410 | js-tokens@4.0.0: {} 2411 | 2412 | js-yaml@3.14.1: 2413 | dependencies: 2414 | argparse: 1.0.10 2415 | esprima: 4.0.1 2416 | 2417 | jsesc@2.5.2: {} 2418 | 2419 | json-parse-even-better-errors@2.3.1: {} 2420 | 2421 | json-stringify-deterministic@1.0.12: {} 2422 | 2423 | json5@2.2.3: {} 2424 | 2425 | kleur@3.0.3: {} 2426 | 2427 | leven@3.1.0: {} 2428 | 2429 | lines-and-columns@1.2.4: {} 2430 | 2431 | locate-path@5.0.0: 2432 | dependencies: 2433 | p-locate: 4.1.0 2434 | 2435 | lodash.memoize@4.1.2: {} 2436 | 2437 | lru-cache@5.1.1: 2438 | dependencies: 2439 | yallist: 3.1.1 2440 | 2441 | lru-cache@6.0.0: 2442 | dependencies: 2443 | yallist: 4.0.0 2444 | 2445 | make-dir@4.0.0: 2446 | dependencies: 2447 | semver: 7.6.0 2448 | 2449 | make-error@1.3.6: {} 2450 | 2451 | makeerror@1.0.12: 2452 | dependencies: 2453 | tmpl: 1.0.5 2454 | 2455 | merge-stream@2.0.0: {} 2456 | 2457 | micromatch@4.0.5: 2458 | dependencies: 2459 | braces: 3.0.2 2460 | picomatch: 2.3.1 2461 | 2462 | mimic-fn@2.1.0: {} 2463 | 2464 | minimatch@3.1.2: 2465 | dependencies: 2466 | brace-expansion: 1.1.11 2467 | 2468 | ms@2.1.2: {} 2469 | 2470 | mutexify@1.4.0: 2471 | dependencies: 2472 | queue-tick: 1.0.1 2473 | 2474 | nanobench@2.1.1: 2475 | dependencies: 2476 | browser-process-hrtime: 0.1.3 2477 | chalk: 1.1.3 2478 | mutexify: 1.4.0 2479 | pretty-hrtime: 1.0.3 2480 | 2481 | natural-compare@1.4.0: {} 2482 | 2483 | node-int64@0.4.0: {} 2484 | 2485 | node-releases@2.0.14: {} 2486 | 2487 | normalize-path@3.0.0: {} 2488 | 2489 | npm-run-path@4.0.1: 2490 | dependencies: 2491 | path-key: 3.1.1 2492 | 2493 | once@1.4.0: 2494 | dependencies: 2495 | wrappy: 1.0.2 2496 | 2497 | onetime@5.1.2: 2498 | dependencies: 2499 | mimic-fn: 2.1.0 2500 | 2501 | p-limit@2.3.0: 2502 | dependencies: 2503 | p-try: 2.2.0 2504 | 2505 | p-limit@3.1.0: 2506 | dependencies: 2507 | yocto-queue: 0.1.0 2508 | 2509 | p-locate@4.1.0: 2510 | dependencies: 2511 | p-limit: 2.3.0 2512 | 2513 | p-try@2.2.0: {} 2514 | 2515 | parse-json@5.2.0: 2516 | dependencies: 2517 | '@babel/code-frame': 7.23.5 2518 | error-ex: 1.3.2 2519 | json-parse-even-better-errors: 2.3.1 2520 | lines-and-columns: 1.2.4 2521 | 2522 | path-exists@4.0.0: {} 2523 | 2524 | path-is-absolute@1.0.1: {} 2525 | 2526 | path-key@3.1.1: {} 2527 | 2528 | path-parse@1.0.7: {} 2529 | 2530 | picocolors@1.0.0: {} 2531 | 2532 | picomatch@2.3.1: {} 2533 | 2534 | pirates@4.0.6: {} 2535 | 2536 | pkg-dir@4.2.0: 2537 | dependencies: 2538 | find-up: 4.1.0 2539 | 2540 | prettier@2.8.8: {} 2541 | 2542 | pretty-format@28.1.3: 2543 | dependencies: 2544 | '@jest/schemas': 28.1.3 2545 | ansi-regex: 5.0.1 2546 | ansi-styles: 5.2.0 2547 | react-is: 18.2.0 2548 | 2549 | pretty-hrtime@1.0.3: {} 2550 | 2551 | prompts@2.4.2: 2552 | dependencies: 2553 | kleur: 3.0.3 2554 | sisteransi: 1.0.5 2555 | 2556 | queue-tick@1.0.1: {} 2557 | 2558 | react-is@18.2.0: {} 2559 | 2560 | require-directory@2.1.1: {} 2561 | 2562 | resolve-cwd@3.0.0: 2563 | dependencies: 2564 | resolve-from: 5.0.0 2565 | 2566 | resolve-from@5.0.0: {} 2567 | 2568 | resolve.exports@1.1.1: {} 2569 | 2570 | resolve@1.22.8: 2571 | dependencies: 2572 | is-core-module: 2.13.1 2573 | path-parse: 1.0.7 2574 | supports-preserve-symlinks-flag: 1.0.0 2575 | 2576 | rimraf@3.0.2: 2577 | dependencies: 2578 | glob: 7.2.3 2579 | 2580 | semver@6.3.1: {} 2581 | 2582 | semver@7.6.0: 2583 | dependencies: 2584 | lru-cache: 6.0.0 2585 | 2586 | shebang-command@2.0.0: 2587 | dependencies: 2588 | shebang-regex: 3.0.0 2589 | 2590 | shebang-regex@3.0.0: {} 2591 | 2592 | signal-exit@3.0.7: {} 2593 | 2594 | sisteransi@1.0.5: {} 2595 | 2596 | slash@3.0.0: {} 2597 | 2598 | sort-keys@5.0.0: 2599 | dependencies: 2600 | is-plain-obj: 4.1.0 2601 | 2602 | source-map-support@0.5.13: 2603 | dependencies: 2604 | buffer-from: 1.1.2 2605 | source-map: 0.6.1 2606 | 2607 | source-map@0.6.1: {} 2608 | 2609 | sprintf-js@1.0.3: {} 2610 | 2611 | stack-utils@2.0.6: 2612 | dependencies: 2613 | escape-string-regexp: 2.0.0 2614 | 2615 | string-length@4.0.2: 2616 | dependencies: 2617 | char-regex: 1.0.2 2618 | strip-ansi: 6.0.1 2619 | 2620 | string-width@4.2.3: 2621 | dependencies: 2622 | emoji-regex: 8.0.0 2623 | is-fullwidth-code-point: 3.0.0 2624 | strip-ansi: 6.0.1 2625 | 2626 | strip-ansi@3.0.1: 2627 | dependencies: 2628 | ansi-regex: 2.1.1 2629 | 2630 | strip-ansi@6.0.1: 2631 | dependencies: 2632 | ansi-regex: 5.0.1 2633 | 2634 | strip-bom@4.0.0: {} 2635 | 2636 | strip-final-newline@2.0.0: {} 2637 | 2638 | strip-json-comments@3.1.1: {} 2639 | 2640 | supports-color@2.0.0: {} 2641 | 2642 | supports-color@5.5.0: 2643 | dependencies: 2644 | has-flag: 3.0.0 2645 | 2646 | supports-color@7.2.0: 2647 | dependencies: 2648 | has-flag: 4.0.0 2649 | 2650 | supports-color@8.1.1: 2651 | dependencies: 2652 | has-flag: 4.0.0 2653 | 2654 | supports-hyperlinks@2.3.0: 2655 | dependencies: 2656 | has-flag: 4.0.0 2657 | supports-color: 7.2.0 2658 | 2659 | supports-preserve-symlinks-flag@1.0.0: {} 2660 | 2661 | terminal-link@2.1.1: 2662 | dependencies: 2663 | ansi-escapes: 4.3.2 2664 | supports-hyperlinks: 2.3.0 2665 | 2666 | test-exclude@6.0.0: 2667 | dependencies: 2668 | '@istanbuljs/schema': 0.1.3 2669 | glob: 7.2.3 2670 | minimatch: 3.1.2 2671 | 2672 | tmpl@1.0.5: {} 2673 | 2674 | to-fast-properties@2.0.0: {} 2675 | 2676 | to-regex-range@5.0.1: 2677 | dependencies: 2678 | is-number: 7.0.0 2679 | 2680 | ts-jest@28.0.8(@babel/core@7.23.9)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.23.9))(esbuild@0.12.29)(jest@28.1.3(@types/node@22.14.0))(typescript@4.9.5): 2681 | dependencies: 2682 | bs-logger: 0.2.6 2683 | fast-json-stable-stringify: 2.1.0 2684 | jest: 28.1.3(@types/node@22.14.0) 2685 | jest-util: 28.1.3 2686 | json5: 2.2.3 2687 | lodash.memoize: 4.1.2 2688 | make-error: 1.3.6 2689 | semver: 7.6.0 2690 | typescript: 4.9.5 2691 | yargs-parser: 21.1.1 2692 | optionalDependencies: 2693 | '@babel/core': 7.23.9 2694 | '@jest/types': 28.1.3 2695 | babel-jest: 28.1.3(@babel/core@7.23.9) 2696 | esbuild: 0.12.29 2697 | 2698 | type-detect@4.0.8: {} 2699 | 2700 | type-fest@0.21.3: {} 2701 | 2702 | type-fest@1.4.0: {} 2703 | 2704 | typescript@4.9.5: {} 2705 | 2706 | undici-types@6.21.0: {} 2707 | 2708 | update-browserslist-db@1.0.13(browserslist@4.22.3): 2709 | dependencies: 2710 | browserslist: 4.22.3 2711 | escalade: 3.1.2 2712 | picocolors: 1.0.0 2713 | 2714 | v8-to-istanbul@9.2.0: 2715 | dependencies: 2716 | '@jridgewell/trace-mapping': 0.3.22 2717 | '@types/istanbul-lib-coverage': 2.0.6 2718 | convert-source-map: 2.0.0 2719 | 2720 | walker@1.0.8: 2721 | dependencies: 2722 | makeerror: 1.0.12 2723 | 2724 | which@2.0.2: 2725 | dependencies: 2726 | isexe: 2.0.0 2727 | 2728 | wrap-ansi@7.0.0: 2729 | dependencies: 2730 | ansi-styles: 4.3.0 2731 | string-width: 4.2.3 2732 | strip-ansi: 6.0.1 2733 | 2734 | wrappy@1.0.2: {} 2735 | 2736 | write-file-atomic@4.0.2: 2737 | dependencies: 2738 | imurmurhash: 0.1.4 2739 | signal-exit: 3.0.7 2740 | 2741 | y18n@5.0.8: {} 2742 | 2743 | yallist@3.1.1: {} 2744 | 2745 | yallist@4.0.0: {} 2746 | 2747 | yargs-parser@21.1.1: {} 2748 | 2749 | yargs@17.7.2: 2750 | dependencies: 2751 | cliui: 8.0.1 2752 | escalade: 3.1.2 2753 | get-caller-file: 2.0.5 2754 | require-directory: 2.1.1 2755 | string-width: 4.2.3 2756 | y18n: 5.0.8 2757 | yargs-parser: 21.1.1 2758 | 2759 | yocto-queue@0.1.0: {} 2760 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | // Use WeakMap to store the object-key mapping so the objects can still be 2 | // garbage collected. WeakMap uses a hashtable under the hood, so the lookup 3 | // complexity is almost O(1). 4 | const table = new WeakMap() 5 | 6 | // A counter of the key. 7 | let counter = 0 8 | 9 | // A stable hash implementation that supports: 10 | // - Fast and ensures unique hash properties 11 | // - Handles unserializable values 12 | // - Handles object key ordering 13 | // - Generates short results 14 | // 15 | // This is not a serialization function, and the result is not guaranteed to be 16 | // parsable. 17 | export function stableHash(arg: any): string { 18 | const type = typeof arg 19 | const constructor = arg && arg.constructor 20 | const isDate = constructor === Date 21 | 22 | if (Object(arg) === arg && !isDate && constructor != RegExp) { 23 | // Object/function, not null/date/regexp. Use WeakMap to store the id first. 24 | // If it's already hashed, directly return the result. 25 | let result = table.get(arg) 26 | if (result) return result 27 | // Store the hash first for circular reference detection before entering the 28 | // recursive `stableHash` calls. 29 | // For other objects like set and map, we use this id directly as the hash. 30 | result = ++counter + "~" 31 | table.set(arg, result) 32 | let index: any 33 | 34 | if (constructor === Array) { 35 | // Array. 36 | result = "@" 37 | for (index = 0; index < arg.length; index++) { 38 | result += stableHash(arg[index]) + "," 39 | } 40 | table.set(arg, result) 41 | } else if (constructor === Object) { 42 | // Object, sort keys. 43 | result = "#" 44 | const keys = Object.keys(arg).sort() 45 | while ((index = keys.pop() as string) !== undefined) { 46 | if (arg[index] !== undefined) { 47 | result += index + ":" + stableHash(arg[index]) + "," 48 | } 49 | } 50 | table.set(arg, result) 51 | } 52 | return result 53 | } 54 | if (isDate) return arg.toJSON() 55 | if (type === "symbol") return arg.toString() 56 | return type === "string" ? JSON.stringify(arg) : "" + arg 57 | } 58 | 59 | export default stableHash 60 | -------------------------------------------------------------------------------- /tests/unit.test.ts: -------------------------------------------------------------------------------- 1 | import hash from "../src/index" 2 | 3 | describe(`Booleans`, () => { 4 | test(`Simple check`, () => { 5 | expect(hash(true)).toEqual(hash(true)); 6 | expect(hash(false)).not.toEqual(hash(true)); 7 | expect(hash(false)).toEqual(hash(false)) 8 | }); 9 | }) 10 | 11 | describe(`Strings`, () => { 12 | test(`Empty strings are equal`, () => { 13 | expect(hash("")).toEqual(hash("")) 14 | }); 15 | test(`Empty string is not equal to other falsy values`, () => { 16 | const emptyString = hash("") 17 | expect(emptyString).not.toEqual(hash(undefined)) 18 | expect(emptyString).not.toEqual(hash(0)) 19 | expect(emptyString).not.toEqual(hash(null)) 20 | expect(emptyString).not.toEqual(hash(false)) 21 | }); 22 | test(`One space is not equal to many spaces`, () => { 23 | expect(hash(" ")).not.toEqual(hash(" ")) 24 | expect(hash(" ")).not.toEqual(hash(" ")) 25 | }); 26 | test(`Basic/Common characters `, () => { 27 | expect(hash("Check out useSWR (npm i swr) for easy, robust data fetching in React.")) 28 | .toEqual(hash("Check out useSWR (npm i swr) for easy, robust data fetching in React.")) 29 | 30 | expect(hash(" af jFJI F89fj32fajsdjfaszf0_F0j2fa0")) 31 | .toEqual(hash(" af jFJI F89fj32fajsdjfaszf0_F0j2fa0")); 32 | 33 | expect(hash("23ja8!@#xc,m,/?@1mfjaDFJIPMal921m")).not.toEqual("23ja8!@#xc,m,/?@1m"); 34 | }); 35 | 36 | test(`Unconventional characters`, () => { 37 | 38 | expect(hash("u̝̚s̞ͨe͚̦͋ͣr̲̞͋͋ ͕̩̹͌ͯ͆ì̺̜̬̏̽ṇ̞̪͍̎͊̉͆p̼̭͎̆̐̄ͬͅȗ̬͙̗͍̟ͩ̒̃̚t͍͓̻̝̝́̾̄̐̔ś̗̹͇͉̙̟̔ͪ͑͛̐ ̥̞͚͖̪͖̎̾̈͑̆̾c̪̘̬͍̤͚͊̆͑̋̓̔a̙̠̻̬̙ͩ͒ͧ͂̄̊ͅn̞͚̠̩̬ͭ͌͑͑̍ ͍̟̲͍̼ͩ̉͒ͬ̚b̦̞̭̹ͪͦ̍ͦȅ̘̟͇͖̿̉̚ ̯̻̠ͩͥͣw̯̮͙ͫ̾̅i̦͈͛̅l̖̘ͯ͗d͔̈́")).toEqual(hash("u̝̚s̞ͨe͚̦͋ͣr̲̞͋͋ ͕̩̹͌ͯ͆ì̺̜̬̏̽ṇ̞̪͍̎͊̉͆p̼̭͎̆̐̄ͬͅȗ̬͙̗͍̟ͩ̒̃̚t͍͓̻̝̝́̾̄̐̔ś̗̹͇͉̙̟̔ͪ͑͛̐ ̥̞͚͖̪͖̎̾̈͑̆̾c̪̘̬͍̤͚͊̆͑̋̓̔a̙̠̻̬̙ͩ͒ͧ͂̄̊ͅn̞͚̠̩̬ͭ͌͑͑̍ ͍̟̲͍̼ͩ̉͒ͬ̚b̦̞̭̹ͪͦ̍ͦȅ̘̟͇͖̿̉̚ ̯̻̠ͩͥͣw̯̮͙ͫ̾̅i̦͈͛̅l̖̘ͯ͗d͔̈́")); 39 | 40 | 41 | 42 | 43 | expect(hash("u̝̚s̞ͨe͚̦͋ͣr̲̞͋͋ ͕̩̹͌ͯ͆ì̺̜̬̏̽ṇ̞̪͍̎͊̉͆p̼̭͎̆̐̄ͬͅȗ̬͙̗͍̟ͩ̒̃̚t͍͓̻̝̝́̾̄̐̔ś̗̹͇͉̙̟̔ͪ͑͛̐ ̥̞͚͖̪͖̎̾̈͑̆̾c̪̘̬͍̤͚͊̆͑̋̓̔a̙̠̻̬̙ͩ͒ͧ͂̄̊ͅn̞͚̠̩̬ͭ͌͑͑̍ ͍̟̲͍̼ͩ̉͒ͬ̚b̦̞̭̹ͪͦ̍ͦȅ̘̟͇͖̿̉̚ ̯̻̠ͩͥͣw̯̮͙ͫ̾̅i̦͈͛̅l̖̘ͯ͗d͔̈́")).not.toEqual(hash("u̝̚s̞ͨe͚̦͋ͣr̲̞͋͋ ͕̩̹͌ͯ͆ì̺̜̬̏̽ṇ̞̪͍̎͊̉͆p̼̭͎̆̐̄ͬͅȗ̬͙̗͍̟ͩ̒̃̚t͍͓̻̝̝́̾̄̐̔ś̗̹͇͉̙̟̔ͪ͑͛̐ ̥̞͚͖̪͖̎̾̈͑̆̾c̪̘̬͍̤͚͊̆͑̋̓̔a̙̠̻̬̙ͩ͒ͧ͂̄̊ͅn̞͚̠̩̬ͭ͌͑͑̍ ͍̟̲͍̼ͩ̉͒ͬ̚b̦̞̭̹ͪͦ̍ͦȅ̘̟͇͖̿̉̚")); 44 | 45 | 46 | }); 47 | }); 48 | 49 | 50 | describe(`Numbers including BigInt`, () => { 51 | test(`SheNaNigans`, () => { 52 | expect(hash(NaN)).toEqual(hash(NaN)); 53 | expect(hash(NaN)).not.toEqual(hash(NaN.toString())); 54 | expect(hash(1 + NaN)).toEqual(hash(NaN + 1)); 55 | expect(hash("1" + NaN)).not.toEqual(hash(NaN + "1")); 56 | }); 57 | test(`Integers`, () => { 58 | expect(hash(2 + 1)).toEqual(hash(2 + 1)); 59 | expect(hash(-3)).not.toEqual(hash("-3")); 60 | expect(hash(123)).not.toEqual(hash(1123)); 61 | expect(hash(400_000)).toEqual(hash(400000)); 62 | }); 63 | test(`Floats`, () => { 64 | expect(hash(0.000001)).toEqual(hash(0.000001)) 65 | expect(hash(-0.000001)).not.toEqual(hash(0.000001)) 66 | expect(hash(9999999.9999999)).not.toEqual(hash(10000000.0)) 67 | }); 68 | 69 | test(`BigInts`, () => { 70 | expect(hash(BigInt(8))).toEqual(hash(BigInt(8))); 71 | //expect(hash( BigInt(8) )).not.toEqual(hash(8)); This fails but that may be intentional; 72 | expect(hash(BigInt(99999999999999999999999999999999999999999999999999999999999999999999999999))) 73 | .not.toEqual(BigInt(77777777777777777777777777777777777777777777777777777)) 74 | }); 75 | }); 76 | 77 | 78 | 79 | describe(`Arrays`, () => { 80 | test(`Empty arrays are equal`, () => { 81 | expect(hash([])).toEqual(hash([])) 82 | }); 83 | test(`Simple arrays with primitives`, () => { 84 | expect(hash([1, 2, 3])).toEqual(hash([1, 2, 3])); 85 | expect(hash([1, 2])).not.toEqual(hash([1, 2, 3])); 86 | expect(hash(["1", 2, 3])).not.toEqual(hash([1, 2, 3])); 87 | expect(hash(["1", "2", "3"])).toEqual(hash(["1", "2", "3"])); 88 | expect(hash([1, 3, 2])).not.toEqual(hash([1, 2, 3])); 89 | expect(hash([true, true, true])).not.toEqual(hash([0, 0, 0])) 90 | expect(hash([true, true, true])).toEqual(hash([true, true, true])); 91 | }); 92 | test(`Pseudo arrays and empty values`, () => { 93 | const pseudo = { "0": "A", "1": "B", "2": "C", length: 3, constructor: Array } 94 | //expect(hash(pseudo)).not.toEqual(hash(["A","B","C"])) This fails (yes it's super contrived 🤪) 95 | expect(hash(pseudo)).toEqual(hash(pseudo)); 96 | 97 | const arrayWithExtraStuff: any = [1, 2, 3]; 98 | arrayWithExtraStuff.extra = "Stuff"; 99 | arrayWithExtraStuff.extraStuff = []; 100 | arrayWithExtraStuff.evenMoreExtraStuff = { nested: "extraStuff" }; 101 | //expect(hash(arrayWithExtraStuff)).not.toEqual(hash([1, 2, 3])) This fails (yep still kinda contrived 🙃) 102 | 103 | const anotherArrayWithExtraStuff = Object.assign([1, 2, 3,], { extra: "Stuff" }); 104 | /* expect(hash(anotherArrayWithExtraStuff)).not.toEqual(hash([1,2,3])) 105 | Ok maybe I'm just getting silly 😂 but this fails. All joking aside, any robust way to 106 | solve these would probably not be worth the hit to performance because these are very unusual cases */ 107 | 108 | const arrayWithEmptyIndices = [1, 2]; 109 | arrayWithEmptyIndices[100] = 3; 110 | expect(arrayWithEmptyIndices).not.toEqual([1, 2, 3]); 111 | }); 112 | }) 113 | 114 | 115 | describe(`POJOs`, () => { 116 | test(`Empty objects are equal`, () => { 117 | expect(hash({})).toEqual(hash({})); 118 | }); 119 | test(`Empty object not equal to empty array`, () => { 120 | expect(hash({})).not.toEqual(hash([])); 121 | }); 122 | test(`Objects with simple k:v pairs where v is a primitive`, () => { 123 | expect(hash({ hi: "hello" })).toEqual(hash({ hi: "hello" })); 124 | expect(hash({ hi: "hello" })).not.toEqual(hash({ bye: "goodbye" })); 125 | 126 | const pretendRecord = { 127 | name: "Muffin Man", 128 | street: "Drury Ln", 129 | crimesCommitted: 13, 130 | description: "⚠ USE EXTREME CAUTION WHEN APPROACHING ⚠", 131 | currentlyUnderInvestigation: true 132 | } 133 | expect(hash(pretendRecord)).toEqual(hash({ 134 | name: "Muffin Man", 135 | street: "Drury Ln", 136 | crimesCommitted: 13, 137 | description: "⚠ USE EXTREME CAUTION WHEN APPROACHING ⚠", 138 | currentlyUnderInvestigation: true 139 | })) 140 | 141 | expect(hash(pretendRecord)).not.toEqual(hash({ 142 | name: "Muffin Man", 143 | street: "Drury Ln", 144 | crimesCommitted: 14, 145 | description: "⚠ USE EXTREME CAUTION WHEN APPROACHING ⚠", 146 | currentlyUnderInvestigation: true 147 | })) 148 | 149 | expect(hash(pretendRecord)).not.toEqual(hash({ 150 | name: "Muffin Man", 151 | street: "Drury Ln", 152 | crimesCommitted: 13, 153 | currentlyUnderInvestigation: true 154 | })) 155 | }); 156 | test(`Stringified json not equal to itself in parsed form`, () => { 157 | expect(hash({ use: "SWR" })).not.toEqual(hash(JSON.stringify({ use: "SWR" }))) 158 | }); 159 | test(`Order doesn't matter in non-array object`, () => { 160 | expect(hash({ first: "1", second: "2", third: "3" })).toEqual(hash({ second: "2", third: "3", first: "1" })) 161 | }) 162 | test(`Objects with nested data structures`, () => { 163 | expect(hash({ a: { b: { c: {} } } })).toEqual(hash({ a: { b: { c: {} } } })); 164 | expect(hash({ a: { b: { c: {} } } })).not.toEqual(hash({ a: { b: { z: {} } } })); 165 | expect(hash({ a: { b: { c: {} } } })).not.toEqual(hash({ a: { b: { c: { d: {} } } } })); 166 | 167 | expect(hash({ 168 | a: [1, 2, 3], 169 | b: { 170 | c: [4, 5, 6], 171 | d: [{ e: 7 }, { g: 8 }] 172 | } 173 | })).toEqual(hash({ 174 | a: [1, 2, 3], 175 | b: { 176 | c: [4, 5, 6], 177 | d: [{ e: 7 }, { g: 8 }] 178 | } 179 | })) 180 | 181 | expect(hash({ 182 | a: [1, 2, 3], 183 | b: { 184 | c: [4, 5, 6], 185 | d: [{ e: 7 }, { g: 8 }] 186 | } 187 | })).not.toEqual(hash({ 188 | a: [1, 2, 3], 189 | b: { 190 | c: [4, 5, 6], 191 | d: [{ e: "f" }, { g: "h" }] 192 | } 193 | })) 194 | }); 195 | 196 | }); 197 | 198 | describe(`The Func-y Bunch featuring The Referential Squad`, () => { 199 | test(`Functions`, () => { 200 | expect(hash(() => { })).not.toEqual(hash(() => { })); 201 | 202 | function emptyFunc() { } 203 | function anotherEmptyFunc() { } 204 | expect(hash(emptyFunc)).toEqual(hash(emptyFunc)); 205 | expect(hash(emptyFunc)).not.toEqual(hash(anotherEmptyFunc)); 206 | 207 | function sum(a, b) { return a + b }; 208 | function alsoSum(a, b) { return a + b } 209 | expect(hash(sum)).toEqual(hash(sum)); 210 | expect(hash(sum)).not.toEqual(hash(alsoSum)); 211 | 212 | const functionHolder = { sum } 213 | expect(hash(functionHolder.sum)).toEqual(hash(functionHolder.sum)); 214 | expect(hash(functionHolder.sum)).toEqual(hash(sum)); 215 | expect(hash(functionHolder)).toEqual(hash(functionHolder)) 216 | }); 217 | 218 | test(`Dates`, () => { 219 | const now = new Date(); 220 | expect(hash(now)).toEqual(hash(now)); 221 | 222 | const actualDateObject = new Date("2022-06-25T01:55:27.743Z"); 223 | const dateString = "2022-06-25T01:55:27.743Z"; 224 | expect(hash(actualDateObject)).not.toEqual(hash(dateString)); 225 | expect(hash(now)).not.toEqual(hash(actualDateObject)) 226 | }); 227 | 228 | test(`Regex`, () => { 229 | expect(hash(/hello/)).toEqual(hash(/hello/)); 230 | expect(hash(/hello/)).not.toEqual(hash("hello")); 231 | expect(hash(/hello/i)).not.toEqual(hash(/HELLO/i)) 232 | }); 233 | 234 | test(`Symbols`, () => { 235 | const test = Symbol("test"); 236 | expect(hash(test)).not.toEqual(hash("test")); 237 | expect(hash(test)).not.toEqual(hash(Symbol())); 238 | expect(test).not.toEqual(hash(test)) 239 | expect(hash(test)).toEqual(hash(test)); 240 | }); 241 | 242 | test(`Proxies`, () => { 243 | const originalObject = { key: "value" }; 244 | const noOpProxy = new Proxy(originalObject, {}); 245 | expect(hash(noOpProxy)).toEqual(hash(originalObject)); 246 | expect(hash(noOpProxy)).toEqual(hash(noOpProxy)); 247 | 248 | const anotherNoOpProxy = new Proxy(originalObject, {}); 249 | expect(hash(anotherNoOpProxy)).toEqual(hash(noOpProxy)); 250 | 251 | const rejectionProxy = new Proxy(originalObject, { 252 | get() { 253 | return "nope" 254 | } 255 | }); 256 | expect(hash(rejectionProxy)).not.toEqual(hash(originalObject)); 257 | expect(hash(rejectionProxy)).toEqual(hash(rejectionProxy)); 258 | }); 259 | 260 | test(`Classes`, () => { 261 | class Cat { } 262 | expect(hash(Cat)).toEqual(hash(Cat)); 263 | 264 | const kitty = new Cat(); 265 | const anotherKitty = new Cat(); 266 | expect(hash(kitty)).toEqual(hash(kitty)); 267 | expect(hash(kitty)).not.toEqual(hash(anotherKitty)); 268 | }); 269 | 270 | test(`Sets`, () => { 271 | const one = new Set([1, 1, 1, 1, 1, 1, 1, 1, 1]); 272 | expect(hash(one)).toEqual(hash(one)); 273 | expect(hash(one)).not.toEqual(hash([1])) 274 | 275 | const anothaOne = new Set([1, 1, 1, 1, 1, 1, 1, 1, 1]); 276 | expect(hash(anothaOne)).toEqual(hash(anothaOne)); 277 | expect(hash(one)).not.toEqual(hash(anothaOne)); 278 | }); 279 | 280 | test(`Buffers`, () => { 281 | const emptyBuffer = Buffer.alloc(10); 282 | const anotherEmptyBuffer = Buffer.alloc(10); 283 | expect(hash(emptyBuffer)).toEqual(hash(emptyBuffer)); 284 | expect(hash(emptyBuffer)).not.toEqual(hash(anotherEmptyBuffer)); 285 | 286 | const stringBuffer = Buffer.from("Host with Vercel to deploy the future of modern, performant web apps that scale with ease.", "utf8"); 287 | const copy = Buffer.from("Host with Vercel to deploy the future of modern, performant web apps that scale with ease.", "utf8"); 288 | expect(hash(stringBuffer)).toEqual(hash(stringBuffer)); 289 | expect(hash(stringBuffer)).not.toEqual(hash(copy)) 290 | }); 291 | 292 | test(`Maps`, () => { 293 | const catMap = new Map(); 294 | const catMap2 = new Map(); 295 | catMap.set('meowLoudly','at 3am'); 296 | catMap2.set('meowLoudly','at 3am'); 297 | 298 | expect(hash(catMap)).toEqual(hash(catMap)); 299 | expect(hash(catMap)).not.toEqual(hash(catMap2)) 300 | }); 301 | }) -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "lib": ["ES2015"], 5 | "target": "es5", 6 | "strict": true, 7 | "sourceMap": true, 8 | "outDir": "dist", 9 | }, 10 | "include": [ 11 | "src/", 12 | ], 13 | "exclude": [ 14 | "node_modules", 15 | ] 16 | } 17 | --------------------------------------------------------------------------------