├── .example.env ├── .github ├── ISSUE_TEMPLATE │ └── add-competitor.yml └── workflows │ ├── request.yml │ └── scoring.yml ├── .gitignore ├── LICENSE ├── README.md ├── assets └── tweet.png ├── docs └── ANNOUNCEMENT.md ├── package.json ├── score.csv ├── scripts ├── create-ogp │ ├── .gitignore │ ├── package.json │ ├── src │ │ ├── capture_screenshot.ts │ │ ├── index.ts │ │ └── logger.ts │ ├── template │ │ ├── index.ejs │ │ └── ogp.ejs │ └── tsconfig.json ├── scoring │ ├── package.json │ ├── src │ │ ├── fetch_build_info.ts │ │ ├── index.ts │ │ ├── logger.ts │ │ ├── measure_competitor.ts │ │ ├── scoring.ts │ │ └── types.ts │ └── tsconfig.json ├── update-leaderboard │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── logger.ts │ │ └── types.ts │ └── tsconfig.json └── vrt │ ├── config │ ├── default.yml │ └── local.yml │ ├── expected │ ├── ホーム - Desktop.png │ ├── ホーム - Kindle Fire HDX.png │ ├── ホーム - Pixel 5.png │ ├── ユーザー詳細 - Desktop.png │ ├── ユーザー詳細 - Kindle Fire HDX.png │ ├── ユーザー詳細 - Pixel 5.png │ ├── 利用規約 - Desktop.png │ ├── 利用規約 - Kindle Fire HDX.png │ ├── 利用規約 - Pixel 5.png │ ├── 投稿詳細 - 動画 - Desktop.png │ ├── 投稿詳細 - 動画 - Kindle Fire HDX.png │ ├── 投稿詳細 - 動画 - Pixel 5.png │ ├── 投稿詳細 - 画像 - Desktop.png │ ├── 投稿詳細 - 画像 - Kindle Fire HDX.png │ ├── 投稿詳細 - 画像 - Pixel 5.png │ ├── 投稿詳細 - 音声 - Desktop.png │ ├── 投稿詳細 - 音声 - Kindle Fire HDX.png │ └── 投稿詳細 - 音声 - Pixel 5.png │ ├── package.json │ ├── src │ ├── capture_screenshot.ts │ ├── index.ts │ ├── logger.ts │ └── types.ts │ └── tsconfig.json └── yarn.lock /.example.env: -------------------------------------------------------------------------------- 1 | WSH_SCORING_TARGET_PATHS='["/"]' 2 | WSH_SCORING_DEBUG=true 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/add-competitor.yml: -------------------------------------------------------------------------------- 1 | name: 参加登録 2 | description: Web Speed Hackathon 2021 mini の参加登録フォームです 3 | title: '[参加登録]' 4 | labels: 5 | - registration 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | # ようこそ、Web Speed Hackathon 2021 mini へ! 11 | 12 | - 開催期間 | **2021/12/4 (土) – 2022/1/3 (月)** 13 | - 参加資格 | **どなたでも自由に参加できます** 14 | 15 | **参加する前に、注意事項とレギュレーションを確認してください** 16 | 17 | - [注意事項](https://github.com/CyberAgentHack/web-speed-hackathon-2021/blob/main/README.md#注意事項) 18 | - [レギュレーション](https://github.com/CyberAgentHack/web-speed-hackathon-2021/blob/main/docs/REGULATION.md) 19 | - type: dropdown 20 | id: regulation 21 | attributes: 22 | label: '注意事項・レギュレーション {{regulation}}' 23 | options: 24 | - 注意事項・レギュレーションを確認して、同意しました 25 | validations: 26 | required: true 27 | - type: markdown 28 | attributes: 29 | value: | 30 | ## 計測対象の URL 31 | 32 | [課題のソースコード](https://github.com/CyberAgentHack/web-speed-hackathon-2021) から、アプリケーションをデプロイして、URL を提出してください 33 | - type: input 34 | id: target-url 35 | attributes: 36 | label: '計測対象の URL {{url}}' 37 | placeholder: e.g.) https://web-speed-hackathon-2021.herokuapp.com/ 38 | validations: 39 | required: true 40 | - type: markdown 41 | attributes: 42 | value: | 43 | ## アンケート項目(任意) 44 | 45 | :warning: **ここから先は任意回答です。このアンケート項目は一般に公開されます** 46 | - type: input 47 | id: referrer 48 | attributes: 49 | label: この Web Speed Hackathon 2021 mini をどこで知りましたか 50 | validations: 51 | required: false 52 | - type: input 53 | id: framework 54 | attributes: 55 | label: 普段利用する Web フレームワーク / ライブラリは何ですか 56 | validations: 57 | required: false 58 | - type: markdown 59 | attributes: 60 | value: | 61 | ## 準備が整いました 62 | 63 | 投稿すると、GitHub Actions によって自動計測が始まります! 64 | 65 | - :information_source: もし、10分以上何も反応がない場合は、issue を作り直してみてください 66 | -------------------------------------------------------------------------------- /.github/workflows/request.yml: -------------------------------------------------------------------------------- 1 | name: Request 2 | on: 3 | issues: 4 | types: 5 | - opened 6 | issue_comment: 7 | types: 8 | - created 9 | env: 10 | TZ: 'Asia/Tokyo' 11 | jobs: 12 | request: 13 | runs-on: ubuntu-20.04 14 | if: | 15 | (contains(github.event.issue.labels.*.name, 'registration')) && ( 16 | (github.event_name == 'issues') || ( 17 | github.event_name == 'issue_comment' && 18 | !github.event.issue.pull_request && 19 | startsWith(github.event.comment.body, '/rerun') && 20 | (github.actor == github.event.issue.user.login || github.actor == '3846masa') 21 | ) 22 | ) 23 | steps: 24 | - name: Initialize 25 | uses: actions/github-script@v5 26 | if: github.event_name == 'issues' 27 | with: 28 | script: | 29 | github.rest.issues.update({ 30 | issue_number: context.issue.number, 31 | owner: context.repo.owner, 32 | repo: context.repo.repo, 33 | title: `[スコア] @${context.actor}`, 34 | }); 35 | - name: Comment 36 | uses: peter-evans/create-or-update-comment@v1.4.5 37 | if: github.event_name == 'issues' 38 | with: 39 | issue-number: ${{ github.event.issue.number }} 40 | body: | 41 | **@${{ github.event.issue.user.login }} ようこそ、Web Speed Hackathon 2021 mini へ!** 42 | 43 | - :warning: 競技期間を過ぎたため、リーダーボードには反映されません 44 | - :racing_car: これから自動でスコアが計測されて、リーダーボードに反映されます 45 | - よい結果が出たら、ぜひ採点結果を **#WebSpeedHackathon** で Twitter に投稿してください 46 | - :memo: 開催期間中の参加記事や解説記事、大歓迎です! 47 | - 他の人の解説記事や参加記事を読んで、更に高速なアプリを目指しましょう :raised_hands: 48 | - name: Comment 49 | uses: peter-evans/create-or-update-comment@v1.4.5 50 | id: report-comment 51 | with: 52 | issue-number: ${{ github.event.issue.number }} 53 | body: | 54 | :hourglass_flowing_sand: **計測する準備をしています** 55 | - name: Parse issue's description 56 | id: parse 57 | uses: peter-murray/issue-forms-body-parser@v2.0.0 58 | with: 59 | issue_id: ${{ github.event.issue.number }} 60 | label_marker_start: '{{' 61 | label_marker_end: '}}' 62 | - name: Create payload 63 | uses: actions/github-script@v5.0.0 64 | with: 65 | script: | 66 | const fs = require('fs'); 67 | 68 | const url = new URL(`${process.env.TARGET_URL}`); 69 | 70 | const payload = { 71 | id: process.env.USER_ID, 72 | url: url.href, 73 | issue_number: context.issue.number, 74 | report_comment_id: process.env.REPORT_COMMENT_ID, 75 | }; 76 | 77 | if (!['http:', 'https:'].includes(url.protocol)) { 78 | console.error('Invalid url: %s', payload.url); 79 | process.exit(1); 80 | } 81 | 82 | fs.writeFileSync('/tmp/payload.json', JSON.stringify(payload), 'utf-8'); 83 | env: 84 | USER_ID: ${{ github.event.issue.user.login }} 85 | TARGET_URL: ${{ fromJSON(steps.parse.outputs.payload).url }} 86 | REPORT_COMMENT_ID: ${{ steps.report-comment.outputs.comment-id }} 87 | - name: Upload payload 88 | uses: actions/upload-artifact@v2.2.4 89 | with: 90 | name: payload.json 91 | path: /tmp/payload.json 92 | retention-days: 1 93 | - name: Failure message 94 | if: failure() 95 | uses: peter-evans/create-or-update-comment@v1.4.5 96 | with: 97 | comment-id: ${{ steps.report-comment.outputs.comment-id }} 98 | edit-mode: replace 99 | body: | 100 | :exclamation: **登録内容を読み込めませんでした** 101 | 102 | 次を確認して、もう一度 issue を作り直してください 103 | 104 | - URL が間違っていませんか 105 | - `http://` もしくは `https://` から始まる URL を入力してください 106 | - issue の description を編集していませんか 107 | - issue の description から登録情報を読み込むため、編集しないでください 108 | 109 | --- 110 | 111 | :information_source: 登録内容を変更する場合は、issue を閉じて作り直してください 112 | -------------------------------------------------------------------------------- /.github/workflows/scoring.yml: -------------------------------------------------------------------------------- 1 | name: Scoring 2 | on: 3 | workflow_run: 4 | workflows: 5 | - Request 6 | types: 7 | - completed 8 | env: 9 | TZ: 'Asia/Tokyo' 10 | WSH_SCORING_DEBUG: '${{ secrets.WSH_SCORING_DEBUG }}' 11 | jobs: 12 | payload: 13 | runs-on: ubuntu-20.04 14 | if: ${{ github.event.workflow_run.conclusion == 'success' }} 15 | outputs: 16 | result: ${{ steps.payload.outputs.result }} 17 | steps: 18 | - name: Download payload 19 | uses: dawidd6/action-download-artifact@v2.15.0 20 | with: 21 | github_token: ${{ secrets.GITHUB_TOKEN }} 22 | workflow: .github/workflows/request.yml 23 | run_id: ${{ github.event.workflow_run.id }} 24 | name: payload.json 25 | path: /tmp 26 | - name: Read payload 27 | uses: actions/github-script@v5.0.0 28 | id: payload 29 | with: 30 | result-encoding: json 31 | script: | 32 | const payload = require('/tmp/payload.json'); 33 | return payload; 34 | vrt: 35 | runs-on: ubuntu-20.04 36 | needs: 37 | - payload 38 | outputs: 39 | details: ${{ steps.details.outputs.result }} 40 | result: ${{ steps.result.outputs.result }} 41 | concurrency: scoring-${{ fromJSON(needs.payload.outputs.result).id }} 42 | steps: 43 | - uses: actions/checkout@v2.4.0 44 | - uses: actions/setup-node@v2.4.1 45 | with: 46 | node-version: '16' 47 | cache: 'yarn' 48 | - run: yarn install --frozen-lockfile 49 | - run: yarn build 50 | - run: sudo apt-get install -y fonts-noto-cjk 51 | - name: Run VRT 52 | id: vrt 53 | run: | 54 | yarn run vrt:capture --url ${{ fromJSON(needs.payload.outputs.result).url }} 55 | yarn run vrt:detect 56 | - name: Upload payload 57 | uses: actions/upload-artifact@v2.2.4 58 | with: 59 | name: screenshots 60 | path: ./scripts/vrt/tmp/* 61 | retention-days: 1 62 | - name: Read details 63 | uses: actions/github-script@v5.0.0 64 | id: details 65 | with: 66 | result-encoding: json 67 | script: | 68 | const payload = require('./scripts/vrt/tmp/reg.json'); 69 | return payload; 70 | - name: Read result 71 | uses: actions/github-script@v5.0.0 72 | id: result 73 | with: 74 | result-encoding: string 75 | script: | 76 | const payload = require('./scripts/vrt/tmp/reg.json'); 77 | return payload.failedItems.length === 0 ? 'success' : 'failed'; 78 | scoring: 79 | runs-on: ubuntu-20.04 80 | needs: 81 | - payload 82 | - vrt 83 | outputs: 84 | result: ${{ steps.scoring.outputs.export }} 85 | concurrency: scoring-${{ fromJSON(needs.payload.outputs.result).id }} 86 | steps: 87 | - uses: actions/checkout@v2.4.0 88 | - uses: actions/setup-node@v2.4.1 89 | with: 90 | node-version: '16' 91 | cache: 'yarn' 92 | - run: yarn install --frozen-lockfile 93 | - run: yarn build 94 | - run: sudo apt-get install -y fonts-noto-cjk 95 | - name: Scoring 96 | id: scoring 97 | run: | 98 | yarn run scoring \ 99 | --id ${{ fromJSON(needs.payload.outputs.result).id }} \ 100 | --url ${{ fromJSON(needs.payload.outputs.result).url }} 101 | env: 102 | WSH_SCORING_TARGET_PATHS: '${{ secrets.WSH_SCORING_TARGET_PATHS }}' 103 | comment-payload: 104 | runs-on: ubuntu-20.04 105 | needs: 106 | - payload 107 | steps: 108 | - name: Comment 109 | uses: peter-evans/create-or-update-comment@v1.4.5 110 | with: 111 | comment-id: ${{ fromJSON(needs.payload.outputs.result).report_comment_id }} 112 | edit-mode: replace 113 | body: | 114 | ## レギュレーションチェック 115 | 116 | :hourglass_flowing_sand: **VRT を実行しています** 117 | 118 | --- 119 | 120 | Actions: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} 121 | comment-failure-vrt: 122 | runs-on: ubuntu-20.04 123 | needs: 124 | - payload 125 | - vrt 126 | - comment-payload 127 | if: always() && needs.vrt.result == 'failure' 128 | steps: 129 | - name: Comment 130 | uses: peter-evans/create-or-update-comment@v1.4.5 131 | with: 132 | comment-id: ${{ fromJSON(needs.payload.outputs.result).report_comment_id }} 133 | edit-mode: replace 134 | body: | 135 | ## レギュレーションチェック 136 | 137 | :exclamation: **VRT が実行できませんでした** 138 | 139 | 次を確認してください 140 | 141 | - URL が間違っていませんか 142 | - API `POST /api/v1/initialize` が実行できますか 143 | - 計測対象のページは、誰でも閲覧できるようになっていますか 144 | - エラーページ以外では、ステータスコードが 200 で返却されますか 145 | 146 | --- 147 | 148 | Actions: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} 149 | 150 | :information_source: `/rerun` (リラン / 再実行)とコメントすると、もう一度計測ができます 151 | :information_source: 登録内容を変更する場合は、issue を閉じて作り直してください 152 | comment-vrt: 153 | runs-on: ubuntu-20.04 154 | needs: 155 | - payload 156 | - vrt 157 | - comment-payload 158 | steps: 159 | - name: Comment 160 | uses: peter-evans/create-or-update-comment@v1.4.5 161 | with: 162 | comment-id: ${{ fromJSON(needs.payload.outputs.result).report_comment_id }} 163 | edit-mode: replace 164 | body: | 165 | ## レギュレーションチェック 166 | 167 | ${{ (needs.vrt.outputs.result == 'success' && '**差分はありませんでした**') || '**一部のページに差分があります**' }} 168 | 169 |
170 | 差分が見つかったページ 171 | 172 | :information_source: スクリーンショットは、スコア計測後に、Actions の Artifacts からダウンロードできます 173 | 174 | ```json 175 | ${{ toJSON(fromJSON(needs.vrt.outputs.details).failedItems) }} 176 | ``` 177 | 178 |
179 | 180 | ## スコア 181 | 182 | :hourglass_flowing_sand: **Lighthouse でスコアを計測しています** 183 | 184 | --- 185 | 186 | Actions: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} 187 | comment-failure-scoring: 188 | runs-on: ubuntu-20.04 189 | needs: 190 | - payload 191 | - vrt 192 | - scoring 193 | - comment-vrt 194 | if: always() && needs.scoring.result == 'failure' 195 | steps: 196 | - name: Comment 197 | uses: peter-evans/create-or-update-comment@v1.4.5 198 | with: 199 | comment-id: ${{ fromJSON(needs.payload.outputs.result).report_comment_id }} 200 | edit-mode: replace 201 | body: | 202 | ## レギュレーションチェック 203 | 204 | ${{ (needs.vrt.outputs.result == 'success' && '**差分はありませんでした**') || '**一部のページに差分があります**' }} 205 | 206 |
207 | 差分が見つかったページ 208 | 209 | :information_source: スクリーンショットは、スコア計測後に、Actions の Artifacts からダウンロードできます 210 | 211 | ```json 212 | ${{ toJSON(fromJSON(needs.vrt.outputs.details).failedItems) }} 213 | ``` 214 | 215 |
216 | 217 | ## スコア 218 | 219 | :exclamation: **Lighthouse の計測ができませんでした** 220 | 221 | 次を確認してください 222 | 223 | - URL が間違っていませんか 224 | - 計測対象のページは、誰でも閲覧できるようになっていますか 225 | - エラーページ以外では、ステータスコードが 200 で返却されますか 226 | 227 | --- 228 | 229 | Actions: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} 230 | 231 | :information_source: `/rerun` (リラン / 再実行)とコメントすると、もう一度計測ができます 232 | :information_source: 登録内容を変更する場合は、issue を閉じて作り直してください 233 | comment-scoring: 234 | runs-on: ubuntu-20.04 235 | needs: 236 | - payload 237 | - vrt 238 | - scoring 239 | - comment-vrt 240 | steps: 241 | - name: Comment 242 | uses: peter-evans/create-or-update-comment@v1.4.5 243 | if: needs.vrt.outputs.result == 'success' 244 | with: 245 | comment-id: ${{ fromJSON(needs.payload.outputs.result).report_comment_id }} 246 | edit-mode: replace 247 | body: | 248 | ## レギュレーションチェック 249 | 250 | ${{ (needs.vrt.outputs.result == 'success' && '**差分はありませんでした**') || '**一部のページに差分があります**' }} 251 | 252 |
253 | 差分が見つかったページ 254 | 255 | :information_source: スクリーンショットは、スコア計測後に、Actions の Artifacts からダウンロードできます 256 | 257 | ```json 258 | ${{ toJSON(fromJSON(needs.vrt.outputs.details).failedItems) }} 259 | ``` 260 | 261 |
262 | 263 | ## スコア 264 | 265 | スコアは **${{ fromJSON(needs.scoring.outputs.result).result.score }}** です 266 | 267 | :warning: 競技期間を過ぎたため、リーダーボードには反映されません 268 | 269 |
270 | buildInfo 271 | 272 | ```json 273 | ${{ toJSON(fromJSON(needs.scoring.outputs.result).buildInfo) }} 274 | ``` 275 | 276 |
277 | 278 | --- 279 | 280 | Actions: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} 281 | 282 | :information_source: `/rerun` (リラン / 再実行)とコメントすると、もう一度計測ができます 283 | :information_source: 登録内容を変更する場合は、issue を閉じて作り直してください 284 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux 4 | 5 | ### Linux ### 6 | *~ 7 | 8 | # temporary files which can be created if a process still has a handle open of a deleted file 9 | .fuse_hidden* 10 | 11 | # KDE directory preferences 12 | .directory 13 | 14 | # Linux trash folder which might appear on any partition or disk 15 | .Trash-* 16 | 17 | # .nfs files are created when an open file is removed but is still being accessed 18 | .nfs* 19 | 20 | ### macOS ### 21 | # General 22 | .DS_Store 23 | .AppleDouble 24 | .LSOverride 25 | 26 | # Icon must end with two \r 27 | Icon 28 | 29 | 30 | # Thumbnails 31 | ._* 32 | 33 | # Files that might appear in the root of a volume 34 | .DocumentRevisions-V100 35 | .fseventsd 36 | .Spotlight-V100 37 | .TemporaryItems 38 | .Trashes 39 | .VolumeIcon.icns 40 | .com.apple.timemachine.donotpresent 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | 49 | ### Node ### 50 | # Logs 51 | logs 52 | *.log 53 | npm-debug.log* 54 | yarn-debug.log* 55 | yarn-error.log* 56 | lerna-debug.log* 57 | .pnpm-debug.log* 58 | 59 | # Diagnostic reports (https://nodejs.org/api/report.html) 60 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 61 | 62 | # Runtime data 63 | pids 64 | *.pid 65 | *.seed 66 | *.pid.lock 67 | 68 | # Directory for instrumented libs generated by jscoverage/JSCover 69 | lib-cov 70 | 71 | # Coverage directory used by tools like istanbul 72 | coverage 73 | *.lcov 74 | 75 | # nyc test coverage 76 | .nyc_output 77 | 78 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 79 | .grunt 80 | 81 | # Bower dependency directory (https://bower.io/) 82 | bower_components 83 | 84 | # node-waf configuration 85 | .lock-wscript 86 | 87 | # Compiled binary addons (https://nodejs.org/api/addons.html) 88 | build/Release 89 | 90 | # Dependency directories 91 | node_modules/ 92 | jspm_packages/ 93 | 94 | # Snowpack dependency directory (https://snowpack.dev/) 95 | web_modules/ 96 | 97 | # TypeScript cache 98 | *.tsbuildinfo 99 | 100 | # Optional npm cache directory 101 | .npm 102 | 103 | # Optional eslint cache 104 | .eslintcache 105 | 106 | # Microbundle cache 107 | .rpt2_cache/ 108 | .rts2_cache_cjs/ 109 | .rts2_cache_es/ 110 | .rts2_cache_umd/ 111 | 112 | # Optional REPL history 113 | .node_repl_history 114 | 115 | # Output of 'npm pack' 116 | *.tgz 117 | 118 | # Yarn Integrity file 119 | .yarn-integrity 120 | 121 | # dotenv environment variables file 122 | .env 123 | .env.test 124 | .env.production 125 | 126 | # parcel-bundler cache (https://parceljs.org/) 127 | .cache 128 | .parcel-cache 129 | 130 | # Next.js build output 131 | .next 132 | out 133 | 134 | # Nuxt.js build / generate output 135 | .nuxt 136 | dist 137 | 138 | # Gatsby files 139 | .cache/ 140 | # Comment in the public line in if your project uses Gatsby and not Next.js 141 | # https://nextjs.org/blog/next-9-1#public-directory-support 142 | # public 143 | 144 | # vuepress build output 145 | .vuepress/dist 146 | 147 | # Serverless directories 148 | .serverless/ 149 | 150 | # FuseBox cache 151 | .fusebox/ 152 | 153 | # DynamoDB Local files 154 | .dynamodb/ 155 | 156 | # TernJS port file 157 | .tern-port 158 | 159 | # Stores VSCode versions used for testing VSCode extensions 160 | .vscode-test 161 | 162 | # yarn v2 163 | .yarn/cache 164 | .yarn/unplugged 165 | .yarn/build-state.yml 166 | .yarn/install-state.gz 167 | .pnp.* 168 | 169 | ### Node Patch ### 170 | # Serverless Webpack directories 171 | .webpack/ 172 | 173 | # Optional stylelint cache 174 | .stylelintcache 175 | 176 | # SvelteKit build / generate output 177 | .svelte-kit 178 | 179 | ### Windows ### 180 | # Windows thumbnail cache files 181 | Thumbs.db 182 | Thumbs.db:encryptable 183 | ehthumbs.db 184 | ehthumbs_vista.db 185 | 186 | # Dump file 187 | *.stackdump 188 | 189 | # Folder config file 190 | [Dd]esktop.ini 191 | 192 | # Recycle Bin used on file shares 193 | $RECYCLE.BIN/ 194 | 195 | # Windows Installer files 196 | *.cab 197 | *.msi 198 | *.msix 199 | *.msm 200 | *.msp 201 | 202 | # Windows shortcuts 203 | *.lnk 204 | 205 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 206 | 207 | tmp 208 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Web Speed Hackathon 2021 mini Leaderboard 2 | 3 | **"Web Speed Hackathon 2021 mini" は、非常に重たい Web アプリをチューニングして、いかに高速にするかを競う競技です。** 4 | 5 | 今回のテーマは、架空の SNS サイト「CAwitter」です。 6 | 「CAwitter」のパフォーマンスを改善してください。 7 | 8 | - デモサイト: https://web-speed-hackathon-2021.herokuapp.com/ 9 | - 参加方法: https://github.com/CyberAgentHack/web-speed-hackathon-2021 10 | 11 | ## 運営からのお知らせ 12 | 13 | [./docs/ANNOUNCEMENT.md](./docs/ANNOUNCEMENT.md) をご覧ください 14 | 15 | ## リーダーボード 16 | 17 | **上位 10 位までを表示しています** 18 | 19 | すべてのスコアは、[こちら](./score.csv) から閲覧できます 20 | 21 | 22 | 23 | |Rank|Score||CompetitorId|URL| 24 | |:--:|:--:|:--:|:--|:--:| 25 | |1|**719.92**||[@NaotoshiFujita](https://github.com/NaotoshiFujita)|[:link:](https://web-speed-hackathon-335112.an.r.appspot.com/)| 26 | |2|**719.91**||[@sapphi-red](https://github.com/sapphi-red)|[:link:](https://web-speed-hackathon-online-2021-mini2.sapphi.red/)| 27 | |3|**715.13**||[@3846masa](https://github.com/3846masa)|[:link:](https://wsh-2021-1208.uc.r.appspot.com/)| 28 | |4|**706.53**||[@imamiya-masaki](https://github.com/imamiya-masaki)|[:link:](https://axiomatic-path-334410.dt.r.appspot.com/)| 29 | |5|**705.39**||[@mazrean](https://github.com/mazrean)|[:link:](https://wsh2021.mazrean.com/)| 30 | |6|**695.80**||[@tk1024](https://github.com/tk1024)|[:link:](https://web-speed-2021.ue.r.appspot.com/)| 31 | |7|**649.46**||[@hira777](https://github.com/hira777)|[:link:](https://web-speed-2021-soarflat.herokuapp.com/)| 32 | |8|**649.34**||[@Karibash](https://github.com/Karibash)|[:link:](https://ca-web-speed-hackathon-2021.karibash.com/)| 33 | |9|**649.21**||[@toshi-pono](https://github.com/toshi-pono)|[:link:](https://web-speed-hackathon-online-2021.toshi00.dev/)| 34 | |10|**648.31**||[@reyu0722](https://github.com/reyu0722)|[:link:](https://web-speed-hackathon2021.reyu.dev/)| 35 | 36 | 37 | 38 | --- 39 | 40 | (c) CyberAgent 41 | -------------------------------------------------------------------------------- /assets/tweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/assets/tweet.png -------------------------------------------------------------------------------- /docs/ANNOUNCEMENT.md: -------------------------------------------------------------------------------- 1 | ## 2021/12/27 20:30 JST 2 | 3 | Web Speed Hackathon 2021 mini 運営 @3846masa です 4 | 5 | 2 点お知らせがあります 6 | 7 | --- 8 | 9 | ### 計測がうまくいかない不具合について 10 | 11 | 2021/12/27 未明より、GitHub Actions による計測が不安定であることを確認しています 12 | 13 | - `/rerun` コマンドが反応しない 14 | - コメントが「計測しています」のまま動かなくなる 15 | - スコアの計測に失敗する 16 | - リーダーボードの更新に失敗する 17 | 18 | もし、上記のような状態になった場合、GitHub Actions のログをご確認いただければ幸いです 19 | 20 | GitHub Actions のログをご覧になるには、コメント下部に記載される URL を開くか、次の URL から該当の workflow を検索してください 21 | 22 | https://github.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/actions 23 | 24 | --- 25 | 26 | ### スコア計測時の GitHub Actions に日本語フォントをインストールします 27 | 28 | **スコア計測時の GitHub Actions に日本語フォントがインストールされておらず、スコアが全体的に低く算出される問題が判明しました** 29 | 30 | このアナウンスより後の計測では、 **スコア計測時の GitHub Actions に Noto Sans CJK をインストールします** 31 | 32 | この変更により、再計測でスコアが大きく変動する可能性があります、ご了承ください 33 | 34 | なお、**この件にかんして、運営からはスコアの再計測を行いません** 35 | 36 | **再計測を希望する方は従来通り `/rerun` コマンドをご利用ください** 37 | 38 | --- 39 | 40 | この件について質問があれば、お気軽に @3846masa までお問い合わせください 41 | 42 | **残り 1 週間になりましたが、このあとも Web Speed Hackathon 2021 mini をお楽しみください!** 43 | 44 | ## 2021/12/10 0:20 JST 45 | 46 | Web Speed Hackathon 2021 mini 運営 @CyberAgentHack/wsh-admin です 47 | 48 | **課題のコードで不具合があったため、修正パッチを公開します** 49 | 50 | ### 修正内容 51 | 52 |
53 | 54 | - webpack の設定に間違いがあり、webpack-dev-server が起動しない 55 | - webfont.css の `@charset` 規則によって PostCSS でエラーが起きる 56 | - 投稿取得の API から返却される画像情報の順序が一意にならない 57 | 58 |
59 | 60 | ### パッチの取り込み方法 61 | 62 |
63 | 64 | 1. 最新の main branch を fetch します 65 | 66 | - ```bash 67 | git remote add upstream https://github.com/CyberAgentHack/web-speed-hackathon-2021.git 68 | git fetch upstream main 69 | ``` 70 | 71 | 2. FETCH_HEAD を rebase します 72 | 73 | - ```bash 74 | git rebase FETCH_HEAD 75 | ``` 76 | - `"Initial commit"` でコンフリクトした場合は skip します 77 | ```bash 78 | git rebase --skip 79 | ``` 80 | - それ以外でコンフリクトが発生したら、実装に合わせて解消してください 81 | 82 | 3. upstream を削除します 83 | 84 | - ```bash 85 | git remote remove upstream 86 | ``` 87 | 88 |
89 | 90 | :warning: **VRT チェックも更新されるため、修正パッチを必ず適用してください** 91 | 92 | --- 93 | 94 | この件について質問があれば、お気軽に @CyberAgentHack/wsh-admin までお問い合わせください 95 | 96 | **このあとも Web Speed Hackathon 2021 mini をお楽しみください!** 97 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "license": "MPL-2.0", 4 | "scripts": { 5 | "build": "yarn workspaces run build", 6 | "vrt:capture": "yarn workspace @web-speed-hackathon/vrt capture", 7 | "vrt:detect": "yarn workspace @web-speed-hackathon/vrt detect", 8 | "scoring": "yarn workspace @web-speed-hackathon/scoring start", 9 | "update": "yarn workspace @web-speed-hackathon/update-leaderboard start", 10 | "create-ogp": "yarn workspace @web-speed-hackathon/create-ogp start" 11 | }, 12 | "workspaces": [ 13 | "scripts/*" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /score.csv: -------------------------------------------------------------------------------- 1 | rank,score,competitorId,url 2 | 1,719.92,NaotoshiFujita,https://web-speed-hackathon-335112.an.r.appspot.com/ 3 | 2,719.91,sapphi-red,https://web-speed-hackathon-online-2021-mini2.sapphi.red/ 4 | 3,715.13,3846masa,https://wsh-2021-1208.uc.r.appspot.com/ 5 | 4,706.53,imamiya-masaki,https://axiomatic-path-334410.dt.r.appspot.com/ 6 | 5,705.39,mazrean,https://wsh2021.mazrean.com/ 7 | 6,695.8,tk1024,https://web-speed-2021.ue.r.appspot.com/ 8 | 7,649.46,hira777,https://web-speed-2021-soarflat.herokuapp.com/ 9 | 8,649.34,Karibash,https://ca-web-speed-hackathon-2021.karibash.com/ 10 | 9,649.21,toshi-pono,https://web-speed-hackathon-online-2021.toshi00.dev/ 11 | 10,648.31,reyu0722,https://web-speed-hackathon2021.reyu.dev/ 12 | 11,641.97,shellingford330,https://ca-writter.herokuapp.com/ 13 | 12,623.83,pvcresin,https://pvcresin-wsh-2021.herokuapp.com/ 14 | 13,623.8,taiga533,https://www.taiga553.ninja/ 15 | 14,613.21,shgtkshruch,https://ca-web-speed-hackathon-2021.herokuapp.com/ 16 | 15,607.11,Co9xs,https://web-speed-hackathon-2021-co9xs.herokuapp.com/ 17 | 16,603.69,taaaaaaak22,https://web-speed-hackathon-2021-app.herokuapp.com/ 18 | 17,528.11,mkizka,https://floating-dusk-76675.herokuapp.com/ 19 | 18,503,kentaro84207,https://web-speed-hackathon-2021-ke.herokuapp.com/ 20 | 19,490.72,motoki317,https://wsh2021.toki317.dev/ 21 | 20,486.1,mgr-kb,https://web-speed-hackathon-2021-mgr.herokuapp.com/ 22 | 21,485.89,math314,https://powerful-lake-98455.herokuapp.com/ 23 | 22,435.35,mktbsh,https://mktbsh-wsh2021.herokuapp.com/ 24 | 23,408.38,airtoxin,https://web-speed-hackathon-2021-atx.herokuapp.com/ 25 | 24,400.79,taiki-fw,https://web-speed-hackathon-2021-taiki.herokuapp.com/ 26 | 25,396.05,Leko,https://leko-web-speed-hackathon-2021.herokuapp.com/ 27 | 26,355.31,azu,https://web-speed-hackathon-2021-azu.herokuapp.com/ 28 | 27,345.77,bati11,https://desolate-hollows-81454.herokuapp.com/ 29 | 28,344.56,hiro0218,https://web-speed-hackathon-2021-hiro.herokuapp.com/ 30 | 29,308.53,matsuu,https://web-speed-hackathon-2021matsuu.herokuapp.com/ 31 | 30,288.21,tiqwab,https://web-speed-hackathon-2021-tiqwa.herokuapp.com/ 32 | 31,249.72,ktpi2000,https://wsh2021-ca.herokuapp.com/ 33 | 32,235.07,t-yng,https://fierce-cove-65311.herokuapp.com/ 34 | 33,233.94,anko9801,https://web-speed-hackathon-2021-anko.herokuapp.com/ 35 | 34,224.56,eichisanden,https://powerful-chamber-16064.herokuapp.com/ 36 | 35,206.09,masa08,https://wsh-2021-masa08.herokuapp.com/ 37 | 36,198.07,shun91,https://shun91-web-speed-hack-2021.herokuapp.com/ 38 | 37,189.65,nissy-dev,https://polar-river-66365.herokuapp.com/ 39 | 38,157.07,RinGoku,https://ws-hackathon-2021-ringoku.herokuapp.com/ 40 | 39,144.95,go-to-the-future,https://web-speed-hackathon-2021-kr.herokuapp.com/ 41 | 40,142.7,arus307,https://web-speed-hackathon-2021-arus.herokuapp.com/ 42 | 41,140.32,Kazuhiro-Mimaki,https://web-speed-hackathon-2021-b1ess.herokuapp.com/ 43 | 42,133.36,schktjm,https://web-speed-hackathon-2021-ca.herokuapp.com/ 44 | 43,120.01,mochiflappe,https://glacial-eyrie-50269.herokuapp.com/ 45 | 44,117.43,tofu4956,https://catw.herokuapp.com/ 46 | 45,109.08,hiroko-ino,https://web-speed-hackathon-2021-ino.herokuapp.com/ 47 | 46,105.46,fuku710,https://web-speed-hackathon-2021-fuku.herokuapp.com/ 48 | 47,99.5,isoflabon,https://speed-hackathon-2021-isoflabon.herokuapp.com/ 49 | 48,92.32,nasustim,https://still-savannah-77812.herokuapp.com/ 50 | 48,92.32,Nyoho,https://wsh2021attentive.herokuapp.com/ 51 | 50,89.94,kai815,https://web-speed-hackathon-2021-kai.herokuapp.com/ 52 | 51,86.58,Coordinate-Cat,https://web-speed-hackathon-ocat.herokuapp.com/ 53 | 52,86.38,seakid,https://wsh-2021-seakid.herokuapp.com/ 54 | 53,81.53,chimame,https://web-speed-hackathon-2021-o7xclz663q-an.a.run.app/ 55 | 54,78.26,CyberAgentHack,https://web-speed-hackathon-2021.herokuapp.com/ 56 | 55,65.08,masibw,https://web-speed-hackathon-2021-masi.herokuapp.com/ 57 | 56,62.62,ookam,https://speed-2021.mx1.net/ 58 | 57,62.27,mochi-sann,https://cb-speedapp.herokuapp.com/ 59 | 58,61.05,ootake-uniface,https://young-meadow-27099.herokuapp.com/ 60 | 59,55.43,inductor,https://web-speed-hackathon-2021.inductor.me/ 61 | 60,51.76,Yury1223,https://salty-cove-70388.herokuapp.com/ 62 | 61,50.31,progfay,https://frozen-bayou-46679.herokuapp.com/ 63 | 62,45.8,kamoseiro-tabetai,https://speedchecker202112.herokuapp.com/ 64 | 62,45.8,hiroshi-kato,https://obscure-reaches-77971.herokuapp.com/ 65 | 64,45.65,unirt,https://dev.d285jqf7ijjnec.amplifyapp.com/ 66 | -------------------------------------------------------------------------------- /scripts/create-ogp/.gitignore: -------------------------------------------------------------------------------- 1 | public 2 | -------------------------------------------------------------------------------- /scripts/create-ogp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "@web-speed-hackathon/create-ogp", 4 | "version": "0.0.0", 5 | "main": "dist/index.js", 6 | "license": "UNLICENSE", 7 | "scripts": { 8 | "build": "tsc", 9 | "start": "node dist/index.js" 10 | }, 11 | "dependencies": { 12 | "chrome-launcher": "0.15.0", 13 | "ejs": "3.1.6", 14 | "fs-extra": "10.0.0", 15 | "lit-date": "1.0.2", 16 | "puppeteer-core": "11.0.0", 17 | "yargs": "17.3.0" 18 | }, 19 | "devDependencies": { 20 | "@types/ejs": "3.1.0", 21 | "@types/fs-extra": "9.0.13", 22 | "@types/node": "16.11.9", 23 | "@types/yargs": "17.0.7", 24 | "typescript": "4.5.2" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /scripts/create-ogp/src/capture_screenshot.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import * as chromeLauncher from 'chrome-launcher'; 3 | import puppeteer from 'puppeteer-core'; 4 | 5 | type Params = { 6 | html: string; 7 | width: number; 8 | height: number; 9 | }; 10 | 11 | export async function captureScreenshot({ html, width, height }: Params): Promise { 12 | const chrome = await chromeLauncher.launch({ 13 | chromeFlags: ['--headless', '--no-sandbox', '--hide-scrollbars'], 14 | }); 15 | 16 | try { 17 | const res = await fetch(`http://localhost:${chrome.port}/json/version`); 18 | const json = await res.json(); 19 | const browser = await puppeteer.connect({ 20 | browserWSEndpoint: json.webSocketDebuggerUrl, 21 | }); 22 | const context = await browser.createIncognitoBrowserContext(); 23 | const page = await context.newPage(); 24 | 25 | await page.setViewport({ width, height }); 26 | await page.setContent(html, { 27 | timeout: 60 * 1000, 28 | waitUntil: 'networkidle0', 29 | }); 30 | 31 | const screenshot = (await page.screenshot({ 32 | captureBeyondViewport: false, 33 | })) as Buffer; 34 | 35 | return screenshot; 36 | } finally { 37 | await chrome.kill(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /scripts/create-ogp/src/index.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs-extra'; 3 | import ejs from 'ejs'; 4 | import yargs from 'yargs'; 5 | import litdate from 'lit-date'; 6 | 7 | import { logger } from './logger'; 8 | import { captureScreenshot } from './capture_screenshot'; 9 | 10 | async function main() { 11 | const argv = await yargs 12 | .option('id', { 13 | type: 'string', 14 | demandOption: true, 15 | }) 16 | .option('score', { 17 | type: 'number', 18 | demandOption: true, 19 | }) 20 | .option('rank', { 21 | type: 'number', 22 | demandOption: true, 23 | }) 24 | .help().argv; 25 | 26 | const exportPath = path.resolve(__dirname, `../public/scores/${argv.id}`); 27 | await fs.ensureDir(exportPath); 28 | 29 | const buffer = await captureScreenshot({ 30 | html: ejs.render(fs.readFileSync(path.resolve(__dirname, '../template/ogp.ejs'), 'utf-8'), { 31 | competitor: { 32 | id: argv.id, 33 | score: argv.score, 34 | rank: argv.rank, 35 | }, 36 | date: litdate`${'YYYY'}/${'MM'}/${'DD'} ${'HH'}:${'MM'} JST`(new Date()), 37 | }), 38 | width: 1200, 39 | height: 630, 40 | }); 41 | 42 | await fs.writeFile(path.resolve(exportPath, `./ogp.png`), buffer); 43 | 44 | await fs.writeFile( 45 | path.resolve(exportPath, `./index.html`), 46 | ejs.render(fs.readFileSync(path.resolve(__dirname, '../template/index.ejs'), 'utf-8'), { 47 | competitor: { 48 | id: argv.id, 49 | }, 50 | date: Date.now(), 51 | }), 52 | 'utf-8', 53 | ); 54 | } 55 | 56 | main().catch((e) => { 57 | logger.error(e); 58 | process.exit(1); 59 | }); 60 | -------------------------------------------------------------------------------- /scripts/create-ogp/src/logger.ts: -------------------------------------------------------------------------------- 1 | import pino from 'pino'; 2 | 3 | export const logger = pino({ 4 | level: process.env['WSH_SCORING_DEBUG'] === 'true' ? 'debug' : 'info', 5 | transport: { 6 | target: 'pino-pretty', 7 | options: { 8 | colorize: true, 9 | levelFirst: true, 10 | }, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /scripts/create-ogp/template/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Web Speed Hackathon 2021 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /scripts/create-ogp/template/ogp.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | OGP 8 | 98 | 99 | 100 |
101 | 102 |
103 |

Web Speed
Hackathon 2021 mini

104 |
105 | GitHub 106 | | 107 | 108 | SCORE 109 | | 110 | <%= Number(competitor.score).toFixed(2) %> / 720.00 111 | RANK 112 | | 113 | <%= competitor.rank %> 位 114 |
115 |
116 | 計測日時 117 | | 118 | <%= date %> 119 |
120 |
121 |
122 | 123 | 124 | -------------------------------------------------------------------------------- /scripts/create-ogp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // "incremental": true, 4 | // "composite": true, 5 | // "tsBuildInfoFile": "./", 6 | // "disableSourceOfProjectReferenceRedirect": true, 7 | // "disableSolutionSearching": true, 8 | // "disableReferencedProjectLoad": true, 9 | 10 | "target": "esnext", 11 | "lib": ["esnext"], 12 | // "jsx": "preserve", 13 | // "experimentalDecorators": true, 14 | // "emitDecoratorMetadata": true, 15 | // "jsxFactory": "", 16 | // "jsxFragmentFactory": "", 17 | // "jsxImportSource": "", 18 | // "reactNamespace": "", 19 | // "noLib": true, 20 | // "useDefineForClassFields": true, 21 | 22 | "module": "commonjs", 23 | "rootDir": "./src", 24 | "moduleResolution": "node", 25 | // "baseUrl": "./", 26 | // "paths": {}, 27 | // "rootDirs": [], 28 | // "typeRoots": [], 29 | "types": ["@types/node"], 30 | // "allowUmdGlobalAccess": true, 31 | // "resolveJsonModule": true, 32 | // "noResolve": true, 33 | 34 | // "allowJs": true, 35 | // "checkJs": true, 36 | // "maxNodeModuleJsDepth": 1, 37 | 38 | // "declaration": true, 39 | // "declarationMap": true, 40 | // "emitDeclarationOnly": true, 41 | // "sourceMap": true, 42 | // "outFile": "./", 43 | "outDir": "./dist", 44 | // "removeComments": true, 45 | // "noEmit": true, 46 | // "importHelpers": true, 47 | // "importsNotUsedAsValues": "remove", 48 | // "downlevelIteration": true, 49 | // "sourceRoot": "", 50 | // "mapRoot": "", 51 | // "inlineSourceMap": true, 52 | // "inlineSources": true, 53 | // "emitBOM": true, 54 | // "newLine": "crlf", 55 | // "stripInternal": true, 56 | // "noEmitHelpers": true, 57 | // "noEmitOnError": true, 58 | // "preserveConstEnums": true, 59 | // "declarationDir": "./", 60 | // "preserveValueImports": true, 61 | 62 | // "isolatedModules": true, 63 | // "allowSyntheticDefaultImports": true, 64 | "esModuleInterop": true, 65 | // "preserveSymlinks": true, 66 | "forceConsistentCasingInFileNames": true, 67 | 68 | "strict": true, 69 | "noImplicitAny": true, 70 | "strictNullChecks": true, 71 | "strictFunctionTypes": true, 72 | "strictBindCallApply": true, 73 | "strictPropertyInitialization": true, 74 | "noImplicitThis": true, 75 | "useUnknownInCatchVariables": true, 76 | "alwaysStrict": true, 77 | "noUnusedLocals": true, 78 | "noUnusedParameters": true, 79 | "exactOptionalPropertyTypes": true, 80 | "noImplicitReturns": true, 81 | "noFallthroughCasesInSwitch": true, 82 | "noUncheckedIndexedAccess": true, 83 | "noImplicitOverride": true, 84 | "noPropertyAccessFromIndexSignature": true, 85 | "allowUnusedLabels": true, 86 | "allowUnreachableCode": true, 87 | 88 | // "skipDefaultLibCheck": true, 89 | "skipLibCheck": true 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /scripts/scoring/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "@web-speed-hackathon/scoring", 4 | "version": "0.0.0", 5 | "main": "dist/index.js", 6 | "license": "UNLICENSE", 7 | "scripts": { 8 | "build": "tsc", 9 | "start": "node dist/index.js" 10 | }, 11 | "dependencies": { 12 | "chrome-launcher": "0.15.0", 13 | "js-yaml": "^4.1.0", 14 | "lighthouse": "9.0.0", 15 | "lodash.floor": "4.0.4", 16 | "node-fetch": "2.6.6", 17 | "option-t": "29.1.0", 18 | "pino": "7.3.0", 19 | "pino-pretty": "7.2.0", 20 | "puppeteer-core": "11.0.0", 21 | "yargs": "17.2.1" 22 | }, 23 | "devDependencies": { 24 | "@types/lodash.floor": "4.0.6", 25 | "@types/node": "16.11.9", 26 | "@types/node-fetch": "2.5.12", 27 | "@types/yargs": "17.0.7", 28 | "typescript": "4.5.2" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /scripts/scoring/src/fetch_build_info.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import * as chromeLauncher from 'chrome-launcher'; 3 | import puppeteer from 'puppeteer-core'; 4 | 5 | import type { BuildInfo, Competitor } from './types'; 6 | import { logger } from './logger'; 7 | 8 | export async function fetchBuildInfo(competitor: Competitor): Promise { 9 | const chrome = await chromeLauncher.launch({ 10 | chromeFlags: ['--headless', '--no-sandbox'], 11 | }); 12 | 13 | try { 14 | const res = await fetch(`http://localhost:${chrome.port}/json/version`); 15 | const json = await res.json(); 16 | const browser = await puppeteer.connect({ 17 | browserWSEndpoint: json.webSocketDebuggerUrl, 18 | }); 19 | const context = await browser.createIncognitoBrowserContext(); 20 | const page = await context.newPage(); 21 | 22 | await page.goto(competitor.url); 23 | 24 | const commitHash = (await page.evaluate( 25 | // @ts-expect-error window.__BUILD_INFO__ must be available 26 | () => window.__BUILD_INFO__?.COMMIT_HASH, 27 | )) as string; 28 | const buildDate = (await page.evaluate( 29 | // @ts-expect-error window.__BUILD_INFO__ must be available 30 | () => window.__BUILD_INFO__?.BUILD_DATE, 31 | )) as string; 32 | 33 | const buildInfo = { 34 | commitHash, 35 | buildDate, 36 | }; 37 | 38 | logger.info('buildInfo: %o', buildInfo); 39 | 40 | return buildInfo; 41 | } catch (e) { 42 | logger.error(e); 43 | return null; 44 | } finally { 45 | await chrome.kill(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /scripts/scoring/src/index.ts: -------------------------------------------------------------------------------- 1 | import yargs from 'yargs'; 2 | 3 | import type { Competitor } from './types'; 4 | import { logger } from './logger'; 5 | import { scoring } from './scoring'; 6 | 7 | async function main() { 8 | const argv = await yargs 9 | .option('id', { 10 | type: 'string', 11 | demandOption: true, 12 | }) 13 | .option('url', { 14 | type: 'string', 15 | demandOption: true, 16 | }) 17 | .help().argv; 18 | 19 | const competitor: Competitor = { 20 | id: argv.id, 21 | url: argv.url, 22 | }; 23 | 24 | const targetPaths = JSON.parse(process.env['WSH_SCORING_TARGET_PATHS'] as string); 25 | 26 | const result = await scoring(competitor, targetPaths); 27 | 28 | if ('error' in result.result) { 29 | throw result.result.error; 30 | } 31 | console.log(`::set-output name=export::${JSON.stringify(result)}`); 32 | } 33 | 34 | main().catch((e) => { 35 | logger.error(e); 36 | process.exit(1); 37 | }); 38 | -------------------------------------------------------------------------------- /scripts/scoring/src/logger.ts: -------------------------------------------------------------------------------- 1 | import pino from 'pino'; 2 | 3 | export const logger = pino({ 4 | level: process.env['WSH_SCORING_DEBUG'] === 'true' ? 'debug' : 'info', 5 | transport: { 6 | target: 'pino-pretty', 7 | options: { 8 | colorize: true, 9 | levelFirst: true, 10 | }, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /scripts/scoring/src/measure_competitor.ts: -------------------------------------------------------------------------------- 1 | import { URL } from 'url'; 2 | // @ts-expect-error 3 | import lighthouse from 'lighthouse'; 4 | import fetch from 'node-fetch'; 5 | import { createErr, createOk, Result } from 'option-t/cjs/PlainResult'; 6 | import * as chromeLauncher from 'chrome-launcher'; 7 | import floor from 'lodash.floor'; 8 | 9 | import type { Competitor, HackathonScore, LighthouseScore, LighthouseScoreList } from './types'; 10 | import { logger } from './logger'; 11 | 12 | async function measurePage(url: string): Promise { 13 | const chrome = await chromeLauncher.launch({ 14 | chromeFlags: ['--headless', '--no-sandbox', '--hide-scrollbars'], 15 | }); 16 | 17 | const settings = { 18 | logLevel: 'error', 19 | output: 'json', 20 | onlyCategories: ['performance'], 21 | onlyAudits: [ 22 | 'first-contentful-paint', 23 | 'speed-index', 24 | 'largest-contentful-paint', 25 | 'interactive', 26 | 'total-blocking-time', 27 | 'cumulative-layout-shift', 28 | ], 29 | port: chrome.port, 30 | }; 31 | const config = { 32 | extends: 'lighthouse:default', 33 | }; 34 | 35 | try { 36 | const runnerResult = await lighthouse(url, settings, config); 37 | const lhr = runnerResult.lhr; 38 | const result: LighthouseScore = { 39 | score: (lhr.categories.performance?.score ?? 0) * 100, 40 | firstContentfulPaint: lhr.audits['first-contentful-paint']?.score ?? 0, 41 | speedIndex: lhr.audits['speed-index']?.score ?? 0, 42 | largestContentfulPaint: lhr.audits['largest-contentful-paint']?.score ?? 0, 43 | timeToInteractive: lhr.audits['interactive']?.score ?? 0, 44 | totalBlockingTime: lhr.audits['total-blocking-time']?.score ?? 0, 45 | cumulativeLayoutShift: lhr.audits['cumulative-layout-shift']?.score ?? 0, 46 | }; 47 | 48 | return result; 49 | } finally { 50 | await chrome.kill(); 51 | } 52 | } 53 | 54 | async function measurePages(entrypoint: string, paths: string[]): Promise { 55 | const result: LighthouseScoreList = {}; 56 | 57 | for (const path of paths) { 58 | const url = new URL(path, entrypoint); 59 | 60 | if (!['http:', 'https:'].includes(url.protocol)) { 61 | throw new Error('target url is invalid.'); 62 | } 63 | 64 | logger.debug('Target URL: %s', url.href); 65 | 66 | // Check HTTP status before actually running Lighthouse 67 | const res = await fetch(url, { method: 'GET' }); 68 | 69 | if (!res.ok) { 70 | throw new Error(`target url returns ${res.status}: ${res.statusText}`); 71 | } 72 | 73 | const lighthouseScore = await measurePage(url.href); 74 | 75 | logger.debug('Lighthouse: %o', lighthouseScore); 76 | 77 | result[path] = lighthouseScore; 78 | } 79 | 80 | return result; 81 | } 82 | 83 | function calculateHackathonScore(lighthouseScores: LighthouseScoreList): HackathonScore { 84 | const score = Object.values(lighthouseScores).reduce((sum, lh) => { 85 | return ( 86 | sum + 87 | lh.score + 88 | lh.firstContentfulPaint * 2 + 89 | lh.speedIndex * 2 + 90 | lh.largestContentfulPaint * 5 + 91 | lh.timeToInteractive * 2 + 92 | lh.totalBlockingTime * 6 + 93 | lh.cumulativeLayoutShift * 3 94 | ); 95 | }, 0); 96 | const roundedScore = floor(score, 2); 97 | 98 | return { 99 | score: roundedScore, 100 | lighthouseScores, 101 | }; 102 | } 103 | 104 | export async function measureCompetitor( 105 | competitor: Competitor, 106 | targetPaths: string[], 107 | ): Promise> { 108 | logger.info('Competitor: %s', competitor.id); 109 | 110 | try { 111 | const lighthouseScores = await measurePages(competitor.url, targetPaths); 112 | const hackathonScore = calculateHackathonScore(lighthouseScores); 113 | 114 | logger.info('Score: %d', hackathonScore.score); 115 | 116 | return createOk(hackathonScore); 117 | } catch (e: unknown) { 118 | if (e instanceof Error) { 119 | return createErr(e); 120 | } else { 121 | return createErr(new Error('unexpected error.')); 122 | } 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /scripts/scoring/src/scoring.ts: -------------------------------------------------------------------------------- 1 | import { isErr } from 'option-t/cjs/PlainResult'; 2 | 3 | import type { Competitor, MeasurementResult } from './types'; 4 | import { fetchBuildInfo } from './fetch_build_info'; 5 | import { measureCompetitor } from './measure_competitor'; 6 | 7 | export async function scoring(competitor: Competitor, targetPaths: string[]): Promise { 8 | const result = await measureCompetitor(competitor, targetPaths); 9 | 10 | if (isErr(result)) { 11 | return { 12 | competitor, 13 | result: { error: result.err }, 14 | }; 15 | } 16 | 17 | const buildInfo = await fetchBuildInfo(competitor); 18 | 19 | return { 20 | competitor, 21 | buildInfo, 22 | result: result.val, 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /scripts/scoring/src/types.ts: -------------------------------------------------------------------------------- 1 | export type Competitor = { 2 | id: string; 3 | url: string; 4 | }; 5 | 6 | export type LighthouseScore = { 7 | score: number; 8 | firstContentfulPaint: number; 9 | speedIndex: number; 10 | largestContentfulPaint: number; 11 | timeToInteractive: number; 12 | totalBlockingTime: number; 13 | cumulativeLayoutShift: number; 14 | }; 15 | 16 | export type LighthouseScoreList = { 17 | [path: string]: LighthouseScore; 18 | }; 19 | 20 | export type HackathonScore = { 21 | score: number; 22 | lighthouseScores: LighthouseScoreList; 23 | }; 24 | 25 | export type BuildInfo = { 26 | commitHash: string; 27 | buildDate: string; 28 | }; 29 | 30 | export type MeasurementResult = 31 | | { 32 | competitor: Competitor; 33 | buildInfo: BuildInfo | null; 34 | result: HackathonScore; 35 | } 36 | | { 37 | competitor: Competitor; 38 | result: { error: Error }; 39 | }; 40 | -------------------------------------------------------------------------------- /scripts/scoring/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // "incremental": true, 4 | // "composite": true, 5 | // "tsBuildInfoFile": "./", 6 | // "disableSourceOfProjectReferenceRedirect": true, 7 | // "disableSolutionSearching": true, 8 | // "disableReferencedProjectLoad": true, 9 | 10 | "target": "esnext", 11 | "lib": ["esnext"], 12 | // "jsx": "preserve", 13 | // "experimentalDecorators": true, 14 | // "emitDecoratorMetadata": true, 15 | // "jsxFactory": "", 16 | // "jsxFragmentFactory": "", 17 | // "jsxImportSource": "", 18 | // "reactNamespace": "", 19 | // "noLib": true, 20 | // "useDefineForClassFields": true, 21 | 22 | "module": "commonjs", 23 | "rootDir": "./src", 24 | "moduleResolution": "node", 25 | // "baseUrl": "./", 26 | // "paths": {}, 27 | // "rootDirs": [], 28 | // "typeRoots": [], 29 | "types": ["@types/node"], 30 | // "allowUmdGlobalAccess": true, 31 | // "resolveJsonModule": true, 32 | // "noResolve": true, 33 | 34 | // "allowJs": true, 35 | // "checkJs": true, 36 | // "maxNodeModuleJsDepth": 1, 37 | 38 | // "declaration": true, 39 | // "declarationMap": true, 40 | // "emitDeclarationOnly": true, 41 | // "sourceMap": true, 42 | // "outFile": "./", 43 | "outDir": "./dist", 44 | // "removeComments": true, 45 | // "noEmit": true, 46 | // "importHelpers": true, 47 | // "importsNotUsedAsValues": "remove", 48 | // "downlevelIteration": true, 49 | // "sourceRoot": "", 50 | // "mapRoot": "", 51 | // "inlineSourceMap": true, 52 | // "inlineSources": true, 53 | // "emitBOM": true, 54 | // "newLine": "crlf", 55 | // "stripInternal": true, 56 | // "noEmitHelpers": true, 57 | // "noEmitOnError": true, 58 | // "preserveConstEnums": true, 59 | // "declarationDir": "./", 60 | // "preserveValueImports": true, 61 | 62 | // "isolatedModules": true, 63 | // "allowSyntheticDefaultImports": true, 64 | "esModuleInterop": true, 65 | // "preserveSymlinks": true, 66 | "forceConsistentCasingInFileNames": true, 67 | 68 | "strict": true, 69 | "noImplicitAny": true, 70 | "strictNullChecks": true, 71 | "strictFunctionTypes": true, 72 | "strictBindCallApply": true, 73 | "strictPropertyInitialization": true, 74 | "noImplicitThis": true, 75 | "useUnknownInCatchVariables": true, 76 | "alwaysStrict": true, 77 | "noUnusedLocals": true, 78 | "noUnusedParameters": true, 79 | "exactOptionalPropertyTypes": true, 80 | "noImplicitReturns": true, 81 | "noFallthroughCasesInSwitch": true, 82 | "noUncheckedIndexedAccess": true, 83 | "noImplicitOverride": true, 84 | "noPropertyAccessFromIndexSignature": true, 85 | "allowUnusedLabels": true, 86 | "allowUnreachableCode": true, 87 | 88 | // "skipDefaultLibCheck": true, 89 | "skipLibCheck": true 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /scripts/update-leaderboard/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "@web-speed-hackathon/update-leaderboard", 4 | "version": "0.0.0", 5 | "main": "dist/index.js", 6 | "license": "UNLICENSE", 7 | "scripts": { 8 | "build": "tsc", 9 | "start": "node dist/index.js" 10 | }, 11 | "dependencies": { 12 | "csv": "6.0.4", 13 | "csv-parse": "5.0.3", 14 | "csv-stringify": "6.0.4", 15 | "pino": "7.3.0", 16 | "pino-pretty": "7.2.0", 17 | "yargs": "17.2.1" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "16.11.9", 21 | "@types/yargs": "17.0.7", 22 | "typescript": "4.5.2" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /scripts/update-leaderboard/src/index.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs/promises'; 2 | import yargs from 'yargs'; 3 | import { parse as parseCSV } from 'csv-parse/sync'; 4 | import { stringify as stringifyCSV } from 'csv-stringify/sync'; 5 | 6 | import { logger } from './logger'; 7 | 8 | import type { CSVRow } from './types'; 9 | 10 | async function main() { 11 | const argv = await yargs 12 | .option('score-csv', { 13 | type: 'string', 14 | demandOption: true, 15 | }) 16 | .option('markdown', { 17 | type: 'string', 18 | demandOption: true, 19 | }) 20 | .option('id', { 21 | type: 'string', 22 | demandOption: true, 23 | }) 24 | .option('url', { 25 | type: 'string', 26 | demandOption: true, 27 | }) 28 | .option('score', { 29 | type: 'number', 30 | demandOption: true, 31 | }) 32 | .help().argv; 33 | 34 | const result: CSVRow = { 35 | rank: 0, 36 | score: argv.score, 37 | competitorId: argv.id, 38 | url: argv.url, 39 | }; 40 | 41 | const scoreList = parseCSV(await fs.readFile(argv['score-csv'], 'utf-8'), { 42 | columns: true, 43 | cast: (value, context) => { 44 | if (context.header) { 45 | return value; 46 | } 47 | if (['rank', 'score'].includes(context.column as string)) { 48 | return Number(value); 49 | } 50 | return String(value); 51 | }, 52 | }) as CSVRow[]; 53 | 54 | const scoreMap = new Map(scoreList.map((s) => [s.competitorId, s])); 55 | scoreMap.set(result.competitorId, result); 56 | 57 | const sortedScoreList = Array.from(scoreMap.values()).sort((a, b) => b.score - a.score); 58 | 59 | for (let idx = 0; idx < sortedScoreList.length; idx++) { 60 | const item = sortedScoreList[idx]!; 61 | const prevItem = sortedScoreList[idx - 1]; 62 | 63 | if (prevItem && item.score === prevItem.score) { 64 | item.rank = prevItem.rank; 65 | } else { 66 | item.rank = idx + 1; 67 | } 68 | } 69 | 70 | console.log(`::set-output name=export::${JSON.stringify(result)}`); 71 | 72 | const leaderBoardMarkdown = [ 73 | '', 74 | '', 75 | '|Rank|Score||CompetitorId|URL|', 76 | '|:--:|:--:|:--:|:--|:--:|', 77 | ...sortedScoreList 78 | .filter((s) => s.rank <= 10) 79 | .map((item) => { 80 | const inner = [ 81 | `${item.rank}`, 82 | `**${Number(item.score).toFixed(2)}**`, 83 | ``, 84 | `[@${item.competitorId}](https://github.com/${item.competitorId})`, 85 | `[:link:](${item.url})`, 86 | ].join('|'); 87 | return `|${inner}|`; 88 | }), 89 | '', 90 | '', 91 | ].join('\n'); 92 | 93 | const markdown = await fs.readFile(argv.markdown, 'utf-8'); 94 | await fs.writeFile( 95 | argv.markdown, 96 | markdown.replace(/.*/ms, leaderBoardMarkdown), 97 | 'utf-8', 98 | ); 99 | 100 | const csv = stringifyCSV(sortedScoreList, { 101 | columns: ['rank', 'score', 'competitorId', 'url'], 102 | header: true, 103 | }); 104 | await fs.writeFile(argv['score-csv'], csv, 'utf-8'); 105 | } 106 | 107 | main().catch((e) => { 108 | logger.error(e); 109 | process.exit(1); 110 | }); 111 | -------------------------------------------------------------------------------- /scripts/update-leaderboard/src/logger.ts: -------------------------------------------------------------------------------- 1 | import pino from 'pino'; 2 | 3 | export const logger = pino({ 4 | level: process.env['WSH_SCORING_DEBUG'] === 'true' ? 'debug' : 'info', 5 | transport: { 6 | target: 'pino-pretty', 7 | options: { 8 | colorize: true, 9 | levelFirst: true, 10 | }, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /scripts/update-leaderboard/src/types.ts: -------------------------------------------------------------------------------- 1 | export type CSVRow = { 2 | rank: number; 3 | score: number; 4 | competitorId: string; 5 | url: string; 6 | }; 7 | -------------------------------------------------------------------------------- /scripts/update-leaderboard/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // "incremental": true, 4 | // "composite": true, 5 | // "tsBuildInfoFile": "./", 6 | // "disableSourceOfProjectReferenceRedirect": true, 7 | // "disableSolutionSearching": true, 8 | // "disableReferencedProjectLoad": true, 9 | 10 | "target": "esnext", 11 | "lib": ["esnext"], 12 | // "jsx": "preserve", 13 | // "experimentalDecorators": true, 14 | // "emitDecoratorMetadata": true, 15 | // "jsxFactory": "", 16 | // "jsxFragmentFactory": "", 17 | // "jsxImportSource": "", 18 | // "reactNamespace": "", 19 | // "noLib": true, 20 | // "useDefineForClassFields": true, 21 | 22 | "module": "commonjs", 23 | "rootDir": "./src", 24 | "moduleResolution": "node", 25 | // "baseUrl": "./", 26 | // "paths": {}, 27 | // "rootDirs": [], 28 | // "typeRoots": [], 29 | "types": ["@types/node"], 30 | // "allowUmdGlobalAccess": true, 31 | // "resolveJsonModule": true, 32 | // "noResolve": true, 33 | 34 | // "allowJs": true, 35 | // "checkJs": true, 36 | // "maxNodeModuleJsDepth": 1, 37 | 38 | // "declaration": true, 39 | // "declarationMap": true, 40 | // "emitDeclarationOnly": true, 41 | // "sourceMap": true, 42 | // "outFile": "./", 43 | "outDir": "./dist", 44 | // "removeComments": true, 45 | // "noEmit": true, 46 | // "importHelpers": true, 47 | // "importsNotUsedAsValues": "remove", 48 | // "downlevelIteration": true, 49 | // "sourceRoot": "", 50 | // "mapRoot": "", 51 | // "inlineSourceMap": true, 52 | // "inlineSources": true, 53 | // "emitBOM": true, 54 | // "newLine": "crlf", 55 | // "stripInternal": true, 56 | // "noEmitHelpers": true, 57 | // "noEmitOnError": true, 58 | // "preserveConstEnums": true, 59 | // "declarationDir": "./", 60 | // "preserveValueImports": true, 61 | 62 | // "isolatedModules": true, 63 | // "allowSyntheticDefaultImports": true, 64 | "esModuleInterop": true, 65 | // "preserveSymlinks": true, 66 | "forceConsistentCasingInFileNames": true, 67 | 68 | "strict": true, 69 | "noImplicitAny": true, 70 | "strictNullChecks": true, 71 | "strictFunctionTypes": true, 72 | "strictBindCallApply": true, 73 | "strictPropertyInitialization": true, 74 | "noImplicitThis": true, 75 | "useUnknownInCatchVariables": true, 76 | "alwaysStrict": true, 77 | "noUnusedLocals": true, 78 | "noUnusedParameters": true, 79 | "exactOptionalPropertyTypes": true, 80 | "noImplicitReturns": true, 81 | "noFallthroughCasesInSwitch": true, 82 | "noUncheckedIndexedAccess": true, 83 | "noImplicitOverride": true, 84 | "noPropertyAccessFromIndexSignature": true, 85 | "allowUnusedLabels": true, 86 | "allowUnreachableCode": true, 87 | 88 | // "skipDefaultLibCheck": true, 89 | "skipLibCheck": true 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /scripts/vrt/config/default.yml: -------------------------------------------------------------------------------- 1 | pages: 2 | - name: ホーム 3 | path: / 4 | viewports: 5 | - name: Device name 6 | width: 100 7 | height: 200 8 | -------------------------------------------------------------------------------- /scripts/vrt/config/local.yml: -------------------------------------------------------------------------------- 1 | pages: 2 | - name: ホーム 3 | path: / 4 | - name: 投稿詳細 - 画像 5 | path: /posts/01EXNV3BSJV18WFYBS87TP4NFC 6 | - name: 投稿詳細 - 音声 7 | path: /posts/01EX0SGMRHZP5JBA5JF2ZZQTP2 8 | - name: 投稿詳細 - 動画 9 | path: /posts/01EXH20KRBVP34RYHYDTSX8JS2 10 | - name: ユーザー詳細 11 | path: /users/mexicandraggle 12 | - name: 利用規約 13 | path: /terms 14 | viewports: 15 | - name: Pixel 5 16 | width: 393 17 | height: 851 18 | - name: Kindle Fire HDX 19 | width: 800 20 | height: 1280 21 | - name: Desktop 22 | width: 1280 23 | height: 720 24 | -------------------------------------------------------------------------------- /scripts/vrt/expected/ホーム - Desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/ホーム - Desktop.png -------------------------------------------------------------------------------- /scripts/vrt/expected/ホーム - Kindle Fire HDX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/ホーム - Kindle Fire HDX.png -------------------------------------------------------------------------------- /scripts/vrt/expected/ホーム - Pixel 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/ホーム - Pixel 5.png -------------------------------------------------------------------------------- /scripts/vrt/expected/ユーザー詳細 - Desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/ユーザー詳細 - Desktop.png -------------------------------------------------------------------------------- /scripts/vrt/expected/ユーザー詳細 - Kindle Fire HDX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/ユーザー詳細 - Kindle Fire HDX.png -------------------------------------------------------------------------------- /scripts/vrt/expected/ユーザー詳細 - Pixel 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/ユーザー詳細 - Pixel 5.png -------------------------------------------------------------------------------- /scripts/vrt/expected/利用規約 - Desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/利用規約 - Desktop.png -------------------------------------------------------------------------------- /scripts/vrt/expected/利用規約 - Kindle Fire HDX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/利用規約 - Kindle Fire HDX.png -------------------------------------------------------------------------------- /scripts/vrt/expected/利用規約 - Pixel 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/利用規約 - Pixel 5.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 動画 - Desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 動画 - Desktop.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 動画 - Kindle Fire HDX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 動画 - Kindle Fire HDX.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 動画 - Pixel 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 動画 - Pixel 5.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 画像 - Desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 画像 - Desktop.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 画像 - Kindle Fire HDX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 画像 - Kindle Fire HDX.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 画像 - Pixel 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 画像 - Pixel 5.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 音声 - Desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 音声 - Desktop.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 音声 - Kindle Fire HDX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 音声 - Kindle Fire HDX.png -------------------------------------------------------------------------------- /scripts/vrt/expected/投稿詳細 - 音声 - Pixel 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CyberAgentHack/web-speed-hackathon-2021-leaderboard/036d67b7a4a992cb848bd605bf31c0179e6e5bb0/scripts/vrt/expected/投稿詳細 - 音声 - Pixel 5.png -------------------------------------------------------------------------------- /scripts/vrt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "@web-speed-hackathon/vrt", 4 | "version": "0.0.0", 5 | "main": "dist/index.js", 6 | "license": "UNLICENSE", 7 | "scripts": { 8 | "build": "tsc", 9 | "detect": "reg-cli ./tmp/actual ./expected ./tmp/diff -M 0.15 -T 0.005 -I -J ./tmp/reg.json", 10 | "capture": "node dist/index.js" 11 | }, 12 | "dependencies": { 13 | "axios": "0.24.0", 14 | "chrome-launcher": "0.15.0", 15 | "config": "3.3.6", 16 | "fs-extra": "10.0.0", 17 | "js-yaml": "4.1.0", 18 | "puppeteer-core": "11.0.0", 19 | "yargs": "17.3.0" 20 | }, 21 | "devDependencies": { 22 | "@types/config": "0.0.40", 23 | "@types/fs-extra": "9.0.13", 24 | "@types/node": "16.11.9", 25 | "@types/yargs": "17.0.7", 26 | "reg-cli": "0.17.4", 27 | "typescript": "4.5.2" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /scripts/vrt/src/capture_screenshot.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import * as chromeLauncher from 'chrome-launcher'; 3 | import puppeteer from 'puppeteer-core'; 4 | 5 | type Params = { 6 | url: string; 7 | width: number; 8 | height: number; 9 | }; 10 | 11 | export async function captureScreenshot({ url, width, height }: Params): Promise { 12 | const chrome = await chromeLauncher.launch({ 13 | chromeFlags: ['--headless', '--no-sandbox', '--hide-scrollbars'], 14 | }); 15 | 16 | try { 17 | const res = await fetch(`http://localhost:${chrome.port}/json/version`); 18 | const json = await res.json(); 19 | const browser = await puppeteer.connect({ 20 | browserWSEndpoint: json.webSocketDebuggerUrl, 21 | }); 22 | const context = await browser.createIncognitoBrowserContext(); 23 | const page = await context.newPage(); 24 | 25 | await page.setViewport({ width, height }); 26 | await page.emulateMediaFeatures([{ name: 'prefers-reduced-motion', value: 'reduce' }]); 27 | await page.goto(url, { 28 | timeout: 60 * 1000, 29 | waitUntil: 'networkidle0', 30 | }); 31 | await page.waitForTimeout(3 * 1000); 32 | 33 | const screenshot = (await page.screenshot({ 34 | captureBeyondViewport: false, 35 | })) as Buffer; 36 | 37 | return screenshot; 38 | } finally { 39 | await chrome.kill(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /scripts/vrt/src/index.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs-extra'; 3 | import config from 'config'; 4 | import yargs from 'yargs'; 5 | import axios from 'axios'; 6 | import { URL } from 'url'; 7 | 8 | import type { Page, ViewPort } from './types'; 9 | import { logger } from './logger'; 10 | import { captureScreenshot } from './capture_screenshot'; 11 | 12 | async function main() { 13 | const argv = await yargs 14 | .option('url', { 15 | type: 'string', 16 | demandOption: true, 17 | }) 18 | .help().argv; 19 | 20 | const baseUrl = argv.url; 21 | 22 | // Initialize 23 | await axios.post(new URL('/api/v1/initialize', baseUrl).href); 24 | logger.info('Initialized: %s', baseUrl); 25 | 26 | const viewportList = config.get('viewports'); 27 | const pageList = config.get('pages'); 28 | 29 | const exportPath = path.resolve(process.cwd(), './tmp/actual/'); 30 | await fs.remove(exportPath); 31 | await fs.ensureDir(exportPath); 32 | 33 | for (const viewport of viewportList) { 34 | for (const page of pageList) { 35 | const url = new URL(page.path, baseUrl).href; 36 | const buffer = await captureScreenshot({ 37 | url, 38 | width: viewport.width, 39 | height: viewport.height, 40 | }); 41 | await fs.writeFile(path.resolve(exportPath, `./${page.name} - ${viewport.name}.png`), buffer); 42 | 43 | logger.info('Captured: %s, %s', page.name, viewport.name); 44 | } 45 | } 46 | } 47 | 48 | main().catch((e) => { 49 | logger.error(e); 50 | process.exit(1); 51 | }); 52 | -------------------------------------------------------------------------------- /scripts/vrt/src/logger.ts: -------------------------------------------------------------------------------- 1 | import pino from 'pino'; 2 | 3 | export const logger = pino({ 4 | level: process.env['WSH_SCORING_DEBUG'] === 'true' ? 'debug' : 'info', 5 | transport: { 6 | target: 'pino-pretty', 7 | options: { 8 | colorize: true, 9 | levelFirst: true, 10 | }, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /scripts/vrt/src/types.ts: -------------------------------------------------------------------------------- 1 | export type ViewPort = { 2 | name: string; 3 | width: number; 4 | height: number; 5 | }; 6 | 7 | export type Page = { 8 | name: string; 9 | path: string; 10 | }; 11 | -------------------------------------------------------------------------------- /scripts/vrt/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // "incremental": true, 4 | // "composite": true, 5 | // "tsBuildInfoFile": "./", 6 | // "disableSourceOfProjectReferenceRedirect": true, 7 | // "disableSolutionSearching": true, 8 | // "disableReferencedProjectLoad": true, 9 | 10 | "target": "esnext", 11 | "lib": ["esnext"], 12 | // "jsx": "preserve", 13 | // "experimentalDecorators": true, 14 | // "emitDecoratorMetadata": true, 15 | // "jsxFactory": "", 16 | // "jsxFragmentFactory": "", 17 | // "jsxImportSource": "", 18 | // "reactNamespace": "", 19 | // "noLib": true, 20 | // "useDefineForClassFields": true, 21 | 22 | "module": "commonjs", 23 | "rootDir": "./src", 24 | "moduleResolution": "node", 25 | // "baseUrl": "./", 26 | // "paths": {}, 27 | // "rootDirs": [], 28 | // "typeRoots": [], 29 | "types": ["@types/node"], 30 | // "allowUmdGlobalAccess": true, 31 | // "resolveJsonModule": true, 32 | // "noResolve": true, 33 | 34 | // "allowJs": true, 35 | // "checkJs": true, 36 | // "maxNodeModuleJsDepth": 1, 37 | 38 | // "declaration": true, 39 | // "declarationMap": true, 40 | // "emitDeclarationOnly": true, 41 | // "sourceMap": true, 42 | // "outFile": "./", 43 | "outDir": "./dist", 44 | // "removeComments": true, 45 | // "noEmit": true, 46 | // "importHelpers": true, 47 | // "importsNotUsedAsValues": "remove", 48 | // "downlevelIteration": true, 49 | // "sourceRoot": "", 50 | // "mapRoot": "", 51 | // "inlineSourceMap": true, 52 | // "inlineSources": true, 53 | // "emitBOM": true, 54 | // "newLine": "crlf", 55 | // "stripInternal": true, 56 | // "noEmitHelpers": true, 57 | // "noEmitOnError": true, 58 | // "preserveConstEnums": true, 59 | // "declarationDir": "./", 60 | // "preserveValueImports": true, 61 | 62 | // "isolatedModules": true, 63 | // "allowSyntheticDefaultImports": true, 64 | "esModuleInterop": true, 65 | // "preserveSymlinks": true, 66 | "forceConsistentCasingInFileNames": true, 67 | 68 | "strict": true, 69 | "noImplicitAny": true, 70 | "strictNullChecks": true, 71 | "strictFunctionTypes": true, 72 | "strictBindCallApply": true, 73 | "strictPropertyInitialization": true, 74 | "noImplicitThis": true, 75 | "useUnknownInCatchVariables": true, 76 | "alwaysStrict": true, 77 | "noUnusedLocals": true, 78 | "noUnusedParameters": true, 79 | "exactOptionalPropertyTypes": true, 80 | "noImplicitReturns": true, 81 | "noFallthroughCasesInSwitch": true, 82 | "noUncheckedIndexedAccess": true, 83 | "noImplicitOverride": true, 84 | "noPropertyAccessFromIndexSignature": true, 85 | "allowUnusedLabels": true, 86 | "allowUnreachableCode": true, 87 | 88 | // "skipDefaultLibCheck": true, 89 | "skipLibCheck": true 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@nodelib/fs.scandir@2.1.5": 6 | version "2.1.5" 7 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 8 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 9 | dependencies: 10 | "@nodelib/fs.stat" "2.0.5" 11 | run-parallel "^1.1.9" 12 | 13 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 14 | version "2.0.5" 15 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 16 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 17 | 18 | "@nodelib/fs.walk@^1.2.3": 19 | version "1.2.8" 20 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 21 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 22 | dependencies: 23 | "@nodelib/fs.scandir" "2.1.5" 24 | fastq "^1.6.0" 25 | 26 | "@sindresorhus/is@^0.14.0": 27 | version "0.14.0" 28 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 29 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 30 | 31 | "@szmarczak/http-timer@^1.1.2": 32 | version "1.1.2" 33 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 34 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 35 | dependencies: 36 | defer-to-connect "^1.0.1" 37 | 38 | "@types/config@0.0.40": 39 | version "0.0.40" 40 | resolved "https://registry.yarnpkg.com/@types/config/-/config-0.0.40.tgz#5ec60501a8e67b47c9edc0a8b060056c35b2c7b7" 41 | integrity sha512-4s7JAciBzCJVy0fp7LPsMj0v3F+IeTdjpwMQ6owOx67UjcyurjP+8DO556u5/8PUhifAYp7H5b7D88RKFDBGEg== 42 | 43 | "@types/ejs@3.1.0": 44 | version "3.1.0" 45 | resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.0.tgz#ab8109208106b5e764e5a6c92b2ba1c625b73020" 46 | integrity sha512-DCg+Ka+uDQ31lJ/UtEXVlaeV3d6t81gifaVWKJy4MYVVgvJttyX/viREy+If7fz+tK/gVxTGMtyrFPnm4gjrVA== 47 | 48 | "@types/fs-extra@9.0.13": 49 | version "9.0.13" 50 | resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" 51 | integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== 52 | dependencies: 53 | "@types/node" "*" 54 | 55 | "@types/lodash.floor@4.0.6": 56 | version "4.0.6" 57 | resolved "https://registry.yarnpkg.com/@types/lodash.floor/-/lodash.floor-4.0.6.tgz#801afcadbc47ed621f1e1e298f61f08ebedd7d49" 58 | integrity sha512-P6l5H4D4RzswuZBFEbt5d9IL+qWqA/kGuj6CoDUX/IABcmfZuVCd8WG1Cfm8Z0Vmec6wb6bs2n7SA6goIFif+Q== 59 | dependencies: 60 | "@types/lodash" "*" 61 | 62 | "@types/lodash@*": 63 | version "4.14.177" 64 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.177.tgz#f70c0d19c30fab101cad46b52be60363c43c4578" 65 | integrity sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw== 66 | 67 | "@types/mkdirp@^1.0.1": 68 | version "1.0.2" 69 | resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.2.tgz#8d0bad7aa793abe551860be1f7ae7f3198c16666" 70 | integrity sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ== 71 | dependencies: 72 | "@types/node" "*" 73 | 74 | "@types/node-fetch@2.5.12": 75 | version "2.5.12" 76 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" 77 | integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== 78 | dependencies: 79 | "@types/node" "*" 80 | form-data "^3.0.0" 81 | 82 | "@types/node@*": 83 | version "16.11.11" 84 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" 85 | integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw== 86 | 87 | "@types/node@16.11.9": 88 | version "16.11.9" 89 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.9.tgz#879be3ad7af29f4c1a5c433421bf99fab7047185" 90 | integrity sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A== 91 | 92 | "@types/node@^14.11.2": 93 | version "14.17.34" 94 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.34.tgz#fe4b38b3f07617c0fa31ae923fca9249641038f0" 95 | integrity sha512-USUftMYpmuMzeWobskoPfzDi+vkpe0dvcOBRNOscFrGxVp4jomnRxWuVohgqBow2xyIPC0S3gjxV/5079jhmDg== 96 | 97 | "@types/pixelmatch@^5.2.2": 98 | version "5.2.4" 99 | resolved "https://registry.yarnpkg.com/@types/pixelmatch/-/pixelmatch-5.2.4.tgz#ca145cc5ede1388c71c68edf2d1f5190e5ddd0f6" 100 | integrity sha512-HDaSHIAv9kwpMN7zlmwfTv6gax0PiporJOipcrGsVNF3Ba+kryOZc0Pio5pn6NhisgWr7TaajlPEKTbTAypIBQ== 101 | dependencies: 102 | "@types/node" "*" 103 | 104 | "@types/pngjs@^6.0.0": 105 | version "6.0.1" 106 | resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-6.0.1.tgz#c711ec3fbbf077fed274ecccaf85dd4673130072" 107 | integrity sha512-J39njbdW1U/6YyVXvC9+1iflZghP8jgRf2ndYghdJb5xL49LYDB+1EuAxfbuJ2IBbWIL3AjHPQhgaTxT3YaYeg== 108 | dependencies: 109 | "@types/node" "*" 110 | 111 | "@types/yargs-parser@*": 112 | version "20.2.1" 113 | resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" 114 | integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== 115 | 116 | "@types/yargs@17.0.7": 117 | version "17.0.7" 118 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.7.tgz#44a484c634761da4391477515a98772b82b5060f" 119 | integrity sha512-OvLKmpKdea1aWtqHv9bxVVcMoT6syAeK+198dfETIFkAevYRGwqh4H+KFxfjUETZuUuE5sQCAFwdOdoHUdo8eg== 120 | dependencies: 121 | "@types/yargs-parser" "*" 122 | 123 | "@types/yauzl@^2.9.1": 124 | version "2.9.2" 125 | resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" 126 | integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== 127 | dependencies: 128 | "@types/node" "*" 129 | 130 | agent-base@6: 131 | version "6.0.2" 132 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 133 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 134 | dependencies: 135 | debug "4" 136 | 137 | aggregate-error@^3.0.0: 138 | version "3.1.0" 139 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 140 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 141 | dependencies: 142 | clean-stack "^2.0.0" 143 | indent-string "^4.0.0" 144 | 145 | ansi-align@^3.0.0: 146 | version "3.0.1" 147 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 148 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 149 | dependencies: 150 | string-width "^4.1.0" 151 | 152 | ansi-colors@^4.1.1: 153 | version "4.1.1" 154 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 155 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 156 | 157 | ansi-regex@^5.0.1: 158 | version "5.0.1" 159 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 160 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 161 | 162 | ansi-styles@^3.2.1: 163 | version "3.2.1" 164 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 165 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 166 | dependencies: 167 | color-convert "^1.9.0" 168 | 169 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 170 | version "4.3.0" 171 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 172 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 173 | dependencies: 174 | color-convert "^2.0.1" 175 | 176 | argparse@^2.0.1: 177 | version "2.0.1" 178 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 179 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 180 | 181 | args@^5.0.1: 182 | version "5.0.1" 183 | resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761" 184 | integrity sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ== 185 | dependencies: 186 | camelcase "5.0.0" 187 | chalk "2.4.2" 188 | leven "2.1.0" 189 | mri "1.1.4" 190 | 191 | array-find-index@^1.0.1: 192 | version "1.0.2" 193 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 194 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 195 | 196 | array-union@^2.1.0: 197 | version "2.1.0" 198 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 199 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 200 | 201 | async@0.9.x: 202 | version "0.9.2" 203 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 204 | integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= 205 | 206 | asynckit@^0.4.0: 207 | version "0.4.0" 208 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 209 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 210 | 211 | atomic-sleep@^1.0.0: 212 | version "1.0.0" 213 | resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" 214 | integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== 215 | 216 | axe-core@4.2.3: 217 | version "4.2.3" 218 | resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.2.3.tgz#2a3afc332f0031b42f602f4a3de03c211ca98f72" 219 | integrity sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ== 220 | 221 | axios@0.24.0: 222 | version "0.24.0" 223 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" 224 | integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== 225 | dependencies: 226 | follow-redirects "^1.14.4" 227 | 228 | balanced-match@^1.0.0: 229 | version "1.0.2" 230 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 231 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 232 | 233 | base64-js@^1.3.1: 234 | version "1.5.1" 235 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 236 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 237 | 238 | bl@^4.0.3: 239 | version "4.1.0" 240 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 241 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 242 | dependencies: 243 | buffer "^5.5.0" 244 | inherits "^2.0.4" 245 | readable-stream "^3.4.0" 246 | 247 | bluebird@3.7.2: 248 | version "3.7.2" 249 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 250 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 251 | 252 | boxen@^4.2.0: 253 | version "4.2.0" 254 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" 255 | integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== 256 | dependencies: 257 | ansi-align "^3.0.0" 258 | camelcase "^5.3.1" 259 | chalk "^3.0.0" 260 | cli-boxes "^2.2.0" 261 | string-width "^4.1.0" 262 | term-size "^2.1.0" 263 | type-fest "^0.8.1" 264 | widest-line "^3.1.0" 265 | 266 | brace-expansion@^1.1.7: 267 | version "1.1.11" 268 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 269 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 270 | dependencies: 271 | balanced-match "^1.0.0" 272 | concat-map "0.0.1" 273 | 274 | braces@^3.0.1: 275 | version "3.0.2" 276 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 277 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 278 | dependencies: 279 | fill-range "^7.0.1" 280 | 281 | buffer-crc32@~0.2.3: 282 | version "0.2.13" 283 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 284 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 285 | 286 | buffer@^5.2.1, buffer@^5.5.0: 287 | version "5.7.1" 288 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 289 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 290 | dependencies: 291 | base64-js "^1.3.1" 292 | ieee754 "^1.1.13" 293 | 294 | cacheable-request@^6.0.0: 295 | version "6.1.0" 296 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 297 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 298 | dependencies: 299 | clone-response "^1.0.2" 300 | get-stream "^5.1.0" 301 | http-cache-semantics "^4.0.0" 302 | keyv "^3.0.0" 303 | lowercase-keys "^2.0.0" 304 | normalize-url "^4.1.0" 305 | responselike "^1.0.2" 306 | 307 | camelcase-keys@^2.0.0: 308 | version "2.1.0" 309 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 310 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 311 | dependencies: 312 | camelcase "^2.0.0" 313 | map-obj "^1.0.0" 314 | 315 | camelcase@5.0.0: 316 | version "5.0.0" 317 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" 318 | integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== 319 | 320 | camelcase@^2.0.0: 321 | version "2.1.1" 322 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 323 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 324 | 325 | camelcase@^5.3.1: 326 | version "5.3.1" 327 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 328 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 329 | 330 | chalk@2.4.2, chalk@^2.4.2: 331 | version "2.4.2" 332 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 333 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 334 | dependencies: 335 | ansi-styles "^3.2.1" 336 | escape-string-regexp "^1.0.5" 337 | supports-color "^5.3.0" 338 | 339 | chalk@4.1.2: 340 | version "4.1.2" 341 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 342 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 343 | dependencies: 344 | ansi-styles "^4.1.0" 345 | supports-color "^7.1.0" 346 | 347 | chalk@^3.0.0: 348 | version "3.0.0" 349 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 350 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 351 | dependencies: 352 | ansi-styles "^4.1.0" 353 | supports-color "^7.1.0" 354 | 355 | charenc@0.0.2: 356 | version "0.0.2" 357 | resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" 358 | integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= 359 | 360 | chownr@^1.1.1: 361 | version "1.1.4" 362 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 363 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 364 | 365 | chrome-launcher@0.15.0, chrome-launcher@^0.15.0: 366 | version "0.15.0" 367 | resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.0.tgz#5144a57aba0cf2f4cbe61dccefdde024fb3ca7fc" 368 | integrity sha512-ZQqX5kb9H0+jy1OqLnWampfocrtSZaGl7Ny3F9GRha85o4odbL8x55paUzh51UC7cEmZ5obp3H2Mm70uC2PpRA== 369 | dependencies: 370 | "@types/node" "*" 371 | escape-string-regexp "^4.0.0" 372 | is-wsl "^2.2.0" 373 | lighthouse-logger "^1.0.0" 374 | 375 | ci-info@^2.0.0: 376 | version "2.0.0" 377 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 378 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 379 | 380 | clean-stack@^2.0.0: 381 | version "2.2.0" 382 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 383 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 384 | 385 | cli-boxes@^2.2.0: 386 | version "2.2.1" 387 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 388 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 389 | 390 | cli-spinner@0.2.10: 391 | version "0.2.10" 392 | resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47" 393 | integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q== 394 | 395 | cliui@^7.0.2: 396 | version "7.0.4" 397 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 398 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 399 | dependencies: 400 | string-width "^4.2.0" 401 | strip-ansi "^6.0.0" 402 | wrap-ansi "^7.0.0" 403 | 404 | clone-response@^1.0.2: 405 | version "1.0.2" 406 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 407 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 408 | dependencies: 409 | mimic-response "^1.0.0" 410 | 411 | color-convert@^1.9.0: 412 | version "1.9.3" 413 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 414 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 415 | dependencies: 416 | color-name "1.1.3" 417 | 418 | color-convert@^2.0.1: 419 | version "2.0.1" 420 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 421 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 422 | dependencies: 423 | color-name "~1.1.4" 424 | 425 | color-name@1.1.3: 426 | version "1.1.3" 427 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 428 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 429 | 430 | color-name@~1.1.4: 431 | version "1.1.4" 432 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 433 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 434 | 435 | colorette@^2.0.7: 436 | version "2.0.16" 437 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" 438 | integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== 439 | 440 | combined-stream@^1.0.8: 441 | version "1.0.8" 442 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 443 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 444 | dependencies: 445 | delayed-stream "~1.0.0" 446 | 447 | concat-map@0.0.1: 448 | version "0.0.1" 449 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 450 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 451 | 452 | config@3.3.6: 453 | version "3.3.6" 454 | resolved "https://registry.yarnpkg.com/config/-/config-3.3.6.tgz#b87799db7399cc34988f55379b5f43465b1b065c" 455 | integrity sha512-Hj5916C5HFawjYJat1epbyY2PlAgLpBtDUlr0MxGLgo3p5+7kylyvnRY18PqJHgnNWXcdd0eWDemT7eYWuFgwg== 456 | dependencies: 457 | json5 "^2.1.1" 458 | 459 | configstore@^5.0.1: 460 | version "5.0.1" 461 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 462 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 463 | dependencies: 464 | dot-prop "^5.2.0" 465 | graceful-fs "^4.1.2" 466 | make-dir "^3.0.0" 467 | unique-string "^2.0.0" 468 | write-file-atomic "^3.0.0" 469 | xdg-basedir "^4.0.0" 470 | 471 | cookie@0.3.1: 472 | version "0.3.1" 473 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 474 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 475 | 476 | cross-spawn@7.0.3: 477 | version "7.0.3" 478 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 479 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 480 | dependencies: 481 | path-key "^3.1.0" 482 | shebang-command "^2.0.0" 483 | which "^2.0.1" 484 | 485 | crypt@0.0.2: 486 | version "0.0.2" 487 | resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" 488 | integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= 489 | 490 | crypto-random-string@^2.0.0: 491 | version "2.0.0" 492 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 493 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 494 | 495 | csp_evaluator@1.1.0: 496 | version "1.1.0" 497 | resolved "https://registry.yarnpkg.com/csp_evaluator/-/csp_evaluator-1.1.0.tgz#7fb3378a08163de4caf0a5297e92a5f70ef42d21" 498 | integrity sha512-TcB+ZH9wZBG314jAUpKHPl1oYbRJV+nAT2YwZ9y4fmUN0FkEJa8e/hKZoOgzLYp1Z/CJdFhbhhGIGh0XG8W54Q== 499 | 500 | cssom@0.3.x: 501 | version "0.3.8" 502 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" 503 | integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== 504 | 505 | cssstyle@1.2.1: 506 | version "1.2.1" 507 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495" 508 | integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A== 509 | dependencies: 510 | cssom "0.3.x" 511 | 512 | csv-generate@^4.0.3: 513 | version "4.0.3" 514 | resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.0.3.tgz#bb95133c918dfcd4a104ce98326c0e4bea4d5aff" 515 | integrity sha512-BLkPf0MkFfPGNNkqjnT16aNMMHUrbbguDE0pMPDcqrBeMoPOKw04dPl1VNQd6+j/JjmrXjQfFKgz6p3FT+bJFA== 516 | 517 | csv-parse@5.0.3, csv-parse@^5.0.3: 518 | version "5.0.3" 519 | resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.3.tgz#eeb0b1ac8bf2970f703176c8f54d313325b6d2e8" 520 | integrity sha512-86R0WU4aEEF/1fPZKxP3NmDAYC4Ce1t9iFgKPZogG5Lvk4m9WZQkCEsDANktG29jppejwclTtEOzubN2ieCJqw== 521 | 522 | csv-stringify@6.0.4, csv-stringify@^6.0.4: 523 | version "6.0.4" 524 | resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.0.4.tgz#8c1656fef2aa05c2ccf7401240d177944a08479e" 525 | integrity sha512-Z3EbRQWwkOV3Qc2fQnJmfjrxRgAwH9AncnNK2jmtTvBvFjj/hESZUGm42YvTh9kMw2OOGPHQn5Yt0EbqoRtUVQ== 526 | 527 | csv@6.0.4: 528 | version "6.0.4" 529 | resolved "https://registry.yarnpkg.com/csv/-/csv-6.0.4.tgz#67d77111f3595d7dc9c8fd4e36819d2f7b4f608e" 530 | integrity sha512-v/7cLK2clZ0QpAc+/1Bl+IF3U7Cxn0oszck+tJmnM2dC7yYPUz5A/i3r2ARkaVpd3RcAzOgTh94ISGzyfF/7XQ== 531 | dependencies: 532 | csv-generate "^4.0.3" 533 | csv-parse "^5.0.3" 534 | csv-stringify "^6.0.4" 535 | stream-transform "^3.0.3" 536 | 537 | currently-unhandled@^0.4.1: 538 | version "0.4.1" 539 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 540 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 541 | dependencies: 542 | array-find-index "^1.0.1" 543 | 544 | dateformat@^4.6.3: 545 | version "4.6.3" 546 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" 547 | integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== 548 | 549 | debug@4, debug@^4.1.1: 550 | version "4.3.3" 551 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 552 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 553 | dependencies: 554 | ms "2.1.2" 555 | 556 | debug@4.3.2: 557 | version "4.3.2" 558 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 559 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 560 | dependencies: 561 | ms "2.1.2" 562 | 563 | debug@^2.6.9: 564 | version "2.6.9" 565 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 566 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 567 | dependencies: 568 | ms "2.0.0" 569 | 570 | decamelize@^1.1.2: 571 | version "1.2.0" 572 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 573 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 574 | 575 | decode-tiff@^0.2.0: 576 | version "0.2.1" 577 | resolved "https://registry.yarnpkg.com/decode-tiff/-/decode-tiff-0.2.1.tgz#c18ca071b8decf5d49b0c732ead4f6bb061142cb" 578 | integrity sha512-v/7hQBv/DrOVQ+Eljg0BLMRbXZYuuw3YZ8duZuFxYpo6qUkdn7oFRkN95RZKbnh08EHNjrMXMbEUNhTLuhPvvA== 579 | 580 | decompress-response@^3.3.0: 581 | version "3.3.0" 582 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 583 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 584 | dependencies: 585 | mimic-response "^1.0.0" 586 | 587 | deep-extend@^0.6.0: 588 | version "0.6.0" 589 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 590 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 591 | 592 | defer-to-connect@^1.0.1: 593 | version "1.1.3" 594 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 595 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 596 | 597 | del@6.0.0: 598 | version "6.0.0" 599 | resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" 600 | integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== 601 | dependencies: 602 | globby "^11.0.1" 603 | graceful-fs "^4.2.4" 604 | is-glob "^4.0.1" 605 | is-path-cwd "^2.2.0" 606 | is-path-inside "^3.0.2" 607 | p-map "^4.0.0" 608 | rimraf "^3.0.2" 609 | slash "^3.0.0" 610 | 611 | delayed-stream@~1.0.0: 612 | version "1.0.0" 613 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 614 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 615 | 616 | devtools-protocol@0.0.901419: 617 | version "0.0.901419" 618 | resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.901419.tgz#79b5459c48fe7e1c5563c02bd72f8fec3e0cebcd" 619 | integrity sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ== 620 | 621 | dir-glob@^3.0.1: 622 | version "3.0.1" 623 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 624 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 625 | dependencies: 626 | path-type "^4.0.0" 627 | 628 | dot-prop@^5.2.0: 629 | version "5.3.0" 630 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 631 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 632 | dependencies: 633 | is-obj "^2.0.0" 634 | 635 | duplexer3@^0.1.4: 636 | version "0.1.4" 637 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 638 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 639 | 640 | duplexify@^4.1.2: 641 | version "4.1.2" 642 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" 643 | integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== 644 | dependencies: 645 | end-of-stream "^1.4.1" 646 | inherits "^2.0.3" 647 | readable-stream "^3.1.1" 648 | stream-shift "^1.0.0" 649 | 650 | ejs@3.1.6: 651 | version "3.1.6" 652 | resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" 653 | integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== 654 | dependencies: 655 | jake "^10.6.1" 656 | 657 | emoji-regex@^8.0.0: 658 | version "8.0.0" 659 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 660 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 661 | 662 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 663 | version "1.4.4" 664 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 665 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 666 | dependencies: 667 | once "^1.4.0" 668 | 669 | enquirer@^2.3.6: 670 | version "2.3.6" 671 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 672 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 673 | dependencies: 674 | ansi-colors "^4.1.1" 675 | 676 | error-ex@^1.2.0: 677 | version "1.3.2" 678 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 679 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 680 | dependencies: 681 | is-arrayish "^0.2.1" 682 | 683 | escalade@^3.1.1: 684 | version "3.1.1" 685 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 686 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 687 | 688 | escape-goat@^2.0.0: 689 | version "2.1.1" 690 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 691 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 692 | 693 | escape-string-regexp@^1.0.5: 694 | version "1.0.5" 695 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 696 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 697 | 698 | escape-string-regexp@^4.0.0: 699 | version "4.0.0" 700 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 701 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 702 | 703 | extract-zip@2.0.1: 704 | version "2.0.1" 705 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" 706 | integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== 707 | dependencies: 708 | debug "^4.1.1" 709 | get-stream "^5.1.0" 710 | yauzl "^2.10.0" 711 | optionalDependencies: 712 | "@types/yauzl" "^2.9.1" 713 | 714 | fast-glob@^3.1.1: 715 | version "3.2.7" 716 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" 717 | integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== 718 | dependencies: 719 | "@nodelib/fs.stat" "^2.0.2" 720 | "@nodelib/fs.walk" "^1.2.3" 721 | glob-parent "^5.1.2" 722 | merge2 "^1.3.0" 723 | micromatch "^4.0.4" 724 | 725 | fast-redact@^3.0.0: 726 | version "3.0.2" 727 | resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.2.tgz#c940ba7162dde3aeeefc522926ae8c5231412904" 728 | integrity sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg== 729 | 730 | fast-safe-stringify@^2.0.7: 731 | version "2.1.1" 732 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" 733 | integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== 734 | 735 | fastify-warning@^0.2.0: 736 | version "0.2.0" 737 | resolved "https://registry.yarnpkg.com/fastify-warning/-/fastify-warning-0.2.0.tgz#e717776026a4493dc9a2befa44db6d17f618008f" 738 | integrity sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== 739 | 740 | fastq@^1.6.0: 741 | version "1.13.0" 742 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 743 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 744 | dependencies: 745 | reusify "^1.0.4" 746 | 747 | fd-slicer@~1.1.0: 748 | version "1.1.0" 749 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 750 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 751 | dependencies: 752 | pend "~1.2.0" 753 | 754 | filelist@^1.0.1: 755 | version "1.0.2" 756 | resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" 757 | integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== 758 | dependencies: 759 | minimatch "^3.0.4" 760 | 761 | fill-range@^7.0.1: 762 | version "7.0.1" 763 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 764 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 765 | dependencies: 766 | to-regex-range "^5.0.1" 767 | 768 | find-up@^1.0.0: 769 | version "1.1.2" 770 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 771 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 772 | dependencies: 773 | path-exists "^2.0.0" 774 | pinkie-promise "^2.0.0" 775 | 776 | find-up@^4.0.0: 777 | version "4.1.0" 778 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 779 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 780 | dependencies: 781 | locate-path "^5.0.0" 782 | path-exists "^4.0.0" 783 | 784 | follow-redirects@^1.14.4: 785 | version "1.14.5" 786 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" 787 | integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== 788 | 789 | form-data@^3.0.0: 790 | version "3.0.1" 791 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" 792 | integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== 793 | dependencies: 794 | asynckit "^0.4.0" 795 | combined-stream "^1.0.8" 796 | mime-types "^2.1.12" 797 | 798 | fs-constants@^1.0.0: 799 | version "1.0.0" 800 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 801 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 802 | 803 | fs-extra@10.0.0: 804 | version "10.0.0" 805 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" 806 | integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== 807 | dependencies: 808 | graceful-fs "^4.2.0" 809 | jsonfile "^6.0.1" 810 | universalify "^2.0.0" 811 | 812 | fs.realpath@^1.0.0: 813 | version "1.0.0" 814 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 815 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 816 | 817 | function-bind@^1.1.1: 818 | version "1.1.1" 819 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 820 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 821 | 822 | get-caller-file@^2.0.5: 823 | version "2.0.5" 824 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 825 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 826 | 827 | get-stdin@^4.0.1: 828 | version "4.0.1" 829 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 830 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 831 | 832 | get-stream@^4.1.0: 833 | version "4.1.0" 834 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 835 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 836 | dependencies: 837 | pump "^3.0.0" 838 | 839 | get-stream@^5.1.0: 840 | version "5.2.0" 841 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 842 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 843 | dependencies: 844 | pump "^3.0.0" 845 | 846 | glob-parent@^5.1.2: 847 | version "5.1.2" 848 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 849 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 850 | dependencies: 851 | is-glob "^4.0.1" 852 | 853 | glob@7.2.0, glob@^7.1.3: 854 | version "7.2.0" 855 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 856 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 857 | dependencies: 858 | fs.realpath "^1.0.0" 859 | inflight "^1.0.4" 860 | inherits "2" 861 | minimatch "^3.0.4" 862 | once "^1.3.0" 863 | path-is-absolute "^1.0.0" 864 | 865 | global-dirs@^2.0.1: 866 | version "2.1.0" 867 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" 868 | integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== 869 | dependencies: 870 | ini "1.3.7" 871 | 872 | globby@^11.0.1: 873 | version "11.0.4" 874 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" 875 | integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== 876 | dependencies: 877 | array-union "^2.1.0" 878 | dir-glob "^3.0.1" 879 | fast-glob "^3.1.1" 880 | ignore "^5.1.4" 881 | merge2 "^1.3.0" 882 | slash "^3.0.0" 883 | 884 | got@^9.6.0: 885 | version "9.6.0" 886 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 887 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 888 | dependencies: 889 | "@sindresorhus/is" "^0.14.0" 890 | "@szmarczak/http-timer" "^1.1.2" 891 | cacheable-request "^6.0.0" 892 | decompress-response "^3.3.0" 893 | duplexer3 "^0.1.4" 894 | get-stream "^4.1.0" 895 | lowercase-keys "^1.0.1" 896 | mimic-response "^1.0.1" 897 | p-cancelable "^1.0.0" 898 | to-readable-stream "^1.0.0" 899 | url-parse-lax "^3.0.0" 900 | 901 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: 902 | version "4.2.8" 903 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" 904 | integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== 905 | 906 | has-flag@^3.0.0: 907 | version "3.0.0" 908 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 909 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 910 | 911 | has-flag@^4.0.0: 912 | version "4.0.0" 913 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 914 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 915 | 916 | has-yarn@^2.1.0: 917 | version "2.1.0" 918 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 919 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 920 | 921 | has@^1.0.3: 922 | version "1.0.3" 923 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 924 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 925 | dependencies: 926 | function-bind "^1.1.1" 927 | 928 | hosted-git-info@^2.1.4: 929 | version "2.8.9" 930 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 931 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 932 | 933 | http-cache-semantics@^4.0.0: 934 | version "4.1.0" 935 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 936 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 937 | 938 | http-link-header@^0.8.0: 939 | version "0.8.0" 940 | resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-0.8.0.tgz#a22b41a0c9b1e2d8fac1bf1b697c6bd532d5f5e4" 941 | integrity sha1-oitBoMmx4tj6wb8baXxr1TLV9eQ= 942 | 943 | https-proxy-agent@5.0.0: 944 | version "5.0.0" 945 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 946 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 947 | dependencies: 948 | agent-base "6" 949 | debug "4" 950 | 951 | ieee754@^1.1.13: 952 | version "1.2.1" 953 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 954 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 955 | 956 | ignore@^5.1.4: 957 | version "5.1.9" 958 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" 959 | integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== 960 | 961 | image-ssim@^0.2.0: 962 | version "0.2.0" 963 | resolved "https://registry.yarnpkg.com/image-ssim/-/image-ssim-0.2.0.tgz#83b42c7a2e6e4b85505477fe6917f5dbc56420e5" 964 | integrity sha1-g7Qsei5uS4VQVHf+aRf128VkIOU= 965 | 966 | img-diff-js@0.5.2: 967 | version "0.5.2" 968 | resolved "https://registry.yarnpkg.com/img-diff-js/-/img-diff-js-0.5.2.tgz#3db3c2af92d92cfc39be45ae83372d7ad2d59df2" 969 | integrity sha512-edvMoyVOrEFC/evz/DYBJ0tmvQ0YeQ+qQZdN4r6LIFxDq1vBd/Pt/+pPOlu9h/whBDiAdQrDkNWtnrpyBMpFOw== 970 | dependencies: 971 | "@types/mkdirp" "^1.0.1" 972 | "@types/node" "^14.11.2" 973 | "@types/pixelmatch" "^5.2.2" 974 | "@types/pngjs" "^6.0.0" 975 | decode-tiff "^0.2.0" 976 | jpeg-js "^0.4.2" 977 | mkdirp "^1.0.4" 978 | pixelmatch "^5.2.1" 979 | pngjs "^6.0.0" 980 | 981 | import-lazy@^2.1.0: 982 | version "2.1.0" 983 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 984 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 985 | 986 | imurmurhash@^0.1.4: 987 | version "0.1.4" 988 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 989 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 990 | 991 | indent-string@^2.1.0: 992 | version "2.1.0" 993 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 994 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 995 | dependencies: 996 | repeating "^2.0.0" 997 | 998 | indent-string@^4.0.0: 999 | version "4.0.0" 1000 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 1001 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 1002 | 1003 | inflight@^1.0.4: 1004 | version "1.0.6" 1005 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1006 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1007 | dependencies: 1008 | once "^1.3.0" 1009 | wrappy "1" 1010 | 1011 | inherits@2, inherits@^2.0.3, inherits@^2.0.4: 1012 | version "2.0.4" 1013 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1014 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1015 | 1016 | ini@1.3.7: 1017 | version "1.3.7" 1018 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" 1019 | integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== 1020 | 1021 | ini@~1.3.0: 1022 | version "1.3.8" 1023 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 1024 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1025 | 1026 | intl-messageformat-parser@^1.8.1: 1027 | version "1.8.1" 1028 | resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz#0eb14c5618333be4c95c409457b66c8c33ddcc01" 1029 | integrity sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg== 1030 | 1031 | intl-messageformat@^4.4.0: 1032 | version "4.4.0" 1033 | resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-4.4.0.tgz#aa196a4d04b573f4090bc417f982d81de4f74fad" 1034 | integrity sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w== 1035 | dependencies: 1036 | intl-messageformat-parser "^1.8.1" 1037 | 1038 | is-arrayish@^0.2.1: 1039 | version "0.2.1" 1040 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1041 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1042 | 1043 | is-buffer@~1.1.6: 1044 | version "1.1.6" 1045 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1046 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1047 | 1048 | is-ci@^2.0.0: 1049 | version "2.0.0" 1050 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 1051 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 1052 | dependencies: 1053 | ci-info "^2.0.0" 1054 | 1055 | is-core-module@^2.2.0: 1056 | version "2.8.0" 1057 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" 1058 | integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== 1059 | dependencies: 1060 | has "^1.0.3" 1061 | 1062 | is-docker@^2.0.0: 1063 | version "2.2.1" 1064 | resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" 1065 | integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== 1066 | 1067 | is-extglob@^2.1.1: 1068 | version "2.1.1" 1069 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1070 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1071 | 1072 | is-finite@^1.0.0: 1073 | version "1.1.0" 1074 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" 1075 | integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== 1076 | 1077 | is-fullwidth-code-point@^3.0.0: 1078 | version "3.0.0" 1079 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1080 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1081 | 1082 | is-glob@^4.0.1: 1083 | version "4.0.3" 1084 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1085 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1086 | dependencies: 1087 | is-extglob "^2.1.1" 1088 | 1089 | is-installed-globally@^0.3.1: 1090 | version "0.3.2" 1091 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" 1092 | integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== 1093 | dependencies: 1094 | global-dirs "^2.0.1" 1095 | is-path-inside "^3.0.1" 1096 | 1097 | is-npm@^4.0.0: 1098 | version "4.0.0" 1099 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" 1100 | integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== 1101 | 1102 | is-number@^7.0.0: 1103 | version "7.0.0" 1104 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1105 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1106 | 1107 | is-obj@^2.0.0: 1108 | version "2.0.0" 1109 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 1110 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 1111 | 1112 | is-path-cwd@^2.2.0: 1113 | version "2.2.0" 1114 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" 1115 | integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== 1116 | 1117 | is-path-inside@^3.0.1, is-path-inside@^3.0.2: 1118 | version "3.0.3" 1119 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1120 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1121 | 1122 | is-typedarray@^1.0.0: 1123 | version "1.0.0" 1124 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1125 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1126 | 1127 | is-utf8@^0.2.0: 1128 | version "0.2.1" 1129 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1130 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 1131 | 1132 | is-wsl@^1.1.0: 1133 | version "1.1.0" 1134 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 1135 | integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= 1136 | 1137 | is-wsl@^2.2.0: 1138 | version "2.2.0" 1139 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" 1140 | integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== 1141 | dependencies: 1142 | is-docker "^2.0.0" 1143 | 1144 | is-yarn-global@^0.3.0: 1145 | version "0.3.0" 1146 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 1147 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 1148 | 1149 | isexe@^2.0.0: 1150 | version "2.0.0" 1151 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1152 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1153 | 1154 | jake@^10.6.1: 1155 | version "10.8.2" 1156 | resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" 1157 | integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== 1158 | dependencies: 1159 | async "0.9.x" 1160 | chalk "^2.4.2" 1161 | filelist "^1.0.1" 1162 | minimatch "^3.0.4" 1163 | 1164 | joycon@^3.0.0: 1165 | version "3.1.0" 1166 | resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.0.tgz#33bb2b6b5a6849a1e251bed623bdf610f477d49f" 1167 | integrity sha512-5Y/YJghKF/IzaUXTut0JtbQyHfBShTaIsH7hHhGXEzYO07zWdWZm5hr3Q6miqhrwsRqqm3mgOnUEZdn+1aRxKQ== 1168 | 1169 | jpeg-js@^0.4.0, jpeg-js@^0.4.1, jpeg-js@^0.4.2: 1170 | version "0.4.3" 1171 | resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" 1172 | integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== 1173 | 1174 | js-library-detector@^6.4.0: 1175 | version "6.4.0" 1176 | resolved "https://registry.yarnpkg.com/js-library-detector/-/js-library-detector-6.4.0.tgz#63e165cb84a4a0a7f7bbf1e97d60623921baae14" 1177 | integrity sha512-NB2sYpmgqiTd7PNNhgp6bnEZmjvTUdAbzxABvYXWLpTL/t158T6mPnD8uYNd0FDP73YWyMrTYDvPxqdvCTbv2g== 1178 | 1179 | js-yaml@4.1.0, js-yaml@^4.1.0: 1180 | version "4.1.0" 1181 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1182 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1183 | dependencies: 1184 | argparse "^2.0.1" 1185 | 1186 | json-buffer@3.0.0: 1187 | version "3.0.0" 1188 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 1189 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 1190 | 1191 | json5@^2.1.1: 1192 | version "2.2.0" 1193 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" 1194 | integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== 1195 | dependencies: 1196 | minimist "^1.2.5" 1197 | 1198 | jsonfile@^6.0.1: 1199 | version "6.1.0" 1200 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 1201 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 1202 | dependencies: 1203 | universalify "^2.0.0" 1204 | optionalDependencies: 1205 | graceful-fs "^4.1.6" 1206 | 1207 | keyv@^3.0.0: 1208 | version "3.1.0" 1209 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 1210 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 1211 | dependencies: 1212 | json-buffer "3.0.0" 1213 | 1214 | latest-version@^5.0.0: 1215 | version "5.1.0" 1216 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 1217 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 1218 | dependencies: 1219 | package-json "^6.3.0" 1220 | 1221 | leven@2.1.0: 1222 | version "2.1.0" 1223 | resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 1224 | integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= 1225 | 1226 | lighthouse-logger@^1.0.0, lighthouse-logger@^1.3.0: 1227 | version "1.3.0" 1228 | resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz#ba6303e739307c4eee18f08249524e7dafd510db" 1229 | integrity sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA== 1230 | dependencies: 1231 | debug "^2.6.9" 1232 | marky "^1.2.2" 1233 | 1234 | lighthouse-stack-packs@^1.5.0: 1235 | version "1.6.0" 1236 | resolved "https://registry.yarnpkg.com/lighthouse-stack-packs/-/lighthouse-stack-packs-1.6.0.tgz#f7327352089f65f4ca61135956c77b9d13f6d681" 1237 | integrity sha512-isv4qY9YCiRis5Z3ijy14IUyAbl6AoD+Q8Co1t0GBBuQK2ZUTSK6mLgFd91MVJrhXaF3LXJRcO+JXaUFHedHhA== 1238 | 1239 | lighthouse@9.0.0: 1240 | version "9.0.0" 1241 | resolved "https://registry.yarnpkg.com/lighthouse/-/lighthouse-9.0.0.tgz#e40bd54feb46b9477a15d85bf23af6b864582c23" 1242 | integrity sha512-bUgc0dQFrLx9+Vyc+sJkDp8kJvE+EpmpARypUlOKgBdTu+6fT0ceo+zSZ6CJn/fDb3rTYfByEPiuD+oik/Po+Q== 1243 | dependencies: 1244 | axe-core "4.2.3" 1245 | chrome-launcher "^0.15.0" 1246 | configstore "^5.0.1" 1247 | csp_evaluator "1.1.0" 1248 | cssstyle "1.2.1" 1249 | enquirer "^2.3.6" 1250 | http-link-header "^0.8.0" 1251 | intl-messageformat "^4.4.0" 1252 | jpeg-js "^0.4.1" 1253 | js-library-detector "^6.4.0" 1254 | lighthouse-logger "^1.3.0" 1255 | lighthouse-stack-packs "^1.5.0" 1256 | lodash.clonedeep "^4.5.0" 1257 | lodash.get "^4.4.2" 1258 | lodash.isequal "^4.5.0" 1259 | lodash.set "^4.3.2" 1260 | lookup-closest-locale "6.0.4" 1261 | metaviewport-parser "0.2.0" 1262 | open "^6.4.0" 1263 | parse-cache-control "1.0.1" 1264 | ps-list "^7.2.0" 1265 | raven "^2.2.1" 1266 | robots-parser "^2.0.1" 1267 | semver "^5.3.0" 1268 | speedline-core "^1.4.3" 1269 | third-party-web "^0.12.4" 1270 | update-notifier "^4.1.0" 1271 | ws "^7.0.0" 1272 | yargs "^16.1.1" 1273 | yargs-parser "^20.2.4" 1274 | 1275 | lit-date@1.0.2: 1276 | version "1.0.2" 1277 | resolved "https://registry.yarnpkg.com/lit-date/-/lit-date-1.0.2.tgz#244df944ac516cdc67d0eecdbf0b5c8e8b2bc570" 1278 | integrity sha512-gecDqPxSsdTj6LgeHAqprmKG4CfpDO0vRRsNspZ9u265wbp8Si+MhwlLEpJCSxXKMxmT8t2ZIhZJz6n829PV3Q== 1279 | 1280 | load-json-file@^1.0.0: 1281 | version "1.1.0" 1282 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1283 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1284 | dependencies: 1285 | graceful-fs "^4.1.2" 1286 | parse-json "^2.2.0" 1287 | pify "^2.0.0" 1288 | pinkie-promise "^2.0.0" 1289 | strip-bom "^2.0.0" 1290 | 1291 | locate-path@^5.0.0: 1292 | version "5.0.0" 1293 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1294 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1295 | dependencies: 1296 | p-locate "^4.1.0" 1297 | 1298 | lodash.clonedeep@^4.5.0: 1299 | version "4.5.0" 1300 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 1301 | integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= 1302 | 1303 | lodash.floor@4.0.4: 1304 | version "4.0.4" 1305 | resolved "https://registry.yarnpkg.com/lodash.floor/-/lodash.floor-4.0.4.tgz#11401c54238723fb4d618be752e4d96eb3fcab54" 1306 | integrity sha1-EUAcVCOHI/tNYYvnUuTZbrP8q1Q= 1307 | 1308 | lodash.get@^4.4.2: 1309 | version "4.4.2" 1310 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1311 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 1312 | 1313 | lodash.isequal@^4.5.0: 1314 | version "4.5.0" 1315 | resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" 1316 | integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= 1317 | 1318 | lodash.set@^4.3.2: 1319 | version "4.3.2" 1320 | resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" 1321 | integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= 1322 | 1323 | lodash@4.17.21: 1324 | version "4.17.21" 1325 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1326 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1327 | 1328 | lookup-closest-locale@6.0.4: 1329 | version "6.0.4" 1330 | resolved "https://registry.yarnpkg.com/lookup-closest-locale/-/lookup-closest-locale-6.0.4.tgz#1279fed7546a601647bbc980f64423ee990a8590" 1331 | integrity sha512-bWoFbSGe6f1GvMGzj17LrwMX4FhDXDwZyH04ySVCPbtOJADcSRguZNKewoJ3Ful/MOxD/wRHvFPadk/kYZUbuQ== 1332 | 1333 | loud-rejection@^1.0.0: 1334 | version "1.6.0" 1335 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1336 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 1337 | dependencies: 1338 | currently-unhandled "^0.4.1" 1339 | signal-exit "^3.0.0" 1340 | 1341 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 1342 | version "1.0.1" 1343 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1344 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1345 | 1346 | lowercase-keys@^2.0.0: 1347 | version "2.0.0" 1348 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 1349 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 1350 | 1351 | make-dir@3.1.0, make-dir@^3.0.0: 1352 | version "3.1.0" 1353 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1354 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1355 | dependencies: 1356 | semver "^6.0.0" 1357 | 1358 | map-obj@^1.0.0, map-obj@^1.0.1: 1359 | version "1.0.1" 1360 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1361 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 1362 | 1363 | marky@^1.2.2: 1364 | version "1.2.2" 1365 | resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.2.tgz#4456765b4de307a13d263a69b0c79bf226e68323" 1366 | integrity sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ== 1367 | 1368 | md5-file@4.0.0: 1369 | version "4.0.0" 1370 | resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-4.0.0.tgz#f3f7ba1e2dd1144d5bf1de698d0e5f44a4409584" 1371 | integrity sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg== 1372 | 1373 | md5@^2.2.1: 1374 | version "2.3.0" 1375 | resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" 1376 | integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== 1377 | dependencies: 1378 | charenc "0.0.2" 1379 | crypt "0.0.2" 1380 | is-buffer "~1.1.6" 1381 | 1382 | meow@3.7.0: 1383 | version "3.7.0" 1384 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1385 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 1386 | dependencies: 1387 | camelcase-keys "^2.0.0" 1388 | decamelize "^1.1.2" 1389 | loud-rejection "^1.0.0" 1390 | map-obj "^1.0.1" 1391 | minimist "^1.1.3" 1392 | normalize-package-data "^2.3.4" 1393 | object-assign "^4.0.1" 1394 | read-pkg-up "^1.0.1" 1395 | redent "^1.0.0" 1396 | trim-newlines "^1.0.0" 1397 | 1398 | merge2@^1.3.0: 1399 | version "1.4.1" 1400 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1401 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1402 | 1403 | metaviewport-parser@0.2.0: 1404 | version "0.2.0" 1405 | resolved "https://registry.yarnpkg.com/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz#535c3ce1ccf6223a5025fddc6a1c36505f7e7db1" 1406 | integrity sha1-U1w84cz2IjpQJf3cahw2UF9+fbE= 1407 | 1408 | micromatch@^4.0.4: 1409 | version "4.0.4" 1410 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 1411 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 1412 | dependencies: 1413 | braces "^3.0.1" 1414 | picomatch "^2.2.3" 1415 | 1416 | mime-db@1.51.0: 1417 | version "1.51.0" 1418 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 1419 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 1420 | 1421 | mime-types@^2.1.12: 1422 | version "2.1.34" 1423 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 1424 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 1425 | dependencies: 1426 | mime-db "1.51.0" 1427 | 1428 | mimic-response@^1.0.0, mimic-response@^1.0.1: 1429 | version "1.0.1" 1430 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1431 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1432 | 1433 | minimatch@^3.0.4: 1434 | version "3.0.4" 1435 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1436 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1437 | dependencies: 1438 | brace-expansion "^1.1.7" 1439 | 1440 | minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: 1441 | version "1.2.5" 1442 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1443 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1444 | 1445 | mkdirp-classic@^0.5.2: 1446 | version "0.5.3" 1447 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 1448 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 1449 | 1450 | mkdirp@^1.0.4: 1451 | version "1.0.4" 1452 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1453 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1454 | 1455 | mri@1.1.4: 1456 | version "1.1.4" 1457 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" 1458 | integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== 1459 | 1460 | ms@2.0.0: 1461 | version "2.0.0" 1462 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1463 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1464 | 1465 | ms@2.1.2: 1466 | version "2.1.2" 1467 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1468 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1469 | 1470 | mustache@4.2.0: 1471 | version "4.2.0" 1472 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" 1473 | integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== 1474 | 1475 | node-fetch@2.6.5: 1476 | version "2.6.5" 1477 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" 1478 | integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== 1479 | dependencies: 1480 | whatwg-url "^5.0.0" 1481 | 1482 | node-fetch@2.6.6: 1483 | version "2.6.6" 1484 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" 1485 | integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== 1486 | dependencies: 1487 | whatwg-url "^5.0.0" 1488 | 1489 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1490 | version "2.5.0" 1491 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1492 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1493 | dependencies: 1494 | hosted-git-info "^2.1.4" 1495 | resolve "^1.10.0" 1496 | semver "2 || 3 || 4 || 5" 1497 | validate-npm-package-license "^3.0.1" 1498 | 1499 | normalize-url@^4.1.0: 1500 | version "4.5.1" 1501 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 1502 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 1503 | 1504 | object-assign@^4.0.1: 1505 | version "4.1.1" 1506 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1507 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1508 | 1509 | on-exit-leak-free@^0.2.0: 1510 | version "0.2.0" 1511 | resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" 1512 | integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== 1513 | 1514 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1515 | version "1.4.0" 1516 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1517 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1518 | dependencies: 1519 | wrappy "1" 1520 | 1521 | open@^6.4.0: 1522 | version "6.4.0" 1523 | resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" 1524 | integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== 1525 | dependencies: 1526 | is-wsl "^1.1.0" 1527 | 1528 | option-t@29.1.0: 1529 | version "29.1.0" 1530 | resolved "https://registry.yarnpkg.com/option-t/-/option-t-29.1.0.tgz#74fb74e8c4f7b679a513026920bd7f06cb9b0dcf" 1531 | integrity sha512-McvO8qSy7aRhnMs9tkC1RLXNbForhkoWmaOohotfH8ZhKD0qB7NPpCKkfMoOAxBdokmPSO+SgQ0M/+6TsmiWTA== 1532 | 1533 | p-cancelable@^1.0.0: 1534 | version "1.1.0" 1535 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1536 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1537 | 1538 | p-limit@^2.2.0: 1539 | version "2.3.0" 1540 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1541 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1542 | dependencies: 1543 | p-try "^2.0.0" 1544 | 1545 | p-locate@^4.1.0: 1546 | version "4.1.0" 1547 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1548 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1549 | dependencies: 1550 | p-limit "^2.2.0" 1551 | 1552 | p-map@^4.0.0: 1553 | version "4.0.0" 1554 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" 1555 | integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== 1556 | dependencies: 1557 | aggregate-error "^3.0.0" 1558 | 1559 | p-try@^2.0.0: 1560 | version "2.2.0" 1561 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1562 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1563 | 1564 | package-json@^6.3.0: 1565 | version "6.5.0" 1566 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 1567 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 1568 | dependencies: 1569 | got "^9.6.0" 1570 | registry-auth-token "^4.0.0" 1571 | registry-url "^5.0.0" 1572 | semver "^6.2.0" 1573 | 1574 | parse-cache-control@1.0.1: 1575 | version "1.0.1" 1576 | resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" 1577 | integrity sha1-juqz5U+laSD+Fro493+iGqzC104= 1578 | 1579 | parse-json@^2.2.0: 1580 | version "2.2.0" 1581 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1582 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1583 | dependencies: 1584 | error-ex "^1.2.0" 1585 | 1586 | path-exists@^2.0.0: 1587 | version "2.1.0" 1588 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1589 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 1590 | dependencies: 1591 | pinkie-promise "^2.0.0" 1592 | 1593 | path-exists@^4.0.0: 1594 | version "4.0.0" 1595 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1596 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1597 | 1598 | path-is-absolute@^1.0.0: 1599 | version "1.0.1" 1600 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1601 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1602 | 1603 | path-key@^3.1.0: 1604 | version "3.1.1" 1605 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1606 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1607 | 1608 | path-parse@^1.0.6: 1609 | version "1.0.7" 1610 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1611 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1612 | 1613 | path-type@^1.0.0: 1614 | version "1.1.0" 1615 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1616 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 1617 | dependencies: 1618 | graceful-fs "^4.1.2" 1619 | pify "^2.0.0" 1620 | pinkie-promise "^2.0.0" 1621 | 1622 | path-type@^4.0.0: 1623 | version "4.0.0" 1624 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1625 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1626 | 1627 | pend@~1.2.0: 1628 | version "1.2.0" 1629 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 1630 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 1631 | 1632 | picomatch@^2.2.3: 1633 | version "2.3.0" 1634 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1635 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1636 | 1637 | pify@^2.0.0: 1638 | version "2.3.0" 1639 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1640 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1641 | 1642 | pinkie-promise@^2.0.0: 1643 | version "2.0.1" 1644 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1645 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1646 | dependencies: 1647 | pinkie "^2.0.0" 1648 | 1649 | pinkie@^2.0.0: 1650 | version "2.0.4" 1651 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1652 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1653 | 1654 | pino-abstract-transport@^0.5.0, pino-abstract-transport@v0.5.0: 1655 | version "0.5.0" 1656 | resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" 1657 | integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== 1658 | dependencies: 1659 | duplexify "^4.1.2" 1660 | split2 "^4.0.0" 1661 | 1662 | pino-pretty@7.2.0: 1663 | version "7.2.0" 1664 | resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-7.2.0.tgz#6cd1500fa47a6e9011e87bb65e129cd4555265f1" 1665 | integrity sha512-pkZhaF1JiyQt4BRqkLANYWuZTxavmuXh3OHsb8goeQasTFgNdzOECXkZWyPYrA0YMRa8zKoVsCzeYz9lI2NYwA== 1666 | dependencies: 1667 | args "^5.0.1" 1668 | colorette "^2.0.7" 1669 | dateformat "^4.6.3" 1670 | fast-safe-stringify "^2.0.7" 1671 | joycon "^3.0.0" 1672 | pino-abstract-transport "^0.5.0" 1673 | pump "^3.0.0" 1674 | readable-stream "^3.6.0" 1675 | rfdc "^1.3.0" 1676 | secure-json-parse "^2.4.0" 1677 | sonic-boom "^2.2.0" 1678 | strip-json-comments "^3.1.1" 1679 | 1680 | pino-std-serializers@^4.0.0: 1681 | version "4.0.0" 1682 | resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" 1683 | integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== 1684 | 1685 | pino@7.3.0: 1686 | version "7.3.0" 1687 | resolved "https://registry.yarnpkg.com/pino/-/pino-7.3.0.tgz#42950857bdc4e963c8b2c60cdae6b0f2d5131acf" 1688 | integrity sha512-RHnBlpOc6qxGvwH5PO5THuQLOaq/CT7xWsdmMkd4tG3u6Z0Mp+DENz9eoLh85dBGzwXYoaSTjOYQ0S4aTn5THg== 1689 | dependencies: 1690 | fast-redact "^3.0.0" 1691 | fastify-warning "^0.2.0" 1692 | get-caller-file "^2.0.5" 1693 | on-exit-leak-free "^0.2.0" 1694 | pino-abstract-transport v0.5.0 1695 | pino-std-serializers "^4.0.0" 1696 | quick-format-unescaped "^4.0.3" 1697 | real-require "^0.1.0" 1698 | safe-stable-stringify "^2.1.0" 1699 | sonic-boom "^2.2.1" 1700 | thread-stream "^0.13.0" 1701 | 1702 | pixelmatch@^5.2.1: 1703 | version "5.2.1" 1704 | resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.2.1.tgz#9e4e4f4aa59648208a31310306a5bed5522b0d65" 1705 | integrity sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ== 1706 | dependencies: 1707 | pngjs "^4.0.1" 1708 | 1709 | pkg-dir@4.2.0: 1710 | version "4.2.0" 1711 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1712 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1713 | dependencies: 1714 | find-up "^4.0.0" 1715 | 1716 | pngjs@^4.0.1: 1717 | version "4.0.1" 1718 | resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe" 1719 | integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg== 1720 | 1721 | pngjs@^6.0.0: 1722 | version "6.0.0" 1723 | resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" 1724 | integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== 1725 | 1726 | prepend-http@^2.0.0: 1727 | version "2.0.0" 1728 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1729 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1730 | 1731 | progress@2.0.3: 1732 | version "2.0.3" 1733 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1734 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1735 | 1736 | proxy-from-env@1.1.0: 1737 | version "1.1.0" 1738 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1739 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1740 | 1741 | ps-list@^7.2.0: 1742 | version "7.2.0" 1743 | resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-7.2.0.tgz#3d110e1de8249a4b178c9b1cf2a215d1e4e42fc0" 1744 | integrity sha512-v4Bl6I3f2kJfr5o80ShABNHAokIgY+wFDTQfE+X3zWYgSGQOCBeYptLZUpoOALBqO5EawmDN/tjTldJesd0ujQ== 1745 | 1746 | pump@^3.0.0: 1747 | version "3.0.0" 1748 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1749 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1750 | dependencies: 1751 | end-of-stream "^1.1.0" 1752 | once "^1.3.1" 1753 | 1754 | pupa@^2.0.1: 1755 | version "2.1.1" 1756 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 1757 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 1758 | dependencies: 1759 | escape-goat "^2.0.0" 1760 | 1761 | puppeteer-core@11.0.0: 1762 | version "11.0.0" 1763 | resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-11.0.0.tgz#d7aa19634948671fa35d14027fa45be807c340cb" 1764 | integrity sha512-hfQ39KNP0qKplQ86iaCNXHH9zpWlV01UFdggt2qffgWeCBF9KMavwP/k/iK/JidPPWfOnKZhDLSHZVSUr73DtA== 1765 | dependencies: 1766 | debug "4.3.2" 1767 | devtools-protocol "0.0.901419" 1768 | extract-zip "2.0.1" 1769 | https-proxy-agent "5.0.0" 1770 | node-fetch "2.6.5" 1771 | pkg-dir "4.2.0" 1772 | progress "2.0.3" 1773 | proxy-from-env "1.1.0" 1774 | rimraf "3.0.2" 1775 | tar-fs "2.1.1" 1776 | unbzip2-stream "1.4.3" 1777 | ws "8.2.3" 1778 | 1779 | queue-microtask@^1.2.2: 1780 | version "1.2.3" 1781 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1782 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1783 | 1784 | quick-format-unescaped@^4.0.3: 1785 | version "4.0.4" 1786 | resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" 1787 | integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== 1788 | 1789 | raven@^2.2.1: 1790 | version "2.6.4" 1791 | resolved "https://registry.yarnpkg.com/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" 1792 | integrity sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw== 1793 | dependencies: 1794 | cookie "0.3.1" 1795 | md5 "^2.2.1" 1796 | stack-trace "0.0.10" 1797 | timed-out "4.0.1" 1798 | uuid "3.3.2" 1799 | 1800 | rc@^1.2.8: 1801 | version "1.2.8" 1802 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1803 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1804 | dependencies: 1805 | deep-extend "^0.6.0" 1806 | ini "~1.3.0" 1807 | minimist "^1.2.0" 1808 | strip-json-comments "~2.0.1" 1809 | 1810 | read-pkg-up@^1.0.1: 1811 | version "1.0.1" 1812 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1813 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 1814 | dependencies: 1815 | find-up "^1.0.0" 1816 | read-pkg "^1.0.0" 1817 | 1818 | read-pkg@^1.0.0: 1819 | version "1.1.0" 1820 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1821 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 1822 | dependencies: 1823 | load-json-file "^1.0.0" 1824 | normalize-package-data "^2.3.2" 1825 | path-type "^1.0.0" 1826 | 1827 | readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: 1828 | version "3.6.0" 1829 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1830 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1831 | dependencies: 1832 | inherits "^2.0.3" 1833 | string_decoder "^1.1.1" 1834 | util-deprecate "^1.0.1" 1835 | 1836 | real-require@^0.1.0: 1837 | version "0.1.0" 1838 | resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" 1839 | integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== 1840 | 1841 | redent@^1.0.0: 1842 | version "1.0.0" 1843 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1844 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 1845 | dependencies: 1846 | indent-string "^2.1.0" 1847 | strip-indent "^1.0.1" 1848 | 1849 | reg-cli@0.17.4: 1850 | version "0.17.4" 1851 | resolved "https://registry.yarnpkg.com/reg-cli/-/reg-cli-0.17.4.tgz#dc11ac83d15d7ad33f9c6f6f8a979a4b39ed0a8d" 1852 | integrity sha512-3pwi7zNXBlWn89Ja6uPCEthQ37DvvV6HkZ31Wkyz6P4XAgmC7QEQIu1naT5d9xvBfkRfZlP37fufOj4fz+7DYw== 1853 | dependencies: 1854 | bluebird "3.7.2" 1855 | chalk "4.1.2" 1856 | cli-spinner "0.2.10" 1857 | cross-spawn "7.0.3" 1858 | del "6.0.0" 1859 | glob "7.2.0" 1860 | img-diff-js "0.5.2" 1861 | jpeg-js "^0.4.0" 1862 | lodash "4.17.21" 1863 | make-dir "3.1.0" 1864 | md5-file "4.0.0" 1865 | meow "3.7.0" 1866 | mustache "4.2.0" 1867 | x-img-diff-js "0.3.5" 1868 | yargs-parser "^20.2.9" 1869 | 1870 | registry-auth-token@^4.0.0: 1871 | version "4.2.1" 1872 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" 1873 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 1874 | dependencies: 1875 | rc "^1.2.8" 1876 | 1877 | registry-url@^5.0.0: 1878 | version "5.1.0" 1879 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1880 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1881 | dependencies: 1882 | rc "^1.2.8" 1883 | 1884 | repeating@^2.0.0: 1885 | version "2.0.1" 1886 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1887 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 1888 | dependencies: 1889 | is-finite "^1.0.0" 1890 | 1891 | require-directory@^2.1.1: 1892 | version "2.1.1" 1893 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1894 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1895 | 1896 | resolve@^1.10.0: 1897 | version "1.20.0" 1898 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 1899 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1900 | dependencies: 1901 | is-core-module "^2.2.0" 1902 | path-parse "^1.0.6" 1903 | 1904 | responselike@^1.0.2: 1905 | version "1.0.2" 1906 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1907 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1908 | dependencies: 1909 | lowercase-keys "^1.0.0" 1910 | 1911 | reusify@^1.0.4: 1912 | version "1.0.4" 1913 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1914 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1915 | 1916 | rfdc@^1.3.0: 1917 | version "1.3.0" 1918 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" 1919 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== 1920 | 1921 | rimraf@3.0.2, rimraf@^3.0.2: 1922 | version "3.0.2" 1923 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1924 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1925 | dependencies: 1926 | glob "^7.1.3" 1927 | 1928 | robots-parser@^2.0.1: 1929 | version "2.3.0" 1930 | resolved "https://registry.yarnpkg.com/robots-parser/-/robots-parser-2.3.0.tgz#d79e86e26e13fa0a806adbc37f4cf1b96aebc8c3" 1931 | integrity sha512-RvuCITckrHM9k8DxCCU9rqWpuuKRfVX9iHG751dC3/EdERxp9gJATxYYdYOT3L0T+TAT4+27lENisk/VbHm47A== 1932 | 1933 | run-parallel@^1.1.9: 1934 | version "1.2.0" 1935 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1936 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1937 | dependencies: 1938 | queue-microtask "^1.2.2" 1939 | 1940 | safe-buffer@~5.2.0: 1941 | version "5.2.1" 1942 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1943 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1944 | 1945 | safe-stable-stringify@^2.1.0: 1946 | version "2.3.0" 1947 | resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.0.tgz#d09eb692386d7faa846d78922605c67cc0ab9c1c" 1948 | integrity sha512-VFlmNrvZ44a0QnRY2yfEIUhbMh8BjTFWf2mRG/8mCEAKTfQYV8xxfn6P+00OLej0gznC5C+hfgcEF7AGrN5Stw== 1949 | 1950 | secure-json-parse@^2.4.0: 1951 | version "2.4.0" 1952 | resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.4.0.tgz#5aaeaaef85c7a417f76271a4f5b0cc3315ddca85" 1953 | integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== 1954 | 1955 | semver-diff@^3.1.1: 1956 | version "3.1.1" 1957 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 1958 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1959 | dependencies: 1960 | semver "^6.3.0" 1961 | 1962 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 1963 | version "5.7.1" 1964 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1965 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1966 | 1967 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 1968 | version "6.3.0" 1969 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1970 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1971 | 1972 | shebang-command@^2.0.0: 1973 | version "2.0.0" 1974 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1975 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1976 | dependencies: 1977 | shebang-regex "^3.0.0" 1978 | 1979 | shebang-regex@^3.0.0: 1980 | version "3.0.0" 1981 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1982 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1983 | 1984 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1985 | version "3.0.6" 1986 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 1987 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 1988 | 1989 | slash@^3.0.0: 1990 | version "3.0.0" 1991 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1992 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1993 | 1994 | sonic-boom@^2.2.0, sonic-boom@^2.2.1: 1995 | version "2.4.0" 1996 | resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.4.0.tgz#f896898174023b1212b201a7d815a3aea6975055" 1997 | integrity sha512-2jSXeHjrovvsrnQ0tvG6eUjDdtMBxtYDAHr18mGDM/Pno/Wdw+pQ1AXUWKCZgriZ9MvCVdUEXXOUfVEwPcrieg== 1998 | dependencies: 1999 | atomic-sleep "^1.0.0" 2000 | 2001 | spdx-correct@^3.0.0: 2002 | version "3.1.1" 2003 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 2004 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 2005 | dependencies: 2006 | spdx-expression-parse "^3.0.0" 2007 | spdx-license-ids "^3.0.0" 2008 | 2009 | spdx-exceptions@^2.1.0: 2010 | version "2.3.0" 2011 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 2012 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 2013 | 2014 | spdx-expression-parse@^3.0.0: 2015 | version "3.0.1" 2016 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 2017 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 2018 | dependencies: 2019 | spdx-exceptions "^2.1.0" 2020 | spdx-license-ids "^3.0.0" 2021 | 2022 | spdx-license-ids@^3.0.0: 2023 | version "3.0.11" 2024 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" 2025 | integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== 2026 | 2027 | speedline-core@^1.4.3: 2028 | version "1.4.3" 2029 | resolved "https://registry.yarnpkg.com/speedline-core/-/speedline-core-1.4.3.tgz#4d6e7276e2063c2d36a375cb25a523ac73475319" 2030 | integrity sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog== 2031 | dependencies: 2032 | "@types/node" "*" 2033 | image-ssim "^0.2.0" 2034 | jpeg-js "^0.4.1" 2035 | 2036 | split2@^4.0.0: 2037 | version "4.1.0" 2038 | resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" 2039 | integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== 2040 | 2041 | stack-trace@0.0.10: 2042 | version "0.0.10" 2043 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 2044 | integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= 2045 | 2046 | stream-shift@^1.0.0: 2047 | version "1.0.1" 2048 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" 2049 | integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== 2050 | 2051 | stream-transform@^3.0.3: 2052 | version "3.0.3" 2053 | resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.0.3.tgz#db9a3b47aef30fba8723d8c71e6ee3af7d2512ae" 2054 | integrity sha512-LU+lJFT1/slgy9Yvgdr21D6PAxm1O7KoEWmXWwiqAHsocbF7woPF0xBXDGuqRycTV3tcrLq0zk+5LhjgCgI3KQ== 2055 | 2056 | string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 2057 | version "4.2.3" 2058 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2059 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2060 | dependencies: 2061 | emoji-regex "^8.0.0" 2062 | is-fullwidth-code-point "^3.0.0" 2063 | strip-ansi "^6.0.1" 2064 | 2065 | string_decoder@^1.1.1: 2066 | version "1.3.0" 2067 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2068 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2069 | dependencies: 2070 | safe-buffer "~5.2.0" 2071 | 2072 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2073 | version "6.0.1" 2074 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2075 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2076 | dependencies: 2077 | ansi-regex "^5.0.1" 2078 | 2079 | strip-bom@^2.0.0: 2080 | version "2.0.0" 2081 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2082 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 2083 | dependencies: 2084 | is-utf8 "^0.2.0" 2085 | 2086 | strip-indent@^1.0.1: 2087 | version "1.0.1" 2088 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 2089 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 2090 | dependencies: 2091 | get-stdin "^4.0.1" 2092 | 2093 | strip-json-comments@^3.1.1: 2094 | version "3.1.1" 2095 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2096 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2097 | 2098 | strip-json-comments@~2.0.1: 2099 | version "2.0.1" 2100 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2101 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2102 | 2103 | supports-color@^5.3.0: 2104 | version "5.5.0" 2105 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2106 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2107 | dependencies: 2108 | has-flag "^3.0.0" 2109 | 2110 | supports-color@^7.1.0: 2111 | version "7.2.0" 2112 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2113 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2114 | dependencies: 2115 | has-flag "^4.0.0" 2116 | 2117 | tar-fs@2.1.1: 2118 | version "2.1.1" 2119 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" 2120 | integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== 2121 | dependencies: 2122 | chownr "^1.1.1" 2123 | mkdirp-classic "^0.5.2" 2124 | pump "^3.0.0" 2125 | tar-stream "^2.1.4" 2126 | 2127 | tar-stream@^2.1.4: 2128 | version "2.2.0" 2129 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" 2130 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 2131 | dependencies: 2132 | bl "^4.0.3" 2133 | end-of-stream "^1.4.1" 2134 | fs-constants "^1.0.0" 2135 | inherits "^2.0.3" 2136 | readable-stream "^3.1.1" 2137 | 2138 | term-size@^2.1.0: 2139 | version "2.2.1" 2140 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" 2141 | integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== 2142 | 2143 | third-party-web@^0.12.4: 2144 | version "0.12.6" 2145 | resolved "https://registry.yarnpkg.com/third-party-web/-/third-party-web-0.12.6.tgz#2745d5dfccd526ee180be833c45578deba7e9e40" 2146 | integrity sha512-g01h+wXG7UsPOPOEGRnz8bvRr7XWYckI0afFaX6JPkAeuHbS1RUKmiZ5Y56em3CNAMu8iz1rxJEpkfjbAuVkMQ== 2147 | 2148 | thread-stream@^0.13.0: 2149 | version "0.13.0" 2150 | resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.13.0.tgz#c68054bdea250c5d8d400caa3233a150d5461cca" 2151 | integrity sha512-kTMZeX4Dzlb1zZ00/01aerGaTw2i8NE4sWF0TvF1uXewRhCiUjCvatQkvxIvFqauWG2ADFS2Wpd3qBeYL9i3dg== 2152 | dependencies: 2153 | real-require "^0.1.0" 2154 | 2155 | through@^2.3.8: 2156 | version "2.3.8" 2157 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2158 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 2159 | 2160 | timed-out@4.0.1: 2161 | version "4.0.1" 2162 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 2163 | integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 2164 | 2165 | to-readable-stream@^1.0.0: 2166 | version "1.0.0" 2167 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 2168 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 2169 | 2170 | to-regex-range@^5.0.1: 2171 | version "5.0.1" 2172 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2173 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2174 | dependencies: 2175 | is-number "^7.0.0" 2176 | 2177 | tr46@~0.0.3: 2178 | version "0.0.3" 2179 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 2180 | integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= 2181 | 2182 | trim-newlines@^1.0.0: 2183 | version "1.0.0" 2184 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 2185 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 2186 | 2187 | type-fest@^0.8.1: 2188 | version "0.8.1" 2189 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 2190 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 2191 | 2192 | typedarray-to-buffer@^3.1.5: 2193 | version "3.1.5" 2194 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 2195 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 2196 | dependencies: 2197 | is-typedarray "^1.0.0" 2198 | 2199 | typescript@4.5.2: 2200 | version "4.5.2" 2201 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" 2202 | integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== 2203 | 2204 | unbzip2-stream@1.4.3: 2205 | version "1.4.3" 2206 | resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" 2207 | integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== 2208 | dependencies: 2209 | buffer "^5.2.1" 2210 | through "^2.3.8" 2211 | 2212 | unique-string@^2.0.0: 2213 | version "2.0.0" 2214 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 2215 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 2216 | dependencies: 2217 | crypto-random-string "^2.0.0" 2218 | 2219 | universalify@^2.0.0: 2220 | version "2.0.0" 2221 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 2222 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 2223 | 2224 | update-notifier@^4.1.0: 2225 | version "4.1.3" 2226 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" 2227 | integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== 2228 | dependencies: 2229 | boxen "^4.2.0" 2230 | chalk "^3.0.0" 2231 | configstore "^5.0.1" 2232 | has-yarn "^2.1.0" 2233 | import-lazy "^2.1.0" 2234 | is-ci "^2.0.0" 2235 | is-installed-globally "^0.3.1" 2236 | is-npm "^4.0.0" 2237 | is-yarn-global "^0.3.0" 2238 | latest-version "^5.0.0" 2239 | pupa "^2.0.1" 2240 | semver-diff "^3.1.1" 2241 | xdg-basedir "^4.0.0" 2242 | 2243 | url-parse-lax@^3.0.0: 2244 | version "3.0.0" 2245 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 2246 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 2247 | dependencies: 2248 | prepend-http "^2.0.0" 2249 | 2250 | util-deprecate@^1.0.1: 2251 | version "1.0.2" 2252 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2253 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2254 | 2255 | uuid@3.3.2: 2256 | version "3.3.2" 2257 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 2258 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 2259 | 2260 | validate-npm-package-license@^3.0.1: 2261 | version "3.0.4" 2262 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2263 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2264 | dependencies: 2265 | spdx-correct "^3.0.0" 2266 | spdx-expression-parse "^3.0.0" 2267 | 2268 | webidl-conversions@^3.0.0: 2269 | version "3.0.1" 2270 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 2271 | integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= 2272 | 2273 | whatwg-url@^5.0.0: 2274 | version "5.0.0" 2275 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 2276 | integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= 2277 | dependencies: 2278 | tr46 "~0.0.3" 2279 | webidl-conversions "^3.0.0" 2280 | 2281 | which@^2.0.1: 2282 | version "2.0.2" 2283 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2284 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2285 | dependencies: 2286 | isexe "^2.0.0" 2287 | 2288 | widest-line@^3.1.0: 2289 | version "3.1.0" 2290 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 2291 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 2292 | dependencies: 2293 | string-width "^4.0.0" 2294 | 2295 | wrap-ansi@^7.0.0: 2296 | version "7.0.0" 2297 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2298 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2299 | dependencies: 2300 | ansi-styles "^4.0.0" 2301 | string-width "^4.1.0" 2302 | strip-ansi "^6.0.0" 2303 | 2304 | wrappy@1: 2305 | version "1.0.2" 2306 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2307 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2308 | 2309 | write-file-atomic@^3.0.0: 2310 | version "3.0.3" 2311 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 2312 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 2313 | dependencies: 2314 | imurmurhash "^0.1.4" 2315 | is-typedarray "^1.0.0" 2316 | signal-exit "^3.0.2" 2317 | typedarray-to-buffer "^3.1.5" 2318 | 2319 | ws@8.2.3: 2320 | version "8.2.3" 2321 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" 2322 | integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== 2323 | 2324 | ws@^7.0.0: 2325 | version "7.5.6" 2326 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" 2327 | integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== 2328 | 2329 | x-img-diff-js@0.3.5: 2330 | version "0.3.5" 2331 | resolved "https://registry.yarnpkg.com/x-img-diff-js/-/x-img-diff-js-0.3.5.tgz#d443d5339d94871038fc08eefa4b68789e2af9e7" 2332 | integrity sha512-B97ztoc2JeM+62HH1zFhmTyilsVqL486WMm8X3oQz16lTCGITY1cz+H57mTsNG0QuyVxv1yGq06qC8wy6UPCmQ== 2333 | 2334 | xdg-basedir@^4.0.0: 2335 | version "4.0.0" 2336 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 2337 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 2338 | 2339 | y18n@^5.0.5: 2340 | version "5.0.8" 2341 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 2342 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 2343 | 2344 | yargs-parser@^20.2.2, yargs-parser@^20.2.4, yargs-parser@^20.2.9: 2345 | version "20.2.9" 2346 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 2347 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 2348 | 2349 | yargs-parser@^21.0.0: 2350 | version "21.0.0" 2351 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" 2352 | integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== 2353 | 2354 | yargs@17.2.1: 2355 | version "17.2.1" 2356 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" 2357 | integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== 2358 | dependencies: 2359 | cliui "^7.0.2" 2360 | escalade "^3.1.1" 2361 | get-caller-file "^2.0.5" 2362 | require-directory "^2.1.1" 2363 | string-width "^4.2.0" 2364 | y18n "^5.0.5" 2365 | yargs-parser "^20.2.2" 2366 | 2367 | yargs@17.3.0: 2368 | version "17.3.0" 2369 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.0.tgz#295c4ffd0eef148ef3e48f7a2e0f58d0e4f26b1c" 2370 | integrity sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew== 2371 | dependencies: 2372 | cliui "^7.0.2" 2373 | escalade "^3.1.1" 2374 | get-caller-file "^2.0.5" 2375 | require-directory "^2.1.1" 2376 | string-width "^4.2.3" 2377 | y18n "^5.0.5" 2378 | yargs-parser "^21.0.0" 2379 | 2380 | yargs@^16.1.1: 2381 | version "16.2.0" 2382 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 2383 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 2384 | dependencies: 2385 | cliui "^7.0.2" 2386 | escalade "^3.1.1" 2387 | get-caller-file "^2.0.5" 2388 | require-directory "^2.1.1" 2389 | string-width "^4.2.0" 2390 | y18n "^5.0.5" 2391 | yargs-parser "^20.2.2" 2392 | 2393 | yauzl@^2.10.0: 2394 | version "2.10.0" 2395 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 2396 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 2397 | dependencies: 2398 | buffer-crc32 "~0.2.3" 2399 | fd-slicer "~1.1.0" 2400 | --------------------------------------------------------------------------------