├── .github ├── main.workflow └── workflows │ └── npmpublish.yml ├── .gitignore ├── .travis.yml ├── CHANGES.md ├── LICENSE ├── README.md ├── bin.js ├── index.js ├── package-lock.json ├── package.json └── test ├── basic.js ├── example.png ├── index-test.js └── performance.json /.github/main.workflow: -------------------------------------------------------------------------------- 1 | workflow "publish to npm" { 2 | on = "push" 3 | resolves = ["install", "test", "publish"] 4 | } 5 | 6 | action "install" { 7 | uses = "actions/npm@e7aaefe" 8 | args = "install" 9 | } 10 | 11 | action "test" { 12 | uses = "actions/npm@e7aaefe" 13 | args = "test" 14 | needs = ["install"] 15 | } 16 | 17 | action "publish" { 18 | uses = "actions/npm@e7aaefe" 19 | args = "publish" 20 | secrets = ["NPM_AUTH_TOKEN"] 21 | needs = ["test"] 22 | } 23 | -------------------------------------------------------------------------------- /.github/workflows/npmpublish.yml: -------------------------------------------------------------------------------- 1 | name: Node.js Package 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-node@v1 13 | with: 14 | node-version: 12 15 | - run: npm ci 16 | - run: npm test 17 | 18 | publish-npm: 19 | needs: build 20 | runs-on: ubuntu-latest 21 | steps: 22 | - uses: actions/checkout@v2 23 | - uses: actions/setup-node@v1 24 | with: 25 | node-version: 12 26 | registry-url: https://registry.npmjs.org/ 27 | - run: npm ci 28 | - run: npm publish 29 | env: 30 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 31 | 32 | publish-gpr: 33 | needs: build 34 | runs-on: ubuntu-latest 35 | steps: 36 | - uses: actions/checkout@v2 37 | - uses: actions/setup-node@v1 38 | with: 39 | node-version: 12 40 | registry-url: https://npm.pkg.github.com/ 41 | scope: '@svenkatreddy' 42 | - run: npm ci 43 | - run: npm publish 44 | env: 45 | NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | gs 3 | logs 4 | *.log 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | *.pid.lock 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # nyc test coverage 22 | .nyc_output 23 | 24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 25 | .grunt 26 | 27 | # Bower dependency directory (https://bower.io/) 28 | bower_components 29 | 30 | # node-waf configuration 31 | .lock-wscript 32 | 33 | # Compiled binary addons (http://nodejs.org/api/addons.html) 34 | build/Release 35 | 36 | # Dependency directories 37 | node_modules/ 38 | jspm_packages/ 39 | 40 | # Typescript v1 declaration files 41 | typings/ 42 | 43 | # Optional npm cache directory 44 | .npm 45 | 46 | # Optional eslint cache 47 | .eslintcache 48 | 49 | # Optional REPL history 50 | .node_repl_history 51 | 52 | # Output of 'npm pack' 53 | *.tgz 54 | 55 | # Yarn Integrity file 56 | .yarn-integrity 57 | 58 | # dotenv environment variables file 59 | .env 60 | 61 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "stable" 5 | 6 | install: 7 | - npm install --quiet -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | ## 2.1.1 2 | - update dependency packages. 3 | 4 | ## 2.1.0 5 | - Add option to use package as node module. 6 | 7 | ## 2.0.0 8 | - Add option (`outputFile`) for measuring performance. 9 | - update packages. 10 | 11 | ## 1.0.6 12 | - update pacakges, publish. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2019 svenkatreddy (https://github.com/svenkatreddy) 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # puppeteer-loadtest 2 | 3 | [![Build Status](https://travis-ci.org/svenkatreddy/puppeteer-loadtest.svg?branch=master)](https://travis-ci.org/svenkatreddy/puppeteer-loadtest) 4 | 5 | [![NPM](https://nodei.co/npm/puppeteer-loadtest.png?stars=true)](https://nodei.co/npm/puppeteer-loadtest/) 6 | 7 | puppeteer-loadtest provides a simple way to launch multiple puppeteer instances in parallel to run a simple load test on your site. 8 | 9 | ## Installation 10 | 11 | Install via npm: 12 | 13 | $ npm install -g puppeteer-loadtest 14 | 15 | ## Usage 16 | 17 | To run a basic load test, just supply the name of a puppeteer script to run: 18 | 19 | $ puppeteer-loadtest --file=sample.js 20 | 21 | This will run the specified puppeteer script once in chrome headless instance. 22 | 23 | ### Parameters 24 | 25 | `--s` flag is to mention sample size 26 | `--c` flag is to mention number of concurrent executions per sample 27 | `--silent` boolean to enable or disable logs 28 | `--outputFile` send performance results to output file 29 | 30 | $ puppeteer-loadtest --s=100 --c=25 --file=sample.js 31 | 32 | This will run a total of 100 runs through the specified puppeteer script across 25 concurrent chrome headless instances. 33 | 34 | 35 | ### Examples 36 | 37 | $ puppeteer-loadtest --file=sample.js 38 | 39 | $ puppeteer-loadtest --file=./test/sample.js --s=100 --c=25 40 | 41 | $ puppeteer-loadtest --file=./test/sample.js --s=100 --c=25 --silent=true 42 | 43 | $ puppeteer-loadtest --file=./test/sample.js -s 100 -c 25 44 | 45 | $ puppeteer-loadtest --file=./test/sample.js -s 100 -c 25 --outputFile=performance.json 46 | 47 | 48 | ### use as node module 49 | 50 | ``` 51 | const startPuppeteerLoadTest = require('puppeteer-loadtest'); 52 | const results = await startPuppeteerLoadTest({ 53 | file, // path to file 54 | samplesRequested, // number of samples requested 55 | concurrencyRequested, // number of concurrency requested 56 | }); 57 | console.log(results); 58 | ``` 59 | 60 | 61 | ## Contributors 62 | 63 | [David Madden](https://github.com/moose56) 64 | 65 | [yuji38kwmt](https://github.com/yuji38kwmt) 66 | 67 | 68 | ## Feedback 69 | 70 | please provide feedback or feature requests using issues link 71 | 72 | 73 | ## Contributing 74 | 75 | 1. Fork it 76 | 2. Create your feature branch (`git checkout -b my-new-feature`) 77 | 3. Commit your changes (`git commit -am 'Add some feature'`) 78 | 4. Push to the branch (`git push origin my-new-feature`) 79 | 5. Create new Pull Request 80 | -------------------------------------------------------------------------------- /bin.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 'use strict'; 3 | 4 | const createDebug = require('debug'); 5 | const debug = createDebug('puppeteer-loadtest'); 6 | const exec = require('child_process').exec; 7 | const argv = require('minimist')(process.argv.slice(2)); 8 | const perf = require('execution-time')(); 9 | const fs = require('fs'); 10 | const startPuppeteerLoadTest = require('.'); 11 | 12 | const file = argv.file; 13 | const samplesRequested = argv.s || 1; 14 | const concurrencyRequested = argv.c || 1; 15 | const silent = argv.silent || false; 16 | const outputFile = argv.outputFile; 17 | 18 | if (!file) { 19 | return console.error('cannot find --file option'); 20 | } 21 | 22 | if (!silent) { 23 | createDebug.enable('puppeteer-loadtest'); 24 | } 25 | 26 | if (!samplesRequested) { 27 | debug('no sample is specified, using 1 as default') 28 | } 29 | 30 | if (!concurrencyRequested) { 31 | debug('no concurrency is specified, using 1 as default') 32 | } 33 | 34 | debug('puppeteer-loadtest is loading...'); 35 | 36 | 37 | const start = async () => { 38 | const results = await startPuppeteerLoadTest({ 39 | file, 40 | samplesRequested, 41 | concurrencyRequested, 42 | }); 43 | 44 | if (results) { 45 | if (outputFile) { 46 | fs.writeFileSync(outputFile, JSON.stringify(results, null, "\t")); 47 | } 48 | if (!silent) { 49 | console.log(JSON.stringify(results, null, "\t")); 50 | } 51 | } 52 | } 53 | 54 | start(); -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const createDebug = require('debug'); 4 | const debug = createDebug('puppeteer-loadtest'); 5 | const exec = require('child_process').exec; 6 | const perf = require('execution-time')(); 7 | 8 | const defaultOptions = { 9 | file: '', 10 | samplesRequested: '', 11 | concurrencyRequested: 1, 12 | results: {}, 13 | samplesCount: 0, 14 | } 15 | 16 | debug('puppeteer-loadtest is loading...'); 17 | 18 | 19 | const startSampleLogPerformance = (results, samplesCount) => { 20 | perf.start(`sampleCall${samplesCount + 1}`); 21 | results[`sample${samplesCount + 1}`] = {}; 22 | }; 23 | 24 | const stopSampleLogPerformance = (results, samplesCount) => { 25 | results[`sample${samplesCount + 1}`].sample = perf.stop(`sampleCall${samplesCount + 1}`); 26 | }; 27 | 28 | const startConcurrencyLogPerformance = (results, concurrencyCount, samplesCount) => { 29 | perf.start(`sample${samplesCount + 1}concurrencyCount${concurrencyCount + 1}`); 30 | results[`sample${samplesCount + 1}`].concurrency = {}; 31 | } 32 | 33 | const stopConcurrencyLogPerformance = (results, concurrencyCount, samplesCount) => { 34 | if(results[`sample${samplesCount + 1}`]) { 35 | results[`sample${samplesCount + 1}`].concurrency[`${concurrencyCount + 1}`] = perf.stop((`sample${samplesCount + 1}concurrencyCount${concurrencyCount + 1}`)); 36 | } 37 | } 38 | 39 | 40 | const executeTheCommand = function({ cmd, concurrencyCount, samplesCount, results }) { 41 | return new Promise((resolve, reject) => { 42 | startConcurrencyLogPerformance(results, concurrencyCount, samplesCount); 43 | exec(cmd, function(error, stdout, stderr) { 44 | debug(`sample: ${samplesCount}, concurrent: ${concurrencyCount}`); 45 | stopConcurrencyLogPerformance(results, concurrencyCount, samplesCount); 46 | if(stderr) reject(stderr); 47 | if(error) reject(error); 48 | resolve(stdout); 49 | }); 50 | }); 51 | }; 52 | 53 | const doAnotherSample = async (options) => { 54 | let { 55 | concurrencyRequested, 56 | file, 57 | samplesCount, 58 | samplesRequested, 59 | results, 60 | } = options; 61 | 62 | if(samplesCount < samplesRequested) { 63 | startSampleLogPerformance(results, samplesCount); 64 | await doConcurrency({ results, samplesCount, concurrencyRequested, file }); 65 | stopSampleLogPerformance(results, samplesCount); 66 | samplesCount += 1; 67 | return doAnotherSample({ 68 | concurrencyRequested, 69 | file, 70 | samplesCount, 71 | samplesRequested, 72 | results, 73 | }); 74 | } 75 | 76 | return results; 77 | }; 78 | 79 | const doConcurrency = async ({ results, samplesCount, concurrencyRequested, file}) => { 80 | const promisesArray = []; 81 | 82 | for(let i=0; i < concurrencyRequested; i += 1) { 83 | promisesArray.push( 84 | executeTheCommand({ 85 | cmd: `node ${file}`, 86 | concurrencyCount: i, 87 | results, 88 | samplesCount, 89 | }) 90 | ); 91 | } 92 | 93 | let values; 94 | try { 95 | perf.start('concurrencyCall'); 96 | values = await Promise.all(promisesArray); 97 | debug(values); 98 | } catch(error) { 99 | debug(error); 100 | } 101 | return values; 102 | }; 103 | 104 | function startPuppeteerLoadTest(paramOptions) { 105 | const options = Object.assign({}, defaultOptions, paramOptions); 106 | return doAnotherSample(options); 107 | } 108 | 109 | module.exports = startPuppeteerLoadTest; 110 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppeteer-loadtest", 3 | "version": "2.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.24.7", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", 10 | "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", 11 | "requires": { 12 | "@babel/highlight": "^7.24.7", 13 | "picocolors": "^1.0.0" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.24.7", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", 19 | "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" 20 | }, 21 | "@babel/highlight": { 22 | "version": "7.24.7", 23 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", 24 | "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", 25 | "requires": { 26 | "@babel/helper-validator-identifier": "^7.24.7", 27 | "chalk": "^2.4.2", 28 | "js-tokens": "^4.0.0", 29 | "picocolors": "^1.0.0" 30 | }, 31 | "dependencies": { 32 | "ansi-styles": { 33 | "version": "3.2.1", 34 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 35 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 36 | "requires": { 37 | "color-convert": "^1.9.0" 38 | } 39 | }, 40 | "chalk": { 41 | "version": "2.4.2", 42 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 43 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 44 | "requires": { 45 | "ansi-styles": "^3.2.1", 46 | "escape-string-regexp": "^1.0.5", 47 | "supports-color": "^5.3.0" 48 | } 49 | }, 50 | "color-convert": { 51 | "version": "1.9.3", 52 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 53 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 54 | "requires": { 55 | "color-name": "1.1.3" 56 | } 57 | }, 58 | "color-name": { 59 | "version": "1.1.3", 60 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 61 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 62 | }, 63 | "escape-string-regexp": { 64 | "version": "1.0.5", 65 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 66 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" 67 | }, 68 | "has-flag": { 69 | "version": "3.0.0", 70 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 71 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" 72 | }, 73 | "supports-color": { 74 | "version": "5.5.0", 75 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 76 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 77 | "requires": { 78 | "has-flag": "^3.0.0" 79 | } 80 | } 81 | } 82 | }, 83 | "@puppeteer/browsers": { 84 | "version": "2.2.3", 85 | "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", 86 | "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", 87 | "requires": { 88 | "debug": "4.3.4", 89 | "extract-zip": "2.0.1", 90 | "progress": "2.0.3", 91 | "proxy-agent": "6.4.0", 92 | "semver": "7.6.0", 93 | "tar-fs": "3.0.5", 94 | "unbzip2-stream": "1.4.3", 95 | "yargs": "17.7.2" 96 | }, 97 | "dependencies": { 98 | "cliui": { 99 | "version": "8.0.1", 100 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 101 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 102 | "requires": { 103 | "string-width": "^4.2.0", 104 | "strip-ansi": "^6.0.1", 105 | "wrap-ansi": "^7.0.0" 106 | } 107 | }, 108 | "debug": { 109 | "version": "4.3.4", 110 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 111 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 112 | "requires": { 113 | "ms": "2.1.2" 114 | } 115 | }, 116 | "yargs": { 117 | "version": "17.7.2", 118 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 119 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 120 | "requires": { 121 | "cliui": "^8.0.1", 122 | "escalade": "^3.1.1", 123 | "get-caller-file": "^2.0.5", 124 | "require-directory": "^2.1.1", 125 | "string-width": "^4.2.3", 126 | "y18n": "^5.0.5", 127 | "yargs-parser": "^21.1.1" 128 | } 129 | }, 130 | "yargs-parser": { 131 | "version": "21.1.1", 132 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 133 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" 134 | } 135 | } 136 | }, 137 | "@tootallnate/quickjs-emscripten": { 138 | "version": "0.23.0", 139 | "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", 140 | "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" 141 | }, 142 | "@types/node": { 143 | "version": "22.8.4", 144 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.4.tgz", 145 | "integrity": "sha512-SpNNxkftTJOPk0oN+y2bIqurEXHTA2AOZ3EJDDKeJ5VzkvvORSvmQXGQarcOzWV1ac7DCaPBEdMDxBsM+d8jWw==", 146 | "optional": true, 147 | "requires": { 148 | "undici-types": "~6.19.8" 149 | } 150 | }, 151 | "@types/yauzl": { 152 | "version": "2.10.3", 153 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", 154 | "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", 155 | "optional": true, 156 | "requires": { 157 | "@types/node": "*" 158 | } 159 | }, 160 | "@ungap/promise-all-settled": { 161 | "version": "1.1.2", 162 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 163 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 164 | "dev": true 165 | }, 166 | "agent-base": { 167 | "version": "7.1.1", 168 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 169 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 170 | "requires": { 171 | "debug": "^4.3.4" 172 | }, 173 | "dependencies": { 174 | "debug": { 175 | "version": "4.3.7", 176 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 177 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 178 | "requires": { 179 | "ms": "^2.1.3" 180 | } 181 | }, 182 | "ms": { 183 | "version": "2.1.3", 184 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 185 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 186 | } 187 | } 188 | }, 189 | "ansi-colors": { 190 | "version": "4.1.1", 191 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 192 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 193 | "dev": true 194 | }, 195 | "ansi-regex": { 196 | "version": "5.0.1", 197 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 198 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 199 | }, 200 | "ansi-styles": { 201 | "version": "4.3.0", 202 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 203 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 204 | "requires": { 205 | "color-convert": "^2.0.1" 206 | } 207 | }, 208 | "anymatch": { 209 | "version": "3.1.2", 210 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 211 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 212 | "dev": true, 213 | "requires": { 214 | "normalize-path": "^3.0.0", 215 | "picomatch": "^2.0.4" 216 | } 217 | }, 218 | "argparse": { 219 | "version": "2.0.1", 220 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 221 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 222 | }, 223 | "assertion-error": { 224 | "version": "1.1.0", 225 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 226 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 227 | "dev": true 228 | }, 229 | "ast-types": { 230 | "version": "0.13.4", 231 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 232 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 233 | "requires": { 234 | "tslib": "^2.0.1" 235 | } 236 | }, 237 | "b4a": { 238 | "version": "1.6.7", 239 | "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", 240 | "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" 241 | }, 242 | "balanced-match": { 243 | "version": "1.0.2", 244 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 245 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 246 | "dev": true 247 | }, 248 | "bare-events": { 249 | "version": "2.5.0", 250 | "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", 251 | "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", 252 | "optional": true 253 | }, 254 | "bare-fs": { 255 | "version": "2.3.5", 256 | "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", 257 | "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", 258 | "optional": true, 259 | "requires": { 260 | "bare-events": "^2.0.0", 261 | "bare-path": "^2.0.0", 262 | "bare-stream": "^2.0.0" 263 | } 264 | }, 265 | "bare-os": { 266 | "version": "2.4.4", 267 | "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", 268 | "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", 269 | "optional": true 270 | }, 271 | "bare-path": { 272 | "version": "2.1.3", 273 | "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", 274 | "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", 275 | "optional": true, 276 | "requires": { 277 | "bare-os": "^2.1.0" 278 | } 279 | }, 280 | "bare-stream": { 281 | "version": "2.3.2", 282 | "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", 283 | "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", 284 | "optional": true, 285 | "requires": { 286 | "streamx": "^2.20.0" 287 | } 288 | }, 289 | "base64-js": { 290 | "version": "1.5.1", 291 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 292 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 293 | }, 294 | "basic-ftp": { 295 | "version": "5.0.5", 296 | "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", 297 | "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==" 298 | }, 299 | "binary-extensions": { 300 | "version": "2.2.0", 301 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 302 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 303 | "dev": true 304 | }, 305 | "brace-expansion": { 306 | "version": "1.1.11", 307 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 308 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 309 | "dev": true, 310 | "requires": { 311 | "balanced-match": "^1.0.0", 312 | "concat-map": "0.0.1" 313 | } 314 | }, 315 | "braces": { 316 | "version": "3.0.2", 317 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 318 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 319 | "dev": true, 320 | "requires": { 321 | "fill-range": "^7.0.1" 322 | } 323 | }, 324 | "browser-stdout": { 325 | "version": "1.3.1", 326 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 327 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 328 | "dev": true 329 | }, 330 | "buffer": { 331 | "version": "5.7.1", 332 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 333 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 334 | "requires": { 335 | "base64-js": "^1.3.1", 336 | "ieee754": "^1.1.13" 337 | } 338 | }, 339 | "buffer-crc32": { 340 | "version": "0.2.13", 341 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 342 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" 343 | }, 344 | "callsites": { 345 | "version": "3.1.0", 346 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 347 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 348 | }, 349 | "camelcase": { 350 | "version": "6.2.0", 351 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 352 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", 353 | "dev": true 354 | }, 355 | "chai": { 356 | "version": "4.3.4", 357 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", 358 | "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", 359 | "dev": true, 360 | "requires": { 361 | "assertion-error": "^1.1.0", 362 | "check-error": "^1.0.2", 363 | "deep-eql": "^3.0.1", 364 | "get-func-name": "^2.0.0", 365 | "pathval": "^1.1.1", 366 | "type-detect": "^4.0.5" 367 | } 368 | }, 369 | "chai-as-promised": { 370 | "version": "7.1.1", 371 | "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", 372 | "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", 373 | "dev": true, 374 | "requires": { 375 | "check-error": "^1.0.2" 376 | } 377 | }, 378 | "chalk": { 379 | "version": "4.1.2", 380 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 381 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 382 | "dev": true, 383 | "requires": { 384 | "ansi-styles": "^4.1.0", 385 | "supports-color": "^7.1.0" 386 | }, 387 | "dependencies": { 388 | "supports-color": { 389 | "version": "7.2.0", 390 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 391 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 392 | "dev": true, 393 | "requires": { 394 | "has-flag": "^4.0.0" 395 | } 396 | } 397 | } 398 | }, 399 | "check-error": { 400 | "version": "1.0.2", 401 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 402 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 403 | "dev": true 404 | }, 405 | "chokidar": { 406 | "version": "3.5.2", 407 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", 408 | "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", 409 | "dev": true, 410 | "requires": { 411 | "anymatch": "~3.1.2", 412 | "braces": "~3.0.2", 413 | "fsevents": "~2.3.2", 414 | "glob-parent": "~5.1.2", 415 | "is-binary-path": "~2.1.0", 416 | "is-glob": "~4.0.1", 417 | "normalize-path": "~3.0.0", 418 | "readdirp": "~3.6.0" 419 | } 420 | }, 421 | "chromium-bidi": { 422 | "version": "0.5.23", 423 | "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.23.tgz", 424 | "integrity": "sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA==", 425 | "requires": { 426 | "mitt": "3.0.1", 427 | "urlpattern-polyfill": "10.0.0", 428 | "zod": "3.23.8" 429 | } 430 | }, 431 | "cliui": { 432 | "version": "7.0.4", 433 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 434 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 435 | "dev": true, 436 | "requires": { 437 | "string-width": "^4.2.0", 438 | "strip-ansi": "^6.0.0", 439 | "wrap-ansi": "^7.0.0" 440 | } 441 | }, 442 | "color-convert": { 443 | "version": "2.0.1", 444 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 445 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 446 | "requires": { 447 | "color-name": "~1.1.4" 448 | } 449 | }, 450 | "color-name": { 451 | "version": "1.1.4", 452 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 453 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 454 | }, 455 | "concat-map": { 456 | "version": "0.0.1", 457 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 458 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 459 | "dev": true 460 | }, 461 | "cosmiconfig": { 462 | "version": "9.0.0", 463 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", 464 | "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", 465 | "requires": { 466 | "env-paths": "^2.2.1", 467 | "import-fresh": "^3.3.0", 468 | "js-yaml": "^4.1.0", 469 | "parse-json": "^5.2.0" 470 | } 471 | }, 472 | "data-uri-to-buffer": { 473 | "version": "6.0.2", 474 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", 475 | "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==" 476 | }, 477 | "debug": { 478 | "version": "4.3.2", 479 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 480 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 481 | "requires": { 482 | "ms": "2.1.2" 483 | } 484 | }, 485 | "decamelize": { 486 | "version": "4.0.0", 487 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 488 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 489 | "dev": true 490 | }, 491 | "deep-eql": { 492 | "version": "3.0.1", 493 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 494 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 495 | "dev": true, 496 | "requires": { 497 | "type-detect": "^4.0.0" 498 | } 499 | }, 500 | "degenerator": { 501 | "version": "5.0.1", 502 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", 503 | "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", 504 | "requires": { 505 | "ast-types": "^0.13.4", 506 | "escodegen": "^2.1.0", 507 | "esprima": "^4.0.1" 508 | } 509 | }, 510 | "devtools-protocol": { 511 | "version": "0.0.1299070", 512 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", 513 | "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==" 514 | }, 515 | "diff": { 516 | "version": "3.5.0", 517 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 518 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 519 | "dev": true 520 | }, 521 | "dirty-chai": { 522 | "version": "2.0.1", 523 | "resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-2.0.1.tgz", 524 | "integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==", 525 | "dev": true 526 | }, 527 | "emoji-regex": { 528 | "version": "8.0.0", 529 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 530 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 531 | }, 532 | "end-of-stream": { 533 | "version": "1.4.4", 534 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 535 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 536 | "requires": { 537 | "once": "^1.4.0" 538 | } 539 | }, 540 | "env-paths": { 541 | "version": "2.2.1", 542 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 543 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" 544 | }, 545 | "error-ex": { 546 | "version": "1.3.2", 547 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 548 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 549 | "requires": { 550 | "is-arrayish": "^0.2.1" 551 | } 552 | }, 553 | "escalade": { 554 | "version": "3.1.1", 555 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 556 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 557 | }, 558 | "escape-string-regexp": { 559 | "version": "4.0.0", 560 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 561 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 562 | "dev": true 563 | }, 564 | "escodegen": { 565 | "version": "2.1.0", 566 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", 567 | "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", 568 | "requires": { 569 | "esprima": "^4.0.1", 570 | "estraverse": "^5.2.0", 571 | "esutils": "^2.0.2", 572 | "source-map": "~0.6.1" 573 | } 574 | }, 575 | "esprima": { 576 | "version": "4.0.1", 577 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 578 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 579 | }, 580 | "estraverse": { 581 | "version": "5.3.0", 582 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 583 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" 584 | }, 585 | "esutils": { 586 | "version": "2.0.3", 587 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 588 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 589 | }, 590 | "execution-time": { 591 | "version": "1.4.1", 592 | "resolved": "https://registry.npmjs.org/execution-time/-/execution-time-1.4.1.tgz", 593 | "integrity": "sha512-4t9svrTtsXxAEzAs9/tm1R/Voj5AYHqxd72BiLEbGQWJq2PD3tAmW8bXI7Pp0yorjaKshT1+NyKy0ytHlKW4Pg==", 594 | "requires": { 595 | "pretty-hrtime": "^1.0.3" 596 | } 597 | }, 598 | "extract-zip": { 599 | "version": "2.0.1", 600 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 601 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 602 | "requires": { 603 | "@types/yauzl": "^2.9.1", 604 | "debug": "^4.1.1", 605 | "get-stream": "^5.1.0", 606 | "yauzl": "^2.10.0" 607 | } 608 | }, 609 | "fast-fifo": { 610 | "version": "1.3.2", 611 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 612 | "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" 613 | }, 614 | "fd-slicer": { 615 | "version": "1.1.0", 616 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 617 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 618 | "requires": { 619 | "pend": "~1.2.0" 620 | } 621 | }, 622 | "fill-range": { 623 | "version": "7.0.1", 624 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 625 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 626 | "dev": true, 627 | "requires": { 628 | "to-regex-range": "^5.0.1" 629 | } 630 | }, 631 | "flat": { 632 | "version": "5.0.2", 633 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 634 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 635 | "dev": true 636 | }, 637 | "formatio": { 638 | "version": "1.2.0", 639 | "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", 640 | "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", 641 | "dev": true, 642 | "requires": { 643 | "samsam": "1.x" 644 | } 645 | }, 646 | "fs-extra": { 647 | "version": "11.2.0", 648 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", 649 | "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", 650 | "requires": { 651 | "graceful-fs": "^4.2.0", 652 | "jsonfile": "^6.0.1", 653 | "universalify": "^2.0.0" 654 | } 655 | }, 656 | "fs.realpath": { 657 | "version": "1.0.0", 658 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 659 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 660 | "dev": true 661 | }, 662 | "fsevents": { 663 | "version": "2.3.2", 664 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 665 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 666 | "dev": true, 667 | "optional": true 668 | }, 669 | "get-caller-file": { 670 | "version": "2.0.5", 671 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 672 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 673 | }, 674 | "get-func-name": { 675 | "version": "2.0.0", 676 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 677 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 678 | "dev": true 679 | }, 680 | "get-stream": { 681 | "version": "5.2.0", 682 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 683 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 684 | "requires": { 685 | "pump": "^3.0.0" 686 | } 687 | }, 688 | "get-uri": { 689 | "version": "6.0.3", 690 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", 691 | "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", 692 | "requires": { 693 | "basic-ftp": "^5.0.2", 694 | "data-uri-to-buffer": "^6.0.2", 695 | "debug": "^4.3.4", 696 | "fs-extra": "^11.2.0" 697 | }, 698 | "dependencies": { 699 | "debug": { 700 | "version": "4.3.7", 701 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 702 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 703 | "requires": { 704 | "ms": "^2.1.3" 705 | } 706 | }, 707 | "ms": { 708 | "version": "2.1.3", 709 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 710 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 711 | } 712 | } 713 | }, 714 | "glob-parent": { 715 | "version": "5.1.2", 716 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 717 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 718 | "dev": true, 719 | "requires": { 720 | "is-glob": "^4.0.1" 721 | } 722 | }, 723 | "graceful-fs": { 724 | "version": "4.2.11", 725 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 726 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 727 | }, 728 | "growl": { 729 | "version": "1.10.5", 730 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 731 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 732 | "dev": true 733 | }, 734 | "has-flag": { 735 | "version": "4.0.0", 736 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 737 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 738 | "dev": true 739 | }, 740 | "he": { 741 | "version": "1.2.0", 742 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 743 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 744 | "dev": true 745 | }, 746 | "http-proxy-agent": { 747 | "version": "7.0.2", 748 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 749 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 750 | "requires": { 751 | "agent-base": "^7.1.0", 752 | "debug": "^4.3.4" 753 | }, 754 | "dependencies": { 755 | "debug": { 756 | "version": "4.3.7", 757 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 758 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 759 | "requires": { 760 | "ms": "^2.1.3" 761 | } 762 | }, 763 | "ms": { 764 | "version": "2.1.3", 765 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 766 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 767 | } 768 | } 769 | }, 770 | "https-proxy-agent": { 771 | "version": "7.0.5", 772 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", 773 | "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", 774 | "requires": { 775 | "agent-base": "^7.0.2", 776 | "debug": "4" 777 | } 778 | }, 779 | "ieee754": { 780 | "version": "1.2.1", 781 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 782 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 783 | }, 784 | "import-fresh": { 785 | "version": "3.3.0", 786 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 787 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 788 | "requires": { 789 | "parent-module": "^1.0.0", 790 | "resolve-from": "^4.0.0" 791 | } 792 | }, 793 | "inflight": { 794 | "version": "1.0.6", 795 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 796 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 797 | "dev": true, 798 | "requires": { 799 | "once": "^1.3.0", 800 | "wrappy": "1" 801 | } 802 | }, 803 | "inherits": { 804 | "version": "2.0.4", 805 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 806 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 807 | "dev": true 808 | }, 809 | "ip-address": { 810 | "version": "9.0.5", 811 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 812 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 813 | "requires": { 814 | "jsbn": "1.1.0", 815 | "sprintf-js": "^1.1.3" 816 | } 817 | }, 818 | "is-arrayish": { 819 | "version": "0.2.1", 820 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 821 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 822 | }, 823 | "is-binary-path": { 824 | "version": "2.1.0", 825 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 826 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 827 | "dev": true, 828 | "requires": { 829 | "binary-extensions": "^2.0.0" 830 | } 831 | }, 832 | "is-extglob": { 833 | "version": "2.1.1", 834 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 835 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 836 | "dev": true 837 | }, 838 | "is-fullwidth-code-point": { 839 | "version": "3.0.0", 840 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 841 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 842 | }, 843 | "is-glob": { 844 | "version": "4.0.3", 845 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 846 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 847 | "dev": true, 848 | "requires": { 849 | "is-extglob": "^2.1.1" 850 | } 851 | }, 852 | "is-number": { 853 | "version": "7.0.0", 854 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 855 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 856 | "dev": true 857 | }, 858 | "is-plain-obj": { 859 | "version": "2.1.0", 860 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 861 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 862 | "dev": true 863 | }, 864 | "is-unicode-supported": { 865 | "version": "0.1.0", 866 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 867 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 868 | "dev": true 869 | }, 870 | "isarray": { 871 | "version": "0.0.1", 872 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 873 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 874 | "dev": true 875 | }, 876 | "isexe": { 877 | "version": "2.0.0", 878 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 879 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 880 | "dev": true 881 | }, 882 | "js-tokens": { 883 | "version": "4.0.0", 884 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 885 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 886 | }, 887 | "js-yaml": { 888 | "version": "4.1.0", 889 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 890 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 891 | "requires": { 892 | "argparse": "^2.0.1" 893 | } 894 | }, 895 | "jsbn": { 896 | "version": "1.1.0", 897 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 898 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 899 | }, 900 | "json-parse-even-better-errors": { 901 | "version": "2.3.1", 902 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 903 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 904 | }, 905 | "jsonfile": { 906 | "version": "6.1.0", 907 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 908 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 909 | "requires": { 910 | "graceful-fs": "^4.1.6", 911 | "universalify": "^2.0.0" 912 | } 913 | }, 914 | "lines-and-columns": { 915 | "version": "1.2.4", 916 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 917 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 918 | }, 919 | "log-symbols": { 920 | "version": "4.1.0", 921 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 922 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 923 | "dev": true, 924 | "requires": { 925 | "chalk": "^4.1.0", 926 | "is-unicode-supported": "^0.1.0" 927 | } 928 | }, 929 | "lolex": { 930 | "version": "1.6.0", 931 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", 932 | "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", 933 | "dev": true 934 | }, 935 | "lru-cache": { 936 | "version": "7.18.3", 937 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 938 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" 939 | }, 940 | "minimatch": { 941 | "version": "3.0.4", 942 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 943 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 944 | "dev": true, 945 | "requires": { 946 | "brace-expansion": "^1.1.7" 947 | } 948 | }, 949 | "minimist": { 950 | "version": "1.2.6", 951 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 952 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 953 | }, 954 | "mitt": { 955 | "version": "3.0.1", 956 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", 957 | "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" 958 | }, 959 | "mocha": { 960 | "version": "9.1.2", 961 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", 962 | "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", 963 | "dev": true, 964 | "requires": { 965 | "@ungap/promise-all-settled": "1.1.2", 966 | "ansi-colors": "4.1.1", 967 | "browser-stdout": "1.3.1", 968 | "chokidar": "3.5.2", 969 | "debug": "4.3.2", 970 | "diff": "5.0.0", 971 | "escape-string-regexp": "4.0.0", 972 | "find-up": "5.0.0", 973 | "glob": "7.1.7", 974 | "growl": "1.10.5", 975 | "he": "1.2.0", 976 | "js-yaml": "4.1.0", 977 | "log-symbols": "4.1.0", 978 | "minimatch": "3.0.4", 979 | "ms": "2.1.3", 980 | "nanoid": "3.1.25", 981 | "serialize-javascript": "6.0.0", 982 | "strip-json-comments": "3.1.1", 983 | "supports-color": "8.1.1", 984 | "which": "2.0.2", 985 | "workerpool": "6.1.5", 986 | "yargs": "16.2.0", 987 | "yargs-parser": "20.2.4", 988 | "yargs-unparser": "2.0.0" 989 | }, 990 | "dependencies": { 991 | "diff": { 992 | "version": "5.0.0", 993 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 994 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 995 | "dev": true 996 | }, 997 | "find-up": { 998 | "version": "5.0.0", 999 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1000 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1001 | "dev": true, 1002 | "requires": { 1003 | "locate-path": "^6.0.0", 1004 | "path-exists": "^4.0.0" 1005 | } 1006 | }, 1007 | "glob": { 1008 | "version": "7.1.7", 1009 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1010 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1011 | "dev": true, 1012 | "requires": { 1013 | "fs.realpath": "^1.0.0", 1014 | "inflight": "^1.0.4", 1015 | "inherits": "2", 1016 | "minimatch": "^3.0.4", 1017 | "once": "^1.3.0", 1018 | "path-is-absolute": "^1.0.0" 1019 | } 1020 | }, 1021 | "locate-path": { 1022 | "version": "6.0.0", 1023 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1024 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1025 | "dev": true, 1026 | "requires": { 1027 | "p-locate": "^5.0.0" 1028 | } 1029 | }, 1030 | "ms": { 1031 | "version": "2.1.3", 1032 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1033 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1034 | "dev": true 1035 | }, 1036 | "p-limit": { 1037 | "version": "3.1.0", 1038 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1039 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1040 | "dev": true, 1041 | "requires": { 1042 | "yocto-queue": "^0.1.0" 1043 | } 1044 | }, 1045 | "p-locate": { 1046 | "version": "5.0.0", 1047 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1048 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1049 | "dev": true, 1050 | "requires": { 1051 | "p-limit": "^3.0.2" 1052 | } 1053 | } 1054 | } 1055 | }, 1056 | "mock-require": { 1057 | "version": "3.0.3", 1058 | "resolved": "https://registry.npmjs.org/mock-require/-/mock-require-3.0.3.tgz", 1059 | "integrity": "sha512-lLzfLHcyc10MKQnNUCv7dMcoY/2Qxd6wJfbqCcVk3LDb8An4hF6ohk5AztrvgKhJCqj36uyzi/p5se+tvyD+Wg==", 1060 | "dev": true, 1061 | "requires": { 1062 | "get-caller-file": "^1.0.2", 1063 | "normalize-path": "^2.1.1" 1064 | }, 1065 | "dependencies": { 1066 | "get-caller-file": { 1067 | "version": "1.0.3", 1068 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 1069 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", 1070 | "dev": true 1071 | }, 1072 | "normalize-path": { 1073 | "version": "2.1.1", 1074 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1075 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1076 | "dev": true, 1077 | "requires": { 1078 | "remove-trailing-separator": "^1.0.1" 1079 | } 1080 | } 1081 | } 1082 | }, 1083 | "ms": { 1084 | "version": "2.1.2", 1085 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1086 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1087 | }, 1088 | "nanoid": { 1089 | "version": "3.1.25", 1090 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", 1091 | "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", 1092 | "dev": true 1093 | }, 1094 | "native-promise-only": { 1095 | "version": "0.8.1", 1096 | "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", 1097 | "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", 1098 | "dev": true 1099 | }, 1100 | "netmask": { 1101 | "version": "2.0.2", 1102 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 1103 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" 1104 | }, 1105 | "normalize-path": { 1106 | "version": "3.0.0", 1107 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1108 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1109 | "dev": true 1110 | }, 1111 | "once": { 1112 | "version": "1.4.0", 1113 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1114 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1115 | "requires": { 1116 | "wrappy": "1" 1117 | } 1118 | }, 1119 | "pac-proxy-agent": { 1120 | "version": "7.0.2", 1121 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", 1122 | "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", 1123 | "requires": { 1124 | "@tootallnate/quickjs-emscripten": "^0.23.0", 1125 | "agent-base": "^7.0.2", 1126 | "debug": "^4.3.4", 1127 | "get-uri": "^6.0.1", 1128 | "http-proxy-agent": "^7.0.0", 1129 | "https-proxy-agent": "^7.0.5", 1130 | "pac-resolver": "^7.0.1", 1131 | "socks-proxy-agent": "^8.0.4" 1132 | }, 1133 | "dependencies": { 1134 | "debug": { 1135 | "version": "4.3.7", 1136 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1137 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1138 | "requires": { 1139 | "ms": "^2.1.3" 1140 | } 1141 | }, 1142 | "ms": { 1143 | "version": "2.1.3", 1144 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1145 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1146 | } 1147 | } 1148 | }, 1149 | "pac-resolver": { 1150 | "version": "7.0.1", 1151 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", 1152 | "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", 1153 | "requires": { 1154 | "degenerator": "^5.0.0", 1155 | "netmask": "^2.0.2" 1156 | } 1157 | }, 1158 | "parent-module": { 1159 | "version": "1.0.1", 1160 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1161 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1162 | "requires": { 1163 | "callsites": "^3.0.0" 1164 | } 1165 | }, 1166 | "parse-json": { 1167 | "version": "5.2.0", 1168 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1169 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1170 | "requires": { 1171 | "@babel/code-frame": "^7.0.0", 1172 | "error-ex": "^1.3.1", 1173 | "json-parse-even-better-errors": "^2.3.0", 1174 | "lines-and-columns": "^1.1.6" 1175 | } 1176 | }, 1177 | "path-exists": { 1178 | "version": "4.0.0", 1179 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1180 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1181 | "dev": true 1182 | }, 1183 | "path-is-absolute": { 1184 | "version": "1.0.1", 1185 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1186 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1187 | "dev": true 1188 | }, 1189 | "path-to-regexp": { 1190 | "version": "1.8.0", 1191 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 1192 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 1193 | "dev": true, 1194 | "requires": { 1195 | "isarray": "0.0.1" 1196 | } 1197 | }, 1198 | "pathval": { 1199 | "version": "1.1.1", 1200 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1201 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1202 | "dev": true 1203 | }, 1204 | "pend": { 1205 | "version": "1.2.0", 1206 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1207 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" 1208 | }, 1209 | "picocolors": { 1210 | "version": "1.0.1", 1211 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 1212 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" 1213 | }, 1214 | "picomatch": { 1215 | "version": "2.3.0", 1216 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 1217 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 1218 | "dev": true 1219 | }, 1220 | "pretty-hrtime": { 1221 | "version": "1.0.3", 1222 | "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", 1223 | "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" 1224 | }, 1225 | "progress": { 1226 | "version": "2.0.3", 1227 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1228 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 1229 | }, 1230 | "proxy-agent": { 1231 | "version": "6.4.0", 1232 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", 1233 | "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", 1234 | "requires": { 1235 | "agent-base": "^7.0.2", 1236 | "debug": "^4.3.4", 1237 | "http-proxy-agent": "^7.0.1", 1238 | "https-proxy-agent": "^7.0.3", 1239 | "lru-cache": "^7.14.1", 1240 | "pac-proxy-agent": "^7.0.1", 1241 | "proxy-from-env": "^1.1.0", 1242 | "socks-proxy-agent": "^8.0.2" 1243 | }, 1244 | "dependencies": { 1245 | "debug": { 1246 | "version": "4.3.7", 1247 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1248 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1249 | "requires": { 1250 | "ms": "^2.1.3" 1251 | } 1252 | }, 1253 | "ms": { 1254 | "version": "2.1.3", 1255 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1256 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1257 | } 1258 | } 1259 | }, 1260 | "proxy-from-env": { 1261 | "version": "1.1.0", 1262 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1263 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1264 | }, 1265 | "pump": { 1266 | "version": "3.0.2", 1267 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1268 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1269 | "requires": { 1270 | "end-of-stream": "^1.1.0", 1271 | "once": "^1.3.1" 1272 | } 1273 | }, 1274 | "puppeteer": { 1275 | "version": "22.11.2", 1276 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.11.2.tgz", 1277 | "integrity": "sha512-8fjdQSgW0sq7471ftca24J7sXK+jXZ7OW7Gx+NEBFNyXrcTiBfukEI46gNq6hiMhbLEDT30NeylK/1ZoPdlKSA==", 1278 | "requires": { 1279 | "@puppeteer/browsers": "2.2.3", 1280 | "cosmiconfig": "9.0.0", 1281 | "devtools-protocol": "0.0.1299070", 1282 | "puppeteer-core": "22.11.2" 1283 | } 1284 | }, 1285 | "puppeteer-core": { 1286 | "version": "22.11.2", 1287 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.2.tgz", 1288 | "integrity": "sha512-vQo+YDuePyvj+92Z9cdtxi/HalKf+k/R4tE80nGtQqJRNqU81eHaHkbVfnLszdaLlvwFF5tipnnSCzqWlEddtw==", 1289 | "requires": { 1290 | "@puppeteer/browsers": "2.2.3", 1291 | "chromium-bidi": "0.5.23", 1292 | "debug": "4.3.5", 1293 | "devtools-protocol": "0.0.1299070", 1294 | "ws": "8.17.1" 1295 | }, 1296 | "dependencies": { 1297 | "debug": { 1298 | "version": "4.3.5", 1299 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 1300 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 1301 | "requires": { 1302 | "ms": "2.1.2" 1303 | } 1304 | } 1305 | } 1306 | }, 1307 | "queue-tick": { 1308 | "version": "1.0.1", 1309 | "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", 1310 | "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" 1311 | }, 1312 | "randombytes": { 1313 | "version": "2.1.0", 1314 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1315 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1316 | "dev": true, 1317 | "requires": { 1318 | "safe-buffer": "^5.1.0" 1319 | } 1320 | }, 1321 | "readdirp": { 1322 | "version": "3.6.0", 1323 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1324 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1325 | "dev": true, 1326 | "requires": { 1327 | "picomatch": "^2.2.1" 1328 | } 1329 | }, 1330 | "remove-trailing-separator": { 1331 | "version": "1.1.0", 1332 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1333 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1334 | "dev": true 1335 | }, 1336 | "require-directory": { 1337 | "version": "2.1.1", 1338 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1339 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1340 | }, 1341 | "resolve-from": { 1342 | "version": "4.0.0", 1343 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1344 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1345 | }, 1346 | "safe-buffer": { 1347 | "version": "5.2.1", 1348 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1349 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1350 | "dev": true 1351 | }, 1352 | "samsam": { 1353 | "version": "1.3.0", 1354 | "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", 1355 | "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", 1356 | "dev": true 1357 | }, 1358 | "semver": { 1359 | "version": "7.6.0", 1360 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 1361 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 1362 | "requires": { 1363 | "lru-cache": "^6.0.0" 1364 | }, 1365 | "dependencies": { 1366 | "lru-cache": { 1367 | "version": "6.0.0", 1368 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1369 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1370 | "requires": { 1371 | "yallist": "^4.0.0" 1372 | } 1373 | } 1374 | } 1375 | }, 1376 | "serialize-javascript": { 1377 | "version": "6.0.0", 1378 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1379 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1380 | "dev": true, 1381 | "requires": { 1382 | "randombytes": "^2.1.0" 1383 | } 1384 | }, 1385 | "sinon": { 1386 | "version": "2.4.1", 1387 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", 1388 | "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", 1389 | "dev": true, 1390 | "requires": { 1391 | "diff": "^3.1.0", 1392 | "formatio": "1.2.0", 1393 | "lolex": "^1.6.0", 1394 | "native-promise-only": "^0.8.1", 1395 | "path-to-regexp": "^1.7.0", 1396 | "samsam": "^1.1.3", 1397 | "text-encoding": "0.6.4", 1398 | "type-detect": "^4.0.0" 1399 | } 1400 | }, 1401 | "sinon-chai": { 1402 | "version": "2.14.0", 1403 | "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", 1404 | "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", 1405 | "dev": true 1406 | }, 1407 | "smart-buffer": { 1408 | "version": "4.2.0", 1409 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1410 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" 1411 | }, 1412 | "socks": { 1413 | "version": "2.8.3", 1414 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1415 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1416 | "requires": { 1417 | "ip-address": "^9.0.5", 1418 | "smart-buffer": "^4.2.0" 1419 | } 1420 | }, 1421 | "socks-proxy-agent": { 1422 | "version": "8.0.4", 1423 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", 1424 | "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", 1425 | "requires": { 1426 | "agent-base": "^7.1.1", 1427 | "debug": "^4.3.4", 1428 | "socks": "^2.8.3" 1429 | }, 1430 | "dependencies": { 1431 | "debug": { 1432 | "version": "4.3.7", 1433 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1434 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1435 | "requires": { 1436 | "ms": "^2.1.3" 1437 | } 1438 | }, 1439 | "ms": { 1440 | "version": "2.1.3", 1441 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1442 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1443 | } 1444 | } 1445 | }, 1446 | "source-map": { 1447 | "version": "0.6.1", 1448 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1449 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1450 | "optional": true 1451 | }, 1452 | "sprintf-js": { 1453 | "version": "1.1.3", 1454 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1455 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 1456 | }, 1457 | "streamx": { 1458 | "version": "2.20.1", 1459 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", 1460 | "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", 1461 | "requires": { 1462 | "bare-events": "^2.2.0", 1463 | "fast-fifo": "^1.3.2", 1464 | "queue-tick": "^1.0.1", 1465 | "text-decoder": "^1.1.0" 1466 | } 1467 | }, 1468 | "string-width": { 1469 | "version": "4.2.3", 1470 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1471 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1472 | "requires": { 1473 | "emoji-regex": "^8.0.0", 1474 | "is-fullwidth-code-point": "^3.0.0", 1475 | "strip-ansi": "^6.0.1" 1476 | } 1477 | }, 1478 | "strip-ansi": { 1479 | "version": "6.0.1", 1480 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1481 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1482 | "requires": { 1483 | "ansi-regex": "^5.0.1" 1484 | } 1485 | }, 1486 | "strip-json-comments": { 1487 | "version": "3.1.1", 1488 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1489 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1490 | "dev": true 1491 | }, 1492 | "supports-color": { 1493 | "version": "8.1.1", 1494 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1495 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1496 | "dev": true, 1497 | "requires": { 1498 | "has-flag": "^4.0.0" 1499 | } 1500 | }, 1501 | "tar-fs": { 1502 | "version": "3.0.5", 1503 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", 1504 | "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", 1505 | "requires": { 1506 | "bare-fs": "^2.1.1", 1507 | "bare-path": "^2.1.0", 1508 | "pump": "^3.0.0", 1509 | "tar-stream": "^3.1.5" 1510 | } 1511 | }, 1512 | "tar-stream": { 1513 | "version": "3.1.7", 1514 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", 1515 | "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", 1516 | "requires": { 1517 | "b4a": "^1.6.4", 1518 | "fast-fifo": "^1.2.0", 1519 | "streamx": "^2.15.0" 1520 | } 1521 | }, 1522 | "text-decoder": { 1523 | "version": "1.2.1", 1524 | "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", 1525 | "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" 1526 | }, 1527 | "text-encoding": { 1528 | "version": "0.6.4", 1529 | "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", 1530 | "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", 1531 | "dev": true 1532 | }, 1533 | "through": { 1534 | "version": "2.3.8", 1535 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1536 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 1537 | }, 1538 | "to-regex-range": { 1539 | "version": "5.0.1", 1540 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1541 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1542 | "dev": true, 1543 | "requires": { 1544 | "is-number": "^7.0.0" 1545 | } 1546 | }, 1547 | "tslib": { 1548 | "version": "2.8.0", 1549 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", 1550 | "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" 1551 | }, 1552 | "type-detect": { 1553 | "version": "4.0.8", 1554 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1555 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1556 | "dev": true 1557 | }, 1558 | "ultimate-chai": { 1559 | "version": "4.1.1", 1560 | "resolved": "https://registry.npmjs.org/ultimate-chai/-/ultimate-chai-4.1.1.tgz", 1561 | "integrity": "sha1-GIH/Nzpak9auLXiHUWcmiDvvdEo=", 1562 | "dev": true, 1563 | "requires": { 1564 | "chai": "^4.1.2", 1565 | "chai-as-promised": "^7.1.1", 1566 | "dirty-chai": "^2.0.1", 1567 | "sinon": "^2.1.0", 1568 | "sinon-chai": "^2.14.0" 1569 | } 1570 | }, 1571 | "unbzip2-stream": { 1572 | "version": "1.4.3", 1573 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 1574 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 1575 | "requires": { 1576 | "buffer": "^5.2.1", 1577 | "through": "^2.3.8" 1578 | } 1579 | }, 1580 | "undici-types": { 1581 | "version": "6.19.8", 1582 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1583 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 1584 | "optional": true 1585 | }, 1586 | "universalify": { 1587 | "version": "2.0.1", 1588 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1589 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" 1590 | }, 1591 | "urlpattern-polyfill": { 1592 | "version": "10.0.0", 1593 | "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", 1594 | "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" 1595 | }, 1596 | "which": { 1597 | "version": "2.0.2", 1598 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1599 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1600 | "dev": true, 1601 | "requires": { 1602 | "isexe": "^2.0.0" 1603 | } 1604 | }, 1605 | "workerpool": { 1606 | "version": "6.1.5", 1607 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", 1608 | "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", 1609 | "dev": true 1610 | }, 1611 | "wrap-ansi": { 1612 | "version": "7.0.0", 1613 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1614 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1615 | "requires": { 1616 | "ansi-styles": "^4.0.0", 1617 | "string-width": "^4.1.0", 1618 | "strip-ansi": "^6.0.0" 1619 | } 1620 | }, 1621 | "wrappy": { 1622 | "version": "1.0.2", 1623 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1624 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1625 | }, 1626 | "ws": { 1627 | "version": "8.17.1", 1628 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", 1629 | "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==" 1630 | }, 1631 | "y18n": { 1632 | "version": "5.0.8", 1633 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1634 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1635 | }, 1636 | "yallist": { 1637 | "version": "4.0.0", 1638 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1639 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1640 | }, 1641 | "yargs": { 1642 | "version": "16.2.0", 1643 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1644 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1645 | "dev": true, 1646 | "requires": { 1647 | "cliui": "^7.0.2", 1648 | "escalade": "^3.1.1", 1649 | "get-caller-file": "^2.0.5", 1650 | "require-directory": "^2.1.1", 1651 | "string-width": "^4.2.0", 1652 | "y18n": "^5.0.5", 1653 | "yargs-parser": "^20.2.2" 1654 | } 1655 | }, 1656 | "yargs-parser": { 1657 | "version": "20.2.4", 1658 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1659 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1660 | "dev": true 1661 | }, 1662 | "yargs-unparser": { 1663 | "version": "2.0.0", 1664 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1665 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1666 | "dev": true, 1667 | "requires": { 1668 | "camelcase": "^6.0.0", 1669 | "decamelize": "^4.0.0", 1670 | "flat": "^5.0.2", 1671 | "is-plain-obj": "^2.1.0" 1672 | } 1673 | }, 1674 | "yauzl": { 1675 | "version": "2.10.0", 1676 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1677 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 1678 | "requires": { 1679 | "buffer-crc32": "~0.2.3", 1680 | "fd-slicer": "~1.1.0" 1681 | } 1682 | }, 1683 | "yocto-queue": { 1684 | "version": "0.1.0", 1685 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1686 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1687 | "dev": true 1688 | }, 1689 | "zod": { 1690 | "version": "3.23.8", 1691 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 1692 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" 1693 | } 1694 | } 1695 | } 1696 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppeteer-loadtest", 3 | "version": "2.2.1", 4 | "description": "loadtest puppeteer (Headless Chrome API) script using node", 5 | "main": "index.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "scripts": { 10 | "test": "mocha ./test/index-test.js" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/svenkatreddy/puppeteer-loadtest.git" 15 | }, 16 | "keywords": [ 17 | "puppeteer", 18 | "loadtest", 19 | "chrome", 20 | "headless", 21 | "automation", 22 | "script" 23 | ], 24 | "author": "svenkatreddy", 25 | "license": "ISC", 26 | "bugs": { 27 | "url": "https://github.com/svenkatreddy/puppeteer-loadtest/issues" 28 | }, 29 | "bin": { 30 | "puppeteer-loadtest": "bin.js" 31 | }, 32 | "homepage": "https://github.com/svenkatreddy/puppeteer-loadtest#readme", 33 | "dependencies": { 34 | "debug": "^4.1.1", 35 | "execution-time": "^1.2.0", 36 | "minimist": "^1.2.6", 37 | "puppeteer": "^22.11.2" 38 | }, 39 | "devDependencies": { 40 | "mocha": "^9.1.2", 41 | "mock-require": "^3.0.3", 42 | "ultimate-chai": "^4.1.0" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /test/basic.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer'); 2 | 3 | (async() => { 4 | try { 5 | const browser = await puppeteer.launch({ 6 | headless: true, 7 | args: ['--no-sandbox'], 8 | }); 9 | const page = await browser.newPage(); 10 | await page.goto('http://example.com'); 11 | await page.screenshot({path: 'example.png'}); 12 | console.log("success"); 13 | browser.close(); 14 | } catch(error) { 15 | console.log(error); 16 | } 17 | 18 | })(); -------------------------------------------------------------------------------- /test/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svenkatreddy/puppeteer-loadtest/1078fc27beb8d8d7f89724e2eca50b642f2efbd8/test/example.png -------------------------------------------------------------------------------- /test/index-test.js: -------------------------------------------------------------------------------- 1 | 2 | const expect = require('ultimate-chai').expect; 3 | const mock = require('mock-require'); 4 | const sinon = require('sinon'); 5 | const execStub = sinon.sandbox.create().stub(); 6 | mock('child_process', { exec: execStub }); 7 | 8 | process.argv.push("--file=./test/basic.js"); 9 | process.env.DEBUG = 'puppeteer-loadtest'; 10 | const index = require('../bin'); 11 | 12 | 13 | describe('index.js', () => { 14 | context('testing index', () => { 15 | it('should call exec with command', (done) => { 16 | expect(execStub).to.have.been.called(); 17 | expect(execStub).to.have.been.calledWith('node ./test/basic.js'); 18 | done(); 19 | }); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /test/performance.json: -------------------------------------------------------------------------------- 1 | { 2 | "sample1": { 3 | "concurrency": { 4 | "1": { 5 | "name": "sample1concurrencyCount1", 6 | "time": 1230.192623, 7 | "words": "1.23 s", 8 | "preciseWords": "1.230192623 s", 9 | "verboseWords": "1 second 230 milliseconds 192 microseconds 623 nanoseconds" 10 | }, 11 | "2": { 12 | "name": "sample1concurrencyCount2", 13 | "time": 1228.022296, 14 | "words": "1.23 s", 15 | "preciseWords": "1.228022296 s", 16 | "verboseWords": "1 second 228 milliseconds 22 microseconds 296 nanoseconds" 17 | } 18 | }, 19 | "sample": { 20 | "name": "sampleCall1", 21 | "time": 1234.006079, 22 | "words": "1.23 s", 23 | "preciseWords": "1.234006079 s", 24 | "verboseWords": "1 second 234 milliseconds 6 microseconds 79 nanoseconds" 25 | } 26 | }, 27 | "sample2": { 28 | "concurrency": { 29 | "1": { 30 | "name": "sample2concurrencyCount1", 31 | "time": 1253.335088, 32 | "words": "1.25 s", 33 | "preciseWords": "1.253335088 s", 34 | "verboseWords": "1 second 253 milliseconds 335 microseconds 88 nanoseconds" 35 | }, 36 | "2": { 37 | "name": "sample2concurrencyCount2", 38 | "time": 1185.066443, 39 | "words": "1.19 s", 40 | "preciseWords": "1.185066443 s", 41 | "verboseWords": "1 second 185 milliseconds 66 microseconds 443 nanoseconds" 42 | } 43 | }, 44 | "sample": { 45 | "name": "sampleCall2", 46 | "time": 1253.648083, 47 | "words": "1.25 s", 48 | "preciseWords": "1.253648083 s", 49 | "verboseWords": "1 second 253 milliseconds 648 microseconds 83 nanoseconds" 50 | } 51 | } 52 | } --------------------------------------------------------------------------------