├── .editorconfig ├── .github └── workflows │ └── verify.yml ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── binding.gyp ├── example.js ├── package-lock.json ├── package.json ├── src ├── eventLoopStats.cc ├── eventLoopStats.d.ts └── eventLoopStats.js └── test ├── eventLoopStats.js └── types.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | indent_style = space 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | charset = utf-8 10 | -------------------------------------------------------------------------------- /.github/workflows/verify.yml: -------------------------------------------------------------------------------- 1 | name: Verify 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - name: Setup Node.js 15 | uses: actions/setup-node@v2 16 | with: 17 | node-version: '16.13.1' 18 | cache: 'npm' 19 | - run: npm install 20 | - run: npm test 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | build/ 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 1.4.1 4 | - Fix issues caused by `uv_hrtime()` returning a value that is greater than the max possible `uint32` value. 5 | 6 | ## 1.4.0 7 | - Expose TypeScript types. 8 | 9 | ## 1.3.0 10 | - Detect synchronous blocks 11 | 12 | ## 1.2.0 13 | - Support Node.js v12 14 | 15 | ## 1.1.0 16 | - Support Node.js v10 17 | 18 | ## 1.0.0 19 | - Initial release 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2022 Ben Blackmore and contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

event-loop-stats

2 |

Exposes stats about the libuv default loop

