├── .gitignore ├── README.md ├── framework └── common-actions.ts ├── package-lock.json ├── package.json ├── pages ├── home-page.ts ├── login-page.ts ├── logout-page.ts └── settings-page.ts ├── playwright-logo.png ├── playwright.config.ts └── tests ├── login.spec.ts └── testdata.ts /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | *.swp 10 | 11 | pids 12 | logs 13 | results 14 | tmp 15 | 16 | # Build 17 | public/css/main.css 18 | 19 | # Coverage reports 20 | coverage 21 | 22 | # API keys and secrets 23 | .env 24 | 25 | # Dependency directory 26 | node_modules 27 | bower_components 28 | 29 | # Editors 30 | .idea 31 | *.iml 32 | 33 | # OS metadata 34 | .DS_Store 35 | Thumbs.db 36 | 37 | # Ignore built ts files 38 | dist/**/* 39 | 40 | # ignore yarn.lock 41 | yarn.lock 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Page Object Model Pattern with Playwright 2 | 3 | ![alt text](./playwright-logo.png) 4 | 5 | This repository contains simple automation test framework written with TypeScript and Playwright and implements Page Object Model Pattern. 6 | 7 | If you want to run test locally, please follow these steps: 8 | 9 | 1. Clone this repository 10 | 2. Make sure you have `node.js` installed. If you don't, please visit [official website](https://nodejs.org/en/download/) for instructions 11 | 3. Run `npm install` to install node modules 12 | 4. That's it, now you can run tests with `npm run test` - it will run test in 3 browsers (chromium, firefox, webkit) in parallel. 13 | 14 | If you want to run it in headed mode, then change configuration to `headless: true` in `playwright.config.js` 15 | -------------------------------------------------------------------------------- /framework/common-actions.ts: -------------------------------------------------------------------------------- 1 | import type { Page } from 'playwright'; 2 | 3 | export async function isVisible(page: Page, locator: string): Promise { 4 | await page.waitForSelector(locator); 5 | return await page.isVisible(locator); 6 | } 7 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playwright-page-object", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.14.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 10 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.14.5" 14 | } 15 | }, 16 | "@babel/compat-data": { 17 | "version": "7.14.7", 18 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", 19 | "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", 20 | "dev": true 21 | }, 22 | "@babel/core": { 23 | "version": "7.14.6", 24 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", 25 | "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/code-frame": "^7.14.5", 29 | "@babel/generator": "^7.14.5", 30 | "@babel/helper-compilation-targets": "^7.14.5", 31 | "@babel/helper-module-transforms": "^7.14.5", 32 | "@babel/helpers": "^7.14.6", 33 | "@babel/parser": "^7.14.6", 34 | "@babel/template": "^7.14.5", 35 | "@babel/traverse": "^7.14.5", 36 | "@babel/types": "^7.14.5", 37 | "convert-source-map": "^1.7.0", 38 | "debug": "^4.1.0", 39 | "gensync": "^1.0.0-beta.2", 40 | "json5": "^2.1.2", 41 | "semver": "^6.3.0", 42 | "source-map": "^0.5.0" 43 | } 44 | }, 45 | "@babel/generator": { 46 | "version": "7.14.5", 47 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", 48 | "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", 49 | "dev": true, 50 | "requires": { 51 | "@babel/types": "^7.14.5", 52 | "jsesc": "^2.5.1", 53 | "source-map": "^0.5.0" 54 | } 55 | }, 56 | "@babel/helper-annotate-as-pure": { 57 | "version": "7.14.5", 58 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", 59 | "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", 60 | "dev": true, 61 | "requires": { 62 | "@babel/types": "^7.14.5" 63 | } 64 | }, 65 | "@babel/helper-compilation-targets": { 66 | "version": "7.14.5", 67 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", 68 | "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", 69 | "dev": true, 70 | "requires": { 71 | "@babel/compat-data": "^7.14.5", 72 | "@babel/helper-validator-option": "^7.14.5", 73 | "browserslist": "^4.16.6", 74 | "semver": "^6.3.0" 75 | } 76 | }, 77 | "@babel/helper-create-class-features-plugin": { 78 | "version": "7.14.6", 79 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", 80 | "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", 81 | "dev": true, 82 | "requires": { 83 | "@babel/helper-annotate-as-pure": "^7.14.5", 84 | "@babel/helper-function-name": "^7.14.5", 85 | "@babel/helper-member-expression-to-functions": "^7.14.5", 86 | "@babel/helper-optimise-call-expression": "^7.14.5", 87 | "@babel/helper-replace-supers": "^7.14.5", 88 | "@babel/helper-split-export-declaration": "^7.14.5" 89 | } 90 | }, 91 | "@babel/helper-function-name": { 92 | "version": "7.14.5", 93 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", 94 | "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", 95 | "dev": true, 96 | "requires": { 97 | "@babel/helper-get-function-arity": "^7.14.5", 98 | "@babel/template": "^7.14.5", 99 | "@babel/types": "^7.14.5" 100 | } 101 | }, 102 | "@babel/helper-get-function-arity": { 103 | "version": "7.14.5", 104 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", 105 | "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", 106 | "dev": true, 107 | "requires": { 108 | "@babel/types": "^7.14.5" 109 | } 110 | }, 111 | "@babel/helper-hoist-variables": { 112 | "version": "7.14.5", 113 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", 114 | "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", 115 | "dev": true, 116 | "requires": { 117 | "@babel/types": "^7.14.5" 118 | } 119 | }, 120 | "@babel/helper-member-expression-to-functions": { 121 | "version": "7.14.7", 122 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", 123 | "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", 124 | "dev": true, 125 | "requires": { 126 | "@babel/types": "^7.14.5" 127 | } 128 | }, 129 | "@babel/helper-module-imports": { 130 | "version": "7.14.5", 131 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", 132 | "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", 133 | "dev": true, 134 | "requires": { 135 | "@babel/types": "^7.14.5" 136 | } 137 | }, 138 | "@babel/helper-module-transforms": { 139 | "version": "7.14.5", 140 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", 141 | "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", 142 | "dev": true, 143 | "requires": { 144 | "@babel/helper-module-imports": "^7.14.5", 145 | "@babel/helper-replace-supers": "^7.14.5", 146 | "@babel/helper-simple-access": "^7.14.5", 147 | "@babel/helper-split-export-declaration": "^7.14.5", 148 | "@babel/helper-validator-identifier": "^7.14.5", 149 | "@babel/template": "^7.14.5", 150 | "@babel/traverse": "^7.14.5", 151 | "@babel/types": "^7.14.5" 152 | } 153 | }, 154 | "@babel/helper-optimise-call-expression": { 155 | "version": "7.14.5", 156 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", 157 | "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", 158 | "dev": true, 159 | "requires": { 160 | "@babel/types": "^7.14.5" 161 | } 162 | }, 163 | "@babel/helper-plugin-utils": { 164 | "version": "7.14.5", 165 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", 166 | "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", 167 | "dev": true 168 | }, 169 | "@babel/helper-replace-supers": { 170 | "version": "7.14.5", 171 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", 172 | "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", 173 | "dev": true, 174 | "requires": { 175 | "@babel/helper-member-expression-to-functions": "^7.14.5", 176 | "@babel/helper-optimise-call-expression": "^7.14.5", 177 | "@babel/traverse": "^7.14.5", 178 | "@babel/types": "^7.14.5" 179 | } 180 | }, 181 | "@babel/helper-simple-access": { 182 | "version": "7.14.5", 183 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", 184 | "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", 185 | "dev": true, 186 | "requires": { 187 | "@babel/types": "^7.14.5" 188 | } 189 | }, 190 | "@babel/helper-skip-transparent-expression-wrappers": { 191 | "version": "7.14.5", 192 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", 193 | "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", 194 | "dev": true, 195 | "requires": { 196 | "@babel/types": "^7.14.5" 197 | } 198 | }, 199 | "@babel/helper-split-export-declaration": { 200 | "version": "7.14.5", 201 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", 202 | "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", 203 | "dev": true, 204 | "requires": { 205 | "@babel/types": "^7.14.5" 206 | } 207 | }, 208 | "@babel/helper-validator-identifier": { 209 | "version": "7.14.5", 210 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", 211 | "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", 212 | "dev": true 213 | }, 214 | "@babel/helper-validator-option": { 215 | "version": "7.14.5", 216 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", 217 | "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", 218 | "dev": true 219 | }, 220 | "@babel/helpers": { 221 | "version": "7.14.6", 222 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", 223 | "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", 224 | "dev": true, 225 | "requires": { 226 | "@babel/template": "^7.14.5", 227 | "@babel/traverse": "^7.14.5", 228 | "@babel/types": "^7.14.5" 229 | } 230 | }, 231 | "@babel/highlight": { 232 | "version": "7.14.5", 233 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 234 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 235 | "dev": true, 236 | "requires": { 237 | "@babel/helper-validator-identifier": "^7.14.5", 238 | "chalk": "^2.0.0", 239 | "js-tokens": "^4.0.0" 240 | } 241 | }, 242 | "@babel/parser": { 243 | "version": "7.14.7", 244 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", 245 | "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", 246 | "dev": true 247 | }, 248 | "@babel/plugin-proposal-class-properties": { 249 | "version": "7.14.5", 250 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", 251 | "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", 252 | "dev": true, 253 | "requires": { 254 | "@babel/helper-create-class-features-plugin": "^7.14.5", 255 | "@babel/helper-plugin-utils": "^7.14.5" 256 | } 257 | }, 258 | "@babel/plugin-proposal-dynamic-import": { 259 | "version": "7.14.5", 260 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", 261 | "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", 262 | "dev": true, 263 | "requires": { 264 | "@babel/helper-plugin-utils": "^7.14.5", 265 | "@babel/plugin-syntax-dynamic-import": "^7.8.3" 266 | } 267 | }, 268 | "@babel/plugin-proposal-export-namespace-from": { 269 | "version": "7.14.5", 270 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", 271 | "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", 272 | "dev": true, 273 | "requires": { 274 | "@babel/helper-plugin-utils": "^7.14.5", 275 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3" 276 | } 277 | }, 278 | "@babel/plugin-proposal-logical-assignment-operators": { 279 | "version": "7.14.5", 280 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", 281 | "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", 282 | "dev": true, 283 | "requires": { 284 | "@babel/helper-plugin-utils": "^7.14.5", 285 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" 286 | } 287 | }, 288 | "@babel/plugin-proposal-nullish-coalescing-operator": { 289 | "version": "7.14.5", 290 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", 291 | "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", 292 | "dev": true, 293 | "requires": { 294 | "@babel/helper-plugin-utils": "^7.14.5", 295 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" 296 | } 297 | }, 298 | "@babel/plugin-proposal-numeric-separator": { 299 | "version": "7.14.5", 300 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", 301 | "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", 302 | "dev": true, 303 | "requires": { 304 | "@babel/helper-plugin-utils": "^7.14.5", 305 | "@babel/plugin-syntax-numeric-separator": "^7.10.4" 306 | } 307 | }, 308 | "@babel/plugin-proposal-optional-chaining": { 309 | "version": "7.14.5", 310 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", 311 | "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", 312 | "dev": true, 313 | "requires": { 314 | "@babel/helper-plugin-utils": "^7.14.5", 315 | "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", 316 | "@babel/plugin-syntax-optional-chaining": "^7.8.3" 317 | } 318 | }, 319 | "@babel/plugin-proposal-private-methods": { 320 | "version": "7.14.5", 321 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", 322 | "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", 323 | "dev": true, 324 | "requires": { 325 | "@babel/helper-create-class-features-plugin": "^7.14.5", 326 | "@babel/helper-plugin-utils": "^7.14.5" 327 | } 328 | }, 329 | "@babel/plugin-proposal-private-property-in-object": { 330 | "version": "7.14.5", 331 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", 332 | "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", 333 | "dev": true, 334 | "requires": { 335 | "@babel/helper-annotate-as-pure": "^7.14.5", 336 | "@babel/helper-create-class-features-plugin": "^7.14.5", 337 | "@babel/helper-plugin-utils": "^7.14.5", 338 | "@babel/plugin-syntax-private-property-in-object": "^7.14.5" 339 | } 340 | }, 341 | "@babel/plugin-syntax-async-generators": { 342 | "version": "7.8.4", 343 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 344 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 345 | "dev": true, 346 | "requires": { 347 | "@babel/helper-plugin-utils": "^7.8.0" 348 | } 349 | }, 350 | "@babel/plugin-syntax-dynamic-import": { 351 | "version": "7.8.3", 352 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 353 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 354 | "dev": true, 355 | "requires": { 356 | "@babel/helper-plugin-utils": "^7.8.0" 357 | } 358 | }, 359 | "@babel/plugin-syntax-export-namespace-from": { 360 | "version": "7.8.3", 361 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", 362 | "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", 363 | "dev": true, 364 | "requires": { 365 | "@babel/helper-plugin-utils": "^7.8.3" 366 | } 367 | }, 368 | "@babel/plugin-syntax-json-strings": { 369 | "version": "7.8.3", 370 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 371 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 372 | "dev": true, 373 | "requires": { 374 | "@babel/helper-plugin-utils": "^7.8.0" 375 | } 376 | }, 377 | "@babel/plugin-syntax-logical-assignment-operators": { 378 | "version": "7.10.4", 379 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 380 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 381 | "dev": true, 382 | "requires": { 383 | "@babel/helper-plugin-utils": "^7.10.4" 384 | } 385 | }, 386 | "@babel/plugin-syntax-nullish-coalescing-operator": { 387 | "version": "7.8.3", 388 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 389 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 390 | "dev": true, 391 | "requires": { 392 | "@babel/helper-plugin-utils": "^7.8.0" 393 | } 394 | }, 395 | "@babel/plugin-syntax-numeric-separator": { 396 | "version": "7.10.4", 397 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 398 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 399 | "dev": true, 400 | "requires": { 401 | "@babel/helper-plugin-utils": "^7.10.4" 402 | } 403 | }, 404 | "@babel/plugin-syntax-object-rest-spread": { 405 | "version": "7.8.3", 406 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 407 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 408 | "dev": true, 409 | "requires": { 410 | "@babel/helper-plugin-utils": "^7.8.0" 411 | } 412 | }, 413 | "@babel/plugin-syntax-optional-catch-binding": { 414 | "version": "7.8.3", 415 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 416 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 417 | "dev": true, 418 | "requires": { 419 | "@babel/helper-plugin-utils": "^7.8.0" 420 | } 421 | }, 422 | "@babel/plugin-syntax-optional-chaining": { 423 | "version": "7.8.3", 424 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 425 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 426 | "dev": true, 427 | "requires": { 428 | "@babel/helper-plugin-utils": "^7.8.0" 429 | } 430 | }, 431 | "@babel/plugin-syntax-private-property-in-object": { 432 | "version": "7.14.5", 433 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", 434 | "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", 435 | "dev": true, 436 | "requires": { 437 | "@babel/helper-plugin-utils": "^7.14.5" 438 | } 439 | }, 440 | "@babel/plugin-syntax-typescript": { 441 | "version": "7.14.5", 442 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", 443 | "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", 444 | "dev": true, 445 | "requires": { 446 | "@babel/helper-plugin-utils": "^7.14.5" 447 | } 448 | }, 449 | "@babel/plugin-transform-modules-commonjs": { 450 | "version": "7.14.5", 451 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", 452 | "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", 453 | "dev": true, 454 | "requires": { 455 | "@babel/helper-module-transforms": "^7.14.5", 456 | "@babel/helper-plugin-utils": "^7.14.5", 457 | "@babel/helper-simple-access": "^7.14.5", 458 | "babel-plugin-dynamic-import-node": "^2.3.3" 459 | } 460 | }, 461 | "@babel/plugin-transform-typescript": { 462 | "version": "7.14.6", 463 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", 464 | "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", 465 | "dev": true, 466 | "requires": { 467 | "@babel/helper-create-class-features-plugin": "^7.14.6", 468 | "@babel/helper-plugin-utils": "^7.14.5", 469 | "@babel/plugin-syntax-typescript": "^7.14.5" 470 | } 471 | }, 472 | "@babel/preset-typescript": { 473 | "version": "7.14.5", 474 | "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", 475 | "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", 476 | "dev": true, 477 | "requires": { 478 | "@babel/helper-plugin-utils": "^7.14.5", 479 | "@babel/helper-validator-option": "^7.14.5", 480 | "@babel/plugin-transform-typescript": "^7.14.5" 481 | } 482 | }, 483 | "@babel/template": { 484 | "version": "7.14.5", 485 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", 486 | "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", 487 | "dev": true, 488 | "requires": { 489 | "@babel/code-frame": "^7.14.5", 490 | "@babel/parser": "^7.14.5", 491 | "@babel/types": "^7.14.5" 492 | } 493 | }, 494 | "@babel/traverse": { 495 | "version": "7.14.7", 496 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", 497 | "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", 498 | "dev": true, 499 | "requires": { 500 | "@babel/code-frame": "^7.14.5", 501 | "@babel/generator": "^7.14.5", 502 | "@babel/helper-function-name": "^7.14.5", 503 | "@babel/helper-hoist-variables": "^7.14.5", 504 | "@babel/helper-split-export-declaration": "^7.14.5", 505 | "@babel/parser": "^7.14.7", 506 | "@babel/types": "^7.14.5", 507 | "debug": "^4.1.0", 508 | "globals": "^11.1.0" 509 | } 510 | }, 511 | "@babel/types": { 512 | "version": "7.14.5", 513 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", 514 | "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", 515 | "dev": true, 516 | "requires": { 517 | "@babel/helper-validator-identifier": "^7.14.5", 518 | "to-fast-properties": "^2.0.0" 519 | } 520 | }, 521 | "@jest/types": { 522 | "version": "26.6.2", 523 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", 524 | "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", 525 | "dev": true, 526 | "requires": { 527 | "@types/istanbul-lib-coverage": "^2.0.0", 528 | "@types/istanbul-reports": "^3.0.0", 529 | "@types/node": "*", 530 | "@types/yargs": "^15.0.0", 531 | "chalk": "^4.0.0" 532 | }, 533 | "dependencies": { 534 | "ansi-styles": { 535 | "version": "4.3.0", 536 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 537 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 538 | "dev": true, 539 | "requires": { 540 | "color-convert": "^2.0.1" 541 | } 542 | }, 543 | "chalk": { 544 | "version": "4.1.1", 545 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 546 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 547 | "dev": true, 548 | "requires": { 549 | "ansi-styles": "^4.1.0", 550 | "supports-color": "^7.1.0" 551 | } 552 | }, 553 | "color-convert": { 554 | "version": "2.0.1", 555 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 556 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 557 | "dev": true, 558 | "requires": { 559 | "color-name": "~1.1.4" 560 | } 561 | }, 562 | "color-name": { 563 | "version": "1.1.4", 564 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 565 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 566 | "dev": true 567 | }, 568 | "has-flag": { 569 | "version": "4.0.0", 570 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 571 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 572 | "dev": true 573 | }, 574 | "supports-color": { 575 | "version": "7.2.0", 576 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 577 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 578 | "dev": true, 579 | "requires": { 580 | "has-flag": "^4.0.0" 581 | } 582 | } 583 | } 584 | }, 585 | "@playwright/test": { 586 | "version": "1.12.3", 587 | "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.12.3.tgz", 588 | "integrity": "sha512-e8i8rMqd1nhdyW2ELShOc5F2EiLIcZs+2LRglrCAy/nzftpLdAqfsk6gp29n8N5KExIlzpKdoQ5QBviqGzT9DA==", 589 | "dev": true, 590 | "requires": { 591 | "@babel/code-frame": "^7.12.13", 592 | "@babel/core": "^7.14.0", 593 | "@babel/plugin-proposal-class-properties": "^7.13.0", 594 | "@babel/plugin-proposal-dynamic-import": "^7.13.8", 595 | "@babel/plugin-proposal-export-namespace-from": "^7.12.13", 596 | "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", 597 | "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", 598 | "@babel/plugin-proposal-numeric-separator": "^7.12.13", 599 | "@babel/plugin-proposal-optional-chaining": "^7.13.12", 600 | "@babel/plugin-proposal-private-methods": "^7.13.0", 601 | "@babel/plugin-proposal-private-property-in-object": "^7.14.0", 602 | "@babel/plugin-syntax-async-generators": "^7.8.4", 603 | "@babel/plugin-syntax-json-strings": "^7.8.3", 604 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 605 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 606 | "@babel/plugin-transform-modules-commonjs": "^7.14.0", 607 | "@babel/preset-typescript": "^7.13.0", 608 | "colors": "^1.4.0", 609 | "commander": "^6.1.0", 610 | "debug": "^4.1.1", 611 | "expect": "^26.4.2", 612 | "extract-zip": "^2.0.1", 613 | "https-proxy-agent": "^5.0.0", 614 | "jpeg-js": "^0.4.2", 615 | "mime": "^2.4.6", 616 | "minimatch": "^3.0.3", 617 | "ms": "^2.1.2", 618 | "pirates": "^4.0.1", 619 | "pixelmatch": "^5.2.1", 620 | "pngjs": "^5.0.0", 621 | "progress": "^2.0.3", 622 | "proper-lockfile": "^4.1.1", 623 | "proxy-from-env": "^1.1.0", 624 | "rimraf": "^3.0.2", 625 | "source-map-support": "^0.4.18", 626 | "stack-utils": "^2.0.3", 627 | "ws": "^7.4.6", 628 | "yazl": "^2.5.1" 629 | } 630 | }, 631 | "@types/istanbul-lib-coverage": { 632 | "version": "2.0.3", 633 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", 634 | "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", 635 | "dev": true 636 | }, 637 | "@types/istanbul-lib-report": { 638 | "version": "3.0.0", 639 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 640 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 641 | "dev": true, 642 | "requires": { 643 | "@types/istanbul-lib-coverage": "*" 644 | } 645 | }, 646 | "@types/istanbul-reports": { 647 | "version": "3.0.1", 648 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", 649 | "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", 650 | "dev": true, 651 | "requires": { 652 | "@types/istanbul-lib-report": "*" 653 | } 654 | }, 655 | "@types/node": { 656 | "version": "16.0.1", 657 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.0.1.tgz", 658 | "integrity": "sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug==", 659 | "dev": true 660 | }, 661 | "@types/stack-utils": { 662 | "version": "2.0.1", 663 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", 664 | "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", 665 | "dev": true 666 | }, 667 | "@types/yargs": { 668 | "version": "15.0.14", 669 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", 670 | "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", 671 | "dev": true, 672 | "requires": { 673 | "@types/yargs-parser": "*" 674 | } 675 | }, 676 | "@types/yargs-parser": { 677 | "version": "20.2.1", 678 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", 679 | "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", 680 | "dev": true 681 | }, 682 | "@types/yauzl": { 683 | "version": "2.9.2", 684 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", 685 | "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", 686 | "dev": true, 687 | "optional": true, 688 | "requires": { 689 | "@types/node": "*" 690 | } 691 | }, 692 | "agent-base": { 693 | "version": "6.0.2", 694 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 695 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 696 | "dev": true, 697 | "requires": { 698 | "debug": "4" 699 | } 700 | }, 701 | "ansi-regex": { 702 | "version": "5.0.0", 703 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 704 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 705 | "dev": true 706 | }, 707 | "ansi-styles": { 708 | "version": "3.2.1", 709 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 710 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 711 | "dev": true, 712 | "requires": { 713 | "color-convert": "^1.9.0" 714 | } 715 | }, 716 | "babel-plugin-dynamic-import-node": { 717 | "version": "2.3.3", 718 | "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", 719 | "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", 720 | "dev": true, 721 | "requires": { 722 | "object.assign": "^4.1.0" 723 | } 724 | }, 725 | "balanced-match": { 726 | "version": "1.0.2", 727 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 728 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 729 | "dev": true 730 | }, 731 | "brace-expansion": { 732 | "version": "1.1.11", 733 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 734 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 735 | "dev": true, 736 | "requires": { 737 | "balanced-match": "^1.0.0", 738 | "concat-map": "0.0.1" 739 | } 740 | }, 741 | "braces": { 742 | "version": "3.0.2", 743 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 744 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 745 | "dev": true, 746 | "requires": { 747 | "fill-range": "^7.0.1" 748 | } 749 | }, 750 | "browserslist": { 751 | "version": "4.16.6", 752 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", 753 | "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", 754 | "dev": true, 755 | "requires": { 756 | "caniuse-lite": "^1.0.30001219", 757 | "colorette": "^1.2.2", 758 | "electron-to-chromium": "^1.3.723", 759 | "escalade": "^3.1.1", 760 | "node-releases": "^1.1.71" 761 | } 762 | }, 763 | "buffer-crc32": { 764 | "version": "0.2.13", 765 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 766 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 767 | "dev": true 768 | }, 769 | "call-bind": { 770 | "version": "1.0.2", 771 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 772 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 773 | "dev": true, 774 | "requires": { 775 | "function-bind": "^1.1.1", 776 | "get-intrinsic": "^1.0.2" 777 | } 778 | }, 779 | "caniuse-lite": { 780 | "version": "1.0.30001243", 781 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001243.tgz", 782 | "integrity": "sha512-vNxw9mkTBtkmLFnJRv/2rhs1yufpDfCkBZexG3Y0xdOH2Z/eE/85E4Dl5j1YUN34nZVsSp6vVRFQRrez9wJMRA==", 783 | "dev": true 784 | }, 785 | "chalk": { 786 | "version": "2.4.2", 787 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 788 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 789 | "dev": true, 790 | "requires": { 791 | "ansi-styles": "^3.2.1", 792 | "escape-string-regexp": "^1.0.5", 793 | "supports-color": "^5.3.0" 794 | }, 795 | "dependencies": { 796 | "escape-string-regexp": { 797 | "version": "1.0.5", 798 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 799 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 800 | "dev": true 801 | } 802 | } 803 | }, 804 | "color-convert": { 805 | "version": "1.9.3", 806 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 807 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 808 | "dev": true, 809 | "requires": { 810 | "color-name": "1.1.3" 811 | } 812 | }, 813 | "color-name": { 814 | "version": "1.1.3", 815 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 816 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 817 | "dev": true 818 | }, 819 | "colorette": { 820 | "version": "1.2.2", 821 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 822 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", 823 | "dev": true 824 | }, 825 | "colors": { 826 | "version": "1.4.0", 827 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 828 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 829 | "dev": true 830 | }, 831 | "commander": { 832 | "version": "6.2.1", 833 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 834 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", 835 | "dev": true 836 | }, 837 | "concat-map": { 838 | "version": "0.0.1", 839 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 840 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 841 | "dev": true 842 | }, 843 | "convert-source-map": { 844 | "version": "1.8.0", 845 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 846 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 847 | "dev": true, 848 | "requires": { 849 | "safe-buffer": "~5.1.1" 850 | } 851 | }, 852 | "debug": { 853 | "version": "4.3.2", 854 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 855 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 856 | "dev": true, 857 | "requires": { 858 | "ms": "2.1.2" 859 | } 860 | }, 861 | "define-properties": { 862 | "version": "1.1.3", 863 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 864 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 865 | "dev": true, 866 | "requires": { 867 | "object-keys": "^1.0.12" 868 | } 869 | }, 870 | "diff-sequences": { 871 | "version": "26.6.2", 872 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", 873 | "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", 874 | "dev": true 875 | }, 876 | "electron-to-chromium": { 877 | "version": "1.3.770", 878 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.770.tgz", 879 | "integrity": "sha512-Kyh8DGK1KfEZuYKIHvuOmrKotsKZQ+qBkDIWHciE3QoFkxXB1KzPP+tfLilSHAfxTON0yYMnFCWkQtUOR7g6KQ==", 880 | "dev": true 881 | }, 882 | "end-of-stream": { 883 | "version": "1.4.4", 884 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 885 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 886 | "dev": true, 887 | "requires": { 888 | "once": "^1.4.0" 889 | } 890 | }, 891 | "escalade": { 892 | "version": "3.1.1", 893 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 894 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 895 | "dev": true 896 | }, 897 | "escape-string-regexp": { 898 | "version": "2.0.0", 899 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 900 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 901 | "dev": true 902 | }, 903 | "expect": { 904 | "version": "26.6.2", 905 | "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", 906 | "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", 907 | "dev": true, 908 | "requires": { 909 | "@jest/types": "^26.6.2", 910 | "ansi-styles": "^4.0.0", 911 | "jest-get-type": "^26.3.0", 912 | "jest-matcher-utils": "^26.6.2", 913 | "jest-message-util": "^26.6.2", 914 | "jest-regex-util": "^26.0.0" 915 | }, 916 | "dependencies": { 917 | "ansi-styles": { 918 | "version": "4.3.0", 919 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 920 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 921 | "dev": true, 922 | "requires": { 923 | "color-convert": "^2.0.1" 924 | } 925 | }, 926 | "color-convert": { 927 | "version": "2.0.1", 928 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 929 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 930 | "dev": true, 931 | "requires": { 932 | "color-name": "~1.1.4" 933 | } 934 | }, 935 | "color-name": { 936 | "version": "1.1.4", 937 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 938 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 939 | "dev": true 940 | } 941 | } 942 | }, 943 | "extract-zip": { 944 | "version": "2.0.1", 945 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 946 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 947 | "dev": true, 948 | "requires": { 949 | "@types/yauzl": "^2.9.1", 950 | "debug": "^4.1.1", 951 | "get-stream": "^5.1.0", 952 | "yauzl": "^2.10.0" 953 | } 954 | }, 955 | "fd-slicer": { 956 | "version": "1.1.0", 957 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 958 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 959 | "dev": true, 960 | "requires": { 961 | "pend": "~1.2.0" 962 | } 963 | }, 964 | "fill-range": { 965 | "version": "7.0.1", 966 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 967 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 968 | "dev": true, 969 | "requires": { 970 | "to-regex-range": "^5.0.1" 971 | } 972 | }, 973 | "fs.realpath": { 974 | "version": "1.0.0", 975 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 976 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 977 | "dev": true 978 | }, 979 | "function-bind": { 980 | "version": "1.1.1", 981 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 982 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 983 | "dev": true 984 | }, 985 | "gensync": { 986 | "version": "1.0.0-beta.2", 987 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 988 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 989 | "dev": true 990 | }, 991 | "get-intrinsic": { 992 | "version": "1.1.1", 993 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 994 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 995 | "dev": true, 996 | "requires": { 997 | "function-bind": "^1.1.1", 998 | "has": "^1.0.3", 999 | "has-symbols": "^1.0.1" 1000 | } 1001 | }, 1002 | "get-stream": { 1003 | "version": "5.2.0", 1004 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1005 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1006 | "dev": true, 1007 | "requires": { 1008 | "pump": "^3.0.0" 1009 | } 1010 | }, 1011 | "glob": { 1012 | "version": "7.1.7", 1013 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1014 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1015 | "dev": true, 1016 | "requires": { 1017 | "fs.realpath": "^1.0.0", 1018 | "inflight": "^1.0.4", 1019 | "inherits": "2", 1020 | "minimatch": "^3.0.4", 1021 | "once": "^1.3.0", 1022 | "path-is-absolute": "^1.0.0" 1023 | } 1024 | }, 1025 | "globals": { 1026 | "version": "11.12.0", 1027 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1028 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1029 | "dev": true 1030 | }, 1031 | "graceful-fs": { 1032 | "version": "4.2.6", 1033 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 1034 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 1035 | "dev": true 1036 | }, 1037 | "has": { 1038 | "version": "1.0.3", 1039 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1040 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1041 | "dev": true, 1042 | "requires": { 1043 | "function-bind": "^1.1.1" 1044 | } 1045 | }, 1046 | "has-flag": { 1047 | "version": "3.0.0", 1048 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1049 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1050 | "dev": true 1051 | }, 1052 | "has-symbols": { 1053 | "version": "1.0.2", 1054 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 1055 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", 1056 | "dev": true 1057 | }, 1058 | "https-proxy-agent": { 1059 | "version": "5.0.0", 1060 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 1061 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 1062 | "dev": true, 1063 | "requires": { 1064 | "agent-base": "6", 1065 | "debug": "4" 1066 | } 1067 | }, 1068 | "inflight": { 1069 | "version": "1.0.6", 1070 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1071 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1072 | "dev": true, 1073 | "requires": { 1074 | "once": "^1.3.0", 1075 | "wrappy": "1" 1076 | } 1077 | }, 1078 | "inherits": { 1079 | "version": "2.0.4", 1080 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1081 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1082 | "dev": true 1083 | }, 1084 | "is-number": { 1085 | "version": "7.0.0", 1086 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1087 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1088 | "dev": true 1089 | }, 1090 | "jest-diff": { 1091 | "version": "26.6.2", 1092 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", 1093 | "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", 1094 | "dev": true, 1095 | "requires": { 1096 | "chalk": "^4.0.0", 1097 | "diff-sequences": "^26.6.2", 1098 | "jest-get-type": "^26.3.0", 1099 | "pretty-format": "^26.6.2" 1100 | }, 1101 | "dependencies": { 1102 | "ansi-styles": { 1103 | "version": "4.3.0", 1104 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1105 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1106 | "dev": true, 1107 | "requires": { 1108 | "color-convert": "^2.0.1" 1109 | } 1110 | }, 1111 | "chalk": { 1112 | "version": "4.1.1", 1113 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 1114 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 1115 | "dev": true, 1116 | "requires": { 1117 | "ansi-styles": "^4.1.0", 1118 | "supports-color": "^7.1.0" 1119 | } 1120 | }, 1121 | "color-convert": { 1122 | "version": "2.0.1", 1123 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1124 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1125 | "dev": true, 1126 | "requires": { 1127 | "color-name": "~1.1.4" 1128 | } 1129 | }, 1130 | "color-name": { 1131 | "version": "1.1.4", 1132 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1133 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1134 | "dev": true 1135 | }, 1136 | "has-flag": { 1137 | "version": "4.0.0", 1138 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1139 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1140 | "dev": true 1141 | }, 1142 | "supports-color": { 1143 | "version": "7.2.0", 1144 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1145 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1146 | "dev": true, 1147 | "requires": { 1148 | "has-flag": "^4.0.0" 1149 | } 1150 | } 1151 | } 1152 | }, 1153 | "jest-get-type": { 1154 | "version": "26.3.0", 1155 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", 1156 | "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", 1157 | "dev": true 1158 | }, 1159 | "jest-matcher-utils": { 1160 | "version": "26.6.2", 1161 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", 1162 | "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", 1163 | "dev": true, 1164 | "requires": { 1165 | "chalk": "^4.0.0", 1166 | "jest-diff": "^26.6.2", 1167 | "jest-get-type": "^26.3.0", 1168 | "pretty-format": "^26.6.2" 1169 | }, 1170 | "dependencies": { 1171 | "ansi-styles": { 1172 | "version": "4.3.0", 1173 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1174 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1175 | "dev": true, 1176 | "requires": { 1177 | "color-convert": "^2.0.1" 1178 | } 1179 | }, 1180 | "chalk": { 1181 | "version": "4.1.1", 1182 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 1183 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 1184 | "dev": true, 1185 | "requires": { 1186 | "ansi-styles": "^4.1.0", 1187 | "supports-color": "^7.1.0" 1188 | } 1189 | }, 1190 | "color-convert": { 1191 | "version": "2.0.1", 1192 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1193 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1194 | "dev": true, 1195 | "requires": { 1196 | "color-name": "~1.1.4" 1197 | } 1198 | }, 1199 | "color-name": { 1200 | "version": "1.1.4", 1201 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1202 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1203 | "dev": true 1204 | }, 1205 | "has-flag": { 1206 | "version": "4.0.0", 1207 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1208 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1209 | "dev": true 1210 | }, 1211 | "supports-color": { 1212 | "version": "7.2.0", 1213 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1214 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1215 | "dev": true, 1216 | "requires": { 1217 | "has-flag": "^4.0.0" 1218 | } 1219 | } 1220 | } 1221 | }, 1222 | "jest-message-util": { 1223 | "version": "26.6.2", 1224 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", 1225 | "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", 1226 | "dev": true, 1227 | "requires": { 1228 | "@babel/code-frame": "^7.0.0", 1229 | "@jest/types": "^26.6.2", 1230 | "@types/stack-utils": "^2.0.0", 1231 | "chalk": "^4.0.0", 1232 | "graceful-fs": "^4.2.4", 1233 | "micromatch": "^4.0.2", 1234 | "pretty-format": "^26.6.2", 1235 | "slash": "^3.0.0", 1236 | "stack-utils": "^2.0.2" 1237 | }, 1238 | "dependencies": { 1239 | "ansi-styles": { 1240 | "version": "4.3.0", 1241 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1242 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1243 | "dev": true, 1244 | "requires": { 1245 | "color-convert": "^2.0.1" 1246 | } 1247 | }, 1248 | "chalk": { 1249 | "version": "4.1.1", 1250 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 1251 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 1252 | "dev": true, 1253 | "requires": { 1254 | "ansi-styles": "^4.1.0", 1255 | "supports-color": "^7.1.0" 1256 | } 1257 | }, 1258 | "color-convert": { 1259 | "version": "2.0.1", 1260 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1261 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1262 | "dev": true, 1263 | "requires": { 1264 | "color-name": "~1.1.4" 1265 | } 1266 | }, 1267 | "color-name": { 1268 | "version": "1.1.4", 1269 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1270 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1271 | "dev": true 1272 | }, 1273 | "has-flag": { 1274 | "version": "4.0.0", 1275 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1276 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1277 | "dev": true 1278 | }, 1279 | "supports-color": { 1280 | "version": "7.2.0", 1281 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1282 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1283 | "dev": true, 1284 | "requires": { 1285 | "has-flag": "^4.0.0" 1286 | } 1287 | } 1288 | } 1289 | }, 1290 | "jest-regex-util": { 1291 | "version": "26.0.0", 1292 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", 1293 | "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", 1294 | "dev": true 1295 | }, 1296 | "jpeg-js": { 1297 | "version": "0.4.3", 1298 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz", 1299 | "integrity": "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==", 1300 | "dev": true 1301 | }, 1302 | "js-tokens": { 1303 | "version": "4.0.0", 1304 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1305 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1306 | "dev": true 1307 | }, 1308 | "jsesc": { 1309 | "version": "2.5.2", 1310 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1311 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1312 | "dev": true 1313 | }, 1314 | "json5": { 1315 | "version": "2.2.0", 1316 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", 1317 | "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", 1318 | "dev": true, 1319 | "requires": { 1320 | "minimist": "^1.2.5" 1321 | } 1322 | }, 1323 | "micromatch": { 1324 | "version": "4.0.4", 1325 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 1326 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 1327 | "dev": true, 1328 | "requires": { 1329 | "braces": "^3.0.1", 1330 | "picomatch": "^2.2.3" 1331 | } 1332 | }, 1333 | "mime": { 1334 | "version": "2.5.2", 1335 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", 1336 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", 1337 | "dev": true 1338 | }, 1339 | "minimatch": { 1340 | "version": "3.0.4", 1341 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1342 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1343 | "dev": true, 1344 | "requires": { 1345 | "brace-expansion": "^1.1.7" 1346 | } 1347 | }, 1348 | "minimist": { 1349 | "version": "1.2.5", 1350 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1351 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1352 | "dev": true 1353 | }, 1354 | "ms": { 1355 | "version": "2.1.2", 1356 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1357 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1358 | "dev": true 1359 | }, 1360 | "node-modules-regexp": { 1361 | "version": "1.0.0", 1362 | "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", 1363 | "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", 1364 | "dev": true 1365 | }, 1366 | "node-releases": { 1367 | "version": "1.1.73", 1368 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", 1369 | "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", 1370 | "dev": true 1371 | }, 1372 | "object-keys": { 1373 | "version": "1.1.1", 1374 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1375 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1376 | "dev": true 1377 | }, 1378 | "object.assign": { 1379 | "version": "4.1.2", 1380 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1381 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1382 | "dev": true, 1383 | "requires": { 1384 | "call-bind": "^1.0.0", 1385 | "define-properties": "^1.1.3", 1386 | "has-symbols": "^1.0.1", 1387 | "object-keys": "^1.1.1" 1388 | } 1389 | }, 1390 | "once": { 1391 | "version": "1.4.0", 1392 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1393 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1394 | "dev": true, 1395 | "requires": { 1396 | "wrappy": "1" 1397 | } 1398 | }, 1399 | "path-is-absolute": { 1400 | "version": "1.0.1", 1401 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1402 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1403 | "dev": true 1404 | }, 1405 | "pend": { 1406 | "version": "1.2.0", 1407 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1408 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1409 | "dev": true 1410 | }, 1411 | "picomatch": { 1412 | "version": "2.3.0", 1413 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 1414 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 1415 | "dev": true 1416 | }, 1417 | "pirates": { 1418 | "version": "4.0.1", 1419 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", 1420 | "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", 1421 | "dev": true, 1422 | "requires": { 1423 | "node-modules-regexp": "^1.0.0" 1424 | } 1425 | }, 1426 | "pixelmatch": { 1427 | "version": "5.2.1", 1428 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", 1429 | "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", 1430 | "dev": true, 1431 | "requires": { 1432 | "pngjs": "^4.0.1" 1433 | }, 1434 | "dependencies": { 1435 | "pngjs": { 1436 | "version": "4.0.1", 1437 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", 1438 | "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==", 1439 | "dev": true 1440 | } 1441 | } 1442 | }, 1443 | "playwright": { 1444 | "version": "1.12.3", 1445 | "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.12.3.tgz", 1446 | "integrity": "sha512-eyhHvZV7dMAUltqjQsgJ9CjZM8dznzN1+rcfCI6W6lfQ7IlPvTFGLuKOCcI4ETbjfbxqaS5FKIkb1WDDzq2Nww==", 1447 | "dev": true, 1448 | "requires": { 1449 | "commander": "^6.1.0", 1450 | "debug": "^4.1.1", 1451 | "extract-zip": "^2.0.1", 1452 | "https-proxy-agent": "^5.0.0", 1453 | "jpeg-js": "^0.4.2", 1454 | "mime": "^2.4.6", 1455 | "pngjs": "^5.0.0", 1456 | "progress": "^2.0.3", 1457 | "proper-lockfile": "^4.1.1", 1458 | "proxy-from-env": "^1.1.0", 1459 | "rimraf": "^3.0.2", 1460 | "stack-utils": "^2.0.3", 1461 | "ws": "^7.4.6", 1462 | "yazl": "^2.5.1" 1463 | } 1464 | }, 1465 | "pngjs": { 1466 | "version": "5.0.0", 1467 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", 1468 | "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", 1469 | "dev": true 1470 | }, 1471 | "pretty-format": { 1472 | "version": "26.6.2", 1473 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", 1474 | "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", 1475 | "dev": true, 1476 | "requires": { 1477 | "@jest/types": "^26.6.2", 1478 | "ansi-regex": "^5.0.0", 1479 | "ansi-styles": "^4.0.0", 1480 | "react-is": "^17.0.1" 1481 | }, 1482 | "dependencies": { 1483 | "ansi-styles": { 1484 | "version": "4.3.0", 1485 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1486 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1487 | "dev": true, 1488 | "requires": { 1489 | "color-convert": "^2.0.1" 1490 | } 1491 | }, 1492 | "color-convert": { 1493 | "version": "2.0.1", 1494 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1495 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1496 | "dev": true, 1497 | "requires": { 1498 | "color-name": "~1.1.4" 1499 | } 1500 | }, 1501 | "color-name": { 1502 | "version": "1.1.4", 1503 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1504 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1505 | "dev": true 1506 | } 1507 | } 1508 | }, 1509 | "progress": { 1510 | "version": "2.0.3", 1511 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1512 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1513 | "dev": true 1514 | }, 1515 | "proper-lockfile": { 1516 | "version": "4.1.2", 1517 | "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", 1518 | "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", 1519 | "dev": true, 1520 | "requires": { 1521 | "graceful-fs": "^4.2.4", 1522 | "retry": "^0.12.0", 1523 | "signal-exit": "^3.0.2" 1524 | } 1525 | }, 1526 | "proxy-from-env": { 1527 | "version": "1.1.0", 1528 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1529 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 1530 | "dev": true 1531 | }, 1532 | "pump": { 1533 | "version": "3.0.0", 1534 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1535 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1536 | "dev": true, 1537 | "requires": { 1538 | "end-of-stream": "^1.1.0", 1539 | "once": "^1.3.1" 1540 | } 1541 | }, 1542 | "react-is": { 1543 | "version": "17.0.2", 1544 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 1545 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 1546 | "dev": true 1547 | }, 1548 | "retry": { 1549 | "version": "0.12.0", 1550 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1551 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", 1552 | "dev": true 1553 | }, 1554 | "rimraf": { 1555 | "version": "3.0.2", 1556 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1557 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1558 | "dev": true, 1559 | "requires": { 1560 | "glob": "^7.1.3" 1561 | } 1562 | }, 1563 | "safe-buffer": { 1564 | "version": "5.1.2", 1565 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1566 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1567 | "dev": true 1568 | }, 1569 | "semver": { 1570 | "version": "6.3.0", 1571 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1572 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1573 | "dev": true 1574 | }, 1575 | "signal-exit": { 1576 | "version": "3.0.3", 1577 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1578 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1579 | "dev": true 1580 | }, 1581 | "slash": { 1582 | "version": "3.0.0", 1583 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1584 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1585 | "dev": true 1586 | }, 1587 | "source-map": { 1588 | "version": "0.5.7", 1589 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1590 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1591 | "dev": true 1592 | }, 1593 | "source-map-support": { 1594 | "version": "0.4.18", 1595 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1596 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1597 | "dev": true, 1598 | "requires": { 1599 | "source-map": "^0.5.6" 1600 | } 1601 | }, 1602 | "stack-utils": { 1603 | "version": "2.0.3", 1604 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", 1605 | "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", 1606 | "dev": true, 1607 | "requires": { 1608 | "escape-string-regexp": "^2.0.0" 1609 | } 1610 | }, 1611 | "supports-color": { 1612 | "version": "5.5.0", 1613 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1614 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1615 | "dev": true, 1616 | "requires": { 1617 | "has-flag": "^3.0.0" 1618 | } 1619 | }, 1620 | "to-fast-properties": { 1621 | "version": "2.0.0", 1622 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1623 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1624 | "dev": true 1625 | }, 1626 | "to-regex-range": { 1627 | "version": "5.0.1", 1628 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1629 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1630 | "dev": true, 1631 | "requires": { 1632 | "is-number": "^7.0.0" 1633 | } 1634 | }, 1635 | "wrappy": { 1636 | "version": "1.0.2", 1637 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1638 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1639 | "dev": true 1640 | }, 1641 | "ws": { 1642 | "version": "7.5.2", 1643 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz", 1644 | "integrity": "sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==", 1645 | "dev": true 1646 | }, 1647 | "yauzl": { 1648 | "version": "2.10.0", 1649 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1650 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1651 | "dev": true, 1652 | "requires": { 1653 | "buffer-crc32": "~0.2.3", 1654 | "fd-slicer": "~1.1.0" 1655 | } 1656 | }, 1657 | "yazl": { 1658 | "version": "2.5.1", 1659 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", 1660 | "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", 1661 | "dev": true, 1662 | "requires": { 1663 | "buffer-crc32": "~0.2.3" 1664 | } 1665 | } 1666 | } 1667 | } 1668 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playwright-page-object", 3 | "version": "1.0.0", 4 | "description": "Page Object Model with playwright", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "npx playwright test" 8 | }, 9 | "author": "Andrii Baidachenko", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@playwright/test": "^1.12.3", 13 | "playwright": "^1.12.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /pages/home-page.ts: -------------------------------------------------------------------------------- 1 | import type { Page } from 'playwright'; 2 | import { isVisible } from '../framework/common-actions'; 3 | 4 | export class HomePage { 5 | readonly page: Page; 6 | 7 | constructor(page: Page) { 8 | this.page = page; 9 | } 10 | 11 | async open() { 12 | await this.page.goto('http://angular.realworld.io/'); 13 | } 14 | 15 | async goToLoginPage() { 16 | await this.page.click('a[routerlink="/login"]'); 17 | } 18 | 19 | async userIsLoggedIn(): Promise { 20 | return await isVisible(this.page, 'a[routerlink="/editor"]'); 21 | } 22 | 23 | async goToSettings() { 24 | await this.page.click('a[routerlink="/settings"]'); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /pages/login-page.ts: -------------------------------------------------------------------------------- 1 | import type { Page } from 'playwright'; 2 | 3 | export class LoginPage { 4 | readonly page: Page; 5 | 6 | constructor(page: Page) { 7 | this.page = page; 8 | } 9 | 10 | async login(email: string, password: string) { 11 | await this.page.type('input[formcontrolname="email"]', email); 12 | await this.page.type('input[formcontrolname="password"]', password); 13 | await this.page.click('button[type="submit"]'); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /pages/logout-page.ts: -------------------------------------------------------------------------------- 1 | import type { Page } from 'playwright'; 2 | import { isVisible } from '../framework/common-actions'; 3 | 4 | export class LogoutPage { 5 | readonly page: Page; 6 | 7 | constructor(page: Page) { 8 | this.page = page; 9 | } 10 | 11 | async userIsLoggedOut(): Promise { 12 | return isVisible(this.page, 'a[routerlink="/login"]'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /pages/settings-page.ts: -------------------------------------------------------------------------------- 1 | import type { Page } from 'playwright'; 2 | 3 | export class SettingsPage { 4 | readonly page: Page; 5 | 6 | constructor(page: Page) { 7 | this.page = page; 8 | } 9 | 10 | async logout() { 11 | await this.page.click('.btn-outline-danger'); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /playwright-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewbayd/playwright-page-object/4bf66e5eb648ae1dbf535fb1c0d4f1cf99af2c3e/playwright-logo.png -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | // Timeout 5 | timeout: 10000, 6 | 7 | use: { 8 | // Browser options 9 | headless: true, 10 | 11 | // Context options 12 | viewport: { width: 1280, height: 720 }, 13 | 14 | // Artifacts 15 | screenshot: 'only-on-failure', 16 | }, 17 | 18 | projects: [ 19 | { 20 | name: 'Chrome', 21 | use: { browserName: 'chromium' }, 22 | }, 23 | { 24 | name: 'Firefox', 25 | use: { browserName: 'firefox' }, 26 | }, 27 | { 28 | name: 'WebKit', 29 | use: { browserName: 'webkit' }, 30 | }, 31 | ], 32 | }; 33 | 34 | export default config; 35 | -------------------------------------------------------------------------------- /tests/login.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test'; 2 | 3 | import { user } from './testdata'; 4 | import { HomePage } from '../pages/home-page'; 5 | import { LoginPage } from '../pages/login-page'; 6 | import { SettingsPage } from '../pages/settings-page'; 7 | import { LogoutPage } from '../pages/logout-page'; 8 | 9 | test('User can login and logout', async ({ page }) => { 10 | const homepage = new HomePage(page); 11 | 12 | await homepage.open(); 13 | await homepage.goToLoginPage(); 14 | await new LoginPage(page).login(user.email, user.password) 15 | 16 | const userIsLoggedIn = await homepage.userIsLoggedIn(); 17 | expect(userIsLoggedIn).toBeTruthy(); 18 | 19 | await homepage.goToSettings(); 20 | await new SettingsPage(page).logout(); 21 | 22 | const userIsLoggedOut = await new LogoutPage(page).userIsLoggedOut(); 23 | expect(userIsLoggedOut).toBeTruthy(); 24 | }); 25 | -------------------------------------------------------------------------------- /tests/testdata.ts: -------------------------------------------------------------------------------- 1 | export const user = { 2 | email: 'java1@selenium.test', 3 | password: 'JavaSeleniumTest1', 4 | }; 5 | --------------------------------------------------------------------------------