├── .eslintrc.js ├── .github └── workflows │ └── publish-native-assets-to-github-releases.yml ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── binding.gyp ├── index.js ├── lib ├── cpuProfileWorker.js ├── heapdumpWorker.js ├── index.js └── node_oom_heapdump_native.cc ├── package-lock.json ├── package.json └── tests ├── index.js ├── long_running_process.js ├── long_running_process_cpu.js └── oom_app.js /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "extends": "google" 3 | }; -------------------------------------------------------------------------------- /.github/workflows/publish-native-assets-to-github-releases.yml: -------------------------------------------------------------------------------- 1 | # This workflow will prebuild native binaries for supported NodeJS versions, and add them to the Github release that triggered the workflow 2 | 3 | name: Add native binaries to release 4 | 5 | on: 6 | release: 7 | types: [created] 8 | 9 | jobs: 10 | augment-release: 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | matrix: 14 | node-version: [18.x, 20.x, 22.x, 24.x] 15 | os: [ubuntu-latest, macos-latest, windows-latest] 16 | steps: 17 | - uses: actions/checkout@v2 18 | - name: Use Node.js ${{ matrix.node-version }} 19 | uses: actions/setup-node@v1 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | - name: Add msbuild to PATH 23 | if: matrix.os == 'windows-latest' 24 | uses: microsoft/setup-msbuild@v1.1 25 | - name: Install node-gyp 26 | if: matrix.os == 'windows-latest' 27 | shell: powershell 28 | run: | 29 | npm install --global npm@latest 30 | npm install --global node-gyp@latest 31 | - name: build using node-pre-gyp 32 | run: | 33 | npm install --build-from-source 34 | npx node-pre-gyp package 35 | - name: Upload native binaries for Node ${{ matrix.node-version }} for ${{ matrix.os }} 36 | uses: csexton/release-asset-action@v2 37 | with: 38 | pattern: "build/stage/*.tar.gz" 39 | github-token: ${{ secrets.GITHUB_TOKEN }} 40 | release-url: ${{ github.event.release.upload_url }} 41 | 42 | alpine-release: 43 | runs-on: ubuntu-latest 44 | strategy: 45 | matrix: 46 | node-version: [18, 20, 22, 24] 47 | container: node:${{ matrix.node-version }}-alpine3.20 48 | steps: 49 | - uses: actions/checkout@v2 50 | - name: install build deps 51 | run: | 52 | apk add g++ make python3 53 | - name: build using node-pre-gyp 54 | run: | 55 | npm install 56 | npx node-pre-gyp rebuild 57 | npx node-pre-gyp package 58 | - name: Upload native binaries for Node ${{ matrix.node-version }} for alpine 59 | uses: csexton/release-asset-action@v2 60 | with: 61 | pattern: "build/stage/*.tar.gz" 62 | github-token: ${{ secrets.GITHUB_TOKEN }} 63 | release-url: ${{ github.event.release.upload_url }} 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | *.heapsnapshot 61 | *.cpuprofile -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "7" 4 | - "8" 5 | - "9" 6 | - "10" 7 | - "11" 8 | - "12" 9 | - "13" 10 | - "14" 11 | - "15" 12 | - "16" 13 | - "17" 14 | - "18" 15 | - "20" 16 | script: npm run dummy 17 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 12-05-2025 Paul Rütter 2 | - 3.6.0 3 | - Upgrade dependencies 4 | 5 | 11-12-2024 Paul Rütter 6 | - 3.4.0 7 | - Upgrade dependencies due to https://security.snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 8 | 9 | 18-06-2024 Paul Rütter 10 | - 3.3.1 11 | - Upgrade dependencies due to https://security.snyk.io/vuln/SNYK-JS-WS-7266574 12 | 13 | 10-06-2024 Paul Rütter 14 | - 3.3.0 15 | - Add prebuilt binaries for Alpine, https://github.com/blueconic/node-oom-heapdump/pull/16 16 | 17 | 16-05-2024 Paul Rütter 18 | - 3.2.3 19 | - Release to fix prebuilt binaries for node 22.x 20 | 21 | 25-04-2024 Paul Rütter 22 | - 3.2.2 23 | - Release to update dependencies 24 | 25 | 27-10-2023 Paul Rütter 26 | - 3.2.0 27 | - https://github.com/blueconic/node-oom-heapdump/issues/31: Node20 support 28 | - Change native code to use different method signature for Node20 and above, remain compatible for Node18 and below. 29 | 30 | 26-10-2023 Paul Rütter 31 | - 3.1.0 32 | - https://github.com/blueconic/node-oom-heapdump/issues/28: only build prebuilt binaries for > 16.x, as Github Actions no longer supports older versions. 33 | 34 | 19-10-2023 Paul Rütter 35 | - 3.0.4 36 | - Update dependencies 37 | 38 | 04-08-2023 Paul Rütter 39 | - 3.0.3 40 | - Prefer IPv4 (https://github.com/blueconic/node-oom-heapdump/pull/29) 41 | - Update dependencies 42 | 43 | 24-07-2022 Paul Rütter 44 | - 3.0.2 45 | - Add Node18, as it's LTS now 46 | - Upgrade dependencies 47 | 48 | 10-02-2022 Paul Rütter 49 | - 3.0.1 50 | - Fixed building native artifacts on Windows, thanks spmiller! https://github.com/blueconic/node-oom-heapdump/issues/22 51 | 52 | 10-02-2022 Paul Rütter 53 | - 3.0.0 54 | - Added Node 16 support (by merging https://github.com/blueconic/node-oom-heapdump/pull/20, Thanks Simon Abbott!). 55 | This fixes a recursion issue. 56 | - Removed "GC_MONITORING" at it relied on `gc-stats`, which is no longer maintained (and contained security issues) 57 | - Updated `node-pre-gyp` to `@mapbox/node-pre-gyp` so security issues are mitigated 58 | 59 | 12-10-2020 Paul Rütter 60 | - 2.1.0 61 | - Added Node 14 support 62 | 63 | 12-10-2020 Paul Rütter 64 | - 2.0.2 65 | - Fix latest published version, was replaced with beta. 66 | 67 | 02-08-2020 Paul Rütter 68 | - 2.0.1 69 | - Fixed prebuilt binaries path. 70 | 71 | 20-07-2020 Paul Rütter 72 | - 2.0 73 | - Added prebuilt binaries again, in a new major version. To "solve" https://github.com/blueconic/node-oom-heapdump/issues/13. 74 | 75 | 20-07-2020 Paul Rütter 76 | - 1.3.1 77 | - Revert prebuilt binaries, since it's a breaking change. 78 | 79 | 24-06-2020 Stuart Miller / Paul Rütter 80 | - 1.3.0 81 | - Stuart Miller added support for having prebuilt binaries for all supported Node.js versions. 82 | 83 | 16-10-2019 Paul Rütter 84 | - 1.2.0 85 | - Node 12 support. 86 | - Still some deprecated API's are used, which should be avoided. 87 | See https://github.com/joyeecheung/node/blob/v8-maybe-doc/CPP_STYLE_GUIDE.md#use-maybe-version-of-v8-apis 88 | - Adjusted test script a bit, by removing some flags which seem to complicate nodejs 12 support. 89 | 90 | 02-09-2019 Paul Rütter 91 | - 1.2.0-beta.0 92 | - Updated dependencies (nan update is needed for nodejs 12) 93 | - Add nodejs 12 to travis 94 | - Add experimental node 12 support. Still some deprecated API's are used, which should be avoided. 95 | See https://github.com/joyeecheung/node/blob/v8-maybe-doc/CPP_STYLE_GUIDE.md#use-maybe-version-of-v8-apis 96 | 97 | 02-01-2019 Paul Rütter 98 | - 1.1.4 99 | - Updated dependencies 100 | - Add travis file to trigger a build. Just run a dummy script which does nothing; the default "npm install" will check if the native module compiles. 101 | 102 | 09-06-2018 Paul Rütter 103 | - 1.1.3 - Updated dependencies, to mitigate security issues. 104 | 105 | 02-20-2018 Paul Rütter 106 | - 1.1.2 - Fixed heapdump generation on Unix machines. 107 | - Added option to use the "old" implementation (GCmonitoring), as the new implementatuion is more prone to run in with the OoM killer when in memory restricted environments (like Docker). The old implementation was less impacted by this, because the "threshold" parameter can be used to create the heapdump earlier. 108 | You can specify which OoM implementation to use, either: "NATIVE_HOOK" (default) or "GC_MONITORING" (old implementation). 109 | 110 | 02-19-2018 Paul Rütter 111 | - 1.1.0 - Changed the way the "out of memory" heapdump is created, based on the work of 'trevnorris' (https://github.com/trevnorris/node-ofe/blob/master/ofe.cc). Using V8 engine isolate.SetOOMErrorHandler() to hook in on the out of memory event. 112 | - Updated readme and removed deprecated 'limit' and 'threshold' parameters. 113 | - Removed 'gc-stats' module, as we no longer need it with the native C++ add-on. 114 | 115 | 02-13-2018 - Paul Rütter 116 | - 1.0.12 - Use 'require-main-filename' instead of require.main.filename, to resolve 'https://github.com/blueconic/node-oom-heapdump/issues/3'. 117 | - Upgrade dependencies 118 | 119 | 11-21-2017 - Paul Rütter 120 | - 1.0.11 - Added port verification; when the module is loaded, the configured WebSocket port is verified. If the websocket responds with ECONNREFUSED, the process might have been started without the --inspect flag. 121 | 122 | 11-17-2017 - Paul Rütter 123 | - 1.0.10 - Use gc-stats to calculate when to make a OoM heapdumo instead of process.memoryUsage() as this memory information (heapTotal) is growing over time, which is not expected. 124 | - Stringify gc-stats output, so it runs over only 1 line. 125 | 126 | 06-10-2017 - Paul Rütter 127 | - 1.0.9 - Handle exit codes better and reject promise if so. 128 | 129 | 05-10-2017 - Paul Rütter 130 | - 1.0.8 - Add CPU profile functionality. 131 | 132 | 04-10-2017 - Paul Rütter 133 | - 1.0.7 - Add addTimestamp option. 134 | 135 | 04-10-2017 - Paul Rütter 136 | - 1.0.6 - Add limit option. 137 | 138 | 03-10-2017 - Paul Rütter 139 | - 1.0.5 - Change heap calculation. 140 | 141 | 03-10-2017 - Paul Rütter 142 | - 1.0.4 - Add error handler in case the calling process is not running anymore. Also, block execution a while to allow heapdump to be created. 143 | 144 | 01-10-2017 - Paul Rütter 145 | - 1.0.3 - Minor doc changes. 146 | 147 | 01-10-2017 - Paul Rütter 148 | - 1.0.2 - Refactored code; split up API and implementation. Also added API for creating heapdumps on the fly. Documentation updated. 149 | 150 | 29-09-2017 - Paul Rütter 151 | - 1.0.1 - minor changed 152 | 153 | 29-09-2017 - Paul Rütter 154 | - 1.0.1 - initial version 155 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 BlueConic 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build status](https://github.com/blueconic/node-oom-heapdump/actions/workflows/publish-native-assets-to-github-releases.yml/badge.svg)](https://github.com/blueconic/node-oom-heapdump/actions/workflows/publish-native-assets-to-github-releases.yml) 2 | 3 | # node-oom-heapdump 4 | Node module which will create a V8 heap snapshot right before an "Out of Memory" error occurs. 5 | 6 | It can also create heapdumps and CPU profiles on request like 'v8-profiler', but does this off-process so it doesn't interfere with execution of the main process. 7 | 8 | Tested on Node.js 10.x, 11.x, 12.x, 13.x, 14.x, 15.x, 16.x, 17.x, 18.x, 20.x, 22.x and 24.x. 9 | No support for Node.js < 10.x at the moment in version 3.0.0, use version 2.2.0 for if needed. 10 | 11 | Also comes with prebuilt binaries (hosted on Github releases), thanks to Stuart Miller (https://github.com/spmiller). 12 | From 3.1.0, prebuilt binaries are only shipped for Node.js 16.x and upwards. 13 | From 3.2.3, prebuilt binaries are only shipped for Node.js 18.x and upwards. 14 | In 3.7.0, prebuilt binaries for node 24.x were added. 15 | 16 | ## Node 22.x 17 | Since node 22.x, there is a new CLI flag for generating heapdumps. This one is supplied by V8 (not Node.js) and is more reliant and efficient in creating the heapdumps than Node.js' `--heapsnapshot-near-heap-limit`. 18 | More information: https://github.com/nodejs/node/issues/50711#issuecomment-2149559816 19 | 20 | ``` 21 | node --heap-snapshot-on-oom index.js 22 | ``` 23 | Since node 22.x we had issues with no heapdumps being created in production sometimes (via `--heapsnapshot-near-heap-limit`), which did work when using V8's `--heap-snapshot-on-oom`. 24 | The only disadvantage i encountered is that the filename of the heapdump file does not include a process ID, just the timestamp. 25 | 26 | ## Node.js 14.18.x 27 | https://github.com/nodejs/node/pull/33010 landed in Node.js 14.18.0, which makes this module no longer needed for heapdumps on out of memory. 28 | One can use the `--heapsnapshot-near-heap-limit` Node.js CLI option as an alternative. 29 | See https://nodejs.org/dist/latest-v14.x/docs/api/cli.html#cli_heapsnapshot_near_heap_limit_max_count. 30 | 31 | # Why? 32 | When running nodejs processes in a low memory environment, every out of memory that occurs is interesting. 33 | To figure out why a process went out of memory, a heap snapshot (e.g. heapdump) can help a lot. 34 | This module creates a heap snapshot right before an out of memory error occurs (by leveraging 'SetOOMErrorHandler' of the V8 engine). 35 | It shows what the heap was filled with right before the out of memory error occured and can be opened with Chrome DevTools (Memory tab). 36 | 37 | There are several modules around which can create heapdumps (v8-profiler, node-heapdump), but these run in the same process as the one going out of memory. Often, creating heapdump won't work when the node process is already struggling. 38 | This module creates the heap snapshot from a separate process, which solves this issue. 39 | Also, these modules are not able to create a heapdump when an out of memory occurs. 40 | 41 | # What? 42 | Based on the work of 'trevnorris' (https://github.com/trevnorris/node-ofe/), this module uses 'isolate.SetOOMErrorHandler' (https://v8docs.nodesource.com/node-8.9/d5/dda/classv8_1_1_isolate.html#a08fd4087f39c33b4ac1c20ad953ce4e3) of the V8 engine, and then creates a heapdump when an actual Out of Memory occurs. To make this happen, a native C++ add-on is used. 43 | Node-gyp is needed to compile this add-on. 44 | 45 | When creating a heapdump of CPU profile on request, the DevTools protocol is used to create these files (no native add-on). 46 | The --inspect node.js flag is needed to make this work (which is validated on startup). 47 | 48 | # Example 49 | Just run "npm test" to see it in action. It creates a heapdump named "my_heapdump.heapsnapshot" in the 'tests' directory of this module. 50 | 51 | # Usage 52 | 53 | ```javascript 54 | npm install node-oom-heapdump 55 | ``` 56 | 57 | Just add the following snippet to your node process. 58 | 59 | ```javascript 60 | let path = require('path'); 61 | require('node-oom-heapdump')({ 62 | path: path.resolve(__dirname, 'my_heapdump') 63 | }); 64 | ``` 65 | 66 | To make heapdumps and CPU profiles on request, your node process should at least be started with the "--inspect" (or --inspect=port) flag. When the module is loaded, the configured port is verified. If it doesn't respond correctly, a console warning will be shown. 67 | 68 | When running in a low memory environment, the following flags are advised: 69 | 70 | * --max_old_space_size=60 - this will limit your heapsize on 60MB 71 | * --optimize_for_size - keep memory as low as possible (GC more often than usual) 72 | * --always_compact - keep memory as low as possible (do compactions each GC) 73 | 74 | These might impact performance though. 75 | On Node.js 12.x the latter two flags seem to cause some stability issues (see https://github.com/nodejs/node/issues/27552#issuecomment-542695931). So, if you encounter issues on Node.js 12.x in combination with those flags, please refrain from using these. 76 | 77 | # Options 78 | * heapdumpOnOOM - boolean whether to create a heapdump when an out of memory occurs. Default true. 79 | * OOMImplementation - Only "NATIVE_HOOK" is supported starting from 3.0.0 80 | "NATIVE_HOOK" relies on the native v8 hook and makes sure that the heapdump is actually created when the OoM occurs. It's more impacted by the OoMKiller of Unix systems though, when being run in memory restricted environments like Docker. 81 | * path - the path where the heapdump ends up when an out of memory error occurs. '.heapsnapshot' is automatically appended. Defaults to this modules' directory. 82 | * addTimestamp - add a timestamp to the out of memory heapdump filename, to make it unique. Default is false. 83 | * port - optionally, the alternative DevTools protocol port. Defaults to 9229. Should map on the port given to the --inspect arg. 84 | 85 | # API 86 | Besides creating heapdumps when an out of memory error occurs, there also is an API for creating heapdumps and CPU profiles on request. See below for the currently available API. 87 | 88 | Notice that you cannot create a heapdump while a CPU profile is being generated and vice versa; an Error will be thrown if this is the case. 89 | 90 | ```javascript 91 | let nodeOomHeapdump = require("node-oom-heapdump")({ 92 | heapdumpOnOOM: false 93 | }); 94 | 95 | /** 96 | * Returns the path to the created heap snapshot in a promise, or rejects on error 97 | * @param {String} snapshotPath - path of the snapshot 98 | * @return {Promise} Promise containing the heap snapshot path on success or error on rejection 99 | */ 100 | nodeOomHeapdump.createHeapSnapshot("myheapsnapshotpath").then((snapshotPath) => { 101 | // do something with heap snapshot 102 | 103 | // and delete again from disk 104 | nodeOomHeapdump.deleteHeapSnapshot(snapshotPath); 105 | }).catch((err) => { 106 | // handle error 107 | }); 108 | 109 | /** 110 | * Deletes all previously created heapsnapshots from disk 111 | */ 112 | nodeOomHeapdump.deleteAllHeapSnapshots(); 113 | 114 | /** 115 | * Deletes a particular snapshot from disk 116 | * @param {String} snapshotPath - path of the heap snapshot to delete 117 | * @return {Promise} 118 | */ 119 | nodeOomHeapdump.deleteHeapSnapshot(snapshotPath); 120 | 121 | /** 122 | * Returns the path to the created CPU profile in a promise, or rejects on error 123 | * @param {String} cpuProfilePath - path of the CPU profile 124 | * @param {number} duration - the duration of the CPU profile in ms (default: 30000ms) 125 | * @return {Promise} the CPU profile path on success or error on rejection 126 | */ 127 | nodeOomHeapdump.createCpuProfile("mycpuprofilepath", 10000).then((cpuProfilePath) => { 128 | // do something with CPU profile 129 | 130 | // and delete again from disk 131 | nodeOomHeapdump.deleteCpuProfile(cpuProfilePath); 132 | }).catch((err) => { 133 | // handle error 134 | }); 135 | 136 | /** 137 | * Deletes all previously created CPU profiles from disk 138 | */ 139 | nodeOomHeapdump.deleteAllCpuProfiles(); 140 | 141 | /** 142 | * Deletes a particular CPU profile from disk 143 | * @param {String} cpuProfilePath - path to the CPU profile to delete from disk 144 | * @return {Promise} 145 | */ 146 | nodeOomHeapdump.deleteCpuProfile(cpuProfilePath); 147 | ``` 148 | 149 | # Known issues and limitations 150 | 151 | ## Memory usage 152 | When creating a heapdump on request, it's notorious for using a lot of memory. This is caused by a bug in V8/DevTools protocol and is reported here (https://bugs.chromium.org/p/chromium/issues/detail?id=768355); the protocol has no backpressure mechanism, which causes the heapdump to be pushed faster than the DevTools client can handle, causing in-memory buffering. 153 | 154 | This is not a problem if your server/machine has memory to spare, but can cause issues in memory restricted environments like a Docker container. Once the process exceeds the container memory threshold, it will be killed by OoMKiller (if enabled). This leads to an empty heapsnapshot file (0 bytes). 155 | 156 | Please vote for that issue to be fixed! 157 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | "targets" : [{ 3 | "target_name" : "node_oom_heapdump_native", 4 | "sources" : [ "lib/node_oom_heapdump_native.cc" ], 5 | "include_dirs": [ 6 | ' { 19 | handleError("CPU profile path not valid or writable", err); 20 | }); 21 | 22 | try { 23 | dns.setDefaultResultOrder('ipv4first'); 24 | } catch (e) { 25 | // ignore, method not available before node16 26 | } 27 | 28 | CDP({ 29 | host: 'localhost', 30 | port: devToolsPort 31 | }, (debugInstance) => { 32 | let cpuProfiler = debugInstance.Profiler; 33 | cpuProfiler.enable(); 34 | cpuProfiler.start(); 35 | 36 | setTimeout(() => { 37 | let Profile = cpuProfiler.stop(); 38 | Profile.then((p) => { 39 | writeStream.write(JSON.stringify(p.profile)); 40 | writeStream.end(); 41 | 42 | cpuProfiler.disable(); 43 | 44 | console.error('CPU profile created in \'%s\'. Exiting worker now.', path); 45 | 46 | // were done, exit normally 47 | process.exit(0); 48 | }).catch((err) => { 49 | handleError(err); 50 | }); 51 | }, duration); 52 | }).on('error', (err) => { 53 | // cannot connect to the remote endpoint 54 | handleError(err); 55 | }); 56 | -------------------------------------------------------------------------------- /lib/heapdumpWorker.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | let dns = require("dns"); 3 | 4 | // set global variables based on args passed on to this heapdump worker 5 | let devToolsPort = process.argv[2]; 6 | let path = process.argv[3]; 7 | let logPrefix = (process.argv[4]) ? process.argv[4] + " " : ""; 8 | 9 | console.error('Started heapdump %sworker for \'%s\' on DevTools port \'%s\'.', logPrefix, path, devToolsPort); 10 | 11 | let CDP = require('chrome-remote-interface'); 12 | let writeStream = fs.createWriteStream(path); 13 | let handleError = function (arg1, arg2) { 14 | console.error("Error occurred while creating heapdump", arg1, arg2 || ""); 15 | writeStream.end(); 16 | process.exit(-1); 17 | }; 18 | writeStream.on('error', (err) => { 19 | handleError("Heapdump path not valid or writable", err); 20 | }); 21 | 22 | try { 23 | dns.setDefaultResultOrder('ipv4first'); 24 | } catch (e) { 25 | // ignore, method not available before node16 26 | } 27 | 28 | CDP({ 29 | host: 'localhost', 30 | port: devToolsPort 31 | }, (debugInstance) => { 32 | debugInstance.Debugger.enable(); 33 | debugInstance.Debugger.pause(); 34 | 35 | let heapProfiler = debugInstance.HeapProfiler; 36 | heapProfiler.enable(); 37 | 38 | debugInstance.on('HeapProfiler.addHeapSnapshotChunk', function (evt) { 39 | writeStream.write(evt.chunk); 40 | }); 41 | heapProfiler.takeHeapSnapshot({ 42 | reportProgress: false 43 | }, function () { 44 | heapProfiler.disable(); 45 | writeStream.end(); 46 | 47 | console.error('%sHeapdump created in \'%s\'. Exiting worker now.', logPrefix, path); 48 | 49 | debugInstance.Debugger.resume(); 50 | 51 | // were done, exit normally 52 | process.exit(0); 53 | }); 54 | }).on('error', (err) => { 55 | handleError(err); 56 | }); 57 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | let cp = require("child_process"); 2 | let fs = require("fs"); 3 | let path = require("path"); 4 | 5 | class NodeOomHeapDumpImpl { 6 | constructor(options) { 7 | this._opts = options; 8 | this._files = []; 9 | this._busy = false; 10 | this._count = 0; 11 | 12 | if (this._opts.heapdumpOnOOM) { 13 | if (options.OOMImplementation === "NATIVE_HOOK") { 14 | require('bindings')('node_oom_heapdump_native.node').call(this._getHeapSnapshotPath(this._opts.path), this._opts.addTimestamp); 15 | } 16 | } 17 | } 18 | 19 | 20 | /** 21 | * Calls the designated worker and returns a promise 22 | * @param {String} workerPath - path of the worker 23 | * @param {String[]} workerArgs - arguments to worker 24 | * @return {Promise} resolve on success, reject on error 25 | */ 26 | _callWorker(workerPath, workerArgs) { 27 | if (this._busy) { 28 | return new Promise((resolve, reject) => { 29 | reject(new Error("A CPU profile or heapdump is already being created, please retry later.")); 30 | }); 31 | } 32 | 33 | var args = [path.resolve(__dirname, workerPath)].concat(workerArgs); 34 | 35 | // use 'require-main-filename' module instead of require.main.filename, see https://github.com/blueconic/node-oom-heapdump/issues/3 36 | let mainFilename = require('require-main-filename')(); 37 | 38 | // start worker 39 | let child = cp.spawn('node', args, { 40 | cmd: path.dirname(mainFilename), 41 | stdio: 'inherit' 42 | }); 43 | 44 | return new Promise((resolve, reject) => { 45 | this._busy = true; 46 | var error = null; 47 | 48 | child.on('error', (err) => { 49 | error = err; 50 | reject(err); 51 | }); 52 | child.on('exit', (code) => { 53 | if (!error) { 54 | if (code === 0) { 55 | resolve(); 56 | } else { 57 | reject(new Error("Worker exited with statusCode: " + code)); 58 | } 59 | } 60 | this._busy = false; 61 | }); 62 | }); 63 | } 64 | 65 | /** 66 | * Returns the path to the created heap snapshot in a promise, or rejects on error 67 | * @param {String} snapshotPath - path of the snapshot 68 | * @param {String} logPrefix - optional log prefix message when heapdump is created 69 | * @return {Promise} the heap snapshot path on success or error on rejection 70 | */ 71 | createHeapSnapshot(snapshotPath, logPrefix) { 72 | snapshotPath = this._getHeapSnapshotPath(snapshotPath, logPrefix); 73 | 74 | // start OoMworker to create heapdump 75 | return this._callWorker('./heapdumpWorker.js', [this._opts.port, snapshotPath, logPrefix || ""]).then(() => { 76 | if (logPrefix === "OoM") { 77 | this._count++; 78 | } 79 | if (!this._files.includes(snapshotPath)) { 80 | this._files.push(snapshotPath); 81 | } 82 | return snapshotPath; 83 | }); 84 | } 85 | 86 | /** 87 | * Returns the path to the created CPU profile in a promise, or rejects on error 88 | * @param {String} cpuProfilePath - path of the CPU profile 89 | * @param {number} duration - the duration of the cpu profile (in ms) 90 | * @return {Promise} the CPU profile path on success or error on rejection 91 | */ 92 | createCpuProfile(cpuProfilePath, duration) { 93 | if (!cpuProfilePath) { 94 | cpuProfilePath = path.resolve(__dirname, "../cpuprofile-" + Date.now()); 95 | } 96 | if (!cpuProfilePath.endsWith(".cpuprofile")) { 97 | cpuProfilePath += ".cpuprofile"; 98 | } 99 | 100 | // start OoMworker to create heapdump 101 | return this._callWorker('./cpuProfileWorker.js', [this._opts.port, cpuProfilePath, duration]).then(() => { 102 | if (!this._files.includes(cpuProfilePath)) { 103 | this._files.push(cpuProfilePath); 104 | } 105 | return cpuProfilePath; 106 | }); 107 | } 108 | 109 | /** 110 | * Delete all created heap snapshots 111 | */ 112 | deleteAllHeapSnapshots() { 113 | this._files.forEach((snapshotPath) => { 114 | if (snapshotPath.endsWith(".heapsnapshot")) { 115 | this.deleteHeapSnapshot(snapshotPath); 116 | } 117 | }); 118 | } 119 | 120 | /** 121 | * Deletes a particular snapshot from disk 122 | * @param {String} snapshotPath - path of the heap snapshot to delete 123 | * @return {Promise} 124 | */ 125 | deleteHeapSnapshot(snapshotPath) { 126 | return this._deleteFile(snapshotPath); 127 | } 128 | 129 | /** 130 | * Delete all created CPU profiles 131 | */ 132 | deleteAllCpuProfiles() { 133 | this._files.forEach((path) => { 134 | if (path.endsWith(".cpuprofile")) { 135 | this.deleteCpuProfile(path); 136 | } 137 | }); 138 | } 139 | 140 | /** 141 | * Deletes a particular CPU profile from disk 142 | * @param {String} cpuProfilePath - path of the CPU profile to delete 143 | * @return {Promise} 144 | */ 145 | deleteCpuProfile(cpuProfilePath) { 146 | return this._deleteFile(cpuProfilePath); 147 | } 148 | 149 | /** 150 | * Deletes a given CPU profile or heapsnapshot from disk 151 | * @param {String} path - path to the file to delete 152 | * @return {Promise} 153 | */ 154 | _deleteFile(path) { 155 | return new Promise((resolve, reject) => { 156 | if (this._files.includes(path)) { 157 | fs.unlink(path, (err) => { 158 | if (err) { 159 | reject(err); 160 | } else { 161 | resolve(path); 162 | } 163 | }); 164 | } else { 165 | reject(new Error("File not found:" + path)); 166 | } 167 | }); 168 | } 169 | 170 | /** 171 | * Returns a proper snapshot path, based on the given parameter 172 | * @param {String} snapshotPath 173 | * @param {String} logPrefix 174 | * @return {String} path 175 | */ 176 | _getHeapSnapshotPath(snapshotPath, logPrefix) { 177 | if (!snapshotPath) { 178 | snapshotPath = path.resolve(__dirname, "../heapsnapshot-" + Date.now()); 179 | } 180 | if (logPrefix === "OoM" && this._opts.addTimestamp) { 181 | if (snapshotPath.endsWith(".heapsnapshot")) { 182 | snapshotPath = snapshotPath.replace(".heapsnapshot", ""); 183 | } 184 | // in case of OoM error, add timestamp if needed 185 | snapshotPath += "-" + Date.now(); 186 | } 187 | if (!snapshotPath.endsWith(".heapsnapshot")) { 188 | snapshotPath += ".heapsnapshot"; 189 | } 190 | return snapshotPath; 191 | } 192 | } 193 | 194 | module.exports = NodeOomHeapDumpImpl; -------------------------------------------------------------------------------- /lib/node_oom_heapdump_native.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #if defined(_WIN32) 5 | #include 6 | #define snprintf _snprintf 7 | #else 8 | #include 9 | #endif 10 | 11 | using namespace v8; 12 | 13 | char filename[256]; 14 | bool addTimestamp; 15 | bool processingOOM = false; 16 | 17 | class FileOutputStream : public OutputStream 18 | { 19 | public: 20 | FileOutputStream(FILE *stream) : stream_(stream) {} 21 | virtual int GetChunkSize() 22 | { 23 | return 65536; 24 | } 25 | virtual void EndOfStream() {} 26 | virtual WriteResult WriteAsciiChunk(char *data, int size) 27 | { 28 | const size_t len = static_cast(size); 29 | size_t off = 0; 30 | while (off < len && !feof(stream_) && !ferror(stream_)) 31 | off += fwrite(data + off, 1, len - off, stream_); 32 | return off == len ? kContinue : kAbort; 33 | } 34 | 35 | private: 36 | FILE *stream_; 37 | }; 38 | 39 | size_t RaiseLimit(void *data, size_t current_heap_limit, size_t initial_heap_limit) 40 | { 41 | return current_heap_limit + 10u * 1024 * 1024; // 10MiB 42 | } 43 | 44 | void OnOOMErrorHandler() 45 | { 46 | if (processingOOM) 47 | { 48 | fprintf(stderr, "FATAL: OnOOMError called more than once.\n"); 49 | exit(2); 50 | } 51 | processingOOM = true; 52 | 53 | if (addTimestamp) 54 | { 55 | // Add timestamp to filename 56 | time_t rawtime; 57 | struct tm *timeinfo; 58 | time(&rawtime); 59 | timeinfo = localtime(&rawtime); 60 | 61 | char *pch; 62 | pch = strstr(filename, ".heapsnapshot"); 63 | strncpy(pch, "", 1); 64 | strcat(filename, "-%Y%m%dT%H%M%S.heapsnapshot"); 65 | 66 | char newFilename[256]; 67 | strftime(newFilename, sizeof(filename), filename, timeinfo); 68 | strcpy(filename, newFilename); 69 | } 70 | 71 | fprintf(stderr, "Generating Heapdump to '%s' now...\n", filename); 72 | FILE *fp = fopen(filename, "w"); 73 | if (fp == NULL) 74 | abort(); 75 | 76 | auto *isolate = v8::Isolate::GetCurrent(); 77 | 78 | // Capturing a heap snapshot forces a garbage collection which can, in turn, 79 | // trigger the OOM flow which causes recursion. To prevent this, this callback 80 | // will raise the heap limit if the GC tries to go down that path again. 81 | // Normally we would want to add a call to RemoveNearHeapLimitCallback() after 82 | // we are done, but that is not necessary since we exit() before it matters. 83 | isolate->AddNearHeapLimitCallback(RaiseLimit, nullptr); 84 | 85 | // Create heapdump, depending on which Node.js version this can differ 86 | // for now, just support Node.js 7 and higher 87 | const HeapSnapshot *snap = isolate->GetHeapProfiler()->TakeHeapSnapshot(); 88 | 89 | FileOutputStream stream(fp); 90 | snap->Serialize(&stream, HeapSnapshot::kJSON); 91 | fclose(fp); 92 | 93 | fprintf(stderr, "Done! Exiting process now.\n"); 94 | exit(1); 95 | } 96 | 97 | #if NODE_VERSION_AT_LEAST(20, 0, 0) 98 | void OnOOMErrorNode20(const char *location, const OOMDetails &details) 99 | { 100 | // Node20+ 101 | OnOOMErrorHandler(); 102 | } 103 | #else 104 | void OnOOMErrorNode18(const char *location, bool is_heap_oom) 105 | { 106 | // Up until Node18 107 | OnOOMErrorHandler(); 108 | } 109 | #endif 110 | 111 | void ParseArgumentsAndSetErrorHandler(const FunctionCallbackInfo &args) 112 | { 113 | Isolate *isolate = args.GetIsolate(); 114 | #if NODE_VERSION_AT_LEAST(20, 0, 0) 115 | // Node20+ 116 | isolate->SetOOMErrorHandler(OnOOMErrorNode20); 117 | #else 118 | // Up until Node18 119 | isolate->SetOOMErrorHandler(OnOOMErrorNode18); 120 | #endif 121 | 122 | // parse JS arguments 123 | // 1: filename 124 | // 2: addTimestamp boolean 125 | #if NODE_VERSION_AT_LEAST(13, 0, 0) 126 | Local context = isolate->GetCurrentContext(); 127 | String::Utf8Value fArg(isolate, args[0]->ToString(context).ToLocalChecked()); 128 | #elif NODE_VERSION_AT_LEAST(12, 0, 0) 129 | String::Utf8Value fArg(isolate, args[0]->ToString(isolate)); 130 | #elif NODE_VERSION_AT_LEAST(9, 0, 0) 131 | String::Utf8Value fArg(isolate, args[0]->ToString()); 132 | #else 133 | String::Utf8Value fArg(args[0]->ToString()); 134 | #endif 135 | strncpy(filename, (const char *)(*fArg), sizeof(filename) - 1); 136 | 137 | #if NODE_VERSION_AT_LEAST(12, 0, 0) 138 | addTimestamp = args[1]->BooleanValue(isolate); 139 | #else 140 | addTimestamp = args[1]->BooleanValue(); 141 | #endif 142 | } 143 | 144 | void init(Local exports) 145 | { 146 | NODE_SET_METHOD(exports, "call", ParseArgumentsAndSetErrorHandler); 147 | } 148 | 149 | NODE_MODULE(NODE_OOM_HEAPDUMP_NATIVE, init) 150 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-oom-heapdump", 3 | "version": "3.7.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "node-oom-heapdump", 9 | "version": "3.7.0", 10 | "hasInstallScript": true, 11 | "license": "MIT", 12 | "dependencies": { 13 | "@mapbox/node-pre-gyp": "2.0.0", 14 | "bindings": "^1.5.0", 15 | "chrome-remote-interface": "^0.33.3", 16 | "nan": "^2.22.2", 17 | "require-main-filename": "^2.0.0", 18 | "ws": "^8.18.2" 19 | }, 20 | "devDependencies": { 21 | "eslint-config-google": "^0.14.0" 22 | }, 23 | "engines": { 24 | "node": ">=10.0.0" 25 | } 26 | }, 27 | "node_modules/@aashutoshrathi/word-wrap": { 28 | "version": "1.2.6", 29 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 30 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 31 | "dev": true, 32 | "peer": true, 33 | "engines": { 34 | "node": ">=0.10.0" 35 | } 36 | }, 37 | "node_modules/@eslint-community/eslint-utils": { 38 | "version": "4.4.0", 39 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 40 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 41 | "dev": true, 42 | "peer": true, 43 | "dependencies": { 44 | "eslint-visitor-keys": "^3.3.0" 45 | }, 46 | "engines": { 47 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 48 | }, 49 | "peerDependencies": { 50 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 51 | } 52 | }, 53 | "node_modules/@eslint-community/regexpp": { 54 | "version": "4.6.0", 55 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.0.tgz", 56 | "integrity": "sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==", 57 | "dev": true, 58 | "peer": true, 59 | "engines": { 60 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 61 | } 62 | }, 63 | "node_modules/@eslint/eslintrc": { 64 | "version": "2.1.0", 65 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", 66 | "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", 67 | "dev": true, 68 | "peer": true, 69 | "dependencies": { 70 | "ajv": "^6.12.4", 71 | "debug": "^4.3.2", 72 | "espree": "^9.6.0", 73 | "globals": "^13.19.0", 74 | "ignore": "^5.2.0", 75 | "import-fresh": "^3.2.1", 76 | "js-yaml": "^4.1.0", 77 | "minimatch": "^3.1.2", 78 | "strip-json-comments": "^3.1.1" 79 | }, 80 | "engines": { 81 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 82 | }, 83 | "funding": { 84 | "url": "https://opencollective.com/eslint" 85 | } 86 | }, 87 | "node_modules/@eslint/js": { 88 | "version": "8.44.0", 89 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", 90 | "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", 91 | "dev": true, 92 | "peer": true, 93 | "engines": { 94 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 95 | } 96 | }, 97 | "node_modules/@humanwhocodes/config-array": { 98 | "version": "0.11.10", 99 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", 100 | "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", 101 | "dev": true, 102 | "peer": true, 103 | "dependencies": { 104 | "@humanwhocodes/object-schema": "^1.2.1", 105 | "debug": "^4.1.1", 106 | "minimatch": "^3.0.5" 107 | }, 108 | "engines": { 109 | "node": ">=10.10.0" 110 | } 111 | }, 112 | "node_modules/@humanwhocodes/module-importer": { 113 | "version": "1.0.1", 114 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 115 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 116 | "dev": true, 117 | "peer": true, 118 | "engines": { 119 | "node": ">=12.22" 120 | }, 121 | "funding": { 122 | "type": "github", 123 | "url": "https://github.com/sponsors/nzakas" 124 | } 125 | }, 126 | "node_modules/@humanwhocodes/object-schema": { 127 | "version": "1.2.1", 128 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 129 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 130 | "dev": true, 131 | "peer": true 132 | }, 133 | "node_modules/@isaacs/cliui": { 134 | "version": "8.0.2", 135 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 136 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 137 | "license": "ISC", 138 | "dependencies": { 139 | "string-width": "^5.1.2", 140 | "string-width-cjs": "npm:string-width@^4.2.0", 141 | "strip-ansi": "^7.0.1", 142 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 143 | "wrap-ansi": "^8.1.0", 144 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 145 | }, 146 | "engines": { 147 | "node": ">=12" 148 | } 149 | }, 150 | "node_modules/@isaacs/cliui/node_modules/ansi-regex": { 151 | "version": "6.1.0", 152 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 153 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 154 | "license": "MIT", 155 | "engines": { 156 | "node": ">=12" 157 | }, 158 | "funding": { 159 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 160 | } 161 | }, 162 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": { 163 | "version": "7.1.0", 164 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 165 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 166 | "license": "MIT", 167 | "dependencies": { 168 | "ansi-regex": "^6.0.1" 169 | }, 170 | "engines": { 171 | "node": ">=12" 172 | }, 173 | "funding": { 174 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 175 | } 176 | }, 177 | "node_modules/@isaacs/fs-minipass": { 178 | "version": "4.0.1", 179 | "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", 180 | "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", 181 | "license": "ISC", 182 | "dependencies": { 183 | "minipass": "^7.0.4" 184 | }, 185 | "engines": { 186 | "node": ">=18.0.0" 187 | } 188 | }, 189 | "node_modules/@mapbox/node-pre-gyp": { 190 | "version": "2.0.0", 191 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", 192 | "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", 193 | "license": "BSD-3-Clause", 194 | "dependencies": { 195 | "consola": "^3.2.3", 196 | "detect-libc": "^2.0.0", 197 | "https-proxy-agent": "^7.0.5", 198 | "node-fetch": "^2.6.7", 199 | "nopt": "^8.0.0", 200 | "semver": "^7.5.3", 201 | "tar": "^7.4.0" 202 | }, 203 | "bin": { 204 | "node-pre-gyp": "bin/node-pre-gyp" 205 | }, 206 | "engines": { 207 | "node": ">=18" 208 | } 209 | }, 210 | "node_modules/@nodelib/fs.scandir": { 211 | "version": "2.1.5", 212 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 213 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 214 | "dev": true, 215 | "peer": true, 216 | "dependencies": { 217 | "@nodelib/fs.stat": "2.0.5", 218 | "run-parallel": "^1.1.9" 219 | }, 220 | "engines": { 221 | "node": ">= 8" 222 | } 223 | }, 224 | "node_modules/@nodelib/fs.stat": { 225 | "version": "2.0.5", 226 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 227 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 228 | "dev": true, 229 | "peer": true, 230 | "engines": { 231 | "node": ">= 8" 232 | } 233 | }, 234 | "node_modules/@nodelib/fs.walk": { 235 | "version": "1.2.8", 236 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 237 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 238 | "dev": true, 239 | "peer": true, 240 | "dependencies": { 241 | "@nodelib/fs.scandir": "2.1.5", 242 | "fastq": "^1.6.0" 243 | }, 244 | "engines": { 245 | "node": ">= 8" 246 | } 247 | }, 248 | "node_modules/@pkgjs/parseargs": { 249 | "version": "0.11.0", 250 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 251 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 252 | "license": "MIT", 253 | "optional": true, 254 | "engines": { 255 | "node": ">=14" 256 | } 257 | }, 258 | "node_modules/abbrev": { 259 | "version": "2.0.0", 260 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", 261 | "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", 262 | "license": "ISC", 263 | "engines": { 264 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 265 | } 266 | }, 267 | "node_modules/acorn": { 268 | "version": "8.10.0", 269 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 270 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 271 | "dev": true, 272 | "peer": true, 273 | "bin": { 274 | "acorn": "bin/acorn" 275 | }, 276 | "engines": { 277 | "node": ">=0.4.0" 278 | } 279 | }, 280 | "node_modules/acorn-jsx": { 281 | "version": "5.3.2", 282 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 283 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 284 | "dev": true, 285 | "peer": true, 286 | "peerDependencies": { 287 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 288 | } 289 | }, 290 | "node_modules/agent-base": { 291 | "version": "7.1.3", 292 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 293 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", 294 | "license": "MIT", 295 | "engines": { 296 | "node": ">= 14" 297 | } 298 | }, 299 | "node_modules/ajv": { 300 | "version": "6.12.6", 301 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 302 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 303 | "dev": true, 304 | "peer": true, 305 | "dependencies": { 306 | "fast-deep-equal": "^3.1.1", 307 | "fast-json-stable-stringify": "^2.0.0", 308 | "json-schema-traverse": "^0.4.1", 309 | "uri-js": "^4.2.2" 310 | }, 311 | "funding": { 312 | "type": "github", 313 | "url": "https://github.com/sponsors/epoberezkin" 314 | } 315 | }, 316 | "node_modules/ansi-regex": { 317 | "version": "5.0.1", 318 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 319 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 320 | "engines": { 321 | "node": ">=8" 322 | } 323 | }, 324 | "node_modules/ansi-styles": { 325 | "version": "4.3.0", 326 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 327 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 328 | "dependencies": { 329 | "color-convert": "^2.0.1" 330 | }, 331 | "engines": { 332 | "node": ">=8" 333 | }, 334 | "funding": { 335 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 336 | } 337 | }, 338 | "node_modules/argparse": { 339 | "version": "2.0.1", 340 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 341 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 342 | "dev": true, 343 | "peer": true 344 | }, 345 | "node_modules/balanced-match": { 346 | "version": "1.0.2", 347 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 348 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 349 | }, 350 | "node_modules/bindings": { 351 | "version": "1.5.0", 352 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 353 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 354 | "dependencies": { 355 | "file-uri-to-path": "1.0.0" 356 | } 357 | }, 358 | "node_modules/brace-expansion": { 359 | "version": "1.1.11", 360 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 361 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 362 | "dev": true, 363 | "peer": true, 364 | "dependencies": { 365 | "balanced-match": "^1.0.0", 366 | "concat-map": "0.0.1" 367 | } 368 | }, 369 | "node_modules/callsites": { 370 | "version": "3.1.0", 371 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 372 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 373 | "dev": true, 374 | "peer": true, 375 | "engines": { 376 | "node": ">=6" 377 | } 378 | }, 379 | "node_modules/chalk": { 380 | "version": "4.1.2", 381 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 382 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 383 | "dev": true, 384 | "peer": true, 385 | "dependencies": { 386 | "ansi-styles": "^4.1.0", 387 | "supports-color": "^7.1.0" 388 | }, 389 | "engines": { 390 | "node": ">=10" 391 | }, 392 | "funding": { 393 | "url": "https://github.com/chalk/chalk?sponsor=1" 394 | } 395 | }, 396 | "node_modules/chownr": { 397 | "version": "3.0.0", 398 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", 399 | "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", 400 | "license": "BlueOak-1.0.0", 401 | "engines": { 402 | "node": ">=18" 403 | } 404 | }, 405 | "node_modules/chrome-remote-interface": { 406 | "version": "0.33.3", 407 | "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.33.3.tgz", 408 | "integrity": "sha512-zNnn0prUL86Teru6UCAZ1yU1XeXljHl3gj7OrfPcarEfU62OUU4IujDPdTDW3dAWwRqN3ZMG/Chhkh2gPL/wiw==", 409 | "license": "MIT", 410 | "dependencies": { 411 | "commander": "2.11.x", 412 | "ws": "^7.2.0" 413 | }, 414 | "bin": { 415 | "chrome-remote-interface": "bin/client.js" 416 | } 417 | }, 418 | "node_modules/chrome-remote-interface/node_modules/ws": { 419 | "version": "7.5.10", 420 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 421 | "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 422 | "engines": { 423 | "node": ">=8.3.0" 424 | }, 425 | "peerDependencies": { 426 | "bufferutil": "^4.0.1", 427 | "utf-8-validate": "^5.0.2" 428 | }, 429 | "peerDependenciesMeta": { 430 | "bufferutil": { 431 | "optional": true 432 | }, 433 | "utf-8-validate": { 434 | "optional": true 435 | } 436 | } 437 | }, 438 | "node_modules/color-convert": { 439 | "version": "2.0.1", 440 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 441 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 442 | "dependencies": { 443 | "color-name": "~1.1.4" 444 | }, 445 | "engines": { 446 | "node": ">=7.0.0" 447 | } 448 | }, 449 | "node_modules/color-name": { 450 | "version": "1.1.4", 451 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 452 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 453 | }, 454 | "node_modules/commander": { 455 | "version": "2.11.0", 456 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 457 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" 458 | }, 459 | "node_modules/concat-map": { 460 | "version": "0.0.1", 461 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 462 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 463 | "dev": true, 464 | "peer": true 465 | }, 466 | "node_modules/consola": { 467 | "version": "3.2.3", 468 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", 469 | "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", 470 | "license": "MIT", 471 | "engines": { 472 | "node": "^14.18.0 || >=16.10.0" 473 | } 474 | }, 475 | "node_modules/cross-spawn": { 476 | "version": "7.0.6", 477 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 478 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 479 | "license": "MIT", 480 | "dependencies": { 481 | "path-key": "^3.1.0", 482 | "shebang-command": "^2.0.0", 483 | "which": "^2.0.1" 484 | }, 485 | "engines": { 486 | "node": ">= 8" 487 | } 488 | }, 489 | "node_modules/debug": { 490 | "version": "4.3.3", 491 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 492 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 493 | "dependencies": { 494 | "ms": "2.1.2" 495 | }, 496 | "engines": { 497 | "node": ">=6.0" 498 | }, 499 | "peerDependenciesMeta": { 500 | "supports-color": { 501 | "optional": true 502 | } 503 | } 504 | }, 505 | "node_modules/deep-is": { 506 | "version": "0.1.4", 507 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 508 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 509 | "dev": true, 510 | "peer": true 511 | }, 512 | "node_modules/detect-libc": { 513 | "version": "2.0.2", 514 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", 515 | "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", 516 | "engines": { 517 | "node": ">=8" 518 | } 519 | }, 520 | "node_modules/doctrine": { 521 | "version": "3.0.0", 522 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 523 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 524 | "dev": true, 525 | "peer": true, 526 | "dependencies": { 527 | "esutils": "^2.0.2" 528 | }, 529 | "engines": { 530 | "node": ">=6.0.0" 531 | } 532 | }, 533 | "node_modules/eastasianwidth": { 534 | "version": "0.2.0", 535 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 536 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 537 | "license": "MIT" 538 | }, 539 | "node_modules/emoji-regex": { 540 | "version": "9.2.2", 541 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 542 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 543 | "license": "MIT" 544 | }, 545 | "node_modules/escape-string-regexp": { 546 | "version": "4.0.0", 547 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 548 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 549 | "dev": true, 550 | "peer": true, 551 | "engines": { 552 | "node": ">=10" 553 | }, 554 | "funding": { 555 | "url": "https://github.com/sponsors/sindresorhus" 556 | } 557 | }, 558 | "node_modules/eslint": { 559 | "version": "8.45.0", 560 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", 561 | "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", 562 | "dev": true, 563 | "peer": true, 564 | "dependencies": { 565 | "@eslint-community/eslint-utils": "^4.2.0", 566 | "@eslint-community/regexpp": "^4.4.0", 567 | "@eslint/eslintrc": "^2.1.0", 568 | "@eslint/js": "8.44.0", 569 | "@humanwhocodes/config-array": "^0.11.10", 570 | "@humanwhocodes/module-importer": "^1.0.1", 571 | "@nodelib/fs.walk": "^1.2.8", 572 | "ajv": "^6.10.0", 573 | "chalk": "^4.0.0", 574 | "cross-spawn": "^7.0.2", 575 | "debug": "^4.3.2", 576 | "doctrine": "^3.0.0", 577 | "escape-string-regexp": "^4.0.0", 578 | "eslint-scope": "^7.2.0", 579 | "eslint-visitor-keys": "^3.4.1", 580 | "espree": "^9.6.0", 581 | "esquery": "^1.4.2", 582 | "esutils": "^2.0.2", 583 | "fast-deep-equal": "^3.1.3", 584 | "file-entry-cache": "^6.0.1", 585 | "find-up": "^5.0.0", 586 | "glob-parent": "^6.0.2", 587 | "globals": "^13.19.0", 588 | "graphemer": "^1.4.0", 589 | "ignore": "^5.2.0", 590 | "imurmurhash": "^0.1.4", 591 | "is-glob": "^4.0.0", 592 | "is-path-inside": "^3.0.3", 593 | "js-yaml": "^4.1.0", 594 | "json-stable-stringify-without-jsonify": "^1.0.1", 595 | "levn": "^0.4.1", 596 | "lodash.merge": "^4.6.2", 597 | "minimatch": "^3.1.2", 598 | "natural-compare": "^1.4.0", 599 | "optionator": "^0.9.3", 600 | "strip-ansi": "^6.0.1", 601 | "text-table": "^0.2.0" 602 | }, 603 | "bin": { 604 | "eslint": "bin/eslint.js" 605 | }, 606 | "engines": { 607 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 608 | }, 609 | "funding": { 610 | "url": "https://opencollective.com/eslint" 611 | } 612 | }, 613 | "node_modules/eslint-config-google": { 614 | "version": "0.14.0", 615 | "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", 616 | "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", 617 | "dev": true, 618 | "engines": { 619 | "node": ">=0.10.0" 620 | }, 621 | "peerDependencies": { 622 | "eslint": ">=5.16.0" 623 | } 624 | }, 625 | "node_modules/eslint-scope": { 626 | "version": "7.2.1", 627 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", 628 | "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", 629 | "dev": true, 630 | "peer": true, 631 | "dependencies": { 632 | "esrecurse": "^4.3.0", 633 | "estraverse": "^5.2.0" 634 | }, 635 | "engines": { 636 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 637 | }, 638 | "funding": { 639 | "url": "https://opencollective.com/eslint" 640 | } 641 | }, 642 | "node_modules/eslint-visitor-keys": { 643 | "version": "3.4.1", 644 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", 645 | "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", 646 | "dev": true, 647 | "peer": true, 648 | "engines": { 649 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 650 | }, 651 | "funding": { 652 | "url": "https://opencollective.com/eslint" 653 | } 654 | }, 655 | "node_modules/espree": { 656 | "version": "9.6.1", 657 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 658 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 659 | "dev": true, 660 | "peer": true, 661 | "dependencies": { 662 | "acorn": "^8.9.0", 663 | "acorn-jsx": "^5.3.2", 664 | "eslint-visitor-keys": "^3.4.1" 665 | }, 666 | "engines": { 667 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 668 | }, 669 | "funding": { 670 | "url": "https://opencollective.com/eslint" 671 | } 672 | }, 673 | "node_modules/esquery": { 674 | "version": "1.5.0", 675 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 676 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 677 | "dev": true, 678 | "peer": true, 679 | "dependencies": { 680 | "estraverse": "^5.1.0" 681 | }, 682 | "engines": { 683 | "node": ">=0.10" 684 | } 685 | }, 686 | "node_modules/esrecurse": { 687 | "version": "4.3.0", 688 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 689 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 690 | "dev": true, 691 | "peer": true, 692 | "dependencies": { 693 | "estraverse": "^5.2.0" 694 | }, 695 | "engines": { 696 | "node": ">=4.0" 697 | } 698 | }, 699 | "node_modules/estraverse": { 700 | "version": "5.3.0", 701 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 702 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 703 | "dev": true, 704 | "peer": true, 705 | "engines": { 706 | "node": ">=4.0" 707 | } 708 | }, 709 | "node_modules/esutils": { 710 | "version": "2.0.3", 711 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 712 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 713 | "dev": true, 714 | "peer": true, 715 | "engines": { 716 | "node": ">=0.10.0" 717 | } 718 | }, 719 | "node_modules/fast-deep-equal": { 720 | "version": "3.1.3", 721 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 722 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 723 | "dev": true, 724 | "peer": true 725 | }, 726 | "node_modules/fast-json-stable-stringify": { 727 | "version": "2.1.0", 728 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 729 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 730 | "dev": true, 731 | "peer": true 732 | }, 733 | "node_modules/fast-levenshtein": { 734 | "version": "2.0.6", 735 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 736 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 737 | "dev": true, 738 | "peer": true 739 | }, 740 | "node_modules/fastq": { 741 | "version": "1.15.0", 742 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 743 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 744 | "dev": true, 745 | "peer": true, 746 | "dependencies": { 747 | "reusify": "^1.0.4" 748 | } 749 | }, 750 | "node_modules/file-entry-cache": { 751 | "version": "6.0.1", 752 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 753 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 754 | "dev": true, 755 | "peer": true, 756 | "dependencies": { 757 | "flat-cache": "^3.0.4" 758 | }, 759 | "engines": { 760 | "node": "^10.12.0 || >=12.0.0" 761 | } 762 | }, 763 | "node_modules/file-uri-to-path": { 764 | "version": "1.0.0", 765 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 766 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 767 | }, 768 | "node_modules/find-up": { 769 | "version": "5.0.0", 770 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 771 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 772 | "dev": true, 773 | "peer": true, 774 | "dependencies": { 775 | "locate-path": "^6.0.0", 776 | "path-exists": "^4.0.0" 777 | }, 778 | "engines": { 779 | "node": ">=10" 780 | }, 781 | "funding": { 782 | "url": "https://github.com/sponsors/sindresorhus" 783 | } 784 | }, 785 | "node_modules/flat-cache": { 786 | "version": "3.0.4", 787 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 788 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 789 | "dev": true, 790 | "peer": true, 791 | "dependencies": { 792 | "flatted": "^3.1.0", 793 | "rimraf": "^3.0.2" 794 | }, 795 | "engines": { 796 | "node": "^10.12.0 || >=12.0.0" 797 | } 798 | }, 799 | "node_modules/flatted": { 800 | "version": "3.2.7", 801 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 802 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 803 | "dev": true, 804 | "peer": true 805 | }, 806 | "node_modules/foreground-child": { 807 | "version": "3.3.0", 808 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 809 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 810 | "license": "ISC", 811 | "dependencies": { 812 | "cross-spawn": "^7.0.0", 813 | "signal-exit": "^4.0.1" 814 | }, 815 | "engines": { 816 | "node": ">=14" 817 | }, 818 | "funding": { 819 | "url": "https://github.com/sponsors/isaacs" 820 | } 821 | }, 822 | "node_modules/fs.realpath": { 823 | "version": "1.0.0", 824 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 825 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 826 | "dev": true, 827 | "peer": true 828 | }, 829 | "node_modules/glob": { 830 | "version": "7.2.0", 831 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 832 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 833 | "dev": true, 834 | "peer": true, 835 | "dependencies": { 836 | "fs.realpath": "^1.0.0", 837 | "inflight": "^1.0.4", 838 | "inherits": "2", 839 | "minimatch": "^3.0.4", 840 | "once": "^1.3.0", 841 | "path-is-absolute": "^1.0.0" 842 | }, 843 | "engines": { 844 | "node": "*" 845 | }, 846 | "funding": { 847 | "url": "https://github.com/sponsors/isaacs" 848 | } 849 | }, 850 | "node_modules/glob-parent": { 851 | "version": "6.0.2", 852 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 853 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 854 | "dev": true, 855 | "peer": true, 856 | "dependencies": { 857 | "is-glob": "^4.0.3" 858 | }, 859 | "engines": { 860 | "node": ">=10.13.0" 861 | } 862 | }, 863 | "node_modules/globals": { 864 | "version": "13.20.0", 865 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 866 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 867 | "dev": true, 868 | "peer": true, 869 | "dependencies": { 870 | "type-fest": "^0.20.2" 871 | }, 872 | "engines": { 873 | "node": ">=8" 874 | }, 875 | "funding": { 876 | "url": "https://github.com/sponsors/sindresorhus" 877 | } 878 | }, 879 | "node_modules/graphemer": { 880 | "version": "1.4.0", 881 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 882 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 883 | "dev": true, 884 | "peer": true 885 | }, 886 | "node_modules/has-flag": { 887 | "version": "4.0.0", 888 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 889 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 890 | "dev": true, 891 | "peer": true, 892 | "engines": { 893 | "node": ">=8" 894 | } 895 | }, 896 | "node_modules/https-proxy-agent": { 897 | "version": "7.0.6", 898 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 899 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 900 | "license": "MIT", 901 | "dependencies": { 902 | "agent-base": "^7.1.2", 903 | "debug": "4" 904 | }, 905 | "engines": { 906 | "node": ">= 14" 907 | } 908 | }, 909 | "node_modules/ignore": { 910 | "version": "5.2.4", 911 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 912 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 913 | "dev": true, 914 | "peer": true, 915 | "engines": { 916 | "node": ">= 4" 917 | } 918 | }, 919 | "node_modules/import-fresh": { 920 | "version": "3.3.0", 921 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 922 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 923 | "dev": true, 924 | "peer": true, 925 | "dependencies": { 926 | "parent-module": "^1.0.0", 927 | "resolve-from": "^4.0.0" 928 | }, 929 | "engines": { 930 | "node": ">=6" 931 | }, 932 | "funding": { 933 | "url": "https://github.com/sponsors/sindresorhus" 934 | } 935 | }, 936 | "node_modules/imurmurhash": { 937 | "version": "0.1.4", 938 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 939 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 940 | "dev": true, 941 | "peer": true, 942 | "engines": { 943 | "node": ">=0.8.19" 944 | } 945 | }, 946 | "node_modules/inflight": { 947 | "version": "1.0.6", 948 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 949 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 950 | "dev": true, 951 | "peer": true, 952 | "dependencies": { 953 | "once": "^1.3.0", 954 | "wrappy": "1" 955 | } 956 | }, 957 | "node_modules/inherits": { 958 | "version": "2.0.4", 959 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 960 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 961 | "dev": true, 962 | "peer": true 963 | }, 964 | "node_modules/is-extglob": { 965 | "version": "2.1.1", 966 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 967 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 968 | "dev": true, 969 | "peer": true, 970 | "engines": { 971 | "node": ">=0.10.0" 972 | } 973 | }, 974 | "node_modules/is-fullwidth-code-point": { 975 | "version": "3.0.0", 976 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 977 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 978 | "license": "MIT", 979 | "engines": { 980 | "node": ">=8" 981 | } 982 | }, 983 | "node_modules/is-glob": { 984 | "version": "4.0.3", 985 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 986 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 987 | "dev": true, 988 | "peer": true, 989 | "dependencies": { 990 | "is-extglob": "^2.1.1" 991 | }, 992 | "engines": { 993 | "node": ">=0.10.0" 994 | } 995 | }, 996 | "node_modules/is-path-inside": { 997 | "version": "3.0.3", 998 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 999 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1000 | "dev": true, 1001 | "peer": true, 1002 | "engines": { 1003 | "node": ">=8" 1004 | } 1005 | }, 1006 | "node_modules/isexe": { 1007 | "version": "2.0.0", 1008 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1009 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1010 | }, 1011 | "node_modules/jackspeak": { 1012 | "version": "3.4.3", 1013 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1014 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1015 | "license": "BlueOak-1.0.0", 1016 | "dependencies": { 1017 | "@isaacs/cliui": "^8.0.2" 1018 | }, 1019 | "funding": { 1020 | "url": "https://github.com/sponsors/isaacs" 1021 | }, 1022 | "optionalDependencies": { 1023 | "@pkgjs/parseargs": "^0.11.0" 1024 | } 1025 | }, 1026 | "node_modules/js-yaml": { 1027 | "version": "4.1.0", 1028 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1029 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1030 | "dev": true, 1031 | "peer": true, 1032 | "dependencies": { 1033 | "argparse": "^2.0.1" 1034 | }, 1035 | "bin": { 1036 | "js-yaml": "bin/js-yaml.js" 1037 | } 1038 | }, 1039 | "node_modules/json-schema-traverse": { 1040 | "version": "0.4.1", 1041 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1042 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1043 | "dev": true, 1044 | "peer": true 1045 | }, 1046 | "node_modules/json-stable-stringify-without-jsonify": { 1047 | "version": "1.0.1", 1048 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1049 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1050 | "dev": true, 1051 | "peer": true 1052 | }, 1053 | "node_modules/levn": { 1054 | "version": "0.4.1", 1055 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1056 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1057 | "dev": true, 1058 | "peer": true, 1059 | "dependencies": { 1060 | "prelude-ls": "^1.2.1", 1061 | "type-check": "~0.4.0" 1062 | }, 1063 | "engines": { 1064 | "node": ">= 0.8.0" 1065 | } 1066 | }, 1067 | "node_modules/locate-path": { 1068 | "version": "6.0.0", 1069 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1070 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1071 | "dev": true, 1072 | "peer": true, 1073 | "dependencies": { 1074 | "p-locate": "^5.0.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">=10" 1078 | }, 1079 | "funding": { 1080 | "url": "https://github.com/sponsors/sindresorhus" 1081 | } 1082 | }, 1083 | "node_modules/lodash.merge": { 1084 | "version": "4.6.2", 1085 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1086 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1087 | "dev": true, 1088 | "peer": true 1089 | }, 1090 | "node_modules/lru-cache": { 1091 | "version": "6.0.0", 1092 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1093 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1094 | "dependencies": { 1095 | "yallist": "^4.0.0" 1096 | }, 1097 | "engines": { 1098 | "node": ">=10" 1099 | } 1100 | }, 1101 | "node_modules/minimatch": { 1102 | "version": "3.1.2", 1103 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1104 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1105 | "dev": true, 1106 | "peer": true, 1107 | "dependencies": { 1108 | "brace-expansion": "^1.1.7" 1109 | }, 1110 | "engines": { 1111 | "node": "*" 1112 | } 1113 | }, 1114 | "node_modules/minipass": { 1115 | "version": "7.1.2", 1116 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1117 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1118 | "license": "ISC", 1119 | "engines": { 1120 | "node": ">=16 || 14 >=14.17" 1121 | } 1122 | }, 1123 | "node_modules/minizlib": { 1124 | "version": "3.0.1", 1125 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", 1126 | "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", 1127 | "license": "MIT", 1128 | "dependencies": { 1129 | "minipass": "^7.0.4", 1130 | "rimraf": "^5.0.5" 1131 | }, 1132 | "engines": { 1133 | "node": ">= 18" 1134 | } 1135 | }, 1136 | "node_modules/minizlib/node_modules/brace-expansion": { 1137 | "version": "2.0.1", 1138 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1139 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1140 | "license": "MIT", 1141 | "dependencies": { 1142 | "balanced-match": "^1.0.0" 1143 | } 1144 | }, 1145 | "node_modules/minizlib/node_modules/glob": { 1146 | "version": "10.4.5", 1147 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1148 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1149 | "license": "ISC", 1150 | "dependencies": { 1151 | "foreground-child": "^3.1.0", 1152 | "jackspeak": "^3.1.2", 1153 | "minimatch": "^9.0.4", 1154 | "minipass": "^7.1.2", 1155 | "package-json-from-dist": "^1.0.0", 1156 | "path-scurry": "^1.11.1" 1157 | }, 1158 | "bin": { 1159 | "glob": "dist/esm/bin.mjs" 1160 | }, 1161 | "funding": { 1162 | "url": "https://github.com/sponsors/isaacs" 1163 | } 1164 | }, 1165 | "node_modules/minizlib/node_modules/minimatch": { 1166 | "version": "9.0.5", 1167 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1168 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1169 | "license": "ISC", 1170 | "dependencies": { 1171 | "brace-expansion": "^2.0.1" 1172 | }, 1173 | "engines": { 1174 | "node": ">=16 || 14 >=14.17" 1175 | }, 1176 | "funding": { 1177 | "url": "https://github.com/sponsors/isaacs" 1178 | } 1179 | }, 1180 | "node_modules/minizlib/node_modules/rimraf": { 1181 | "version": "5.0.10", 1182 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", 1183 | "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", 1184 | "license": "ISC", 1185 | "dependencies": { 1186 | "glob": "^10.3.7" 1187 | }, 1188 | "bin": { 1189 | "rimraf": "dist/esm/bin.mjs" 1190 | }, 1191 | "funding": { 1192 | "url": "https://github.com/sponsors/isaacs" 1193 | } 1194 | }, 1195 | "node_modules/mkdirp": { 1196 | "version": "3.0.1", 1197 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", 1198 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 1199 | "license": "MIT", 1200 | "bin": { 1201 | "mkdirp": "dist/cjs/src/bin.js" 1202 | }, 1203 | "engines": { 1204 | "node": ">=10" 1205 | }, 1206 | "funding": { 1207 | "url": "https://github.com/sponsors/isaacs" 1208 | } 1209 | }, 1210 | "node_modules/ms": { 1211 | "version": "2.1.2", 1212 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1213 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1214 | }, 1215 | "node_modules/nan": { 1216 | "version": "2.22.2", 1217 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", 1218 | "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", 1219 | "license": "MIT" 1220 | }, 1221 | "node_modules/natural-compare": { 1222 | "version": "1.4.0", 1223 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1224 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1225 | "dev": true, 1226 | "peer": true 1227 | }, 1228 | "node_modules/node-fetch": { 1229 | "version": "2.6.7", 1230 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1231 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1232 | "dependencies": { 1233 | "whatwg-url": "^5.0.0" 1234 | }, 1235 | "engines": { 1236 | "node": "4.x || >=6.0.0" 1237 | }, 1238 | "peerDependencies": { 1239 | "encoding": "^0.1.0" 1240 | }, 1241 | "peerDependenciesMeta": { 1242 | "encoding": { 1243 | "optional": true 1244 | } 1245 | } 1246 | }, 1247 | "node_modules/nopt": { 1248 | "version": "8.0.0", 1249 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", 1250 | "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", 1251 | "license": "ISC", 1252 | "dependencies": { 1253 | "abbrev": "^2.0.0" 1254 | }, 1255 | "bin": { 1256 | "nopt": "bin/nopt.js" 1257 | }, 1258 | "engines": { 1259 | "node": "^18.17.0 || >=20.5.0" 1260 | } 1261 | }, 1262 | "node_modules/once": { 1263 | "version": "1.4.0", 1264 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1265 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1266 | "dev": true, 1267 | "peer": true, 1268 | "dependencies": { 1269 | "wrappy": "1" 1270 | } 1271 | }, 1272 | "node_modules/optionator": { 1273 | "version": "0.9.3", 1274 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 1275 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 1276 | "dev": true, 1277 | "peer": true, 1278 | "dependencies": { 1279 | "@aashutoshrathi/word-wrap": "^1.2.3", 1280 | "deep-is": "^0.1.3", 1281 | "fast-levenshtein": "^2.0.6", 1282 | "levn": "^0.4.1", 1283 | "prelude-ls": "^1.2.1", 1284 | "type-check": "^0.4.0" 1285 | }, 1286 | "engines": { 1287 | "node": ">= 0.8.0" 1288 | } 1289 | }, 1290 | "node_modules/p-limit": { 1291 | "version": "3.1.0", 1292 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1293 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1294 | "dev": true, 1295 | "peer": true, 1296 | "dependencies": { 1297 | "yocto-queue": "^0.1.0" 1298 | }, 1299 | "engines": { 1300 | "node": ">=10" 1301 | }, 1302 | "funding": { 1303 | "url": "https://github.com/sponsors/sindresorhus" 1304 | } 1305 | }, 1306 | "node_modules/p-locate": { 1307 | "version": "5.0.0", 1308 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1309 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1310 | "dev": true, 1311 | "peer": true, 1312 | "dependencies": { 1313 | "p-limit": "^3.0.2" 1314 | }, 1315 | "engines": { 1316 | "node": ">=10" 1317 | }, 1318 | "funding": { 1319 | "url": "https://github.com/sponsors/sindresorhus" 1320 | } 1321 | }, 1322 | "node_modules/package-json-from-dist": { 1323 | "version": "1.0.1", 1324 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1325 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1326 | "license": "BlueOak-1.0.0" 1327 | }, 1328 | "node_modules/parent-module": { 1329 | "version": "1.0.1", 1330 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1331 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1332 | "dev": true, 1333 | "peer": true, 1334 | "dependencies": { 1335 | "callsites": "^3.0.0" 1336 | }, 1337 | "engines": { 1338 | "node": ">=6" 1339 | } 1340 | }, 1341 | "node_modules/path-exists": { 1342 | "version": "4.0.0", 1343 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1344 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1345 | "dev": true, 1346 | "peer": true, 1347 | "engines": { 1348 | "node": ">=8" 1349 | } 1350 | }, 1351 | "node_modules/path-is-absolute": { 1352 | "version": "1.0.1", 1353 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1354 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1355 | "dev": true, 1356 | "peer": true, 1357 | "engines": { 1358 | "node": ">=0.10.0" 1359 | } 1360 | }, 1361 | "node_modules/path-key": { 1362 | "version": "3.1.1", 1363 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1364 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1365 | "engines": { 1366 | "node": ">=8" 1367 | } 1368 | }, 1369 | "node_modules/path-scurry": { 1370 | "version": "1.11.1", 1371 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1372 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1373 | "license": "BlueOak-1.0.0", 1374 | "dependencies": { 1375 | "lru-cache": "^10.2.0", 1376 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1377 | }, 1378 | "engines": { 1379 | "node": ">=16 || 14 >=14.18" 1380 | }, 1381 | "funding": { 1382 | "url": "https://github.com/sponsors/isaacs" 1383 | } 1384 | }, 1385 | "node_modules/path-scurry/node_modules/lru-cache": { 1386 | "version": "10.4.3", 1387 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1388 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1389 | "license": "ISC" 1390 | }, 1391 | "node_modules/prelude-ls": { 1392 | "version": "1.2.1", 1393 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1394 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1395 | "dev": true, 1396 | "peer": true, 1397 | "engines": { 1398 | "node": ">= 0.8.0" 1399 | } 1400 | }, 1401 | "node_modules/punycode": { 1402 | "version": "2.3.0", 1403 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1404 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1405 | "dev": true, 1406 | "peer": true, 1407 | "engines": { 1408 | "node": ">=6" 1409 | } 1410 | }, 1411 | "node_modules/queue-microtask": { 1412 | "version": "1.2.3", 1413 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1414 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1415 | "dev": true, 1416 | "funding": [ 1417 | { 1418 | "type": "github", 1419 | "url": "https://github.com/sponsors/feross" 1420 | }, 1421 | { 1422 | "type": "patreon", 1423 | "url": "https://www.patreon.com/feross" 1424 | }, 1425 | { 1426 | "type": "consulting", 1427 | "url": "https://feross.org/support" 1428 | } 1429 | ], 1430 | "peer": true 1431 | }, 1432 | "node_modules/require-main-filename": { 1433 | "version": "2.0.0", 1434 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1435 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1436 | }, 1437 | "node_modules/resolve-from": { 1438 | "version": "4.0.0", 1439 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1440 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1441 | "dev": true, 1442 | "peer": true, 1443 | "engines": { 1444 | "node": ">=4" 1445 | } 1446 | }, 1447 | "node_modules/reusify": { 1448 | "version": "1.0.4", 1449 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1450 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1451 | "dev": true, 1452 | "peer": true, 1453 | "engines": { 1454 | "iojs": ">=1.0.0", 1455 | "node": ">=0.10.0" 1456 | } 1457 | }, 1458 | "node_modules/rimraf": { 1459 | "version": "3.0.2", 1460 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1461 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1462 | "dev": true, 1463 | "peer": true, 1464 | "dependencies": { 1465 | "glob": "^7.1.3" 1466 | }, 1467 | "bin": { 1468 | "rimraf": "bin.js" 1469 | }, 1470 | "funding": { 1471 | "url": "https://github.com/sponsors/isaacs" 1472 | } 1473 | }, 1474 | "node_modules/run-parallel": { 1475 | "version": "1.2.0", 1476 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1477 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1478 | "dev": true, 1479 | "funding": [ 1480 | { 1481 | "type": "github", 1482 | "url": "https://github.com/sponsors/feross" 1483 | }, 1484 | { 1485 | "type": "patreon", 1486 | "url": "https://www.patreon.com/feross" 1487 | }, 1488 | { 1489 | "type": "consulting", 1490 | "url": "https://feross.org/support" 1491 | } 1492 | ], 1493 | "peer": true, 1494 | "dependencies": { 1495 | "queue-microtask": "^1.2.2" 1496 | } 1497 | }, 1498 | "node_modules/semver": { 1499 | "version": "7.5.4", 1500 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1501 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1502 | "dependencies": { 1503 | "lru-cache": "^6.0.0" 1504 | }, 1505 | "bin": { 1506 | "semver": "bin/semver.js" 1507 | }, 1508 | "engines": { 1509 | "node": ">=10" 1510 | } 1511 | }, 1512 | "node_modules/shebang-command": { 1513 | "version": "2.0.0", 1514 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1515 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1516 | "dependencies": { 1517 | "shebang-regex": "^3.0.0" 1518 | }, 1519 | "engines": { 1520 | "node": ">=8" 1521 | } 1522 | }, 1523 | "node_modules/shebang-regex": { 1524 | "version": "3.0.0", 1525 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1526 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1527 | "engines": { 1528 | "node": ">=8" 1529 | } 1530 | }, 1531 | "node_modules/signal-exit": { 1532 | "version": "4.1.0", 1533 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1534 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1535 | "license": "ISC", 1536 | "engines": { 1537 | "node": ">=14" 1538 | }, 1539 | "funding": { 1540 | "url": "https://github.com/sponsors/isaacs" 1541 | } 1542 | }, 1543 | "node_modules/string-width": { 1544 | "version": "5.1.2", 1545 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1546 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1547 | "license": "MIT", 1548 | "dependencies": { 1549 | "eastasianwidth": "^0.2.0", 1550 | "emoji-regex": "^9.2.2", 1551 | "strip-ansi": "^7.0.1" 1552 | }, 1553 | "engines": { 1554 | "node": ">=12" 1555 | }, 1556 | "funding": { 1557 | "url": "https://github.com/sponsors/sindresorhus" 1558 | } 1559 | }, 1560 | "node_modules/string-width-cjs": { 1561 | "name": "string-width", 1562 | "version": "4.2.3", 1563 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1564 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1565 | "license": "MIT", 1566 | "dependencies": { 1567 | "emoji-regex": "^8.0.0", 1568 | "is-fullwidth-code-point": "^3.0.0", 1569 | "strip-ansi": "^6.0.1" 1570 | }, 1571 | "engines": { 1572 | "node": ">=8" 1573 | } 1574 | }, 1575 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1576 | "version": "8.0.0", 1577 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1578 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1579 | "license": "MIT" 1580 | }, 1581 | "node_modules/string-width/node_modules/ansi-regex": { 1582 | "version": "6.1.0", 1583 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1584 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1585 | "license": "MIT", 1586 | "engines": { 1587 | "node": ">=12" 1588 | }, 1589 | "funding": { 1590 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1591 | } 1592 | }, 1593 | "node_modules/string-width/node_modules/strip-ansi": { 1594 | "version": "7.1.0", 1595 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1596 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1597 | "license": "MIT", 1598 | "dependencies": { 1599 | "ansi-regex": "^6.0.1" 1600 | }, 1601 | "engines": { 1602 | "node": ">=12" 1603 | }, 1604 | "funding": { 1605 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1606 | } 1607 | }, 1608 | "node_modules/strip-ansi": { 1609 | "version": "6.0.1", 1610 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1611 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1612 | "dependencies": { 1613 | "ansi-regex": "^5.0.1" 1614 | }, 1615 | "engines": { 1616 | "node": ">=8" 1617 | } 1618 | }, 1619 | "node_modules/strip-ansi-cjs": { 1620 | "name": "strip-ansi", 1621 | "version": "6.0.1", 1622 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1623 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1624 | "license": "MIT", 1625 | "dependencies": { 1626 | "ansi-regex": "^5.0.1" 1627 | }, 1628 | "engines": { 1629 | "node": ">=8" 1630 | } 1631 | }, 1632 | "node_modules/strip-json-comments": { 1633 | "version": "3.1.1", 1634 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1635 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1636 | "dev": true, 1637 | "peer": true, 1638 | "engines": { 1639 | "node": ">=8" 1640 | }, 1641 | "funding": { 1642 | "url": "https://github.com/sponsors/sindresorhus" 1643 | } 1644 | }, 1645 | "node_modules/supports-color": { 1646 | "version": "7.2.0", 1647 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1648 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1649 | "dev": true, 1650 | "peer": true, 1651 | "dependencies": { 1652 | "has-flag": "^4.0.0" 1653 | }, 1654 | "engines": { 1655 | "node": ">=8" 1656 | } 1657 | }, 1658 | "node_modules/tar": { 1659 | "version": "7.4.3", 1660 | "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", 1661 | "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", 1662 | "license": "ISC", 1663 | "dependencies": { 1664 | "@isaacs/fs-minipass": "^4.0.0", 1665 | "chownr": "^3.0.0", 1666 | "minipass": "^7.1.2", 1667 | "minizlib": "^3.0.1", 1668 | "mkdirp": "^3.0.1", 1669 | "yallist": "^5.0.0" 1670 | }, 1671 | "engines": { 1672 | "node": ">=18" 1673 | } 1674 | }, 1675 | "node_modules/tar/node_modules/yallist": { 1676 | "version": "5.0.0", 1677 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", 1678 | "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", 1679 | "license": "BlueOak-1.0.0", 1680 | "engines": { 1681 | "node": ">=18" 1682 | } 1683 | }, 1684 | "node_modules/text-table": { 1685 | "version": "0.2.0", 1686 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1687 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1688 | "dev": true, 1689 | "peer": true 1690 | }, 1691 | "node_modules/tr46": { 1692 | "version": "0.0.3", 1693 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1694 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1695 | }, 1696 | "node_modules/type-check": { 1697 | "version": "0.4.0", 1698 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1699 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1700 | "dev": true, 1701 | "peer": true, 1702 | "dependencies": { 1703 | "prelude-ls": "^1.2.1" 1704 | }, 1705 | "engines": { 1706 | "node": ">= 0.8.0" 1707 | } 1708 | }, 1709 | "node_modules/type-fest": { 1710 | "version": "0.20.2", 1711 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1712 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1713 | "dev": true, 1714 | "peer": true, 1715 | "engines": { 1716 | "node": ">=10" 1717 | }, 1718 | "funding": { 1719 | "url": "https://github.com/sponsors/sindresorhus" 1720 | } 1721 | }, 1722 | "node_modules/uri-js": { 1723 | "version": "4.4.1", 1724 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1725 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1726 | "dev": true, 1727 | "peer": true, 1728 | "dependencies": { 1729 | "punycode": "^2.1.0" 1730 | } 1731 | }, 1732 | "node_modules/webidl-conversions": { 1733 | "version": "3.0.1", 1734 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1735 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1736 | }, 1737 | "node_modules/whatwg-url": { 1738 | "version": "5.0.0", 1739 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1740 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1741 | "dependencies": { 1742 | "tr46": "~0.0.3", 1743 | "webidl-conversions": "^3.0.0" 1744 | } 1745 | }, 1746 | "node_modules/which": { 1747 | "version": "2.0.2", 1748 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1749 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1750 | "dependencies": { 1751 | "isexe": "^2.0.0" 1752 | }, 1753 | "bin": { 1754 | "node-which": "bin/node-which" 1755 | }, 1756 | "engines": { 1757 | "node": ">= 8" 1758 | } 1759 | }, 1760 | "node_modules/wrap-ansi": { 1761 | "version": "8.1.0", 1762 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1763 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1764 | "license": "MIT", 1765 | "dependencies": { 1766 | "ansi-styles": "^6.1.0", 1767 | "string-width": "^5.0.1", 1768 | "strip-ansi": "^7.0.1" 1769 | }, 1770 | "engines": { 1771 | "node": ">=12" 1772 | }, 1773 | "funding": { 1774 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1775 | } 1776 | }, 1777 | "node_modules/wrap-ansi-cjs": { 1778 | "name": "wrap-ansi", 1779 | "version": "7.0.0", 1780 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1781 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1782 | "license": "MIT", 1783 | "dependencies": { 1784 | "ansi-styles": "^4.0.0", 1785 | "string-width": "^4.1.0", 1786 | "strip-ansi": "^6.0.0" 1787 | }, 1788 | "engines": { 1789 | "node": ">=10" 1790 | }, 1791 | "funding": { 1792 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1793 | } 1794 | }, 1795 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1796 | "version": "8.0.0", 1797 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1798 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1799 | "license": "MIT" 1800 | }, 1801 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1802 | "version": "4.2.3", 1803 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1804 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1805 | "license": "MIT", 1806 | "dependencies": { 1807 | "emoji-regex": "^8.0.0", 1808 | "is-fullwidth-code-point": "^3.0.0", 1809 | "strip-ansi": "^6.0.1" 1810 | }, 1811 | "engines": { 1812 | "node": ">=8" 1813 | } 1814 | }, 1815 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 1816 | "version": "6.1.0", 1817 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1818 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1819 | "license": "MIT", 1820 | "engines": { 1821 | "node": ">=12" 1822 | }, 1823 | "funding": { 1824 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1825 | } 1826 | }, 1827 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 1828 | "version": "6.2.1", 1829 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1830 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1831 | "license": "MIT", 1832 | "engines": { 1833 | "node": ">=12" 1834 | }, 1835 | "funding": { 1836 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1837 | } 1838 | }, 1839 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 1840 | "version": "7.1.0", 1841 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1842 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1843 | "license": "MIT", 1844 | "dependencies": { 1845 | "ansi-regex": "^6.0.1" 1846 | }, 1847 | "engines": { 1848 | "node": ">=12" 1849 | }, 1850 | "funding": { 1851 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1852 | } 1853 | }, 1854 | "node_modules/wrappy": { 1855 | "version": "1.0.2", 1856 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1857 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1858 | "dev": true, 1859 | "peer": true 1860 | }, 1861 | "node_modules/ws": { 1862 | "version": "8.18.2", 1863 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", 1864 | "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", 1865 | "license": "MIT", 1866 | "engines": { 1867 | "node": ">=10.0.0" 1868 | }, 1869 | "peerDependencies": { 1870 | "bufferutil": "^4.0.1", 1871 | "utf-8-validate": ">=5.0.2" 1872 | }, 1873 | "peerDependenciesMeta": { 1874 | "bufferutil": { 1875 | "optional": true 1876 | }, 1877 | "utf-8-validate": { 1878 | "optional": true 1879 | } 1880 | } 1881 | }, 1882 | "node_modules/yallist": { 1883 | "version": "4.0.0", 1884 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1885 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1886 | }, 1887 | "node_modules/yocto-queue": { 1888 | "version": "0.1.0", 1889 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1890 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1891 | "dev": true, 1892 | "peer": true, 1893 | "engines": { 1894 | "node": ">=10" 1895 | }, 1896 | "funding": { 1897 | "url": "https://github.com/sponsors/sindresorhus" 1898 | } 1899 | } 1900 | }, 1901 | "dependencies": { 1902 | "@aashutoshrathi/word-wrap": { 1903 | "version": "1.2.6", 1904 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 1905 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 1906 | "dev": true, 1907 | "peer": true 1908 | }, 1909 | "@eslint-community/eslint-utils": { 1910 | "version": "4.4.0", 1911 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 1912 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 1913 | "dev": true, 1914 | "peer": true, 1915 | "requires": { 1916 | "eslint-visitor-keys": "^3.3.0" 1917 | } 1918 | }, 1919 | "@eslint-community/regexpp": { 1920 | "version": "4.6.0", 1921 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.0.tgz", 1922 | "integrity": "sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==", 1923 | "dev": true, 1924 | "peer": true 1925 | }, 1926 | "@eslint/eslintrc": { 1927 | "version": "2.1.0", 1928 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", 1929 | "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", 1930 | "dev": true, 1931 | "peer": true, 1932 | "requires": { 1933 | "ajv": "^6.12.4", 1934 | "debug": "^4.3.2", 1935 | "espree": "^9.6.0", 1936 | "globals": "^13.19.0", 1937 | "ignore": "^5.2.0", 1938 | "import-fresh": "^3.2.1", 1939 | "js-yaml": "^4.1.0", 1940 | "minimatch": "^3.1.2", 1941 | "strip-json-comments": "^3.1.1" 1942 | } 1943 | }, 1944 | "@eslint/js": { 1945 | "version": "8.44.0", 1946 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", 1947 | "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", 1948 | "dev": true, 1949 | "peer": true 1950 | }, 1951 | "@humanwhocodes/config-array": { 1952 | "version": "0.11.10", 1953 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", 1954 | "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", 1955 | "dev": true, 1956 | "peer": true, 1957 | "requires": { 1958 | "@humanwhocodes/object-schema": "^1.2.1", 1959 | "debug": "^4.1.1", 1960 | "minimatch": "^3.0.5" 1961 | } 1962 | }, 1963 | "@humanwhocodes/module-importer": { 1964 | "version": "1.0.1", 1965 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 1966 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 1967 | "dev": true, 1968 | "peer": true 1969 | }, 1970 | "@humanwhocodes/object-schema": { 1971 | "version": "1.2.1", 1972 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 1973 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 1974 | "dev": true, 1975 | "peer": true 1976 | }, 1977 | "@isaacs/cliui": { 1978 | "version": "8.0.2", 1979 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 1980 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 1981 | "requires": { 1982 | "string-width": "^5.1.2", 1983 | "string-width-cjs": "npm:string-width@^4.2.0", 1984 | "strip-ansi": "^7.0.1", 1985 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 1986 | "wrap-ansi": "^8.1.0", 1987 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 1988 | }, 1989 | "dependencies": { 1990 | "ansi-regex": { 1991 | "version": "6.1.0", 1992 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1993 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" 1994 | }, 1995 | "strip-ansi": { 1996 | "version": "7.1.0", 1997 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1998 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1999 | "requires": { 2000 | "ansi-regex": "^6.0.1" 2001 | } 2002 | } 2003 | } 2004 | }, 2005 | "@isaacs/fs-minipass": { 2006 | "version": "4.0.1", 2007 | "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", 2008 | "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", 2009 | "requires": { 2010 | "minipass": "^7.0.4" 2011 | } 2012 | }, 2013 | "@mapbox/node-pre-gyp": { 2014 | "version": "2.0.0", 2015 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", 2016 | "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", 2017 | "requires": { 2018 | "consola": "^3.2.3", 2019 | "detect-libc": "^2.0.0", 2020 | "https-proxy-agent": "^7.0.5", 2021 | "node-fetch": "^2.6.7", 2022 | "nopt": "^8.0.0", 2023 | "semver": "^7.5.3", 2024 | "tar": "^7.4.0" 2025 | } 2026 | }, 2027 | "@nodelib/fs.scandir": { 2028 | "version": "2.1.5", 2029 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 2030 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 2031 | "dev": true, 2032 | "peer": true, 2033 | "requires": { 2034 | "@nodelib/fs.stat": "2.0.5", 2035 | "run-parallel": "^1.1.9" 2036 | } 2037 | }, 2038 | "@nodelib/fs.stat": { 2039 | "version": "2.0.5", 2040 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 2041 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 2042 | "dev": true, 2043 | "peer": true 2044 | }, 2045 | "@nodelib/fs.walk": { 2046 | "version": "1.2.8", 2047 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 2048 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 2049 | "dev": true, 2050 | "peer": true, 2051 | "requires": { 2052 | "@nodelib/fs.scandir": "2.1.5", 2053 | "fastq": "^1.6.0" 2054 | } 2055 | }, 2056 | "@pkgjs/parseargs": { 2057 | "version": "0.11.0", 2058 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 2059 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 2060 | "optional": true 2061 | }, 2062 | "abbrev": { 2063 | "version": "2.0.0", 2064 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", 2065 | "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==" 2066 | }, 2067 | "acorn": { 2068 | "version": "8.10.0", 2069 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 2070 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 2071 | "dev": true, 2072 | "peer": true 2073 | }, 2074 | "acorn-jsx": { 2075 | "version": "5.3.2", 2076 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 2077 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 2078 | "dev": true, 2079 | "peer": true, 2080 | "requires": {} 2081 | }, 2082 | "agent-base": { 2083 | "version": "7.1.3", 2084 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 2085 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" 2086 | }, 2087 | "ajv": { 2088 | "version": "6.12.6", 2089 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 2090 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 2091 | "dev": true, 2092 | "peer": true, 2093 | "requires": { 2094 | "fast-deep-equal": "^3.1.1", 2095 | "fast-json-stable-stringify": "^2.0.0", 2096 | "json-schema-traverse": "^0.4.1", 2097 | "uri-js": "^4.2.2" 2098 | } 2099 | }, 2100 | "ansi-regex": { 2101 | "version": "5.0.1", 2102 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2103 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 2104 | }, 2105 | "ansi-styles": { 2106 | "version": "4.3.0", 2107 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2108 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2109 | "requires": { 2110 | "color-convert": "^2.0.1" 2111 | } 2112 | }, 2113 | "argparse": { 2114 | "version": "2.0.1", 2115 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2116 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2117 | "dev": true, 2118 | "peer": true 2119 | }, 2120 | "balanced-match": { 2121 | "version": "1.0.2", 2122 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2123 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 2124 | }, 2125 | "bindings": { 2126 | "version": "1.5.0", 2127 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 2128 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 2129 | "requires": { 2130 | "file-uri-to-path": "1.0.0" 2131 | } 2132 | }, 2133 | "brace-expansion": { 2134 | "version": "1.1.11", 2135 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2136 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2137 | "dev": true, 2138 | "peer": true, 2139 | "requires": { 2140 | "balanced-match": "^1.0.0", 2141 | "concat-map": "0.0.1" 2142 | } 2143 | }, 2144 | "callsites": { 2145 | "version": "3.1.0", 2146 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2147 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 2148 | "dev": true, 2149 | "peer": true 2150 | }, 2151 | "chalk": { 2152 | "version": "4.1.2", 2153 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2154 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 2155 | "dev": true, 2156 | "peer": true, 2157 | "requires": { 2158 | "ansi-styles": "^4.1.0", 2159 | "supports-color": "^7.1.0" 2160 | } 2161 | }, 2162 | "chownr": { 2163 | "version": "3.0.0", 2164 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", 2165 | "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" 2166 | }, 2167 | "chrome-remote-interface": { 2168 | "version": "0.33.3", 2169 | "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.33.3.tgz", 2170 | "integrity": "sha512-zNnn0prUL86Teru6UCAZ1yU1XeXljHl3gj7OrfPcarEfU62OUU4IujDPdTDW3dAWwRqN3ZMG/Chhkh2gPL/wiw==", 2171 | "requires": { 2172 | "commander": "2.11.x", 2173 | "ws": "^7.2.0" 2174 | }, 2175 | "dependencies": { 2176 | "ws": { 2177 | "version": "7.5.10", 2178 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 2179 | "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 2180 | "requires": {} 2181 | } 2182 | } 2183 | }, 2184 | "color-convert": { 2185 | "version": "2.0.1", 2186 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2187 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2188 | "requires": { 2189 | "color-name": "~1.1.4" 2190 | } 2191 | }, 2192 | "color-name": { 2193 | "version": "1.1.4", 2194 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2195 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 2196 | }, 2197 | "commander": { 2198 | "version": "2.11.0", 2199 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 2200 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" 2201 | }, 2202 | "concat-map": { 2203 | "version": "0.0.1", 2204 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2205 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 2206 | "dev": true, 2207 | "peer": true 2208 | }, 2209 | "consola": { 2210 | "version": "3.2.3", 2211 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", 2212 | "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==" 2213 | }, 2214 | "cross-spawn": { 2215 | "version": "7.0.6", 2216 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2217 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2218 | "requires": { 2219 | "path-key": "^3.1.0", 2220 | "shebang-command": "^2.0.0", 2221 | "which": "^2.0.1" 2222 | } 2223 | }, 2224 | "debug": { 2225 | "version": "4.3.3", 2226 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 2227 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 2228 | "requires": { 2229 | "ms": "2.1.2" 2230 | } 2231 | }, 2232 | "deep-is": { 2233 | "version": "0.1.4", 2234 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 2235 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 2236 | "dev": true, 2237 | "peer": true 2238 | }, 2239 | "detect-libc": { 2240 | "version": "2.0.2", 2241 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", 2242 | "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" 2243 | }, 2244 | "doctrine": { 2245 | "version": "3.0.0", 2246 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 2247 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 2248 | "dev": true, 2249 | "peer": true, 2250 | "requires": { 2251 | "esutils": "^2.0.2" 2252 | } 2253 | }, 2254 | "eastasianwidth": { 2255 | "version": "0.2.0", 2256 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 2257 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 2258 | }, 2259 | "emoji-regex": { 2260 | "version": "9.2.2", 2261 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 2262 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 2263 | }, 2264 | "escape-string-regexp": { 2265 | "version": "4.0.0", 2266 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2267 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2268 | "dev": true, 2269 | "peer": true 2270 | }, 2271 | "eslint": { 2272 | "version": "8.45.0", 2273 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", 2274 | "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", 2275 | "dev": true, 2276 | "peer": true, 2277 | "requires": { 2278 | "@eslint-community/eslint-utils": "^4.2.0", 2279 | "@eslint-community/regexpp": "^4.4.0", 2280 | "@eslint/eslintrc": "^2.1.0", 2281 | "@eslint/js": "8.44.0", 2282 | "@humanwhocodes/config-array": "^0.11.10", 2283 | "@humanwhocodes/module-importer": "^1.0.1", 2284 | "@nodelib/fs.walk": "^1.2.8", 2285 | "ajv": "^6.10.0", 2286 | "chalk": "^4.0.0", 2287 | "cross-spawn": "^7.0.2", 2288 | "debug": "^4.3.2", 2289 | "doctrine": "^3.0.0", 2290 | "escape-string-regexp": "^4.0.0", 2291 | "eslint-scope": "^7.2.0", 2292 | "eslint-visitor-keys": "^3.4.1", 2293 | "espree": "^9.6.0", 2294 | "esquery": "^1.4.2", 2295 | "esutils": "^2.0.2", 2296 | "fast-deep-equal": "^3.1.3", 2297 | "file-entry-cache": "^6.0.1", 2298 | "find-up": "^5.0.0", 2299 | "glob-parent": "^6.0.2", 2300 | "globals": "^13.19.0", 2301 | "graphemer": "^1.4.0", 2302 | "ignore": "^5.2.0", 2303 | "imurmurhash": "^0.1.4", 2304 | "is-glob": "^4.0.0", 2305 | "is-path-inside": "^3.0.3", 2306 | "js-yaml": "^4.1.0", 2307 | "json-stable-stringify-without-jsonify": "^1.0.1", 2308 | "levn": "^0.4.1", 2309 | "lodash.merge": "^4.6.2", 2310 | "minimatch": "^3.1.2", 2311 | "natural-compare": "^1.4.0", 2312 | "optionator": "^0.9.3", 2313 | "strip-ansi": "^6.0.1", 2314 | "text-table": "^0.2.0" 2315 | } 2316 | }, 2317 | "eslint-config-google": { 2318 | "version": "0.14.0", 2319 | "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", 2320 | "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", 2321 | "dev": true, 2322 | "requires": {} 2323 | }, 2324 | "eslint-scope": { 2325 | "version": "7.2.1", 2326 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", 2327 | "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", 2328 | "dev": true, 2329 | "peer": true, 2330 | "requires": { 2331 | "esrecurse": "^4.3.0", 2332 | "estraverse": "^5.2.0" 2333 | } 2334 | }, 2335 | "eslint-visitor-keys": { 2336 | "version": "3.4.1", 2337 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", 2338 | "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", 2339 | "dev": true, 2340 | "peer": true 2341 | }, 2342 | "espree": { 2343 | "version": "9.6.1", 2344 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 2345 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 2346 | "dev": true, 2347 | "peer": true, 2348 | "requires": { 2349 | "acorn": "^8.9.0", 2350 | "acorn-jsx": "^5.3.2", 2351 | "eslint-visitor-keys": "^3.4.1" 2352 | } 2353 | }, 2354 | "esquery": { 2355 | "version": "1.5.0", 2356 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 2357 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 2358 | "dev": true, 2359 | "peer": true, 2360 | "requires": { 2361 | "estraverse": "^5.1.0" 2362 | } 2363 | }, 2364 | "esrecurse": { 2365 | "version": "4.3.0", 2366 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2367 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2368 | "dev": true, 2369 | "peer": true, 2370 | "requires": { 2371 | "estraverse": "^5.2.0" 2372 | } 2373 | }, 2374 | "estraverse": { 2375 | "version": "5.3.0", 2376 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2377 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2378 | "dev": true, 2379 | "peer": true 2380 | }, 2381 | "esutils": { 2382 | "version": "2.0.3", 2383 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2384 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2385 | "dev": true, 2386 | "peer": true 2387 | }, 2388 | "fast-deep-equal": { 2389 | "version": "3.1.3", 2390 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2391 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2392 | "dev": true, 2393 | "peer": true 2394 | }, 2395 | "fast-json-stable-stringify": { 2396 | "version": "2.1.0", 2397 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2398 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2399 | "dev": true, 2400 | "peer": true 2401 | }, 2402 | "fast-levenshtein": { 2403 | "version": "2.0.6", 2404 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2405 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2406 | "dev": true, 2407 | "peer": true 2408 | }, 2409 | "fastq": { 2410 | "version": "1.15.0", 2411 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 2412 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 2413 | "dev": true, 2414 | "peer": true, 2415 | "requires": { 2416 | "reusify": "^1.0.4" 2417 | } 2418 | }, 2419 | "file-entry-cache": { 2420 | "version": "6.0.1", 2421 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 2422 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 2423 | "dev": true, 2424 | "peer": true, 2425 | "requires": { 2426 | "flat-cache": "^3.0.4" 2427 | } 2428 | }, 2429 | "file-uri-to-path": { 2430 | "version": "1.0.0", 2431 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 2432 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 2433 | }, 2434 | "find-up": { 2435 | "version": "5.0.0", 2436 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2437 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2438 | "dev": true, 2439 | "peer": true, 2440 | "requires": { 2441 | "locate-path": "^6.0.0", 2442 | "path-exists": "^4.0.0" 2443 | } 2444 | }, 2445 | "flat-cache": { 2446 | "version": "3.0.4", 2447 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 2448 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 2449 | "dev": true, 2450 | "peer": true, 2451 | "requires": { 2452 | "flatted": "^3.1.0", 2453 | "rimraf": "^3.0.2" 2454 | } 2455 | }, 2456 | "flatted": { 2457 | "version": "3.2.7", 2458 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 2459 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 2460 | "dev": true, 2461 | "peer": true 2462 | }, 2463 | "foreground-child": { 2464 | "version": "3.3.0", 2465 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 2466 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 2467 | "requires": { 2468 | "cross-spawn": "^7.0.0", 2469 | "signal-exit": "^4.0.1" 2470 | } 2471 | }, 2472 | "fs.realpath": { 2473 | "version": "1.0.0", 2474 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2475 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 2476 | "dev": true, 2477 | "peer": true 2478 | }, 2479 | "glob": { 2480 | "version": "7.2.0", 2481 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2482 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2483 | "dev": true, 2484 | "peer": true, 2485 | "requires": { 2486 | "fs.realpath": "^1.0.0", 2487 | "inflight": "^1.0.4", 2488 | "inherits": "2", 2489 | "minimatch": "^3.0.4", 2490 | "once": "^1.3.0", 2491 | "path-is-absolute": "^1.0.0" 2492 | } 2493 | }, 2494 | "glob-parent": { 2495 | "version": "6.0.2", 2496 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2497 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2498 | "dev": true, 2499 | "peer": true, 2500 | "requires": { 2501 | "is-glob": "^4.0.3" 2502 | } 2503 | }, 2504 | "globals": { 2505 | "version": "13.20.0", 2506 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 2507 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 2508 | "dev": true, 2509 | "peer": true, 2510 | "requires": { 2511 | "type-fest": "^0.20.2" 2512 | } 2513 | }, 2514 | "graphemer": { 2515 | "version": "1.4.0", 2516 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 2517 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 2518 | "dev": true, 2519 | "peer": true 2520 | }, 2521 | "has-flag": { 2522 | "version": "4.0.0", 2523 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2524 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2525 | "dev": true, 2526 | "peer": true 2527 | }, 2528 | "https-proxy-agent": { 2529 | "version": "7.0.6", 2530 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 2531 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 2532 | "requires": { 2533 | "agent-base": "^7.1.2", 2534 | "debug": "4" 2535 | } 2536 | }, 2537 | "ignore": { 2538 | "version": "5.2.4", 2539 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 2540 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 2541 | "dev": true, 2542 | "peer": true 2543 | }, 2544 | "import-fresh": { 2545 | "version": "3.3.0", 2546 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2547 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2548 | "dev": true, 2549 | "peer": true, 2550 | "requires": { 2551 | "parent-module": "^1.0.0", 2552 | "resolve-from": "^4.0.0" 2553 | } 2554 | }, 2555 | "imurmurhash": { 2556 | "version": "0.1.4", 2557 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2558 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2559 | "dev": true, 2560 | "peer": true 2561 | }, 2562 | "inflight": { 2563 | "version": "1.0.6", 2564 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2565 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2566 | "dev": true, 2567 | "peer": true, 2568 | "requires": { 2569 | "once": "^1.3.0", 2570 | "wrappy": "1" 2571 | } 2572 | }, 2573 | "inherits": { 2574 | "version": "2.0.4", 2575 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2576 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2577 | "dev": true, 2578 | "peer": true 2579 | }, 2580 | "is-extglob": { 2581 | "version": "2.1.1", 2582 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2583 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2584 | "dev": true, 2585 | "peer": true 2586 | }, 2587 | "is-fullwidth-code-point": { 2588 | "version": "3.0.0", 2589 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2590 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 2591 | }, 2592 | "is-glob": { 2593 | "version": "4.0.3", 2594 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2595 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2596 | "dev": true, 2597 | "peer": true, 2598 | "requires": { 2599 | "is-extglob": "^2.1.1" 2600 | } 2601 | }, 2602 | "is-path-inside": { 2603 | "version": "3.0.3", 2604 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 2605 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 2606 | "dev": true, 2607 | "peer": true 2608 | }, 2609 | "isexe": { 2610 | "version": "2.0.0", 2611 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2612 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 2613 | }, 2614 | "jackspeak": { 2615 | "version": "3.4.3", 2616 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 2617 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 2618 | "requires": { 2619 | "@isaacs/cliui": "^8.0.2", 2620 | "@pkgjs/parseargs": "^0.11.0" 2621 | } 2622 | }, 2623 | "js-yaml": { 2624 | "version": "4.1.0", 2625 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2626 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2627 | "dev": true, 2628 | "peer": true, 2629 | "requires": { 2630 | "argparse": "^2.0.1" 2631 | } 2632 | }, 2633 | "json-schema-traverse": { 2634 | "version": "0.4.1", 2635 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2636 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2637 | "dev": true, 2638 | "peer": true 2639 | }, 2640 | "json-stable-stringify-without-jsonify": { 2641 | "version": "1.0.1", 2642 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2643 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2644 | "dev": true, 2645 | "peer": true 2646 | }, 2647 | "levn": { 2648 | "version": "0.4.1", 2649 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2650 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2651 | "dev": true, 2652 | "peer": true, 2653 | "requires": { 2654 | "prelude-ls": "^1.2.1", 2655 | "type-check": "~0.4.0" 2656 | } 2657 | }, 2658 | "locate-path": { 2659 | "version": "6.0.0", 2660 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2661 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2662 | "dev": true, 2663 | "peer": true, 2664 | "requires": { 2665 | "p-locate": "^5.0.0" 2666 | } 2667 | }, 2668 | "lodash.merge": { 2669 | "version": "4.6.2", 2670 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2671 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2672 | "dev": true, 2673 | "peer": true 2674 | }, 2675 | "lru-cache": { 2676 | "version": "6.0.0", 2677 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2678 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2679 | "requires": { 2680 | "yallist": "^4.0.0" 2681 | } 2682 | }, 2683 | "minimatch": { 2684 | "version": "3.1.2", 2685 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2686 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2687 | "dev": true, 2688 | "peer": true, 2689 | "requires": { 2690 | "brace-expansion": "^1.1.7" 2691 | } 2692 | }, 2693 | "minipass": { 2694 | "version": "7.1.2", 2695 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2696 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" 2697 | }, 2698 | "minizlib": { 2699 | "version": "3.0.1", 2700 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", 2701 | "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", 2702 | "requires": { 2703 | "minipass": "^7.0.4", 2704 | "rimraf": "^5.0.5" 2705 | }, 2706 | "dependencies": { 2707 | "brace-expansion": { 2708 | "version": "2.0.1", 2709 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2710 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2711 | "requires": { 2712 | "balanced-match": "^1.0.0" 2713 | } 2714 | }, 2715 | "glob": { 2716 | "version": "10.4.5", 2717 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 2718 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 2719 | "requires": { 2720 | "foreground-child": "^3.1.0", 2721 | "jackspeak": "^3.1.2", 2722 | "minimatch": "^9.0.4", 2723 | "minipass": "^7.1.2", 2724 | "package-json-from-dist": "^1.0.0", 2725 | "path-scurry": "^1.11.1" 2726 | } 2727 | }, 2728 | "minimatch": { 2729 | "version": "9.0.5", 2730 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2731 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2732 | "requires": { 2733 | "brace-expansion": "^2.0.1" 2734 | } 2735 | }, 2736 | "rimraf": { 2737 | "version": "5.0.10", 2738 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", 2739 | "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", 2740 | "requires": { 2741 | "glob": "^10.3.7" 2742 | } 2743 | } 2744 | } 2745 | }, 2746 | "mkdirp": { 2747 | "version": "3.0.1", 2748 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", 2749 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 2750 | }, 2751 | "ms": { 2752 | "version": "2.1.2", 2753 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2754 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2755 | }, 2756 | "nan": { 2757 | "version": "2.22.2", 2758 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", 2759 | "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==" 2760 | }, 2761 | "natural-compare": { 2762 | "version": "1.4.0", 2763 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2764 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2765 | "dev": true, 2766 | "peer": true 2767 | }, 2768 | "node-fetch": { 2769 | "version": "2.6.7", 2770 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 2771 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 2772 | "requires": { 2773 | "whatwg-url": "^5.0.0" 2774 | } 2775 | }, 2776 | "nopt": { 2777 | "version": "8.0.0", 2778 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", 2779 | "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", 2780 | "requires": { 2781 | "abbrev": "^2.0.0" 2782 | } 2783 | }, 2784 | "once": { 2785 | "version": "1.4.0", 2786 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2787 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2788 | "dev": true, 2789 | "peer": true, 2790 | "requires": { 2791 | "wrappy": "1" 2792 | } 2793 | }, 2794 | "optionator": { 2795 | "version": "0.9.3", 2796 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 2797 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 2798 | "dev": true, 2799 | "peer": true, 2800 | "requires": { 2801 | "@aashutoshrathi/word-wrap": "^1.2.3", 2802 | "deep-is": "^0.1.3", 2803 | "fast-levenshtein": "^2.0.6", 2804 | "levn": "^0.4.1", 2805 | "prelude-ls": "^1.2.1", 2806 | "type-check": "^0.4.0" 2807 | } 2808 | }, 2809 | "p-limit": { 2810 | "version": "3.1.0", 2811 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2812 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2813 | "dev": true, 2814 | "peer": true, 2815 | "requires": { 2816 | "yocto-queue": "^0.1.0" 2817 | } 2818 | }, 2819 | "p-locate": { 2820 | "version": "5.0.0", 2821 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2822 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2823 | "dev": true, 2824 | "peer": true, 2825 | "requires": { 2826 | "p-limit": "^3.0.2" 2827 | } 2828 | }, 2829 | "package-json-from-dist": { 2830 | "version": "1.0.1", 2831 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2832 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" 2833 | }, 2834 | "parent-module": { 2835 | "version": "1.0.1", 2836 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2837 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2838 | "dev": true, 2839 | "peer": true, 2840 | "requires": { 2841 | "callsites": "^3.0.0" 2842 | } 2843 | }, 2844 | "path-exists": { 2845 | "version": "4.0.0", 2846 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2847 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2848 | "dev": true, 2849 | "peer": true 2850 | }, 2851 | "path-is-absolute": { 2852 | "version": "1.0.1", 2853 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2854 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2855 | "dev": true, 2856 | "peer": true 2857 | }, 2858 | "path-key": { 2859 | "version": "3.1.1", 2860 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2861 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 2862 | }, 2863 | "path-scurry": { 2864 | "version": "1.11.1", 2865 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2866 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2867 | "requires": { 2868 | "lru-cache": "^10.2.0", 2869 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2870 | }, 2871 | "dependencies": { 2872 | "lru-cache": { 2873 | "version": "10.4.3", 2874 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 2875 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" 2876 | } 2877 | } 2878 | }, 2879 | "prelude-ls": { 2880 | "version": "1.2.1", 2881 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2882 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2883 | "dev": true, 2884 | "peer": true 2885 | }, 2886 | "punycode": { 2887 | "version": "2.3.0", 2888 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 2889 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 2890 | "dev": true, 2891 | "peer": true 2892 | }, 2893 | "queue-microtask": { 2894 | "version": "1.2.3", 2895 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2896 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2897 | "dev": true, 2898 | "peer": true 2899 | }, 2900 | "require-main-filename": { 2901 | "version": "2.0.0", 2902 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2903 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 2904 | }, 2905 | "resolve-from": { 2906 | "version": "4.0.0", 2907 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2908 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2909 | "dev": true, 2910 | "peer": true 2911 | }, 2912 | "reusify": { 2913 | "version": "1.0.4", 2914 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2915 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2916 | "dev": true, 2917 | "peer": true 2918 | }, 2919 | "rimraf": { 2920 | "version": "3.0.2", 2921 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2922 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2923 | "dev": true, 2924 | "peer": true, 2925 | "requires": { 2926 | "glob": "^7.1.3" 2927 | } 2928 | }, 2929 | "run-parallel": { 2930 | "version": "1.2.0", 2931 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2932 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2933 | "dev": true, 2934 | "peer": true, 2935 | "requires": { 2936 | "queue-microtask": "^1.2.2" 2937 | } 2938 | }, 2939 | "semver": { 2940 | "version": "7.5.4", 2941 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2942 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2943 | "requires": { 2944 | "lru-cache": "^6.0.0" 2945 | } 2946 | }, 2947 | "shebang-command": { 2948 | "version": "2.0.0", 2949 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2950 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2951 | "requires": { 2952 | "shebang-regex": "^3.0.0" 2953 | } 2954 | }, 2955 | "shebang-regex": { 2956 | "version": "3.0.0", 2957 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2958 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 2959 | }, 2960 | "signal-exit": { 2961 | "version": "4.1.0", 2962 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2963 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" 2964 | }, 2965 | "string-width": { 2966 | "version": "5.1.2", 2967 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2968 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2969 | "requires": { 2970 | "eastasianwidth": "^0.2.0", 2971 | "emoji-regex": "^9.2.2", 2972 | "strip-ansi": "^7.0.1" 2973 | }, 2974 | "dependencies": { 2975 | "ansi-regex": { 2976 | "version": "6.1.0", 2977 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 2978 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" 2979 | }, 2980 | "strip-ansi": { 2981 | "version": "7.1.0", 2982 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2983 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2984 | "requires": { 2985 | "ansi-regex": "^6.0.1" 2986 | } 2987 | } 2988 | } 2989 | }, 2990 | "string-width-cjs": { 2991 | "version": "npm:string-width@4.2.3", 2992 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2993 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2994 | "requires": { 2995 | "emoji-regex": "^8.0.0", 2996 | "is-fullwidth-code-point": "^3.0.0", 2997 | "strip-ansi": "^6.0.1" 2998 | }, 2999 | "dependencies": { 3000 | "emoji-regex": { 3001 | "version": "8.0.0", 3002 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3003 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 3004 | } 3005 | } 3006 | }, 3007 | "strip-ansi": { 3008 | "version": "6.0.1", 3009 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3010 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3011 | "requires": { 3012 | "ansi-regex": "^5.0.1" 3013 | } 3014 | }, 3015 | "strip-ansi-cjs": { 3016 | "version": "npm:strip-ansi@6.0.1", 3017 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3018 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3019 | "requires": { 3020 | "ansi-regex": "^5.0.1" 3021 | } 3022 | }, 3023 | "strip-json-comments": { 3024 | "version": "3.1.1", 3025 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3026 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3027 | "dev": true, 3028 | "peer": true 3029 | }, 3030 | "supports-color": { 3031 | "version": "7.2.0", 3032 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3033 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3034 | "dev": true, 3035 | "peer": true, 3036 | "requires": { 3037 | "has-flag": "^4.0.0" 3038 | } 3039 | }, 3040 | "tar": { 3041 | "version": "7.4.3", 3042 | "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", 3043 | "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", 3044 | "requires": { 3045 | "@isaacs/fs-minipass": "^4.0.0", 3046 | "chownr": "^3.0.0", 3047 | "minipass": "^7.1.2", 3048 | "minizlib": "^3.0.1", 3049 | "mkdirp": "^3.0.1", 3050 | "yallist": "^5.0.0" 3051 | }, 3052 | "dependencies": { 3053 | "yallist": { 3054 | "version": "5.0.0", 3055 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", 3056 | "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" 3057 | } 3058 | } 3059 | }, 3060 | "text-table": { 3061 | "version": "0.2.0", 3062 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3063 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 3064 | "dev": true, 3065 | "peer": true 3066 | }, 3067 | "tr46": { 3068 | "version": "0.0.3", 3069 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3070 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 3071 | }, 3072 | "type-check": { 3073 | "version": "0.4.0", 3074 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3075 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3076 | "dev": true, 3077 | "peer": true, 3078 | "requires": { 3079 | "prelude-ls": "^1.2.1" 3080 | } 3081 | }, 3082 | "type-fest": { 3083 | "version": "0.20.2", 3084 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 3085 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 3086 | "dev": true, 3087 | "peer": true 3088 | }, 3089 | "uri-js": { 3090 | "version": "4.4.1", 3091 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3092 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3093 | "dev": true, 3094 | "peer": true, 3095 | "requires": { 3096 | "punycode": "^2.1.0" 3097 | } 3098 | }, 3099 | "webidl-conversions": { 3100 | "version": "3.0.1", 3101 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3102 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 3103 | }, 3104 | "whatwg-url": { 3105 | "version": "5.0.0", 3106 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3107 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 3108 | "requires": { 3109 | "tr46": "~0.0.3", 3110 | "webidl-conversions": "^3.0.0" 3111 | } 3112 | }, 3113 | "which": { 3114 | "version": "2.0.2", 3115 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3116 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3117 | "requires": { 3118 | "isexe": "^2.0.0" 3119 | } 3120 | }, 3121 | "wrap-ansi": { 3122 | "version": "8.1.0", 3123 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3124 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3125 | "requires": { 3126 | "ansi-styles": "^6.1.0", 3127 | "string-width": "^5.0.1", 3128 | "strip-ansi": "^7.0.1" 3129 | }, 3130 | "dependencies": { 3131 | "ansi-regex": { 3132 | "version": "6.1.0", 3133 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 3134 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" 3135 | }, 3136 | "ansi-styles": { 3137 | "version": "6.2.1", 3138 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 3139 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" 3140 | }, 3141 | "strip-ansi": { 3142 | "version": "7.1.0", 3143 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 3144 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 3145 | "requires": { 3146 | "ansi-regex": "^6.0.1" 3147 | } 3148 | } 3149 | } 3150 | }, 3151 | "wrap-ansi-cjs": { 3152 | "version": "npm:wrap-ansi@7.0.0", 3153 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3154 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3155 | "requires": { 3156 | "ansi-styles": "^4.0.0", 3157 | "string-width": "^4.1.0", 3158 | "strip-ansi": "^6.0.0" 3159 | }, 3160 | "dependencies": { 3161 | "emoji-regex": { 3162 | "version": "8.0.0", 3163 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3164 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 3165 | }, 3166 | "string-width": { 3167 | "version": "4.2.3", 3168 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3169 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3170 | "requires": { 3171 | "emoji-regex": "^8.0.0", 3172 | "is-fullwidth-code-point": "^3.0.0", 3173 | "strip-ansi": "^6.0.1" 3174 | } 3175 | } 3176 | } 3177 | }, 3178 | "wrappy": { 3179 | "version": "1.0.2", 3180 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3181 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3182 | "dev": true, 3183 | "peer": true 3184 | }, 3185 | "ws": { 3186 | "version": "8.18.2", 3187 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", 3188 | "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", 3189 | "requires": {} 3190 | }, 3191 | "yallist": { 3192 | "version": "4.0.0", 3193 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3194 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 3195 | }, 3196 | "yocto-queue": { 3197 | "version": "0.1.0", 3198 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3199 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3200 | "dev": true, 3201 | "peer": true 3202 | } 3203 | } 3204 | } 3205 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-oom-heapdump", 3 | "version": "3.7.0", 4 | "description": "Create a V8 heap snapshot when an \"Out of Memory\" error occurs, or create a heap snapshot or CPU profile on request.", 5 | "main": "index.js", 6 | "scripts": { 7 | "rebuild": "node-pre-gyp install --build-from-source", 8 | "install": "node-pre-gyp install --fallback-to-build", 9 | "test": "node --max_old_space_size=80 --inspect ./tests/oom_app.js", 10 | "dummy": "node -e \"process.exit(0)\"" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/blueconic/node-oom-heapdump.git" 15 | }, 16 | "binary": { 17 | "module_name": "node_oom_heapdump_native", 18 | "module_path": "./build/Release", 19 | "package_name": "{module_name}-v{version}-{node_abi}-{platform}-{arch}-{libc}.tar.gz", 20 | "host": "https://github.com/blueconic/node-oom-heapdump/releases/download/{version}" 21 | }, 22 | "engines": { 23 | "node": ">=10.0.0" 24 | }, 25 | "keywords": [ 26 | "nodejs", 27 | "memory-leak", 28 | "out-of-memory", 29 | "heapdump", 30 | "memory", 31 | "OnFatalError", 32 | "OnOOMError" 33 | ], 34 | "author": "Paul Rütter", 35 | "license": "MIT", 36 | "bugs": { 37 | "url": "https://github.com/blueconic/node-oom-heapdump/issues" 38 | }, 39 | "homepage": "https://github.com/blueconic/node-oom-heapdump#readme", 40 | "devDependencies": { 41 | "eslint-config-google": "^0.14.0" 42 | }, 43 | "dependencies": { 44 | "@mapbox/node-pre-gyp": "2.0.0", 45 | "bindings": "^1.5.0", 46 | "chrome-remote-interface": "^0.33.3", 47 | "nan": "^2.22.2", 48 | "require-main-filename": "^2.0.0", 49 | "ws": "^8.18.2" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /tests/index.js: -------------------------------------------------------------------------------- 1 | let cp = require("child_process"); 2 | let fs = require("fs"); 3 | let path = require("path"); 4 | 5 | describe('Heapdumps', function () { 6 | it('should be created in x seconds', function (done) { 7 | this.timeout(250000); 8 | 9 | let child = cp.fork(path.resolve(__dirname, './oom_app.js'), null, { 10 | cmd: path.dirname(require.main.filename), 11 | stdio: 'inherit', 12 | execArgv: ["--max_old_space_size=40", "--optimize_for_size", "--always_compact", "--inspect=9229"] 13 | }); 14 | 15 | setTimeout(function () { 16 | child.kill(); 17 | fs.lstat(path.resolve(__dirname, "../abc.heapsnapshot"), (err, stats) => { 18 | if (!err && stats.isFile()) { 19 | done(); 20 | } else { 21 | done(err); 22 | } 23 | clearTimeout(handle); 24 | }) 25 | }, 20000); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /tests/long_running_process.js: -------------------------------------------------------------------------------- 1 | let oomLib = require("../index.js")({ 2 | heapdumpOnOOM: false 3 | }); 4 | 5 | var i = 0; 6 | var path = ""; 7 | 8 | var handle = setInterval(function () { 9 | i++; 10 | 11 | oomLib.createHeapSnapshot(require("path").resolve("../", "myName")).then((p) => { 12 | path = p; 13 | }).catch((err) => { 14 | console.error(err); 15 | }); 16 | 17 | if (i === 3) { 18 | oomLib.deleteHeapSnapshot(path).then(() => { 19 | // 20 | }).catch((err) => { 21 | console.error("err", err); 22 | }); 23 | setTimeout(function () { 24 | process.exit(0); 25 | }, 100); 26 | } 27 | }, 2000); -------------------------------------------------------------------------------- /tests/long_running_process_cpu.js: -------------------------------------------------------------------------------- 1 | let oomLib = require("../index.js")({ 2 | heapdumpOnOOM: false 3 | }); 4 | 5 | var i = 0; 6 | var path = ""; 7 | 8 | oomLib.createCpuProfile(require("path").resolve("myCPU.cpuprofile"), 3000).then((p) => { 9 | console.error("CPU profile", p); 10 | 11 | //oomLib.deleteAllCpuProfiles(); 12 | }).catch((err) => { 13 | console.error(err); 14 | }); 15 | 16 | var handle = setInterval(function () { 17 | i++; 18 | 19 | oomLib.createHeapSnapshot(require("path").resolve("../", "myName")).then((p) => { 20 | path = p; 21 | }).catch((err) => { 22 | console.error(err); 23 | }); 24 | 25 | if (i === 5) { 26 | /* oomLib.deleteHeapSnapshot(path).then(() => { 27 | // 28 | }).catch((err) => { 29 | console.error("err", err); 30 | });*/ 31 | setTimeout(function () { 32 | process.exit(0); 33 | }, 100); 34 | } 35 | }, 1000); -------------------------------------------------------------------------------- /tests/oom_app.js: -------------------------------------------------------------------------------- 1 | let path = require('path'); 2 | 3 | let oom = require("../index.js")({ 4 | path: path.resolve(__dirname, 'my_heapdump'), 5 | heapdumpOnOOM: true, 6 | //OOMImplementation: "GC_MONITORING", // use the old implementation 7 | addTimestamp: false 8 | }); 9 | 10 | // It is important to use named constructors (like the one below), otherwise 11 | // the heap snapshots will not produce useful outputs for you. 12 | function LeakingClass1() { 13 | } 14 | 15 | var leaks = []; 16 | var handle = setInterval(function () { 17 | for (var i = 0; i < 100000; i++) { 18 | leaks.push(new LeakingClass1); 19 | } 20 | 21 | console.error('Leaks: %d', leaks.length); 22 | }, 100); --------------------------------------------------------------------------------