3 | 4 | ## Installation 5 | 6 | ``` 7 | npm install --save event-loop-stats 8 | ``` 9 | 10 | ## Usage 11 | ```javascript 12 | var eventLoopStats = require('event-loop-stats'); 13 | console.log('Stats', eventLoopStats.sense()); 14 | ``` 15 | 16 | This will print the following information: 17 | 18 | ``` 19 | Stats { 20 | max: 5, 21 | min: 0, 22 | sum: 10, 23 | num: 5 24 | } 25 | ``` 26 | 27 | ## Property insights 28 | - `max`: Maximum number of milliseconds spent in a single loop since last `sense call`. 29 | - `min`: Minimum number of milliseconds spent in a single loop since last `sense call`. 30 | - `sum`: Total number of milliseconds spent in the loop since last `sense call`. 31 | - `num`: Total number of loops since last `sense call`. 32 | 33 | ## Node version compatibility 34 | `event-loop-stats` depends on C++ extensions which are compiled when the `event-loop-stats` module is installed. Compatibility information can be inspected via the [Travis-CI build jobs](https://travis-ci.org/bripkens/event-loop-stats). 35 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | "targets": [{ 3 | "target_name" : "eventLoopStats", 4 | "sources" : [ "src/eventLoopStats.cc" ], 5 | "include_dirs" : [ 6 | "src", 7 | "=4.0.0" 23 | } 24 | }, 25 | "node_modules/@types/node": { 26 | "version": "17.0.10", 27 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", 28 | "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==", 29 | "dev": true 30 | }, 31 | "node_modules/ansi-colors": { 32 | "version": "4.1.1", 33 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 34 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 35 | "dev": true, 36 | "engines": { 37 | "node": ">=6" 38 | } 39 | }, 40 | "node_modules/ansi-regex": { 41 | "version": "5.0.1", 42 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 43 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 44 | "dev": true, 45 | "engines": { 46 | "node": ">=8" 47 | } 48 | }, 49 | "node_modules/ansi-styles": { 50 | "version": "4.3.0", 51 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 52 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 53 | "dev": true, 54 | "dependencies": { 55 | "color-convert": "^2.0.1" 56 | }, 57 | "engines": { 58 | "node": ">=8" 59 | }, 60 | "funding": { 61 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 62 | } 63 | }, 64 | "node_modules/anymatch": { 65 | "version": "3.1.3", 66 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 67 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 68 | "dev": true, 69 | "dependencies": { 70 | "normalize-path": "^3.0.0", 71 | "picomatch": "^2.0.4" 72 | }, 73 | "engines": { 74 | "node": ">= 8" 75 | } 76 | }, 77 | "node_modules/argparse": { 78 | "version": "2.0.1", 79 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 80 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 81 | "dev": true 82 | }, 83 | "node_modules/assertion-error": { 84 | "version": "1.1.0", 85 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 86 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 87 | "dev": true, 88 | "engines": { 89 | "node": "*" 90 | } 91 | }, 92 | "node_modules/balanced-match": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 95 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 96 | "dev": true 97 | }, 98 | "node_modules/binary-extensions": { 99 | "version": "2.2.0", 100 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 101 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 102 | "dev": true, 103 | "engines": { 104 | "node": ">=8" 105 | } 106 | }, 107 | "node_modules/brace-expansion": { 108 | "version": "2.0.1", 109 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 110 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 111 | "dev": true, 112 | "dependencies": { 113 | "balanced-match": "^1.0.0" 114 | } 115 | }, 116 | "node_modules/braces": { 117 | "version": "3.0.3", 118 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 119 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 120 | "dev": true, 121 | "dependencies": { 122 | "fill-range": "^7.1.1" 123 | }, 124 | "engines": { 125 | "node": ">=8" 126 | } 127 | }, 128 | "node_modules/browser-stdout": { 129 | "version": "1.3.1", 130 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 131 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 132 | "dev": true 133 | }, 134 | "node_modules/camelcase": { 135 | "version": "6.3.0", 136 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 137 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 138 | "dev": true, 139 | "engines": { 140 | "node": ">=10" 141 | }, 142 | "funding": { 143 | "url": "https://github.com/sponsors/sindresorhus" 144 | } 145 | }, 146 | "node_modules/chai": { 147 | "version": "4.1.2", 148 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 149 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 150 | "dev": true, 151 | "dependencies": { 152 | "assertion-error": "^1.0.1", 153 | "check-error": "^1.0.1", 154 | "deep-eql": "^3.0.0", 155 | "get-func-name": "^2.0.0", 156 | "pathval": "^1.0.0", 157 | "type-detect": "^4.0.0" 158 | }, 159 | "engines": { 160 | "node": ">=4" 161 | } 162 | }, 163 | "node_modules/chalk": { 164 | "version": "4.1.2", 165 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 166 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 167 | "dev": true, 168 | "dependencies": { 169 | "ansi-styles": "^4.1.0", 170 | "supports-color": "^7.1.0" 171 | }, 172 | "engines": { 173 | "node": ">=10" 174 | }, 175 | "funding": { 176 | "url": "https://github.com/chalk/chalk?sponsor=1" 177 | } 178 | }, 179 | "node_modules/chalk/node_modules/supports-color": { 180 | "version": "7.2.0", 181 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 182 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 183 | "dev": true, 184 | "dependencies": { 185 | "has-flag": "^4.0.0" 186 | }, 187 | "engines": { 188 | "node": ">=8" 189 | } 190 | }, 191 | "node_modules/check-error": { 192 | "version": "1.0.2", 193 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 194 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 195 | "dev": true, 196 | "engines": { 197 | "node": "*" 198 | } 199 | }, 200 | "node_modules/chokidar": { 201 | "version": "3.5.3", 202 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 203 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 204 | "dev": true, 205 | "funding": [ 206 | { 207 | "type": "individual", 208 | "url": "https://paulmillr.com/funding/" 209 | } 210 | ], 211 | "dependencies": { 212 | "anymatch": "~3.1.2", 213 | "braces": "~3.0.2", 214 | "glob-parent": "~5.1.2", 215 | "is-binary-path": "~2.1.0", 216 | "is-glob": "~4.0.1", 217 | "normalize-path": "~3.0.0", 218 | "readdirp": "~3.6.0" 219 | }, 220 | "engines": { 221 | "node": ">= 8.10.0" 222 | }, 223 | "optionalDependencies": { 224 | "fsevents": "~2.3.2" 225 | } 226 | }, 227 | "node_modules/cliui": { 228 | "version": "7.0.4", 229 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 230 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 231 | "dev": true, 232 | "dependencies": { 233 | "string-width": "^4.2.0", 234 | "strip-ansi": "^6.0.0", 235 | "wrap-ansi": "^7.0.0" 236 | } 237 | }, 238 | "node_modules/color-convert": { 239 | "version": "2.0.1", 240 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 241 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 242 | "dev": true, 243 | "dependencies": { 244 | "color-name": "~1.1.4" 245 | }, 246 | "engines": { 247 | "node": ">=7.0.0" 248 | } 249 | }, 250 | "node_modules/color-name": { 251 | "version": "1.1.4", 252 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 253 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 254 | "dev": true 255 | }, 256 | "node_modules/concat-map": { 257 | "version": "0.0.1", 258 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 259 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 260 | "dev": true 261 | }, 262 | "node_modules/debug": { 263 | "version": "4.3.4", 264 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 265 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 266 | "dev": true, 267 | "dependencies": { 268 | "ms": "2.1.2" 269 | }, 270 | "engines": { 271 | "node": ">=6.0" 272 | }, 273 | "peerDependenciesMeta": { 274 | "supports-color": { 275 | "optional": true 276 | } 277 | } 278 | }, 279 | "node_modules/debug/node_modules/ms": { 280 | "version": "2.1.2", 281 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 282 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 283 | "dev": true 284 | }, 285 | "node_modules/decamelize": { 286 | "version": "4.0.0", 287 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 288 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 289 | "dev": true, 290 | "engines": { 291 | "node": ">=10" 292 | }, 293 | "funding": { 294 | "url": "https://github.com/sponsors/sindresorhus" 295 | } 296 | }, 297 | "node_modules/deep-eql": { 298 | "version": "3.0.1", 299 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 300 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 301 | "dev": true, 302 | "dependencies": { 303 | "type-detect": "^4.0.0" 304 | }, 305 | "engines": { 306 | "node": ">=0.12" 307 | } 308 | }, 309 | "node_modules/diff": { 310 | "version": "5.0.0", 311 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 312 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 313 | "dev": true, 314 | "engines": { 315 | "node": ">=0.3.1" 316 | } 317 | }, 318 | "node_modules/emoji-regex": { 319 | "version": "8.0.0", 320 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 321 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 322 | "dev": true 323 | }, 324 | "node_modules/escalade": { 325 | "version": "3.1.1", 326 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 327 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 328 | "dev": true, 329 | "engines": { 330 | "node": ">=6" 331 | } 332 | }, 333 | "node_modules/escape-string-regexp": { 334 | "version": "4.0.0", 335 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 336 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 337 | "dev": true, 338 | "engines": { 339 | "node": ">=10" 340 | }, 341 | "funding": { 342 | "url": "https://github.com/sponsors/sindresorhus" 343 | } 344 | }, 345 | "node_modules/fill-range": { 346 | "version": "7.1.1", 347 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 348 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 349 | "dev": true, 350 | "dependencies": { 351 | "to-regex-range": "^5.0.1" 352 | }, 353 | "engines": { 354 | "node": ">=8" 355 | } 356 | }, 357 | "node_modules/find-up": { 358 | "version": "5.0.0", 359 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 360 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 361 | "dev": true, 362 | "dependencies": { 363 | "locate-path": "^6.0.0", 364 | "path-exists": "^4.0.0" 365 | }, 366 | "engines": { 367 | "node": ">=10" 368 | }, 369 | "funding": { 370 | "url": "https://github.com/sponsors/sindresorhus" 371 | } 372 | }, 373 | "node_modules/flat": { 374 | "version": "5.0.2", 375 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 376 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 377 | "dev": true, 378 | "bin": { 379 | "flat": "cli.js" 380 | } 381 | }, 382 | "node_modules/fs.realpath": { 383 | "version": "1.0.0", 384 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 385 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 386 | "dev": true 387 | }, 388 | "node_modules/fsevents": { 389 | "version": "2.3.2", 390 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 391 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 392 | "dev": true, 393 | "hasInstallScript": true, 394 | "optional": true, 395 | "os": [ 396 | "darwin" 397 | ], 398 | "engines": { 399 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 400 | } 401 | }, 402 | "node_modules/get-caller-file": { 403 | "version": "2.0.5", 404 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 405 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 406 | "dev": true, 407 | "engines": { 408 | "node": "6.* || 8.* || >= 10.*" 409 | } 410 | }, 411 | "node_modules/get-func-name": { 412 | "version": "2.0.0", 413 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 414 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 415 | "dev": true, 416 | "engines": { 417 | "node": "*" 418 | } 419 | }, 420 | "node_modules/glob": { 421 | "version": "7.2.0", 422 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 423 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 424 | "dev": true, 425 | "dependencies": { 426 | "fs.realpath": "^1.0.0", 427 | "inflight": "^1.0.4", 428 | "inherits": "2", 429 | "minimatch": "^3.0.4", 430 | "once": "^1.3.0", 431 | "path-is-absolute": "^1.0.0" 432 | }, 433 | "engines": { 434 | "node": "*" 435 | }, 436 | "funding": { 437 | "url": "https://github.com/sponsors/isaacs" 438 | } 439 | }, 440 | "node_modules/glob-parent": { 441 | "version": "5.1.2", 442 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 443 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 444 | "dev": true, 445 | "dependencies": { 446 | "is-glob": "^4.0.1" 447 | }, 448 | "engines": { 449 | "node": ">= 6" 450 | } 451 | }, 452 | "node_modules/glob/node_modules/brace-expansion": { 453 | "version": "1.1.11", 454 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 455 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 456 | "dev": true, 457 | "dependencies": { 458 | "balanced-match": "^1.0.0", 459 | "concat-map": "0.0.1" 460 | } 461 | }, 462 | "node_modules/glob/node_modules/minimatch": { 463 | "version": "3.1.2", 464 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 465 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 466 | "dev": true, 467 | "dependencies": { 468 | "brace-expansion": "^1.1.7" 469 | }, 470 | "engines": { 471 | "node": "*" 472 | } 473 | }, 474 | "node_modules/has-flag": { 475 | "version": "4.0.0", 476 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 477 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 478 | "dev": true, 479 | "engines": { 480 | "node": ">=8" 481 | } 482 | }, 483 | "node_modules/he": { 484 | "version": "1.2.0", 485 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 486 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 487 | "dev": true, 488 | "bin": { 489 | "he": "bin/he" 490 | } 491 | }, 492 | "node_modules/inflight": { 493 | "version": "1.0.6", 494 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 495 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 496 | "dev": true, 497 | "dependencies": { 498 | "once": "^1.3.0", 499 | "wrappy": "1" 500 | } 501 | }, 502 | "node_modules/inherits": { 503 | "version": "2.0.4", 504 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 505 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 506 | "dev": true 507 | }, 508 | "node_modules/is-binary-path": { 509 | "version": "2.1.0", 510 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 511 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 512 | "dev": true, 513 | "dependencies": { 514 | "binary-extensions": "^2.0.0" 515 | }, 516 | "engines": { 517 | "node": ">=8" 518 | } 519 | }, 520 | "node_modules/is-extglob": { 521 | "version": "2.1.1", 522 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 523 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 524 | "dev": true, 525 | "engines": { 526 | "node": ">=0.10.0" 527 | } 528 | }, 529 | "node_modules/is-fullwidth-code-point": { 530 | "version": "3.0.0", 531 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 532 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 533 | "dev": true, 534 | "engines": { 535 | "node": ">=8" 536 | } 537 | }, 538 | "node_modules/is-glob": { 539 | "version": "4.0.3", 540 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 541 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 542 | "dev": true, 543 | "dependencies": { 544 | "is-extglob": "^2.1.1" 545 | }, 546 | "engines": { 547 | "node": ">=0.10.0" 548 | } 549 | }, 550 | "node_modules/is-number": { 551 | "version": "7.0.0", 552 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 553 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 554 | "dev": true, 555 | "engines": { 556 | "node": ">=0.12.0" 557 | } 558 | }, 559 | "node_modules/is-plain-obj": { 560 | "version": "2.1.0", 561 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 562 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 563 | "dev": true, 564 | "engines": { 565 | "node": ">=8" 566 | } 567 | }, 568 | "node_modules/is-unicode-supported": { 569 | "version": "0.1.0", 570 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 571 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 572 | "dev": true, 573 | "engines": { 574 | "node": ">=10" 575 | }, 576 | "funding": { 577 | "url": "https://github.com/sponsors/sindresorhus" 578 | } 579 | }, 580 | "node_modules/js-yaml": { 581 | "version": "4.1.0", 582 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 583 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 584 | "dev": true, 585 | "dependencies": { 586 | "argparse": "^2.0.1" 587 | }, 588 | "bin": { 589 | "js-yaml": "bin/js-yaml.js" 590 | } 591 | }, 592 | "node_modules/locate-path": { 593 | "version": "6.0.0", 594 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 595 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 596 | "dev": true, 597 | "dependencies": { 598 | "p-locate": "^5.0.0" 599 | }, 600 | "engines": { 601 | "node": ">=10" 602 | }, 603 | "funding": { 604 | "url": "https://github.com/sponsors/sindresorhus" 605 | } 606 | }, 607 | "node_modules/log-symbols": { 608 | "version": "4.1.0", 609 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 610 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 611 | "dev": true, 612 | "dependencies": { 613 | "chalk": "^4.1.0", 614 | "is-unicode-supported": "^0.1.0" 615 | }, 616 | "engines": { 617 | "node": ">=10" 618 | }, 619 | "funding": { 620 | "url": "https://github.com/sponsors/sindresorhus" 621 | } 622 | }, 623 | "node_modules/minimatch": { 624 | "version": "5.0.1", 625 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 626 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 627 | "dev": true, 628 | "dependencies": { 629 | "brace-expansion": "^2.0.1" 630 | }, 631 | "engines": { 632 | "node": ">=10" 633 | } 634 | }, 635 | "node_modules/mocha": { 636 | "version": "10.2.0", 637 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 638 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 639 | "dev": true, 640 | "dependencies": { 641 | "ansi-colors": "4.1.1", 642 | "browser-stdout": "1.3.1", 643 | "chokidar": "3.5.3", 644 | "debug": "4.3.4", 645 | "diff": "5.0.0", 646 | "escape-string-regexp": "4.0.0", 647 | "find-up": "5.0.0", 648 | "glob": "7.2.0", 649 | "he": "1.2.0", 650 | "js-yaml": "4.1.0", 651 | "log-symbols": "4.1.0", 652 | "minimatch": "5.0.1", 653 | "ms": "2.1.3", 654 | "nanoid": "3.3.3", 655 | "serialize-javascript": "6.0.0", 656 | "strip-json-comments": "3.1.1", 657 | "supports-color": "8.1.1", 658 | "workerpool": "6.2.1", 659 | "yargs": "16.2.0", 660 | "yargs-parser": "20.2.4", 661 | "yargs-unparser": "2.0.0" 662 | }, 663 | "bin": { 664 | "_mocha": "bin/_mocha", 665 | "mocha": "bin/mocha.js" 666 | }, 667 | "engines": { 668 | "node": ">= 14.0.0" 669 | }, 670 | "funding": { 671 | "type": "opencollective", 672 | "url": "https://opencollective.com/mochajs" 673 | } 674 | }, 675 | "node_modules/ms": { 676 | "version": "2.1.3", 677 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 678 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 679 | "dev": true 680 | }, 681 | "node_modules/nan": { 682 | "version": "2.14.0", 683 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 684 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 685 | }, 686 | "node_modules/nanoid": { 687 | "version": "3.3.3", 688 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 689 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 690 | "dev": true, 691 | "bin": { 692 | "nanoid": "bin/nanoid.cjs" 693 | }, 694 | "engines": { 695 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 696 | } 697 | }, 698 | "node_modules/normalize-path": { 699 | "version": "3.0.0", 700 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 701 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 702 | "dev": true, 703 | "engines": { 704 | "node": ">=0.10.0" 705 | } 706 | }, 707 | "node_modules/once": { 708 | "version": "1.4.0", 709 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 710 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 711 | "dev": true, 712 | "dependencies": { 713 | "wrappy": "1" 714 | } 715 | }, 716 | "node_modules/p-limit": { 717 | "version": "3.1.0", 718 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 719 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 720 | "dev": true, 721 | "dependencies": { 722 | "yocto-queue": "^0.1.0" 723 | }, 724 | "engines": { 725 | "node": ">=10" 726 | }, 727 | "funding": { 728 | "url": "https://github.com/sponsors/sindresorhus" 729 | } 730 | }, 731 | "node_modules/p-locate": { 732 | "version": "5.0.0", 733 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 734 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 735 | "dev": true, 736 | "dependencies": { 737 | "p-limit": "^3.0.2" 738 | }, 739 | "engines": { 740 | "node": ">=10" 741 | }, 742 | "funding": { 743 | "url": "https://github.com/sponsors/sindresorhus" 744 | } 745 | }, 746 | "node_modules/path-exists": { 747 | "version": "4.0.0", 748 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 749 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 750 | "dev": true, 751 | "engines": { 752 | "node": ">=8" 753 | } 754 | }, 755 | "node_modules/path-is-absolute": { 756 | "version": "1.0.1", 757 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 758 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 759 | "dev": true, 760 | "engines": { 761 | "node": ">=0.10.0" 762 | } 763 | }, 764 | "node_modules/pathval": { 765 | "version": "1.1.0", 766 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 767 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 768 | "dev": true, 769 | "engines": { 770 | "node": "*" 771 | } 772 | }, 773 | "node_modules/picomatch": { 774 | "version": "2.3.1", 775 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 776 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 777 | "dev": true, 778 | "engines": { 779 | "node": ">=8.6" 780 | }, 781 | "funding": { 782 | "url": "https://github.com/sponsors/jonschlinkert" 783 | } 784 | }, 785 | "node_modules/randombytes": { 786 | "version": "2.1.0", 787 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 788 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 789 | "dev": true, 790 | "dependencies": { 791 | "safe-buffer": "^5.1.0" 792 | } 793 | }, 794 | "node_modules/readdirp": { 795 | "version": "3.6.0", 796 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 797 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 798 | "dev": true, 799 | "dependencies": { 800 | "picomatch": "^2.2.1" 801 | }, 802 | "engines": { 803 | "node": ">=8.10.0" 804 | } 805 | }, 806 | "node_modules/require-directory": { 807 | "version": "2.1.1", 808 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 809 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 810 | "dev": true, 811 | "engines": { 812 | "node": ">=0.10.0" 813 | } 814 | }, 815 | "node_modules/safe-buffer": { 816 | "version": "5.2.1", 817 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 818 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 819 | "dev": true, 820 | "funding": [ 821 | { 822 | "type": "github", 823 | "url": "https://github.com/sponsors/feross" 824 | }, 825 | { 826 | "type": "patreon", 827 | "url": "https://www.patreon.com/feross" 828 | }, 829 | { 830 | "type": "consulting", 831 | "url": "https://feross.org/support" 832 | } 833 | ] 834 | }, 835 | "node_modules/serialize-javascript": { 836 | "version": "6.0.0", 837 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 838 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 839 | "dev": true, 840 | "dependencies": { 841 | "randombytes": "^2.1.0" 842 | } 843 | }, 844 | "node_modules/string-width": { 845 | "version": "4.2.3", 846 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 847 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 848 | "dev": true, 849 | "dependencies": { 850 | "emoji-regex": "^8.0.0", 851 | "is-fullwidth-code-point": "^3.0.0", 852 | "strip-ansi": "^6.0.1" 853 | }, 854 | "engines": { 855 | "node": ">=8" 856 | } 857 | }, 858 | "node_modules/strip-ansi": { 859 | "version": "6.0.1", 860 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 861 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 862 | "dev": true, 863 | "dependencies": { 864 | "ansi-regex": "^5.0.1" 865 | }, 866 | "engines": { 867 | "node": ">=8" 868 | } 869 | }, 870 | "node_modules/strip-json-comments": { 871 | "version": "3.1.1", 872 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 873 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 874 | "dev": true, 875 | "engines": { 876 | "node": ">=8" 877 | }, 878 | "funding": { 879 | "url": "https://github.com/sponsors/sindresorhus" 880 | } 881 | }, 882 | "node_modules/supports-color": { 883 | "version": "8.1.1", 884 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 885 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 886 | "dev": true, 887 | "dependencies": { 888 | "has-flag": "^4.0.0" 889 | }, 890 | "engines": { 891 | "node": ">=10" 892 | }, 893 | "funding": { 894 | "url": "https://github.com/chalk/supports-color?sponsor=1" 895 | } 896 | }, 897 | "node_modules/to-regex-range": { 898 | "version": "5.0.1", 899 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 900 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 901 | "dev": true, 902 | "dependencies": { 903 | "is-number": "^7.0.0" 904 | }, 905 | "engines": { 906 | "node": ">=8.0" 907 | } 908 | }, 909 | "node_modules/type-detect": { 910 | "version": "4.0.8", 911 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 912 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 913 | "dev": true, 914 | "engines": { 915 | "node": ">=4" 916 | } 917 | }, 918 | "node_modules/typescript": { 919 | "version": "4.5.4", 920 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", 921 | "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", 922 | "dev": true, 923 | "bin": { 924 | "tsc": "bin/tsc", 925 | "tsserver": "bin/tsserver" 926 | }, 927 | "engines": { 928 | "node": ">=4.2.0" 929 | } 930 | }, 931 | "node_modules/workerpool": { 932 | "version": "6.2.1", 933 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 934 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 935 | "dev": true 936 | }, 937 | "node_modules/wrap-ansi": { 938 | "version": "7.0.0", 939 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 940 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 941 | "dev": true, 942 | "dependencies": { 943 | "ansi-styles": "^4.0.0", 944 | "string-width": "^4.1.0", 945 | "strip-ansi": "^6.0.0" 946 | }, 947 | "engines": { 948 | "node": ">=10" 949 | }, 950 | "funding": { 951 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 952 | } 953 | }, 954 | "node_modules/wrappy": { 955 | "version": "1.0.2", 956 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 957 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 958 | "dev": true 959 | }, 960 | "node_modules/y18n": { 961 | "version": "5.0.8", 962 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 963 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 964 | "dev": true, 965 | "engines": { 966 | "node": ">=10" 967 | } 968 | }, 969 | "node_modules/yargs": { 970 | "version": "16.2.0", 971 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 972 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 973 | "dev": true, 974 | "dependencies": { 975 | "cliui": "^7.0.2", 976 | "escalade": "^3.1.1", 977 | "get-caller-file": "^2.0.5", 978 | "require-directory": "^2.1.1", 979 | "string-width": "^4.2.0", 980 | "y18n": "^5.0.5", 981 | "yargs-parser": "^20.2.2" 982 | }, 983 | "engines": { 984 | "node": ">=10" 985 | } 986 | }, 987 | "node_modules/yargs-parser": { 988 | "version": "20.2.4", 989 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 990 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 991 | "dev": true, 992 | "engines": { 993 | "node": ">=10" 994 | } 995 | }, 996 | "node_modules/yargs-unparser": { 997 | "version": "2.0.0", 998 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 999 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1000 | "dev": true, 1001 | "dependencies": { 1002 | "camelcase": "^6.0.0", 1003 | "decamelize": "^4.0.0", 1004 | "flat": "^5.0.2", 1005 | "is-plain-obj": "^2.1.0" 1006 | }, 1007 | "engines": { 1008 | "node": ">=10" 1009 | } 1010 | }, 1011 | "node_modules/yocto-queue": { 1012 | "version": "0.1.0", 1013 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1014 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1015 | "dev": true, 1016 | "engines": { 1017 | "node": ">=10" 1018 | }, 1019 | "funding": { 1020 | "url": "https://github.com/sponsors/sindresorhus" 1021 | } 1022 | } 1023 | }, 1024 | "dependencies": { 1025 | "@types/node": { 1026 | "version": "17.0.10", 1027 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", 1028 | "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==", 1029 | "dev": true 1030 | }, 1031 | "ansi-colors": { 1032 | "version": "4.1.1", 1033 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1034 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1035 | "dev": true 1036 | }, 1037 | "ansi-regex": { 1038 | "version": "5.0.1", 1039 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1040 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1041 | "dev": true 1042 | }, 1043 | "ansi-styles": { 1044 | "version": "4.3.0", 1045 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1046 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1047 | "dev": true, 1048 | "requires": { 1049 | "color-convert": "^2.0.1" 1050 | } 1051 | }, 1052 | "anymatch": { 1053 | "version": "3.1.3", 1054 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1055 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1056 | "dev": true, 1057 | "requires": { 1058 | "normalize-path": "^3.0.0", 1059 | "picomatch": "^2.0.4" 1060 | } 1061 | }, 1062 | "argparse": { 1063 | "version": "2.0.1", 1064 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1065 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1066 | "dev": true 1067 | }, 1068 | "assertion-error": { 1069 | "version": "1.1.0", 1070 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1071 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 1072 | "dev": true 1073 | }, 1074 | "balanced-match": { 1075 | "version": "1.0.2", 1076 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1077 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1078 | "dev": true 1079 | }, 1080 | "binary-extensions": { 1081 | "version": "2.2.0", 1082 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1083 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1084 | "dev": true 1085 | }, 1086 | "brace-expansion": { 1087 | "version": "2.0.1", 1088 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1089 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1090 | "dev": true, 1091 | "requires": { 1092 | "balanced-match": "^1.0.0" 1093 | } 1094 | }, 1095 | "braces": { 1096 | "version": "3.0.3", 1097 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1098 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1099 | "dev": true, 1100 | "requires": { 1101 | "fill-range": "^7.1.1" 1102 | } 1103 | }, 1104 | "browser-stdout": { 1105 | "version": "1.3.1", 1106 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1107 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1108 | "dev": true 1109 | }, 1110 | "camelcase": { 1111 | "version": "6.3.0", 1112 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1113 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1114 | "dev": true 1115 | }, 1116 | "chai": { 1117 | "version": "4.1.2", 1118 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 1119 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 1120 | "dev": true, 1121 | "requires": { 1122 | "assertion-error": "^1.0.1", 1123 | "check-error": "^1.0.1", 1124 | "deep-eql": "^3.0.0", 1125 | "get-func-name": "^2.0.0", 1126 | "pathval": "^1.0.0", 1127 | "type-detect": "^4.0.0" 1128 | } 1129 | }, 1130 | "chalk": { 1131 | "version": "4.1.2", 1132 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1133 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1134 | "dev": true, 1135 | "requires": { 1136 | "ansi-styles": "^4.1.0", 1137 | "supports-color": "^7.1.0" 1138 | }, 1139 | "dependencies": { 1140 | "supports-color": { 1141 | "version": "7.2.0", 1142 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1143 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1144 | "dev": true, 1145 | "requires": { 1146 | "has-flag": "^4.0.0" 1147 | } 1148 | } 1149 | } 1150 | }, 1151 | "check-error": { 1152 | "version": "1.0.2", 1153 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 1154 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 1155 | "dev": true 1156 | }, 1157 | "chokidar": { 1158 | "version": "3.5.3", 1159 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1160 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1161 | "dev": true, 1162 | "requires": { 1163 | "anymatch": "~3.1.2", 1164 | "braces": "~3.0.2", 1165 | "fsevents": "~2.3.2", 1166 | "glob-parent": "~5.1.2", 1167 | "is-binary-path": "~2.1.0", 1168 | "is-glob": "~4.0.1", 1169 | "normalize-path": "~3.0.0", 1170 | "readdirp": "~3.6.0" 1171 | } 1172 | }, 1173 | "cliui": { 1174 | "version": "7.0.4", 1175 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1176 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1177 | "dev": true, 1178 | "requires": { 1179 | "string-width": "^4.2.0", 1180 | "strip-ansi": "^6.0.0", 1181 | "wrap-ansi": "^7.0.0" 1182 | } 1183 | }, 1184 | "color-convert": { 1185 | "version": "2.0.1", 1186 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1187 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1188 | "dev": true, 1189 | "requires": { 1190 | "color-name": "~1.1.4" 1191 | } 1192 | }, 1193 | "color-name": { 1194 | "version": "1.1.4", 1195 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1196 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1197 | "dev": true 1198 | }, 1199 | "concat-map": { 1200 | "version": "0.0.1", 1201 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1202 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1203 | "dev": true 1204 | }, 1205 | "debug": { 1206 | "version": "4.3.4", 1207 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1208 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1209 | "dev": true, 1210 | "requires": { 1211 | "ms": "2.1.2" 1212 | }, 1213 | "dependencies": { 1214 | "ms": { 1215 | "version": "2.1.2", 1216 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1217 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1218 | "dev": true 1219 | } 1220 | } 1221 | }, 1222 | "decamelize": { 1223 | "version": "4.0.0", 1224 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1225 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1226 | "dev": true 1227 | }, 1228 | "deep-eql": { 1229 | "version": "3.0.1", 1230 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 1231 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 1232 | "dev": true, 1233 | "requires": { 1234 | "type-detect": "^4.0.0" 1235 | } 1236 | }, 1237 | "diff": { 1238 | "version": "5.0.0", 1239 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 1240 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 1241 | "dev": true 1242 | }, 1243 | "emoji-regex": { 1244 | "version": "8.0.0", 1245 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1246 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1247 | "dev": true 1248 | }, 1249 | "escalade": { 1250 | "version": "3.1.1", 1251 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1252 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1253 | "dev": true 1254 | }, 1255 | "escape-string-regexp": { 1256 | "version": "4.0.0", 1257 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1258 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1259 | "dev": true 1260 | }, 1261 | "fill-range": { 1262 | "version": "7.1.1", 1263 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1264 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1265 | "dev": true, 1266 | "requires": { 1267 | "to-regex-range": "^5.0.1" 1268 | } 1269 | }, 1270 | "find-up": { 1271 | "version": "5.0.0", 1272 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1273 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1274 | "dev": true, 1275 | "requires": { 1276 | "locate-path": "^6.0.0", 1277 | "path-exists": "^4.0.0" 1278 | } 1279 | }, 1280 | "flat": { 1281 | "version": "5.0.2", 1282 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1283 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1284 | "dev": true 1285 | }, 1286 | "fs.realpath": { 1287 | "version": "1.0.0", 1288 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1289 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1290 | "dev": true 1291 | }, 1292 | "fsevents": { 1293 | "version": "2.3.2", 1294 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1295 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1296 | "dev": true, 1297 | "optional": true 1298 | }, 1299 | "get-caller-file": { 1300 | "version": "2.0.5", 1301 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1302 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1303 | "dev": true 1304 | }, 1305 | "get-func-name": { 1306 | "version": "2.0.0", 1307 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 1308 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 1309 | "dev": true 1310 | }, 1311 | "glob": { 1312 | "version": "7.2.0", 1313 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 1314 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 1315 | "dev": true, 1316 | "requires": { 1317 | "fs.realpath": "^1.0.0", 1318 | "inflight": "^1.0.4", 1319 | "inherits": "2", 1320 | "minimatch": "^3.0.4", 1321 | "once": "^1.3.0", 1322 | "path-is-absolute": "^1.0.0" 1323 | }, 1324 | "dependencies": { 1325 | "brace-expansion": { 1326 | "version": "1.1.11", 1327 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1328 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1329 | "dev": true, 1330 | "requires": { 1331 | "balanced-match": "^1.0.0", 1332 | "concat-map": "0.0.1" 1333 | } 1334 | }, 1335 | "minimatch": { 1336 | "version": "3.1.2", 1337 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1338 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1339 | "dev": true, 1340 | "requires": { 1341 | "brace-expansion": "^1.1.7" 1342 | } 1343 | } 1344 | } 1345 | }, 1346 | "glob-parent": { 1347 | "version": "5.1.2", 1348 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1349 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1350 | "dev": true, 1351 | "requires": { 1352 | "is-glob": "^4.0.1" 1353 | } 1354 | }, 1355 | "has-flag": { 1356 | "version": "4.0.0", 1357 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1358 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1359 | "dev": true 1360 | }, 1361 | "he": { 1362 | "version": "1.2.0", 1363 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1364 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1365 | "dev": true 1366 | }, 1367 | "inflight": { 1368 | "version": "1.0.6", 1369 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1370 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1371 | "dev": true, 1372 | "requires": { 1373 | "once": "^1.3.0", 1374 | "wrappy": "1" 1375 | } 1376 | }, 1377 | "inherits": { 1378 | "version": "2.0.4", 1379 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1380 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1381 | "dev": true 1382 | }, 1383 | "is-binary-path": { 1384 | "version": "2.1.0", 1385 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1386 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1387 | "dev": true, 1388 | "requires": { 1389 | "binary-extensions": "^2.0.0" 1390 | } 1391 | }, 1392 | "is-extglob": { 1393 | "version": "2.1.1", 1394 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1395 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1396 | "dev": true 1397 | }, 1398 | "is-fullwidth-code-point": { 1399 | "version": "3.0.0", 1400 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1401 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1402 | "dev": true 1403 | }, 1404 | "is-glob": { 1405 | "version": "4.0.3", 1406 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1407 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1408 | "dev": true, 1409 | "requires": { 1410 | "is-extglob": "^2.1.1" 1411 | } 1412 | }, 1413 | "is-number": { 1414 | "version": "7.0.0", 1415 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1416 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1417 | "dev": true 1418 | }, 1419 | "is-plain-obj": { 1420 | "version": "2.1.0", 1421 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1422 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1423 | "dev": true 1424 | }, 1425 | "is-unicode-supported": { 1426 | "version": "0.1.0", 1427 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1428 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1429 | "dev": true 1430 | }, 1431 | "js-yaml": { 1432 | "version": "4.1.0", 1433 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1434 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1435 | "dev": true, 1436 | "requires": { 1437 | "argparse": "^2.0.1" 1438 | } 1439 | }, 1440 | "locate-path": { 1441 | "version": "6.0.0", 1442 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1443 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1444 | "dev": true, 1445 | "requires": { 1446 | "p-locate": "^5.0.0" 1447 | } 1448 | }, 1449 | "log-symbols": { 1450 | "version": "4.1.0", 1451 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1452 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1453 | "dev": true, 1454 | "requires": { 1455 | "chalk": "^4.1.0", 1456 | "is-unicode-supported": "^0.1.0" 1457 | } 1458 | }, 1459 | "minimatch": { 1460 | "version": "5.0.1", 1461 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 1462 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 1463 | "dev": true, 1464 | "requires": { 1465 | "brace-expansion": "^2.0.1" 1466 | } 1467 | }, 1468 | "mocha": { 1469 | "version": "10.2.0", 1470 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1471 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1472 | "dev": true, 1473 | "requires": { 1474 | "ansi-colors": "4.1.1", 1475 | "browser-stdout": "1.3.1", 1476 | "chokidar": "3.5.3", 1477 | "debug": "4.3.4", 1478 | "diff": "5.0.0", 1479 | "escape-string-regexp": "4.0.0", 1480 | "find-up": "5.0.0", 1481 | "glob": "7.2.0", 1482 | "he": "1.2.0", 1483 | "js-yaml": "4.1.0", 1484 | "log-symbols": "4.1.0", 1485 | "minimatch": "5.0.1", 1486 | "ms": "2.1.3", 1487 | "nanoid": "3.3.3", 1488 | "serialize-javascript": "6.0.0", 1489 | "strip-json-comments": "3.1.1", 1490 | "supports-color": "8.1.1", 1491 | "workerpool": "6.2.1", 1492 | "yargs": "16.2.0", 1493 | "yargs-parser": "20.2.4", 1494 | "yargs-unparser": "2.0.0" 1495 | } 1496 | }, 1497 | "ms": { 1498 | "version": "2.1.3", 1499 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1500 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1501 | "dev": true 1502 | }, 1503 | "nan": { 1504 | "version": "2.14.0", 1505 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 1506 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 1507 | }, 1508 | "nanoid": { 1509 | "version": "3.3.3", 1510 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1511 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1512 | "dev": true 1513 | }, 1514 | "normalize-path": { 1515 | "version": "3.0.0", 1516 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1517 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1518 | "dev": true 1519 | }, 1520 | "once": { 1521 | "version": "1.4.0", 1522 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1523 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1524 | "dev": true, 1525 | "requires": { 1526 | "wrappy": "1" 1527 | } 1528 | }, 1529 | "p-limit": { 1530 | "version": "3.1.0", 1531 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1532 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1533 | "dev": true, 1534 | "requires": { 1535 | "yocto-queue": "^0.1.0" 1536 | } 1537 | }, 1538 | "p-locate": { 1539 | "version": "5.0.0", 1540 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1541 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1542 | "dev": true, 1543 | "requires": { 1544 | "p-limit": "^3.0.2" 1545 | } 1546 | }, 1547 | "path-exists": { 1548 | "version": "4.0.0", 1549 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1550 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1551 | "dev": true 1552 | }, 1553 | "path-is-absolute": { 1554 | "version": "1.0.1", 1555 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1556 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1557 | "dev": true 1558 | }, 1559 | "pathval": { 1560 | "version": "1.1.0", 1561 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1562 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1563 | "dev": true 1564 | }, 1565 | "picomatch": { 1566 | "version": "2.3.1", 1567 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1568 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1569 | "dev": true 1570 | }, 1571 | "randombytes": { 1572 | "version": "2.1.0", 1573 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1574 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1575 | "dev": true, 1576 | "requires": { 1577 | "safe-buffer": "^5.1.0" 1578 | } 1579 | }, 1580 | "readdirp": { 1581 | "version": "3.6.0", 1582 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1583 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1584 | "dev": true, 1585 | "requires": { 1586 | "picomatch": "^2.2.1" 1587 | } 1588 | }, 1589 | "require-directory": { 1590 | "version": "2.1.1", 1591 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1592 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1593 | "dev": true 1594 | }, 1595 | "safe-buffer": { 1596 | "version": "5.2.1", 1597 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1598 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1599 | "dev": true 1600 | }, 1601 | "serialize-javascript": { 1602 | "version": "6.0.0", 1603 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1604 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1605 | "dev": true, 1606 | "requires": { 1607 | "randombytes": "^2.1.0" 1608 | } 1609 | }, 1610 | "string-width": { 1611 | "version": "4.2.3", 1612 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1613 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1614 | "dev": true, 1615 | "requires": { 1616 | "emoji-regex": "^8.0.0", 1617 | "is-fullwidth-code-point": "^3.0.0", 1618 | "strip-ansi": "^6.0.1" 1619 | } 1620 | }, 1621 | "strip-ansi": { 1622 | "version": "6.0.1", 1623 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1624 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1625 | "dev": true, 1626 | "requires": { 1627 | "ansi-regex": "^5.0.1" 1628 | } 1629 | }, 1630 | "strip-json-comments": { 1631 | "version": "3.1.1", 1632 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1633 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1634 | "dev": true 1635 | }, 1636 | "supports-color": { 1637 | "version": "8.1.1", 1638 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1639 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1640 | "dev": true, 1641 | "requires": { 1642 | "has-flag": "^4.0.0" 1643 | } 1644 | }, 1645 | "to-regex-range": { 1646 | "version": "5.0.1", 1647 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1648 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1649 | "dev": true, 1650 | "requires": { 1651 | "is-number": "^7.0.0" 1652 | } 1653 | }, 1654 | "type-detect": { 1655 | "version": "4.0.8", 1656 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1657 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1658 | "dev": true 1659 | }, 1660 | "typescript": { 1661 | "version": "4.5.4", 1662 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", 1663 | "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", 1664 | "dev": true 1665 | }, 1666 | "workerpool": { 1667 | "version": "6.2.1", 1668 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 1669 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 1670 | "dev": true 1671 | }, 1672 | "wrap-ansi": { 1673 | "version": "7.0.0", 1674 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1675 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1676 | "dev": true, 1677 | "requires": { 1678 | "ansi-styles": "^4.0.0", 1679 | "string-width": "^4.1.0", 1680 | "strip-ansi": "^6.0.0" 1681 | } 1682 | }, 1683 | "wrappy": { 1684 | "version": "1.0.2", 1685 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1686 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1687 | "dev": true 1688 | }, 1689 | "y18n": { 1690 | "version": "5.0.8", 1691 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1692 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1693 | "dev": true 1694 | }, 1695 | "yargs": { 1696 | "version": "16.2.0", 1697 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1698 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1699 | "dev": true, 1700 | "requires": { 1701 | "cliui": "^7.0.2", 1702 | "escalade": "^3.1.1", 1703 | "get-caller-file": "^2.0.5", 1704 | "require-directory": "^2.1.1", 1705 | "string-width": "^4.2.0", 1706 | "y18n": "^5.0.5", 1707 | "yargs-parser": "^20.2.2" 1708 | } 1709 | }, 1710 | "yargs-parser": { 1711 | "version": "20.2.4", 1712 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1713 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1714 | "dev": true 1715 | }, 1716 | "yargs-unparser": { 1717 | "version": "2.0.0", 1718 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1719 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1720 | "dev": true, 1721 | "requires": { 1722 | "camelcase": "^6.0.0", 1723 | "decamelize": "^4.0.0", 1724 | "flat": "^5.0.2", 1725 | "is-plain-obj": "^2.1.0" 1726 | } 1727 | }, 1728 | "yocto-queue": { 1729 | "version": "0.1.0", 1730 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1731 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1732 | "dev": true 1733 | } 1734 | } 1735 | } 1736 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "event-loop-stats", 3 | "version": "1.4.1", 4 | "description": "Exposes stats about the libuv default loop", 5 | "main": "src/eventLoopStats.js", 6 | "types": "src/eventLoopStats.d.ts", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/bripkens/event-loop-stats.git" 10 | }, 11 | "author": "Ben Blackmore ", 12 | "license": "MIT", 13 | "keywords": [ 14 | "libuv", 15 | "stats", 16 | "monitoring", 17 | "loop" 18 | ], 19 | "scripts": { 20 | "install": "node-gyp rebuild", 21 | "rebuild": "node-gyp rebuild", 22 | "test": "mocha && tsc --noEmit --strict --esModuleInterop --module commonjs test/types.ts" 23 | }, 24 | "engines": { 25 | "node": ">=4.0.0" 26 | }, 27 | "dependencies": { 28 | "nan": "^2.14.0" 29 | }, 30 | "gypfile": true, 31 | "devDependencies": { 32 | "@types/node": "^17.0.10", 33 | "chai": "4.1.2", 34 | "mocha": "10.2.0", 35 | "typescript": "^4.5.4" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/eventLoopStats.cc: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace v8; 4 | 5 | // Casting -1 to an uint will give the max uint value 6 | const uint32_t maxPossibleUint32 = -1; 7 | const uint64_t maxPossibleUint64 = -1; 8 | const uint32_t minPossibleUint32 = 0; 9 | 10 | uv_check_t check_handle; 11 | 12 | // The minimum event loop duration since the last sense() call. 13 | uint32_t min; 14 | // The maximum event loop duration since the last sense() call. 15 | uint32_t max; 16 | // The sum of event loop durations the last sense() call. 17 | uint32_t sum; 18 | // The number of event loop iterations since the last sense() call. 19 | uint32_t num; 20 | 21 | uint64_t previous_now = maxPossibleUint64; 22 | 23 | // This will be called after each sense call. 24 | void reset() { 25 | min = maxPossibleUint32; 26 | max = minPossibleUint32; 27 | sum = 0; 28 | num = 0; 29 | } 30 | 31 | // This will be called once per event loop iteration, right after polling 32 | // for i/o. See http://docs.libuv.org/en/v1.x/design.html#the-i-o-loop for a 33 | // general overview and http://docs.libuv.org/en/v1.x/check.html for details. 34 | void on_check(uv_check_t* handle) { 35 | // An earlier incarnation of event-loop-stats checked uv_hrtime() against 36 | // uv_now(handle->loop), which doesn't seem to work -- for example, it does 37 | // not detect long event loop iterations caused by a synchronous block due to 38 | // long running for- or while-loops. Checking against the time of the same 39 | // point at the last iteration of the event loop also covers these cases. 40 | 41 | const uint64_t now = uv_hrtime(); 42 | uint32_t duration; 43 | 44 | if (previous_now >= now) { 45 | // This only happens on the very first call on_check call. Since we have no 46 | // timestamp to compare to from an earlier on_check call, we start by 47 | // assuming an event loop lag of zero. 48 | duration = 0; 49 | } else { 50 | // Calculate the duration since the last on_check call - this is the 51 | // event loop lag. 52 | // And convert to milliseconds (uv_hrtime yields nanos). 53 | duration = (now - previous_now) / static_cast(1e6); 54 | } 55 | 56 | // save min/max values 57 | if (duration < min) { 58 | min = duration; 59 | } 60 | if (duration > max) { 61 | max = duration; 62 | } 63 | 64 | // Sum up all durations between two consecutive sense() calls. 65 | sum += duration; 66 | 67 | // Simply count all event loop iterations between two sense() calls. 68 | num += 1; 69 | 70 | // Save the current timestamp for the next on_check call for comparison. 71 | previous_now = now; 72 | } 73 | 74 | 75 | static NAN_METHOD(sense) { 76 | // Reset min and max counters when there were no calls. 77 | if (num == 0) { 78 | min = 0; 79 | max = 0; 80 | } 81 | 82 | Local obj = Nan::New(); 83 | Nan::Set( 84 | obj, 85 | Nan::New("min").ToLocalChecked(), 86 | Nan::New(static_cast(min)) 87 | ); 88 | Nan::Set( 89 | obj, 90 | Nan::New("max").ToLocalChecked(), 91 | Nan::New(static_cast(max)) 92 | ); 93 | Nan::Set( 94 | obj, 95 | Nan::New("num").ToLocalChecked(), 96 | Nan::New(static_cast(num)) 97 | ); 98 | Nan::Set( 99 | obj, 100 | Nan::New("sum").ToLocalChecked(), 101 | Nan::New(static_cast(sum)) 102 | ); 103 | 104 | reset(); 105 | 106 | info.GetReturnValue().Set(obj); 107 | } 108 | 109 | 110 | NAN_MODULE_INIT(init) { 111 | reset(); 112 | 113 | uv_check_init(uv_default_loop(), &check_handle); 114 | uv_check_start(&check_handle, reinterpret_cast(on_check)); 115 | uv_unref(reinterpret_cast(&check_handle)); 116 | 117 | Nan::Set(target, 118 | Nan::New("sense").ToLocalChecked(), 119 | Nan::GetFunction(Nan::New(sense)).ToLocalChecked() 120 | ); 121 | } 122 | 123 | NODE_MODULE(eventLoopStats, init) 124 | -------------------------------------------------------------------------------- /src/eventLoopStats.d.ts: -------------------------------------------------------------------------------- 1 | export interface EventLoopStats { 2 | /** 3 | * Maximum number of milliseconds spent in a single loop since last sense call 4 | */ 5 | max: number; 6 | /** 7 | * Minimum number of milliseconds spent in a single loop since last sense call 8 | */ 9 | min: number; 10 | /** 11 | * Total number of milliseconds spent in the loop since last sense call 12 | */ 13 | sum: number; 14 | /** 15 | * Total number of loops since last sense call 16 | */ 17 | num: number; 18 | } 19 | 20 | export function sense(): EventLoopStats; 21 | 22 | -------------------------------------------------------------------------------- /src/eventLoopStats.js: -------------------------------------------------------------------------------- 1 | var eventLoopStats = require('../build/Release/eventLoopStats'); 2 | exports.sense = eventLoopStats.sense; 3 | -------------------------------------------------------------------------------- /test/eventLoopStats.js: -------------------------------------------------------------------------------- 1 | var eventLoopStats = require('..'); 2 | var expect = require('chai').expect; 3 | 4 | describe('eventLoopStats', function() { 5 | it('should expose a sense function', function() { 6 | expect(eventLoopStats.sense).to.be.a('function'); 7 | }); 8 | 9 | it('should return stats via the sense function', function(done) { 10 | setTimeout(function() { 11 | // provoke execution on the default loop 12 | }, 500); 13 | 14 | setTimeout(function() { 15 | var stats = eventLoopStats.sense(); 16 | expect(stats.num).to.be.a('number'); 17 | expect(stats.num).to.be.gt(0); 18 | expect(stats.sum).to.be.a('number'); 19 | expect(stats.max).to.be.a('number'); 20 | expect(stats.min).to.be.a('number'); 21 | done(); 22 | }, 1000); 23 | }); 24 | 25 | // This pattern will usually allow for at least _two_ on_check calls between 26 | // the two sense calls. Check the next test for a slightly different pattern. 27 | it('should detect a blocked event loop', function(done) { 28 | // Call sense to reset max. 29 | eventLoopStats.sense(); 30 | // On the next tick, block for 500ms. 31 | setTimeout(function() { 32 | var waitUntill = new Date(Date.now() + 500); 33 | // Block event loop with busy waiting. 34 | while (waitUntill > new Date()) {} 35 | 36 | // On the next tick, detect stats again - the 500 ms block should have 37 | // been noticed. 38 | setTimeout(function() { 39 | var stats = eventLoopStats.sense(); 40 | expect(stats.max).to.be.gte(490); 41 | expect(stats.max).to.be.lt(2000); 42 | expect(stats.sum).to.be.gte(490); 43 | expect(stats.sum).to.be.lt(2000); 44 | 45 | // At least two on_check calls should have happened (older Node.js versions will call it more often). 46 | expect(stats.num).to.be.gte(2); 47 | 48 | // Since there are at least two on_check calls, min and max should be different. 49 | expect(stats.min).to.be.gte(0); 50 | expect(stats.min).to.be.lt(stats.max); 51 | 52 | done(); 53 | }, 0); 54 | }, 0); 55 | }); 56 | 57 | // This pattern will typically allow for only _one_ on_check call between the 58 | // two sense calls (at least on more recent Node.js versions). Check the 59 | // previous test for a slightly different pattern. 60 | it('one on_check call should suffice to report correct max duration ', function(done) { 61 | // Call sense to reset max. 62 | eventLoopStats.sense(); 63 | var now = Date.now(); 64 | var end = now + 50; 65 | setTimeout(function() { 66 | // After 100ms, call sense again - the 50ms block (see below) should have been noticed. 67 | var stats = eventLoopStats.sense(); 68 | expect(stats.max).to.be.gte(40); 69 | expect(stats.max).to.be.lt(1000); 70 | expect(stats.sum).to.be.gte(40); 71 | expect(stats.sum).to.be.lt(1000); 72 | 73 | // Only one on_check call might have happened. 74 | expect(stats.num).to.gte(1); 75 | 76 | done(); 77 | }, 100); 78 | 79 | // Directly block for 50ms right in this tick, synchronously. 80 | while (Date.now() < end) {} 81 | }); 82 | }); 83 | -------------------------------------------------------------------------------- /test/types.ts: -------------------------------------------------------------------------------- 1 | import {sense} from '../src/eventLoopStats'; 2 | 3 | const stats = sense(); 4 | 5 | const max: number = stats.max; 6 | const min: number = stats.min; 7 | const sum: number = stats.sum; 8 | const num: number = stats.num; 9 | 10 | console.log({ 11 | max, 12 | min, 13 | sum, 14 | num 15 | }); 16 | --------------------------------------------------------------------------------