├── .eslintignore ├── .eslintrc ├── .github └── workflows │ ├── checks.yml │ ├── issue-auto-assign.yml │ └── release.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── CODEOWNERS ├── LICENSE ├── README.md ├── package.json ├── src ├── index.js ├── junit.js └── text.js └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | .cache/ 2 | public/ 3 | node_modules/ 4 | build/ 5 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "ecmaFeatures": { 4 | "jsx": true 5 | }, 6 | "ecmaVersion": 2020, 7 | "sourceType": "module" 8 | }, 9 | "extends": ["eslint:recommended"], 10 | "plugins": ["prettier"], 11 | "env": { 12 | "browser": true, 13 | "node": true 14 | }, 15 | "rules": { 16 | "prettier/prettier": ["error"], 17 | "arrow-body-style": "warn", 18 | "camelcase": 0, 19 | "object-curly-newline": 0, 20 | "operator-linebreak": 0, 21 | "no-shadow": 0, 22 | "max-len": [2, 120], 23 | "no-underscore-dangle": "off" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/checks.yml: -------------------------------------------------------------------------------- 1 | name: Lint, Check Build 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | checks: 11 | runs-on: ubuntu-latest 12 | permissions: 13 | contents: read 14 | steps: 15 | - uses: actions/checkout@v4 16 | with: 17 | persist-credentials: false 18 | - name: Use Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: '18.x' 22 | - name: Dependencies 23 | run: yarn 24 | - name: Lint Code 25 | run: yarn lint 26 | - name: Check build & archive build 27 | run: yarn build && tar -zcf build.tar.gz build 28 | - name: Created build artifact 29 | uses: actions/upload-artifact@v4 30 | with: 31 | name: build 32 | if-no-files-found: error 33 | path: build.tar.gz 34 | retention-days: 1 35 | -------------------------------------------------------------------------------- /.github/workflows/issue-auto-assign.yml: -------------------------------------------------------------------------------- 1 | name: "Auto assign maintainer to issue" 2 | on: 3 | issues: 4 | types: [opened] 5 | 6 | permissions: 7 | issues: write 8 | 9 | jobs: 10 | assign-maintainer: 11 | uses: grafana/k6/.github/workflows/issue-auto-assign.yml@master 12 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | checks: 10 | runs-on: ubuntu-latest 11 | if: startsWith(github.ref, 'refs/tags/v') 12 | permissions: 13 | contents: write 14 | steps: 15 | - uses: actions/checkout@v4 16 | with: 17 | persist-credentials: false 18 | - name: Use Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: '18.x' 22 | - name: Dependencies 23 | run: yarn 24 | - name: Check build & archive build 25 | run: yarn build && tar -zcf build.tar.gz build 26 | - name: Create Release & Upload Asset 27 | env: 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | run: | 30 | set -x 31 | VERSION="${GITHUB_REF##*/}" 32 | gh release create "$VERSION" build.tar.gz --target "$GITHUB_SHA" --title "Release $VERSION" 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .cache/ 2 | public/ 3 | node_modules/ 4 | build/ 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } 5 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @grafana/k6-core 2 | -------------------------------------------------------------------------------- /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 [yyyy] [name of copyright owner] 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 | # k6-jslib-summary 2 | 3 | This repository contains source code of the functions that can be used to generate different end-of-test summary reports when used in the `handleSummary()` callback: [https://k6.io/docs/results-visualization/end-of-test-summary](https://k6.io/docs/results-visualization/end-of-test-summary/). 4 | 5 | ## Release 6 | 7 | Release happens automatically with the tag push to the `main` branch. The tag should be in the format of `vX.Y.Z`. 8 | 9 | The produced artifacts are build published as artifact and will be hosted in the [https://jslib.k6.io](https://jslib.k6.io/). 10 | 11 | To add a new version to the https://jslib.k6.io/ please follow instructions from the https://github.com/grafana/jslib.k6.io. 12 | 13 | ## Contributing 14 | 15 | ### Building 16 | 17 | To make a local build please use `yarn build` command. 18 | 19 | ### Linting 20 | 21 | To run a linter please execute the following command: 22 | 23 | ```bash 24 | yarn lint 25 | ``` 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "k6-jslib-summary", 3 | "repository": "https://github.com/grafana/k6-jslib-summary", 4 | "version": "0.0.5", 5 | "description": "Creates a summary of the k6 JS libraries used in a test runs.", 6 | "devDependencies": { 7 | "esbuild": "^0.14.51", 8 | "eslint": "^8.20.0", 9 | "eslint-config-prettier": "^8.5.0", 10 | "eslint-plugin-prettier": "^4.2.1", 11 | "prettier": "^2.7.1" 12 | }, 13 | "engines": {}, 14 | "scripts": { 15 | "lint": "eslint --max-warnings 0 src", 16 | "fix": "eslint --fix src", 17 | "build": "esbuild ./src/index.js --bundle --sourcemap --minify --format=cjs --legal-comments=none --outfile=./build/index.js" 18 | }, 19 | "keywords": [ 20 | "k6" 21 | ], 22 | "author": "grafana/k6 team", 23 | "license": "Apache-2.0" 24 | } 25 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // this is the entry point for the library 2 | // it exports all the functions that are available to the user 3 | // it uses also for the bundling and minifying 4 | // (see package.json's "build" script) 5 | export { jUnit } from './junit.js'; 6 | export { humanizeValue, textSummary } from './text.js'; 7 | -------------------------------------------------------------------------------- /src/junit.js: -------------------------------------------------------------------------------- 1 | const replacements = { 2 | '&': '&', 3 | '<': '<', 4 | '>': '>', 5 | "'": ''', 6 | '"': '"', 7 | }; 8 | 9 | function escapeHTML(str) { 10 | return str.replace(/[&<>'"]/g, (char) => replacements[char]); 11 | } 12 | 13 | function generateJUnitXML(data, options) { 14 | const name = 15 | options && options.name ? escapeHTML(options.name) : 'k6 thresholds'; 16 | const classname = 17 | options && options.classname 18 | ? escapeHTML(options.classname) 19 | : 'Unnamed folder'; 20 | let failures = 0; 21 | let cases = []; 22 | 23 | Object.entries(data.metrics).forEach(([metricName, metric]) => { 24 | if (!metric.thresholds) { 25 | return; 26 | } 27 | Object.entries(metric.thresholds).forEach(([thresholdName, threshold]) => { 28 | const testcaseName = `${escapeHTML(metricName)} - ${escapeHTML( 29 | thresholdName, 30 | )}`; 31 | 32 | if (threshold.ok) { 33 | cases.push( 34 | ``, 35 | ); 36 | } else { 37 | failures++; 38 | const failureMessage = 39 | `${metric.type} threshold failed: ` + 40 | Object.entries(metric.values) 41 | .map(([key, value]) => `${key} value: ${value}`) 42 | .join(', '); 43 | 44 | cases.push( 45 | ``, 48 | ); 49 | } 50 | }); 51 | }); 52 | 53 | return ` 54 | 55 | 56 | ${cases.join('\n')} 57 | 58 | `; 59 | } 60 | 61 | exports.jUnit = generateJUnitXML; 62 | -------------------------------------------------------------------------------- /src/text.js: -------------------------------------------------------------------------------- 1 | var forEach = function (obj, callback) { 2 | for (var key in obj) { 3 | if (Object.prototype.hasOwnProperty.call(obj, key)) { 4 | if (callback(key, obj[key])) { 5 | break; 6 | } 7 | } 8 | } 9 | }; 10 | 11 | var palette = { 12 | bold: 1, 13 | faint: 2, 14 | red: 31, 15 | green: 32, 16 | cyan: 36, 17 | //TODO: add others? 18 | }; 19 | 20 | var groupPrefix = '█'; 21 | var detailsPrefix = '↳'; 22 | var succMark = '✓'; 23 | var failMark = '✗'; 24 | var defaultOptions = { 25 | indent: ' ', 26 | enableColors: true, 27 | summaryTimeUnit: null, 28 | summaryTrendStats: null, 29 | }; 30 | 31 | // strWidth tries to return the actual width the string will take up on the 32 | // screen, without any terminal formatting, unicode ligatures, etc. 33 | function strWidth(s) { 34 | // TODO: determine if NFC or NFKD are not more appropriate? or just give up? https://hsivonen.fi/string-length/ 35 | var data = s.normalize('NFKC'); // This used to be NFKD in Go, but this should be better 36 | var inEscSeq = false; 37 | var inLongEscSeq = false; 38 | var width = 0; 39 | for (var char of data) { 40 | if (char.done) { 41 | break; 42 | } 43 | 44 | // Skip over ANSI escape codes. 45 | if (char == '\x1b') { 46 | inEscSeq = true; 47 | continue; 48 | } 49 | if (inEscSeq && char == '[') { 50 | inLongEscSeq = true; 51 | continue; 52 | } 53 | if ( 54 | inEscSeq && 55 | inLongEscSeq && 56 | char.charCodeAt(0) >= 0x40 && 57 | char.charCodeAt(0) <= 0x7e 58 | ) { 59 | inEscSeq = false; 60 | inLongEscSeq = false; 61 | continue; 62 | } 63 | if ( 64 | inEscSeq && 65 | !inLongEscSeq && 66 | char.charCodeAt(0) >= 0x40 && 67 | char.charCodeAt(0) <= 0x5f 68 | ) { 69 | inEscSeq = false; 70 | continue; 71 | } 72 | 73 | if (!inEscSeq && !inLongEscSeq) { 74 | width++; 75 | } 76 | } 77 | return width; 78 | } 79 | 80 | function summarizeCheck(indent, check, decorate) { 81 | if (check.fails == 0) { 82 | return decorate(indent + succMark + ' ' + check.name, palette.green); 83 | } 84 | 85 | var succPercent = Math.floor( 86 | (100 * check.passes) / (check.passes + check.fails), 87 | ); 88 | return decorate( 89 | indent + 90 | failMark + 91 | ' ' + 92 | check.name + 93 | '\n' + 94 | indent + 95 | ' ' + 96 | detailsPrefix + 97 | ' ' + 98 | succPercent + 99 | '% — ' + 100 | succMark + 101 | ' ' + 102 | check.passes + 103 | ' / ' + 104 | failMark + 105 | ' ' + 106 | check.fails, 107 | palette.red, 108 | ); 109 | } 110 | 111 | function summarizeGroup(indent, group, decorate) { 112 | var result = []; 113 | if (group.name != '') { 114 | result.push(indent + groupPrefix + ' ' + group.name + '\n'); 115 | indent = indent + ' '; 116 | } 117 | 118 | for (let i = 0; i < group.checks.length; i++) { 119 | result.push(summarizeCheck(indent, group.checks[i], decorate)); 120 | } 121 | if (group.checks.length > 0) { 122 | result.push(''); 123 | } 124 | for (let i = 0; i < group.groups.length; i++) { 125 | Array.prototype.push.apply( 126 | result, 127 | summarizeGroup(indent, group.groups[i], decorate), 128 | ); 129 | } 130 | 131 | return result; 132 | } 133 | 134 | function displayNameForMetric(name) { 135 | var subMetricPos = name.indexOf('{'); 136 | if (subMetricPos >= 0) { 137 | return '{ ' + name.substring(subMetricPos + 1, name.length - 1) + ' }'; 138 | } 139 | return name; 140 | } 141 | 142 | function indentForMetric(name) { 143 | if (name.indexOf('{') >= 0) { 144 | return ' '; 145 | } 146 | return ''; 147 | } 148 | 149 | function humanizeBytes(bytes) { 150 | var units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; 151 | var base = 1000; 152 | if (bytes < 10) { 153 | return bytes + ' B'; 154 | } 155 | 156 | var e = Math.floor(Math.log(bytes) / Math.log(base)); 157 | var suffix = units[e | 0]; 158 | var val = Math.floor((bytes / Math.pow(base, e)) * 10 + 0.5) / 10; 159 | return val.toFixed(val < 10 ? 1 : 0) + ' ' + suffix; 160 | } 161 | 162 | var unitMap = { 163 | s: { unit: 's', coef: 0.001 }, 164 | ms: { unit: 'ms', coef: 1 }, 165 | us: { unit: 'µs', coef: 1000 }, 166 | }; 167 | 168 | function toFixedNoTrailingZeros(val, prec) { 169 | // TODO: figure out something better? 170 | return parseFloat(val.toFixed(prec)).toString(); 171 | } 172 | 173 | function toFixedNoTrailingZerosTrunc(val, prec) { 174 | var mult = Math.pow(10, prec); 175 | return toFixedNoTrailingZeros(Math.trunc(mult * val) / mult, prec); 176 | } 177 | 178 | function humanizeGenericDuration(dur) { 179 | if (dur === 0) { 180 | return '0s'; 181 | } 182 | 183 | if (dur < 0.001) { 184 | // smaller than a microsecond, print nanoseconds 185 | return Math.trunc(dur * 1000000) + 'ns'; 186 | } 187 | if (dur < 1) { 188 | // smaller than a millisecond, print microseconds 189 | return toFixedNoTrailingZerosTrunc(dur * 1000, 2) + 'µs'; 190 | } 191 | if (dur < 1000) { 192 | // duration is smaller than a second 193 | return toFixedNoTrailingZerosTrunc(dur, 2) + 'ms'; 194 | } 195 | 196 | var result = 197 | toFixedNoTrailingZerosTrunc((dur % 60000) / 1000, dur > 60000 ? 0 : 2) + 198 | 's'; 199 | var rem = Math.trunc(dur / 60000); 200 | if (rem < 1) { 201 | // less than a minute 202 | return result; 203 | } 204 | result = (rem % 60) + 'm' + result; 205 | rem = Math.trunc(rem / 60); 206 | if (rem < 1) { 207 | // less than an hour 208 | return result; 209 | } 210 | return rem + 'h' + result; 211 | } 212 | 213 | function humanizeDuration(dur, timeUnit) { 214 | if ( 215 | timeUnit !== '' && 216 | Object.prototype.hasOwnProperty.call(unitMap, timeUnit) 217 | ) { 218 | return (dur * unitMap[timeUnit].coef).toFixed(2) + unitMap[timeUnit].unit; 219 | } 220 | 221 | return humanizeGenericDuration(dur); 222 | } 223 | 224 | function humanizeValue(val, metric, timeUnit) { 225 | if (metric.type == 'rate') { 226 | // Truncate instead of round when decreasing precision to 2 decimal places 227 | return (Math.trunc(val * 100 * 100) / 100).toFixed(2) + '%'; 228 | } 229 | 230 | switch (metric.contains) { 231 | case 'data': 232 | return humanizeBytes(val); 233 | case 'time': 234 | return humanizeDuration(val, timeUnit); 235 | default: 236 | return toFixedNoTrailingZeros(val, 6); 237 | } 238 | } 239 | 240 | function nonTrendMetricValueForSum(metric, timeUnit) { 241 | switch (metric.type) { 242 | case 'counter': 243 | return [ 244 | humanizeValue(metric.values.count, metric, timeUnit), 245 | humanizeValue(metric.values.rate, metric, timeUnit) + '/s', 246 | ]; 247 | case 'gauge': 248 | return [ 249 | humanizeValue(metric.values.value, metric, timeUnit), 250 | 'min=' + humanizeValue(metric.values.min, metric, timeUnit), 251 | 'max=' + humanizeValue(metric.values.max, metric, timeUnit), 252 | ]; 253 | case 'rate': 254 | return [ 255 | humanizeValue(metric.values.rate, metric, timeUnit), 256 | succMark + ' ' + metric.values.passes, 257 | failMark + ' ' + metric.values.fails, 258 | ]; 259 | default: 260 | return ['[no data]']; 261 | } 262 | } 263 | 264 | function summarizeMetrics(options, data, decorate) { 265 | var indent = options.indent + ' '; 266 | var result = []; 267 | 268 | var names = []; 269 | var nameLenMax = 0; 270 | 271 | var nonTrendValues = {}; 272 | var nonTrendValueMaxLen = 0; 273 | var nonTrendExtras = {}; 274 | var nonTrendExtraMaxLens = [0, 0]; 275 | 276 | var trendCols = {}; 277 | var numTrendColumns = options.summaryTrendStats.length; 278 | var trendColMaxLens = new Array(numTrendColumns).fill(0); 279 | forEach(data.metrics, function (name, metric) { 280 | names.push(name); 281 | // When calculating widths for metrics, account for the indentation on submetrics. 282 | var displayName = indentForMetric(name) + displayNameForMetric(name); 283 | var displayNameWidth = strWidth(displayName); 284 | if (displayNameWidth > nameLenMax) { 285 | nameLenMax = displayNameWidth; 286 | } 287 | 288 | if (metric.type == 'trend') { 289 | var cols = []; 290 | for (let i = 0; i < numTrendColumns; i++) { 291 | var tc = options.summaryTrendStats[i]; 292 | var value = metric.values[tc]; 293 | if (tc === 'count') { 294 | value = value.toString(); 295 | } else { 296 | value = humanizeValue(value, metric, options.summaryTimeUnit); 297 | } 298 | var valLen = strWidth(value); 299 | if (valLen > trendColMaxLens[i]) { 300 | trendColMaxLens[i] = valLen; 301 | } 302 | cols[i] = value; 303 | } 304 | trendCols[name] = cols; 305 | return; 306 | } 307 | var values = nonTrendMetricValueForSum(metric, options.summaryTimeUnit); 308 | nonTrendValues[name] = values[0]; 309 | var valueLen = strWidth(values[0]); 310 | if (valueLen > nonTrendValueMaxLen) { 311 | nonTrendValueMaxLen = valueLen; 312 | } 313 | nonTrendExtras[name] = values.slice(1); 314 | for (let i = 1; i < values.length; i++) { 315 | var extraLen = strWidth(values[i]); 316 | if (extraLen > nonTrendExtraMaxLens[i - 1]) { 317 | nonTrendExtraMaxLens[i - 1] = extraLen; 318 | } 319 | } 320 | }); 321 | 322 | // sort all metrics but keep sub metrics grouped with their parent metrics 323 | names.sort(function (metric1, metric2) { 324 | var parent1 = metric1.split('{', 1)[0]; 325 | var parent2 = metric2.split('{', 1)[0]; 326 | var result = parent1.localeCompare(parent2); 327 | if (result !== 0) { 328 | return result; 329 | } 330 | var sub1 = metric1.substring(parent1.length); 331 | var sub2 = metric2.substring(parent2.length); 332 | return sub1.localeCompare(sub2); 333 | }); 334 | 335 | var getData = function (name) { 336 | if (Object.prototype.hasOwnProperty.call(trendCols, name)) { 337 | var cols = trendCols[name]; 338 | var tmpCols = new Array(numTrendColumns); 339 | for (let i = 0; i < cols.length; i++) { 340 | tmpCols[i] = 341 | options.summaryTrendStats[i] + 342 | '=' + 343 | decorate(cols[i], palette.cyan) + 344 | ' '.repeat(trendColMaxLens[i] - strWidth(cols[i])); 345 | } 346 | return tmpCols.join(' '); 347 | } 348 | 349 | var value = nonTrendValues[name]; 350 | var fmtData = 351 | decorate(value, palette.cyan) + 352 | ' '.repeat(nonTrendValueMaxLen - strWidth(value)); 353 | 354 | var extras = nonTrendExtras[name]; 355 | if (extras.length == 1) { 356 | fmtData = 357 | fmtData + ' ' + decorate(extras[0], palette.cyan, palette.faint); 358 | } else if (extras.length > 1) { 359 | var parts = new Array(extras.length); 360 | for (let i = 0; i < extras.length; i++) { 361 | parts[i] = 362 | decorate(extras[i], palette.cyan, palette.faint) + 363 | ' '.repeat(nonTrendExtraMaxLens[i] - strWidth(extras[i])); 364 | } 365 | fmtData = fmtData + ' ' + parts.join(' '); 366 | } 367 | 368 | return fmtData; 369 | }; 370 | 371 | for (var name of names) { 372 | var metric = data.metrics[name]; 373 | var mark = ' '; 374 | var markColor = function (text) { 375 | return text; 376 | }; // noop 377 | 378 | if (metric.thresholds) { 379 | mark = succMark; 380 | markColor = function (text) { 381 | return decorate(text, palette.green); 382 | }; 383 | forEach(metric.thresholds, function (name, threshold) { 384 | if (!threshold.ok) { 385 | mark = failMark; 386 | markColor = function (text) { 387 | return decorate(text, palette.red); 388 | }; 389 | return true; // break 390 | } 391 | }); 392 | } 393 | var fmtIndent = indentForMetric(name); 394 | var fmtName = displayNameForMetric(name); 395 | fmtName = 396 | fmtName + 397 | decorate( 398 | '.'.repeat(nameLenMax - strWidth(fmtName) - strWidth(fmtIndent) + 3) + 399 | ':', 400 | palette.faint, 401 | ); 402 | 403 | result.push( 404 | indent + 405 | fmtIndent + 406 | markColor(mark) + 407 | ' ' + 408 | fmtName + 409 | ' ' + 410 | getData(name), 411 | ); 412 | } 413 | 414 | return result; 415 | } 416 | 417 | function generateTextSummary(data, options) { 418 | var mergedOpts = Object.assign({}, defaultOptions, data.options, options); 419 | var lines = []; 420 | 421 | // TODO: move all of these functions into an object with methods? 422 | var decorate = function (text) { 423 | return text; 424 | }; 425 | if (mergedOpts.enableColors) { 426 | decorate = function (text, color /*, ...rest*/) { 427 | var result = '\x1b[' + color; 428 | for (var i = 2; i < arguments.length; i++) { 429 | result += ';' + arguments[i]; 430 | } 431 | return result + 'm' + text + '\x1b[0m'; 432 | }; 433 | } 434 | 435 | Array.prototype.push.apply( 436 | lines, 437 | summarizeGroup(mergedOpts.indent + ' ', data.root_group, decorate), 438 | ); 439 | 440 | Array.prototype.push.apply( 441 | lines, 442 | summarizeMetrics(mergedOpts, data, decorate), 443 | ); 444 | 445 | return lines.join('\n'); 446 | } 447 | 448 | exports.humanizeValue = humanizeValue; 449 | exports.textSummary = generateTextSummary; 450 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@aashutoshrathi/word-wrap@^1.2.3": 6 | version "1.2.6" 7 | resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" 8 | integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== 9 | 10 | "@esbuild/linux-loong64@0.14.54": 11 | version "0.14.54" 12 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 13 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 14 | 15 | "@eslint-community/eslint-utils@^4.2.0": 16 | version "4.4.0" 17 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 18 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 19 | dependencies: 20 | eslint-visitor-keys "^3.3.0" 21 | 22 | "@eslint-community/regexpp@^4.6.1": 23 | version "4.10.0" 24 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" 25 | integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== 26 | 27 | "@eslint/eslintrc@^2.1.4": 28 | version "2.1.4" 29 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 30 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 31 | dependencies: 32 | ajv "^6.12.4" 33 | debug "^4.3.2" 34 | espree "^9.6.0" 35 | globals "^13.19.0" 36 | ignore "^5.2.0" 37 | import-fresh "^3.2.1" 38 | js-yaml "^4.1.0" 39 | minimatch "^3.1.2" 40 | strip-json-comments "^3.1.1" 41 | 42 | "@eslint/js@8.55.0": 43 | version "8.55.0" 44 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.55.0.tgz#b721d52060f369aa259cf97392403cb9ce892ec6" 45 | integrity sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA== 46 | 47 | "@humanwhocodes/config-array@^0.11.13": 48 | version "0.11.13" 49 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" 50 | integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== 51 | dependencies: 52 | "@humanwhocodes/object-schema" "^2.0.1" 53 | debug "^4.1.1" 54 | minimatch "^3.0.5" 55 | 56 | "@humanwhocodes/module-importer@^1.0.1": 57 | version "1.0.1" 58 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 59 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 60 | 61 | "@humanwhocodes/object-schema@^2.0.1": 62 | version "2.0.1" 63 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" 64 | integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== 65 | 66 | "@nodelib/fs.scandir@2.1.5": 67 | version "2.1.5" 68 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 69 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 70 | dependencies: 71 | "@nodelib/fs.stat" "2.0.5" 72 | run-parallel "^1.1.9" 73 | 74 | "@nodelib/fs.stat@2.0.5": 75 | version "2.0.5" 76 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 77 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 78 | 79 | "@nodelib/fs.walk@^1.2.8": 80 | version "1.2.8" 81 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 82 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 83 | dependencies: 84 | "@nodelib/fs.scandir" "2.1.5" 85 | fastq "^1.6.0" 86 | 87 | "@ungap/structured-clone@^1.2.0": 88 | version "1.2.0" 89 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" 90 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== 91 | 92 | acorn-jsx@^5.3.2: 93 | version "5.3.2" 94 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 95 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 96 | 97 | acorn@^8.9.0: 98 | version "8.11.2" 99 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" 100 | integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== 101 | 102 | ajv@^6.12.4: 103 | version "6.12.6" 104 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 105 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 106 | dependencies: 107 | fast-deep-equal "^3.1.1" 108 | fast-json-stable-stringify "^2.0.0" 109 | json-schema-traverse "^0.4.1" 110 | uri-js "^4.2.2" 111 | 112 | ansi-regex@^5.0.1: 113 | version "5.0.1" 114 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 115 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 116 | 117 | ansi-styles@^4.1.0: 118 | version "4.3.0" 119 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 120 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 121 | dependencies: 122 | color-convert "^2.0.1" 123 | 124 | argparse@^2.0.1: 125 | version "2.0.1" 126 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 127 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 128 | 129 | balanced-match@^1.0.0: 130 | version "1.0.2" 131 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 132 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 133 | 134 | brace-expansion@^1.1.7: 135 | version "1.1.11" 136 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 137 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 138 | dependencies: 139 | balanced-match "^1.0.0" 140 | concat-map "0.0.1" 141 | 142 | callsites@^3.0.0: 143 | version "3.1.0" 144 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 145 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 146 | 147 | chalk@^4.0.0: 148 | version "4.1.2" 149 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 150 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 151 | dependencies: 152 | ansi-styles "^4.1.0" 153 | supports-color "^7.1.0" 154 | 155 | color-convert@^2.0.1: 156 | version "2.0.1" 157 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 158 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 159 | dependencies: 160 | color-name "~1.1.4" 161 | 162 | color-name@~1.1.4: 163 | version "1.1.4" 164 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 165 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 166 | 167 | concat-map@0.0.1: 168 | version "0.0.1" 169 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 170 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 171 | 172 | cross-spawn@^7.0.2: 173 | version "7.0.3" 174 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 175 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 176 | dependencies: 177 | path-key "^3.1.0" 178 | shebang-command "^2.0.0" 179 | which "^2.0.1" 180 | 181 | debug@^4.1.1, debug@^4.3.2: 182 | version "4.3.4" 183 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 184 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 185 | dependencies: 186 | ms "2.1.2" 187 | 188 | deep-is@^0.1.3: 189 | version "0.1.4" 190 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 191 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 192 | 193 | doctrine@^3.0.0: 194 | version "3.0.0" 195 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 196 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 197 | dependencies: 198 | esutils "^2.0.2" 199 | 200 | esbuild-android-64@0.14.54: 201 | version "0.14.54" 202 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 203 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 204 | 205 | esbuild-android-arm64@0.14.54: 206 | version "0.14.54" 207 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 208 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 209 | 210 | esbuild-darwin-64@0.14.54: 211 | version "0.14.54" 212 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 213 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 214 | 215 | esbuild-darwin-arm64@0.14.54: 216 | version "0.14.54" 217 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 218 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 219 | 220 | esbuild-freebsd-64@0.14.54: 221 | version "0.14.54" 222 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 223 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 224 | 225 | esbuild-freebsd-arm64@0.14.54: 226 | version "0.14.54" 227 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 228 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 229 | 230 | esbuild-linux-32@0.14.54: 231 | version "0.14.54" 232 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 233 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 234 | 235 | esbuild-linux-64@0.14.54: 236 | version "0.14.54" 237 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 238 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 239 | 240 | esbuild-linux-arm64@0.14.54: 241 | version "0.14.54" 242 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 243 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 244 | 245 | esbuild-linux-arm@0.14.54: 246 | version "0.14.54" 247 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 248 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 249 | 250 | esbuild-linux-mips64le@0.14.54: 251 | version "0.14.54" 252 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 253 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 254 | 255 | esbuild-linux-ppc64le@0.14.54: 256 | version "0.14.54" 257 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 258 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 259 | 260 | esbuild-linux-riscv64@0.14.54: 261 | version "0.14.54" 262 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 263 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 264 | 265 | esbuild-linux-s390x@0.14.54: 266 | version "0.14.54" 267 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 268 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 269 | 270 | esbuild-netbsd-64@0.14.54: 271 | version "0.14.54" 272 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 273 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 274 | 275 | esbuild-openbsd-64@0.14.54: 276 | version "0.14.54" 277 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 278 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 279 | 280 | esbuild-sunos-64@0.14.54: 281 | version "0.14.54" 282 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 283 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 284 | 285 | esbuild-windows-32@0.14.54: 286 | version "0.14.54" 287 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 288 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 289 | 290 | esbuild-windows-64@0.14.54: 291 | version "0.14.54" 292 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 293 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 294 | 295 | esbuild-windows-arm64@0.14.54: 296 | version "0.14.54" 297 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 298 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 299 | 300 | esbuild@^0.14.51: 301 | version "0.14.54" 302 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 303 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 304 | optionalDependencies: 305 | "@esbuild/linux-loong64" "0.14.54" 306 | esbuild-android-64 "0.14.54" 307 | esbuild-android-arm64 "0.14.54" 308 | esbuild-darwin-64 "0.14.54" 309 | esbuild-darwin-arm64 "0.14.54" 310 | esbuild-freebsd-64 "0.14.54" 311 | esbuild-freebsd-arm64 "0.14.54" 312 | esbuild-linux-32 "0.14.54" 313 | esbuild-linux-64 "0.14.54" 314 | esbuild-linux-arm "0.14.54" 315 | esbuild-linux-arm64 "0.14.54" 316 | esbuild-linux-mips64le "0.14.54" 317 | esbuild-linux-ppc64le "0.14.54" 318 | esbuild-linux-riscv64 "0.14.54" 319 | esbuild-linux-s390x "0.14.54" 320 | esbuild-netbsd-64 "0.14.54" 321 | esbuild-openbsd-64 "0.14.54" 322 | esbuild-sunos-64 "0.14.54" 323 | esbuild-windows-32 "0.14.54" 324 | esbuild-windows-64 "0.14.54" 325 | esbuild-windows-arm64 "0.14.54" 326 | 327 | escape-string-regexp@^4.0.0: 328 | version "4.0.0" 329 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 330 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 331 | 332 | eslint-config-prettier@^8.5.0: 333 | version "8.10.0" 334 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" 335 | integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== 336 | 337 | eslint-plugin-prettier@^4.2.1: 338 | version "4.2.1" 339 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" 340 | integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== 341 | dependencies: 342 | prettier-linter-helpers "^1.0.0" 343 | 344 | eslint-scope@^7.2.2: 345 | version "7.2.2" 346 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 347 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 348 | dependencies: 349 | esrecurse "^4.3.0" 350 | estraverse "^5.2.0" 351 | 352 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 353 | version "3.4.3" 354 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 355 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 356 | 357 | eslint@^8.20.0: 358 | version "8.55.0" 359 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.55.0.tgz#078cb7b847d66f2c254ea1794fa395bf8e7e03f8" 360 | integrity sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA== 361 | dependencies: 362 | "@eslint-community/eslint-utils" "^4.2.0" 363 | "@eslint-community/regexpp" "^4.6.1" 364 | "@eslint/eslintrc" "^2.1.4" 365 | "@eslint/js" "8.55.0" 366 | "@humanwhocodes/config-array" "^0.11.13" 367 | "@humanwhocodes/module-importer" "^1.0.1" 368 | "@nodelib/fs.walk" "^1.2.8" 369 | "@ungap/structured-clone" "^1.2.0" 370 | ajv "^6.12.4" 371 | chalk "^4.0.0" 372 | cross-spawn "^7.0.2" 373 | debug "^4.3.2" 374 | doctrine "^3.0.0" 375 | escape-string-regexp "^4.0.0" 376 | eslint-scope "^7.2.2" 377 | eslint-visitor-keys "^3.4.3" 378 | espree "^9.6.1" 379 | esquery "^1.4.2" 380 | esutils "^2.0.2" 381 | fast-deep-equal "^3.1.3" 382 | file-entry-cache "^6.0.1" 383 | find-up "^5.0.0" 384 | glob-parent "^6.0.2" 385 | globals "^13.19.0" 386 | graphemer "^1.4.0" 387 | ignore "^5.2.0" 388 | imurmurhash "^0.1.4" 389 | is-glob "^4.0.0" 390 | is-path-inside "^3.0.3" 391 | js-yaml "^4.1.0" 392 | json-stable-stringify-without-jsonify "^1.0.1" 393 | levn "^0.4.1" 394 | lodash.merge "^4.6.2" 395 | minimatch "^3.1.2" 396 | natural-compare "^1.4.0" 397 | optionator "^0.9.3" 398 | strip-ansi "^6.0.1" 399 | text-table "^0.2.0" 400 | 401 | espree@^9.6.0, espree@^9.6.1: 402 | version "9.6.1" 403 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 404 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 405 | dependencies: 406 | acorn "^8.9.0" 407 | acorn-jsx "^5.3.2" 408 | eslint-visitor-keys "^3.4.1" 409 | 410 | esquery@^1.4.2: 411 | version "1.5.0" 412 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 413 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 414 | dependencies: 415 | estraverse "^5.1.0" 416 | 417 | esrecurse@^4.3.0: 418 | version "4.3.0" 419 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 420 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 421 | dependencies: 422 | estraverse "^5.2.0" 423 | 424 | estraverse@^5.1.0, estraverse@^5.2.0: 425 | version "5.3.0" 426 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 427 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 428 | 429 | esutils@^2.0.2: 430 | version "2.0.3" 431 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 432 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 433 | 434 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 435 | version "3.1.3" 436 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 437 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 438 | 439 | fast-diff@^1.1.2: 440 | version "1.3.0" 441 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" 442 | integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== 443 | 444 | fast-json-stable-stringify@^2.0.0: 445 | version "2.1.0" 446 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 447 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 448 | 449 | fast-levenshtein@^2.0.6: 450 | version "2.0.6" 451 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 452 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 453 | 454 | fastq@^1.6.0: 455 | version "1.15.0" 456 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 457 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 458 | dependencies: 459 | reusify "^1.0.4" 460 | 461 | file-entry-cache@^6.0.1: 462 | version "6.0.1" 463 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 464 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 465 | dependencies: 466 | flat-cache "^3.0.4" 467 | 468 | find-up@^5.0.0: 469 | version "5.0.0" 470 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 471 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 472 | dependencies: 473 | locate-path "^6.0.0" 474 | path-exists "^4.0.0" 475 | 476 | flat-cache@^3.0.4: 477 | version "3.2.0" 478 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 479 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 480 | dependencies: 481 | flatted "^3.2.9" 482 | keyv "^4.5.3" 483 | rimraf "^3.0.2" 484 | 485 | flatted@^3.2.9: 486 | version "3.2.9" 487 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" 488 | integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== 489 | 490 | fs.realpath@^1.0.0: 491 | version "1.0.0" 492 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 493 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 494 | 495 | glob-parent@^6.0.2: 496 | version "6.0.2" 497 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 498 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 499 | dependencies: 500 | is-glob "^4.0.3" 501 | 502 | glob@^7.1.3: 503 | version "7.2.3" 504 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 505 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 506 | dependencies: 507 | fs.realpath "^1.0.0" 508 | inflight "^1.0.4" 509 | inherits "2" 510 | minimatch "^3.1.1" 511 | once "^1.3.0" 512 | path-is-absolute "^1.0.0" 513 | 514 | globals@^13.19.0: 515 | version "13.23.0" 516 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" 517 | integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== 518 | dependencies: 519 | type-fest "^0.20.2" 520 | 521 | graphemer@^1.4.0: 522 | version "1.4.0" 523 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 524 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 525 | 526 | has-flag@^4.0.0: 527 | version "4.0.0" 528 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 529 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 530 | 531 | ignore@^5.2.0: 532 | version "5.3.0" 533 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" 534 | integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== 535 | 536 | import-fresh@^3.2.1: 537 | version "3.3.0" 538 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 539 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 540 | dependencies: 541 | parent-module "^1.0.0" 542 | resolve-from "^4.0.0" 543 | 544 | imurmurhash@^0.1.4: 545 | version "0.1.4" 546 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 547 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 548 | 549 | inflight@^1.0.4: 550 | version "1.0.6" 551 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 552 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 553 | dependencies: 554 | once "^1.3.0" 555 | wrappy "1" 556 | 557 | inherits@2: 558 | version "2.0.4" 559 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 560 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 561 | 562 | is-extglob@^2.1.1: 563 | version "2.1.1" 564 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 565 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 566 | 567 | is-glob@^4.0.0, is-glob@^4.0.3: 568 | version "4.0.3" 569 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 570 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 571 | dependencies: 572 | is-extglob "^2.1.1" 573 | 574 | is-path-inside@^3.0.3: 575 | version "3.0.3" 576 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 577 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 578 | 579 | isexe@^2.0.0: 580 | version "2.0.0" 581 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 582 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 583 | 584 | js-yaml@^4.1.0: 585 | version "4.1.0" 586 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 587 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 588 | dependencies: 589 | argparse "^2.0.1" 590 | 591 | json-buffer@3.0.1: 592 | version "3.0.1" 593 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 594 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 595 | 596 | json-schema-traverse@^0.4.1: 597 | version "0.4.1" 598 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 599 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 600 | 601 | json-stable-stringify-without-jsonify@^1.0.1: 602 | version "1.0.1" 603 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 604 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 605 | 606 | keyv@^4.5.3: 607 | version "4.5.4" 608 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 609 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 610 | dependencies: 611 | json-buffer "3.0.1" 612 | 613 | levn@^0.4.1: 614 | version "0.4.1" 615 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 616 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 617 | dependencies: 618 | prelude-ls "^1.2.1" 619 | type-check "~0.4.0" 620 | 621 | locate-path@^6.0.0: 622 | version "6.0.0" 623 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 624 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 625 | dependencies: 626 | p-locate "^5.0.0" 627 | 628 | lodash.merge@^4.6.2: 629 | version "4.6.2" 630 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 631 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 632 | 633 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 634 | version "3.1.2" 635 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 636 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 637 | dependencies: 638 | brace-expansion "^1.1.7" 639 | 640 | ms@2.1.2: 641 | version "2.1.2" 642 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 643 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 644 | 645 | natural-compare@^1.4.0: 646 | version "1.4.0" 647 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 648 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 649 | 650 | once@^1.3.0: 651 | version "1.4.0" 652 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 653 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 654 | dependencies: 655 | wrappy "1" 656 | 657 | optionator@^0.9.3: 658 | version "0.9.3" 659 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" 660 | integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== 661 | dependencies: 662 | "@aashutoshrathi/word-wrap" "^1.2.3" 663 | deep-is "^0.1.3" 664 | fast-levenshtein "^2.0.6" 665 | levn "^0.4.1" 666 | prelude-ls "^1.2.1" 667 | type-check "^0.4.0" 668 | 669 | p-limit@^3.0.2: 670 | version "3.1.0" 671 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 672 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 673 | dependencies: 674 | yocto-queue "^0.1.0" 675 | 676 | p-locate@^5.0.0: 677 | version "5.0.0" 678 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 679 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 680 | dependencies: 681 | p-limit "^3.0.2" 682 | 683 | parent-module@^1.0.0: 684 | version "1.0.1" 685 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 686 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 687 | dependencies: 688 | callsites "^3.0.0" 689 | 690 | path-exists@^4.0.0: 691 | version "4.0.0" 692 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 693 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 694 | 695 | path-is-absolute@^1.0.0: 696 | version "1.0.1" 697 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 698 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 699 | 700 | path-key@^3.1.0: 701 | version "3.1.1" 702 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 703 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 704 | 705 | prelude-ls@^1.2.1: 706 | version "1.2.1" 707 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 708 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 709 | 710 | prettier-linter-helpers@^1.0.0: 711 | version "1.0.0" 712 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 713 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 714 | dependencies: 715 | fast-diff "^1.1.2" 716 | 717 | prettier@^2.7.1: 718 | version "2.8.8" 719 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" 720 | integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== 721 | 722 | punycode@^2.1.0: 723 | version "2.3.1" 724 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 725 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 726 | 727 | queue-microtask@^1.2.2: 728 | version "1.2.3" 729 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 730 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 731 | 732 | resolve-from@^4.0.0: 733 | version "4.0.0" 734 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 735 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 736 | 737 | reusify@^1.0.4: 738 | version "1.0.4" 739 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 740 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 741 | 742 | rimraf@^3.0.2: 743 | version "3.0.2" 744 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 745 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 746 | dependencies: 747 | glob "^7.1.3" 748 | 749 | run-parallel@^1.1.9: 750 | version "1.2.0" 751 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 752 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 753 | dependencies: 754 | queue-microtask "^1.2.2" 755 | 756 | shebang-command@^2.0.0: 757 | version "2.0.0" 758 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 759 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 760 | dependencies: 761 | shebang-regex "^3.0.0" 762 | 763 | shebang-regex@^3.0.0: 764 | version "3.0.0" 765 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 766 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 767 | 768 | strip-ansi@^6.0.1: 769 | version "6.0.1" 770 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 771 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 772 | dependencies: 773 | ansi-regex "^5.0.1" 774 | 775 | strip-json-comments@^3.1.1: 776 | version "3.1.1" 777 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 778 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 779 | 780 | supports-color@^7.1.0: 781 | version "7.2.0" 782 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 783 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 784 | dependencies: 785 | has-flag "^4.0.0" 786 | 787 | text-table@^0.2.0: 788 | version "0.2.0" 789 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 790 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 791 | 792 | type-check@^0.4.0, type-check@~0.4.0: 793 | version "0.4.0" 794 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 795 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 796 | dependencies: 797 | prelude-ls "^1.2.1" 798 | 799 | type-fest@^0.20.2: 800 | version "0.20.2" 801 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 802 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 803 | 804 | uri-js@^4.2.2: 805 | version "4.4.1" 806 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 807 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 808 | dependencies: 809 | punycode "^2.1.0" 810 | 811 | which@^2.0.1: 812 | version "2.0.2" 813 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 814 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 815 | dependencies: 816 | isexe "^2.0.0" 817 | 818 | wrappy@1: 819 | version "1.0.2" 820 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 821 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 822 | 823 | yocto-queue@^0.1.0: 824 | version "0.1.0" 825 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 826 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 827 | --------------------------------------------------------------------------------