├── .dockerignore ├── .gitignore ├── .prettierrc ├── Dockerfile ├── LICENSE ├── README.md ├── config ├── configLoader.ts ├── data │ └── data.json ├── environment │ ├── qa.json │ └── uat.json └── testManager.ts ├── global-teardown.ts ├── package-lock.json ├── package.json ├── pageObjectModel ├── LoginPage.ts ├── ProfilePage.ts └── commonActions.ts ├── playwright.config.ts ├── src ├── AuthConfig.ts ├── api │ └── client.ts ├── core │ ├── lighthouse.js │ └── logger.ts └── http │ ├── AxiosHttpClient.ts │ └── HttpClient.ts └── tests ├── Login.test.ts ├── Profile.test.ts └── api └── example.test.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | test-results/ 3 | allure-results/ 4 | allure-report/ 5 | Downloads/ 6 | reports/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directories 7 | node_modules/ 8 | 9 | # Reporting and other files 10 | /test-results/ 11 | /playwright-report/ 12 | /playwright/.cache/ 13 | /allure-results/ 14 | /allure-report/ 15 | /html-report/ 16 | /Downloads/ 17 | /test-results/ 18 | /playwright-report/ 19 | /playwright/.cache/ 20 | /test-results/ 21 | /playwright-report/ 22 | /playwright/.cache/ 23 | /test-results/ 24 | /playwright-report/ 25 | /playwright/.cache/ 26 | reports/ 27 | 28 | # lighthouse reports 29 | 30 | LighthouseReport.html 31 | 32 | # npmjs 33 | 34 | .npmrc 35 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 160, 4 | "tabWidth": 4, 5 | "trailingComma": "es5", 6 | "semi": false, 7 | "endOfLine": "auto" 8 | } 9 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/playwright:v1.34.3-jammy 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json ./ 6 | 7 | RUN npm ci 8 | 9 | #Install chrome on the container 10 | RUN npx playwright install chrome 11 | 12 | COPY . . 13 | 14 | #Add user named "tester" 15 | RUN useradd -m tester 16 | 17 | #Giving Read/Write perms to the project "/app" 18 | RUN chown -R tester /app 19 | 20 | #Switch from root to tester 21 | USER tester 22 | 23 | # Run test 24 | CMD ENV=qa npx playwright test --project=chrome -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Luca Ahumada 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Script Savvy: end-to-end Automation Framework 2 | 3 |

4 | 5 |

6 |

7 | 8 | 9 |

10 |

11 | 12 | 13 | 14 | 15 |

16 | 17 | ## About the project 18 | 19 | This is a **Test Automation Framework** working as a boilerplate to run end-to-end testing using Playwright. **Script Savvy** brings to the table different tools and best coding practices to ensure a high quality development in your test. 20 | 21 | Top Features: 22 | 23 | - Cross-language: write your code in JavaScript or TypeScript. 24 | - Cross-browser: support for Chrome, Firefox, Edge or Safari. 25 | - Cross-platform: test on Windows, Linux, macOS, locally or CI. 26 | - Mobile testing: native support for Chrome (Android) and Safari (iOS). 27 | - API testing: test and validate endpoint all in one place. 28 | - Paralelism: stage and run multiple test at the same time. 29 | - Extended: Playwright based with additional tools and features. 30 | - Extras: wondering what else can Script Savvy do? Check out Savvy docs! 31 | 32 | ## Structure 33 | 34 | ``` 35 | ├── config 36 | │ ├── data 37 | │ │ ├── data.json 38 | │ ├── environment 39 | │ │ ├── configLoader.ts 40 | │ │ ├── testManager.ts 41 | ├── logs 42 | ├── pageObjects 43 | │ ├── LoginPage.ts 44 | │ └── ProfilePage.ts 45 | ├── performance 46 | │ ├── runner.js 47 | │ └── test-scenario.js 48 | ├── reports 49 | │ ├── allure-reports 50 | │ ├── artifacts 51 | │ ├── html-reports 52 | │ ├── lighthouse 53 | ├── src 54 | │ ├── api 55 | │ │ └── client.ts 56 | │ ├── core 57 | │ │ ├── dataHandler.ts 58 | │ │ ├── logger.ts 59 | │ │ └── testHandler.ts 60 | │ ├── http 61 | │ │ ├── httpClient.ts 62 | │ │ └── axiosHttpClient.ts 63 | │ └── authConfig.ts 64 | ├── tests 65 | │ ├── login.test.ts 66 | │ ├── profile.test.ts 67 | │ └── api 68 | │ └── example.test.ts 69 | ├── utils 70 | │ ├── lighthouse.js 71 | │ └── testConfig.ts 72 | 73 | ``` -------------------------------------------------------------------------------- /config/configLoader.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs' 2 | 3 | export function loadEnvironmentConfig(env: string): any { 4 | const configPath = `./config/environment/${env}.json` 5 | try { 6 | const configData = JSON.parse(fs.readFileSync(configPath, 'utf8')) 7 | return configData 8 | } catch (error) { 9 | throw new Error(`Error loading environment config for ${env}: ${error.message}`) 10 | } 11 | } 12 | 13 | export function loadTestDataConfig(data: string): any { 14 | const configPath = `./config/data/${data}.json` 15 | try { 16 | const configData = JSON.parse(fs.readFileSync(configPath, 'utf8')) 17 | return configData 18 | } catch (error) { 19 | throw new Error(`Error loading test data config for ${data}: ${error.message}`) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /config/data/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Luca", 3 | "lastname": "Ahumada", 4 | "birthdate": "25-10-1996", 5 | "city": "Mendoza", 6 | "country": "Argentina" 7 | } -------------------------------------------------------------------------------- /config/environment/qa.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseURL": "https://underc0de.org/foro", 3 | "username": "test.playc0de@gmail.com", 4 | "password": "@Underc0de" 5 | } -------------------------------------------------------------------------------- /config/environment/uat.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseURL": "https://your-website.url", 3 | "username": "Underc0de", 4 | "password": "@Underc0de" 5 | } -------------------------------------------------------------------------------- /config/testManager.ts: -------------------------------------------------------------------------------- 1 | import { test as baseTest } from '@playwright/test' 2 | import { LoginPage } from '../pageObjectModel/LoginPage' 3 | import { ProfilePage } from '../pageObjectModel/ProfilePage' 4 | 5 | const environment = process.env.TEST || 'qa' 6 | 7 | const test = baseTest.extend<{ 8 | loginPage: LoginPage 9 | profilePage: ProfilePage 10 | }>({ 11 | loginPage: async ({ page, context }, use) => { 12 | const loginPage = new LoginPage(page, context, environment) 13 | await use(loginPage) 14 | }, 15 | profilePage: async ({ page, context }, use) => { 16 | const profilePage = new ProfilePage(page, context, environment) 17 | await use(profilePage) 18 | }, 19 | }) 20 | 21 | export default test 22 | -------------------------------------------------------------------------------- /global-teardown.ts: -------------------------------------------------------------------------------- 1 | import logger from './src/core/logger' 2 | import * as fs from 'fs-extra'; 3 | import { execSync } from 'child_process'; 4 | 5 | const copyHistoryFolder = () => { 6 | try { 7 | fs.copySync('./allure-report/history', './allure-results/history'); 8 | } catch (error) { 9 | logger.error('Error copying history folder:', error); 10 | } 11 | }; 12 | 13 | const generateAllureReport = () => { 14 | try { 15 | execSync('allure generate --clean ./allure-results', { stdio: 'inherit' }); 16 | } catch (error) { 17 | logger.error('Error generating Allure report:', error); 18 | } 19 | }; 20 | 21 | const openAllureReport = () => { 22 | try { 23 | execSync('allure open', { stdio: 'inherit' }); 24 | } catch (error) { 25 | logger.error('Error opening Allure report:', error); 26 | } 27 | }; 28 | 29 | export default async function globalTeardown() { 30 | copyHistoryFolder(); 31 | generateAllureReport(); 32 | openAllureReport(); 33 | } 34 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@script-savvy/playwright", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@script-savvy/playwright", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@datadog/browser-logs": "^4.50.0", 13 | "axios": "^1.5.1", 14 | "dotenv": "^16.3.1", 15 | "express": "^4.18.2", 16 | "fs-extra": "^11.1.1", 17 | "winston": "^3.11.0" 18 | }, 19 | "devDependencies": { 20 | "@playwright/test": "^1.38.1", 21 | "@types/node": "^20.8.3", 22 | "allure-commandline": "^2.24.1", 23 | "allure-playwright": "^2.9.2", 24 | "k6": "^0.0.0", 25 | "lighthouse": "^9.6.8", 26 | "open-cli": "^7.2.0", 27 | "typescript": "^5.2.2", 28 | "winston-logs-display": "^1.0.0" 29 | }, 30 | "engines": { 31 | "node": ">=14.0.0" 32 | } 33 | }, 34 | "node_modules/@babel/code-frame": { 35 | "version": "7.21.4", 36 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", 37 | "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", 38 | "dev": true, 39 | "dependencies": { 40 | "@babel/highlight": "^7.18.6" 41 | }, 42 | "engines": { 43 | "node": ">=6.9.0" 44 | } 45 | }, 46 | "node_modules/@babel/helper-validator-identifier": { 47 | "version": "7.19.1", 48 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 49 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 50 | "dev": true, 51 | "engines": { 52 | "node": ">=6.9.0" 53 | } 54 | }, 55 | "node_modules/@babel/highlight": { 56 | "version": "7.18.6", 57 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 58 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 59 | "dev": true, 60 | "dependencies": { 61 | "@babel/helper-validator-identifier": "^7.18.6", 62 | "chalk": "^2.0.0", 63 | "js-tokens": "^4.0.0" 64 | }, 65 | "engines": { 66 | "node": ">=6.9.0" 67 | } 68 | }, 69 | "node_modules/@colors/colors": { 70 | "version": "1.5.0", 71 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", 72 | "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", 73 | "engines": { 74 | "node": ">=0.1.90" 75 | } 76 | }, 77 | "node_modules/@dabh/diagnostics": { 78 | "version": "2.0.3", 79 | "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", 80 | "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", 81 | "dependencies": { 82 | "colorspace": "1.1.x", 83 | "enabled": "2.0.x", 84 | "kuler": "^2.0.0" 85 | } 86 | }, 87 | "node_modules/@datadog/browser-core": { 88 | "version": "4.50.0", 89 | "resolved": "https://registry.npmjs.org/@datadog/browser-core/-/browser-core-4.50.0.tgz", 90 | "integrity": "sha512-I5fRko3h3xAbH/pktCFyGi6LaktL4E0KbBnYn0dcHE8fv/CHCSmAuz3bne5bElMIyzHRGZa1T7f8ttPFXTAZPw==" 91 | }, 92 | "node_modules/@datadog/browser-logs": { 93 | "version": "4.50.0", 94 | "resolved": "https://registry.npmjs.org/@datadog/browser-logs/-/browser-logs-4.50.0.tgz", 95 | "integrity": "sha512-thKfGGONhb4fM1U8QqUK2VPlZDoJ8FM1ncVjzwOviGrnl8s8f8eJvjZEhWAJk1IaMnonwUHfbZfJChASw/Nl2A==", 96 | "dependencies": { 97 | "@datadog/browser-core": "4.50.0" 98 | }, 99 | "peerDependencies": { 100 | "@datadog/browser-rum": "4.50.0" 101 | }, 102 | "peerDependenciesMeta": { 103 | "@datadog/browser-rum": { 104 | "optional": true 105 | } 106 | } 107 | }, 108 | "node_modules/@playwright/test": { 109 | "version": "1.38.1", 110 | "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.1.tgz", 111 | "integrity": "sha512-NqRp8XMwj3AK+zKLbZShl0r/9wKgzqI/527bkptKXomtuo+dOjU9NdMASQ8DNC9z9zLOMbG53T4eihYr3XR+BQ==", 112 | "dev": true, 113 | "dependencies": { 114 | "playwright": "1.38.1" 115 | }, 116 | "bin": { 117 | "playwright": "cli.js" 118 | }, 119 | "engines": { 120 | "node": ">=16" 121 | } 122 | }, 123 | "node_modules/@sentry/core": { 124 | "version": "6.19.7", 125 | "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", 126 | "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", 127 | "dev": true, 128 | "dependencies": { 129 | "@sentry/hub": "6.19.7", 130 | "@sentry/minimal": "6.19.7", 131 | "@sentry/types": "6.19.7", 132 | "@sentry/utils": "6.19.7", 133 | "tslib": "^1.9.3" 134 | }, 135 | "engines": { 136 | "node": ">=6" 137 | } 138 | }, 139 | "node_modules/@sentry/hub": { 140 | "version": "6.19.7", 141 | "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", 142 | "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", 143 | "dev": true, 144 | "dependencies": { 145 | "@sentry/types": "6.19.7", 146 | "@sentry/utils": "6.19.7", 147 | "tslib": "^1.9.3" 148 | }, 149 | "engines": { 150 | "node": ">=6" 151 | } 152 | }, 153 | "node_modules/@sentry/minimal": { 154 | "version": "6.19.7", 155 | "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", 156 | "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", 157 | "dev": true, 158 | "dependencies": { 159 | "@sentry/hub": "6.19.7", 160 | "@sentry/types": "6.19.7", 161 | "tslib": "^1.9.3" 162 | }, 163 | "engines": { 164 | "node": ">=6" 165 | } 166 | }, 167 | "node_modules/@sentry/node": { 168 | "version": "6.19.7", 169 | "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", 170 | "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", 171 | "dev": true, 172 | "dependencies": { 173 | "@sentry/core": "6.19.7", 174 | "@sentry/hub": "6.19.7", 175 | "@sentry/types": "6.19.7", 176 | "@sentry/utils": "6.19.7", 177 | "cookie": "^0.4.1", 178 | "https-proxy-agent": "^5.0.0", 179 | "lru_map": "^0.3.3", 180 | "tslib": "^1.9.3" 181 | }, 182 | "engines": { 183 | "node": ">=6" 184 | } 185 | }, 186 | "node_modules/@sentry/types": { 187 | "version": "6.19.7", 188 | "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", 189 | "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", 190 | "dev": true, 191 | "engines": { 192 | "node": ">=6" 193 | } 194 | }, 195 | "node_modules/@sentry/utils": { 196 | "version": "6.19.7", 197 | "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", 198 | "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", 199 | "dev": true, 200 | "dependencies": { 201 | "@sentry/types": "6.19.7", 202 | "tslib": "^1.9.3" 203 | }, 204 | "engines": { 205 | "node": ">=6" 206 | } 207 | }, 208 | "node_modules/@tokenizer/token": { 209 | "version": "0.3.0", 210 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 211 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", 212 | "dev": true 213 | }, 214 | "node_modules/@types/minimist": { 215 | "version": "1.2.2", 216 | "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", 217 | "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", 218 | "dev": true 219 | }, 220 | "node_modules/@types/node": { 221 | "version": "20.8.3", 222 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz", 223 | "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", 224 | "dev": true 225 | }, 226 | "node_modules/@types/normalize-package-data": { 227 | "version": "2.4.1", 228 | "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", 229 | "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", 230 | "dev": true 231 | }, 232 | "node_modules/@types/triple-beam": { 233 | "version": "1.3.2", 234 | "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", 235 | "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" 236 | }, 237 | "node_modules/@types/yauzl": { 238 | "version": "2.10.0", 239 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", 240 | "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", 241 | "dev": true, 242 | "optional": true, 243 | "dependencies": { 244 | "@types/node": "*" 245 | } 246 | }, 247 | "node_modules/accepts": { 248 | "version": "1.3.8", 249 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 250 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 251 | "dependencies": { 252 | "mime-types": "~2.1.34", 253 | "negotiator": "0.6.3" 254 | }, 255 | "engines": { 256 | "node": ">= 0.6" 257 | } 258 | }, 259 | "node_modules/acorn": { 260 | "version": "2.7.0", 261 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 262 | "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", 263 | "dev": true, 264 | "bin": { 265 | "acorn": "bin/acorn" 266 | }, 267 | "engines": { 268 | "node": ">=0.4.0" 269 | } 270 | }, 271 | "node_modules/acorn-globals": { 272 | "version": "1.0.9", 273 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", 274 | "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", 275 | "dev": true, 276 | "dependencies": { 277 | "acorn": "^2.1.0" 278 | } 279 | }, 280 | "node_modules/agent-base": { 281 | "version": "6.0.2", 282 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 283 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 284 | "dev": true, 285 | "dependencies": { 286 | "debug": "4" 287 | }, 288 | "engines": { 289 | "node": ">= 6.0.0" 290 | } 291 | }, 292 | "node_modules/align-text": { 293 | "version": "0.1.4", 294 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 295 | "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", 296 | "dev": true, 297 | "dependencies": { 298 | "kind-of": "^3.0.2", 299 | "longest": "^1.0.1", 300 | "repeat-string": "^1.5.2" 301 | }, 302 | "engines": { 303 | "node": ">=0.10.0" 304 | } 305 | }, 306 | "node_modules/align-text/node_modules/kind-of": { 307 | "version": "3.2.2", 308 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 309 | "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", 310 | "dev": true, 311 | "dependencies": { 312 | "is-buffer": "^1.1.5" 313 | }, 314 | "engines": { 315 | "node": ">=0.10.0" 316 | } 317 | }, 318 | "node_modules/allure-commandline": { 319 | "version": "2.24.1", 320 | "resolved": "https://registry.npmjs.org/allure-commandline/-/allure-commandline-2.24.1.tgz", 321 | "integrity": "sha512-eNto3ipBq+O2B/f8/OwiS3E8R7jYENs3qv8jT7wMZmziYLANsISC9tX/FfEqR3FDiQlEOjkP7iyTEZ3ph53FPg==", 322 | "dev": true, 323 | "bin": { 324 | "allure": "bin/allure" 325 | } 326 | }, 327 | "node_modules/allure-js-commons": { 328 | "version": "2.9.2", 329 | "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-2.9.2.tgz", 330 | "integrity": "sha512-Qvi+zMZQruklqcnqG/zHCnE209v1YiWGhO3H2aPW2aXC8Ockqd01a+w2lP4Qqp3SfC+WQDeAK2+pp+v+eNl8xQ==", 331 | "dev": true, 332 | "dependencies": { 333 | "properties": "^1.2.1" 334 | } 335 | }, 336 | "node_modules/allure-playwright": { 337 | "version": "2.9.2", 338 | "resolved": "https://registry.npmjs.org/allure-playwright/-/allure-playwright-2.9.2.tgz", 339 | "integrity": "sha512-N0X1c1GGLg74vdDAuq86KCekuvQ5BaqqpgcBpJj5x3y/RlQPBn84wlg8PT/ViKQM4EdbNFMXOXpa5Opufv6qCg==", 340 | "dev": true, 341 | "dependencies": { 342 | "allure-js-commons": "2.9.2" 343 | } 344 | }, 345 | "node_modules/amdefine": { 346 | "version": "1.0.1", 347 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 348 | "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", 349 | "dev": true, 350 | "engines": { 351 | "node": ">=0.4.2" 352 | } 353 | }, 354 | "node_modules/ansi-colors": { 355 | "version": "4.1.3", 356 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 357 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 358 | "dev": true, 359 | "engines": { 360 | "node": ">=6" 361 | } 362 | }, 363 | "node_modules/ansi-regex": { 364 | "version": "5.0.1", 365 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 366 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 367 | "dev": true, 368 | "engines": { 369 | "node": ">=8" 370 | } 371 | }, 372 | "node_modules/ansi-styles": { 373 | "version": "4.3.0", 374 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 375 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 376 | "dev": true, 377 | "dependencies": { 378 | "color-convert": "^2.0.1" 379 | }, 380 | "engines": { 381 | "node": ">=8" 382 | }, 383 | "funding": { 384 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 385 | } 386 | }, 387 | "node_modules/array-flatten": { 388 | "version": "1.1.1", 389 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 390 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 391 | }, 392 | "node_modules/arrify": { 393 | "version": "1.0.1", 394 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 395 | "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", 396 | "dev": true, 397 | "engines": { 398 | "node": ">=0.10.0" 399 | } 400 | }, 401 | "node_modules/asap": { 402 | "version": "1.0.0", 403 | "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", 404 | "integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==", 405 | "dev": true 406 | }, 407 | "node_modules/async": { 408 | "version": "3.2.4", 409 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 410 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" 411 | }, 412 | "node_modules/asynckit": { 413 | "version": "0.4.0", 414 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 415 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 416 | }, 417 | "node_modules/axe-core": { 418 | "version": "4.4.1", 419 | "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", 420 | "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", 421 | "dev": true, 422 | "engines": { 423 | "node": ">=4" 424 | } 425 | }, 426 | "node_modules/axios": { 427 | "version": "1.5.1", 428 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", 429 | "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", 430 | "dependencies": { 431 | "follow-redirects": "^1.15.0", 432 | "form-data": "^4.0.0", 433 | "proxy-from-env": "^1.1.0" 434 | } 435 | }, 436 | "node_modules/balanced-match": { 437 | "version": "1.0.2", 438 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 439 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 440 | "dev": true 441 | }, 442 | "node_modules/base64-js": { 443 | "version": "1.5.1", 444 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 445 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 446 | "dev": true, 447 | "funding": [ 448 | { 449 | "type": "github", 450 | "url": "https://github.com/sponsors/feross" 451 | }, 452 | { 453 | "type": "patreon", 454 | "url": "https://www.patreon.com/feross" 455 | }, 456 | { 457 | "type": "consulting", 458 | "url": "https://feross.org/support" 459 | } 460 | ] 461 | }, 462 | "node_modules/big-integer": { 463 | "version": "1.6.51", 464 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", 465 | "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", 466 | "dev": true, 467 | "engines": { 468 | "node": ">=0.6" 469 | } 470 | }, 471 | "node_modules/bl": { 472 | "version": "4.1.0", 473 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 474 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 475 | "dev": true, 476 | "dependencies": { 477 | "buffer": "^5.5.0", 478 | "inherits": "^2.0.4", 479 | "readable-stream": "^3.4.0" 480 | } 481 | }, 482 | "node_modules/bluebird": { 483 | "version": "3.7.2", 484 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 485 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 486 | "dev": true 487 | }, 488 | "node_modules/body-parser": { 489 | "version": "1.20.1", 490 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 491 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 492 | "dependencies": { 493 | "bytes": "3.1.2", 494 | "content-type": "~1.0.4", 495 | "debug": "2.6.9", 496 | "depd": "2.0.0", 497 | "destroy": "1.2.0", 498 | "http-errors": "2.0.0", 499 | "iconv-lite": "0.4.24", 500 | "on-finished": "2.4.1", 501 | "qs": "6.11.0", 502 | "raw-body": "2.5.1", 503 | "type-is": "~1.6.18", 504 | "unpipe": "1.0.0" 505 | }, 506 | "engines": { 507 | "node": ">= 0.8", 508 | "npm": "1.2.8000 || >= 1.4.16" 509 | } 510 | }, 511 | "node_modules/body-parser/node_modules/debug": { 512 | "version": "2.6.9", 513 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 514 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 515 | "dependencies": { 516 | "ms": "2.0.0" 517 | } 518 | }, 519 | "node_modules/body-parser/node_modules/ms": { 520 | "version": "2.0.0", 521 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 522 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 523 | }, 524 | "node_modules/bplist-parser": { 525 | "version": "0.2.0", 526 | "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", 527 | "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", 528 | "dev": true, 529 | "dependencies": { 530 | "big-integer": "^1.6.44" 531 | }, 532 | "engines": { 533 | "node": ">= 5.10.0" 534 | } 535 | }, 536 | "node_modules/brace-expansion": { 537 | "version": "1.1.11", 538 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 539 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 540 | "dev": true, 541 | "dependencies": { 542 | "balanced-match": "^1.0.0", 543 | "concat-map": "0.0.1" 544 | } 545 | }, 546 | "node_modules/buffer": { 547 | "version": "5.7.1", 548 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 549 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 550 | "dev": true, 551 | "funding": [ 552 | { 553 | "type": "github", 554 | "url": "https://github.com/sponsors/feross" 555 | }, 556 | { 557 | "type": "patreon", 558 | "url": "https://www.patreon.com/feross" 559 | }, 560 | { 561 | "type": "consulting", 562 | "url": "https://feross.org/support" 563 | } 564 | ], 565 | "dependencies": { 566 | "base64-js": "^1.3.1", 567 | "ieee754": "^1.1.13" 568 | } 569 | }, 570 | "node_modules/buffer-crc32": { 571 | "version": "0.2.13", 572 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 573 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 574 | "dev": true, 575 | "engines": { 576 | "node": "*" 577 | } 578 | }, 579 | "node_modules/bundle-name": { 580 | "version": "3.0.0", 581 | "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", 582 | "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", 583 | "dev": true, 584 | "dependencies": { 585 | "run-applescript": "^5.0.0" 586 | }, 587 | "engines": { 588 | "node": ">=12" 589 | }, 590 | "funding": { 591 | "url": "https://github.com/sponsors/sindresorhus" 592 | } 593 | }, 594 | "node_modules/bytes": { 595 | "version": "3.1.2", 596 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 597 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 598 | "engines": { 599 | "node": ">= 0.8" 600 | } 601 | }, 602 | "node_modules/call-bind": { 603 | "version": "1.0.2", 604 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 605 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 606 | "dependencies": { 607 | "function-bind": "^1.1.1", 608 | "get-intrinsic": "^1.0.2" 609 | }, 610 | "funding": { 611 | "url": "https://github.com/sponsors/ljharb" 612 | } 613 | }, 614 | "node_modules/camelcase": { 615 | "version": "7.0.1", 616 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", 617 | "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", 618 | "dev": true, 619 | "engines": { 620 | "node": ">=14.16" 621 | }, 622 | "funding": { 623 | "url": "https://github.com/sponsors/sindresorhus" 624 | } 625 | }, 626 | "node_modules/camelcase-keys": { 627 | "version": "8.0.2", 628 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", 629 | "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", 630 | "dev": true, 631 | "dependencies": { 632 | "camelcase": "^7.0.0", 633 | "map-obj": "^4.3.0", 634 | "quick-lru": "^6.1.1", 635 | "type-fest": "^2.13.0" 636 | }, 637 | "engines": { 638 | "node": ">=14.16" 639 | }, 640 | "funding": { 641 | "url": "https://github.com/sponsors/sindresorhus" 642 | } 643 | }, 644 | "node_modules/camelcase-keys/node_modules/type-fest": { 645 | "version": "2.19.0", 646 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", 647 | "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", 648 | "dev": true, 649 | "engines": { 650 | "node": ">=12.20" 651 | }, 652 | "funding": { 653 | "url": "https://github.com/sponsors/sindresorhus" 654 | } 655 | }, 656 | "node_modules/center-align": { 657 | "version": "0.1.3", 658 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 659 | "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", 660 | "dev": true, 661 | "dependencies": { 662 | "align-text": "^0.1.3", 663 | "lazy-cache": "^1.0.3" 664 | }, 665 | "engines": { 666 | "node": ">=0.10.0" 667 | } 668 | }, 669 | "node_modules/chalk": { 670 | "version": "2.4.2", 671 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 672 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 673 | "dev": true, 674 | "dependencies": { 675 | "ansi-styles": "^3.2.1", 676 | "escape-string-regexp": "^1.0.5", 677 | "supports-color": "^5.3.0" 678 | }, 679 | "engines": { 680 | "node": ">=4" 681 | } 682 | }, 683 | "node_modules/chalk/node_modules/ansi-styles": { 684 | "version": "3.2.1", 685 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 686 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 687 | "dev": true, 688 | "dependencies": { 689 | "color-convert": "^1.9.0" 690 | }, 691 | "engines": { 692 | "node": ">=4" 693 | } 694 | }, 695 | "node_modules/chalk/node_modules/color-convert": { 696 | "version": "1.9.3", 697 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 698 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 699 | "dev": true, 700 | "dependencies": { 701 | "color-name": "1.1.3" 702 | } 703 | }, 704 | "node_modules/chalk/node_modules/color-name": { 705 | "version": "1.1.3", 706 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 707 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 708 | "dev": true 709 | }, 710 | "node_modules/chalk/node_modules/escape-string-regexp": { 711 | "version": "1.0.5", 712 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 713 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 714 | "dev": true, 715 | "engines": { 716 | "node": ">=0.8.0" 717 | } 718 | }, 719 | "node_modules/character-parser": { 720 | "version": "1.2.1", 721 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", 722 | "integrity": "sha512-6OEBVBlf/y8LaAphnbAnt743O3zMhlBer+FO5D40H6wqAdU9B1TvuApkejgLW0cvv0tEZNLktv1AnRI+C87ueQ==", 723 | "dev": true 724 | }, 725 | "node_modules/chownr": { 726 | "version": "1.1.4", 727 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 728 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 729 | "dev": true 730 | }, 731 | "node_modules/chrome-launcher": { 732 | "version": "0.15.2", 733 | "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", 734 | "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", 735 | "dev": true, 736 | "dependencies": { 737 | "@types/node": "*", 738 | "escape-string-regexp": "^4.0.0", 739 | "is-wsl": "^2.2.0", 740 | "lighthouse-logger": "^1.0.0" 741 | }, 742 | "bin": { 743 | "print-chrome-path": "bin/print-chrome-path.js" 744 | }, 745 | "engines": { 746 | "node": ">=12.13.0" 747 | } 748 | }, 749 | "node_modules/clean-css": { 750 | "version": "3.4.28", 751 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", 752 | "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==", 753 | "dev": true, 754 | "dependencies": { 755 | "commander": "2.8.x", 756 | "source-map": "0.4.x" 757 | }, 758 | "bin": { 759 | "cleancss": "bin/cleancss" 760 | }, 761 | "engines": { 762 | "node": ">=0.10.0" 763 | } 764 | }, 765 | "node_modules/clean-css/node_modules/commander": { 766 | "version": "2.8.1", 767 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 768 | "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", 769 | "dev": true, 770 | "dependencies": { 771 | "graceful-readlink": ">= 1.0.0" 772 | }, 773 | "engines": { 774 | "node": ">= 0.6.x" 775 | } 776 | }, 777 | "node_modules/clean-css/node_modules/source-map": { 778 | "version": "0.4.4", 779 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 780 | "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", 781 | "dev": true, 782 | "dependencies": { 783 | "amdefine": ">=0.0.4" 784 | }, 785 | "engines": { 786 | "node": ">=0.8.0" 787 | } 788 | }, 789 | "node_modules/cliui": { 790 | "version": "8.0.1", 791 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 792 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 793 | "dev": true, 794 | "dependencies": { 795 | "string-width": "^4.2.0", 796 | "strip-ansi": "^6.0.1", 797 | "wrap-ansi": "^7.0.0" 798 | }, 799 | "engines": { 800 | "node": ">=12" 801 | } 802 | }, 803 | "node_modules/color": { 804 | "version": "3.2.1", 805 | "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", 806 | "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", 807 | "dependencies": { 808 | "color-convert": "^1.9.3", 809 | "color-string": "^1.6.0" 810 | } 811 | }, 812 | "node_modules/color-convert": { 813 | "version": "2.0.1", 814 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 815 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 816 | "dev": true, 817 | "dependencies": { 818 | "color-name": "~1.1.4" 819 | }, 820 | "engines": { 821 | "node": ">=7.0.0" 822 | } 823 | }, 824 | "node_modules/color-name": { 825 | "version": "1.1.4", 826 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 827 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 828 | }, 829 | "node_modules/color-string": { 830 | "version": "1.9.1", 831 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 832 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 833 | "dependencies": { 834 | "color-name": "^1.0.0", 835 | "simple-swizzle": "^0.2.2" 836 | } 837 | }, 838 | "node_modules/color/node_modules/color-convert": { 839 | "version": "1.9.3", 840 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 841 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 842 | "dependencies": { 843 | "color-name": "1.1.3" 844 | } 845 | }, 846 | "node_modules/color/node_modules/color-name": { 847 | "version": "1.1.3", 848 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 849 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 850 | }, 851 | "node_modules/colors": { 852 | "version": "1.0.3", 853 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 854 | "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", 855 | "dev": true, 856 | "engines": { 857 | "node": ">=0.1.90" 858 | } 859 | }, 860 | "node_modules/colorspace": { 861 | "version": "1.1.4", 862 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", 863 | "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", 864 | "dependencies": { 865 | "color": "^3.1.3", 866 | "text-hex": "1.0.x" 867 | } 868 | }, 869 | "node_modules/combined-stream": { 870 | "version": "1.0.8", 871 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 872 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 873 | "dependencies": { 874 | "delayed-stream": "~1.0.0" 875 | }, 876 | "engines": { 877 | "node": ">= 0.8" 878 | } 879 | }, 880 | "node_modules/concat-map": { 881 | "version": "0.0.1", 882 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 883 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 884 | "dev": true 885 | }, 886 | "node_modules/configstore": { 887 | "version": "5.0.1", 888 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", 889 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", 890 | "dev": true, 891 | "dependencies": { 892 | "dot-prop": "^5.2.0", 893 | "graceful-fs": "^4.1.2", 894 | "make-dir": "^3.0.0", 895 | "unique-string": "^2.0.0", 896 | "write-file-atomic": "^3.0.0", 897 | "xdg-basedir": "^4.0.0" 898 | }, 899 | "engines": { 900 | "node": ">=8" 901 | } 902 | }, 903 | "node_modules/constantinople": { 904 | "version": "3.0.2", 905 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", 906 | "integrity": "sha512-UnEggAQrmhxuTxlb7n1OsTtagNXWUv2CRlOogZhWOU4jLK4EJEbF8UDSNxuGu+jVtWNtO2j51ab2H1wlBIzF/w==", 907 | "deprecated": "Please update to at least constantinople 3.1.1", 908 | "dev": true, 909 | "dependencies": { 910 | "acorn": "^2.1.0" 911 | } 912 | }, 913 | "node_modules/content-disposition": { 914 | "version": "0.5.4", 915 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 916 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 917 | "dependencies": { 918 | "safe-buffer": "5.2.1" 919 | }, 920 | "engines": { 921 | "node": ">= 0.6" 922 | } 923 | }, 924 | "node_modules/content-type": { 925 | "version": "1.0.5", 926 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 927 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 928 | "engines": { 929 | "node": ">= 0.6" 930 | } 931 | }, 932 | "node_modules/cookie": { 933 | "version": "0.4.2", 934 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 935 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", 936 | "dev": true, 937 | "engines": { 938 | "node": ">= 0.6" 939 | } 940 | }, 941 | "node_modules/cookie-signature": { 942 | "version": "1.0.6", 943 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 944 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 945 | }, 946 | "node_modules/cross-fetch": { 947 | "version": "3.1.5", 948 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", 949 | "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", 950 | "dev": true, 951 | "dependencies": { 952 | "node-fetch": "2.6.7" 953 | } 954 | }, 955 | "node_modules/cross-spawn": { 956 | "version": "7.0.3", 957 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 958 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 959 | "dev": true, 960 | "dependencies": { 961 | "path-key": "^3.1.0", 962 | "shebang-command": "^2.0.0", 963 | "which": "^2.0.1" 964 | }, 965 | "engines": { 966 | "node": ">= 8" 967 | } 968 | }, 969 | "node_modules/crypto-random-string": { 970 | "version": "2.0.0", 971 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 972 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", 973 | "dev": true, 974 | "engines": { 975 | "node": ">=8" 976 | } 977 | }, 978 | "node_modules/csp_evaluator": { 979 | "version": "1.1.1", 980 | "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", 981 | "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==", 982 | "dev": true 983 | }, 984 | "node_modules/css": { 985 | "version": "1.0.8", 986 | "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", 987 | "integrity": "sha512-qmTYWhHk910nQWnGqMAiWWPQlB6tESiWgNebQJmiozOAGcBAQ1+U/UzUOkhdrcshlkSRRiKWodwmVvO0OmnIGg==", 988 | "dev": true, 989 | "dependencies": { 990 | "css-parse": "1.0.4", 991 | "css-stringify": "1.0.5" 992 | } 993 | }, 994 | "node_modules/css-parse": { 995 | "version": "1.0.4", 996 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", 997 | "integrity": "sha512-pfstzKVRZiHprDXdsmtfH1HYUEw22lzjuHdnpe1hscwoQvgW2C5zDQIBE0RKoALEReTn9W1ECdY8uaT/kO4VfA==", 998 | "dev": true 999 | }, 1000 | "node_modules/css-stringify": { 1001 | "version": "1.0.5", 1002 | "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", 1003 | "integrity": "sha512-aIThpcErhG5EyHorGqNlTh0TduNBqLrrXLO3x5rku3ZKBxuVfY+T7noyM2G2X/01iQANqJUb6d3+FLoa+N7Xwg==", 1004 | "dev": true 1005 | }, 1006 | "node_modules/cssom": { 1007 | "version": "0.3.8", 1008 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", 1009 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", 1010 | "dev": true 1011 | }, 1012 | "node_modules/cssstyle": { 1013 | "version": "1.2.1", 1014 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", 1015 | "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", 1016 | "dev": true, 1017 | "dependencies": { 1018 | "cssom": "0.3.x" 1019 | } 1020 | }, 1021 | "node_modules/cycle": { 1022 | "version": "1.0.3", 1023 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 1024 | "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", 1025 | "dev": true, 1026 | "engines": { 1027 | "node": ">=0.4.0" 1028 | } 1029 | }, 1030 | "node_modules/debug": { 1031 | "version": "4.3.4", 1032 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1033 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1034 | "dev": true, 1035 | "dependencies": { 1036 | "ms": "2.1.2" 1037 | }, 1038 | "engines": { 1039 | "node": ">=6.0" 1040 | }, 1041 | "peerDependenciesMeta": { 1042 | "supports-color": { 1043 | "optional": true 1044 | } 1045 | } 1046 | }, 1047 | "node_modules/decamelize": { 1048 | "version": "6.0.0", 1049 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", 1050 | "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", 1051 | "dev": true, 1052 | "engines": { 1053 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1054 | }, 1055 | "funding": { 1056 | "url": "https://github.com/sponsors/sindresorhus" 1057 | } 1058 | }, 1059 | "node_modules/decamelize-keys": { 1060 | "version": "1.1.1", 1061 | "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", 1062 | "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", 1063 | "dev": true, 1064 | "dependencies": { 1065 | "decamelize": "^1.1.0", 1066 | "map-obj": "^1.0.0" 1067 | }, 1068 | "engines": { 1069 | "node": ">=0.10.0" 1070 | }, 1071 | "funding": { 1072 | "url": "https://github.com/sponsors/sindresorhus" 1073 | } 1074 | }, 1075 | "node_modules/decamelize-keys/node_modules/decamelize": { 1076 | "version": "1.2.0", 1077 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 1078 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 1079 | "dev": true, 1080 | "engines": { 1081 | "node": ">=0.10.0" 1082 | } 1083 | }, 1084 | "node_modules/decamelize-keys/node_modules/map-obj": { 1085 | "version": "1.0.1", 1086 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 1087 | "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", 1088 | "dev": true, 1089 | "engines": { 1090 | "node": ">=0.10.0" 1091 | } 1092 | }, 1093 | "node_modules/default-browser": { 1094 | "version": "4.0.0", 1095 | "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", 1096 | "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", 1097 | "dev": true, 1098 | "dependencies": { 1099 | "bundle-name": "^3.0.0", 1100 | "default-browser-id": "^3.0.0", 1101 | "execa": "^7.1.1", 1102 | "titleize": "^3.0.0" 1103 | }, 1104 | "engines": { 1105 | "node": ">=14.16" 1106 | }, 1107 | "funding": { 1108 | "url": "https://github.com/sponsors/sindresorhus" 1109 | } 1110 | }, 1111 | "node_modules/default-browser-id": { 1112 | "version": "3.0.0", 1113 | "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", 1114 | "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", 1115 | "dev": true, 1116 | "dependencies": { 1117 | "bplist-parser": "^0.2.0", 1118 | "untildify": "^4.0.0" 1119 | }, 1120 | "engines": { 1121 | "node": ">=12" 1122 | }, 1123 | "funding": { 1124 | "url": "https://github.com/sponsors/sindresorhus" 1125 | } 1126 | }, 1127 | "node_modules/define-lazy-prop": { 1128 | "version": "2.0.0", 1129 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", 1130 | "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", 1131 | "dev": true, 1132 | "engines": { 1133 | "node": ">=8" 1134 | } 1135 | }, 1136 | "node_modules/delayed-stream": { 1137 | "version": "1.0.0", 1138 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1139 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1140 | "engines": { 1141 | "node": ">=0.4.0" 1142 | } 1143 | }, 1144 | "node_modules/depd": { 1145 | "version": "2.0.0", 1146 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1147 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 1148 | "engines": { 1149 | "node": ">= 0.8" 1150 | } 1151 | }, 1152 | "node_modules/destroy": { 1153 | "version": "1.2.0", 1154 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1155 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 1156 | "engines": { 1157 | "node": ">= 0.8", 1158 | "npm": "1.2.8000 || >= 1.4.16" 1159 | } 1160 | }, 1161 | "node_modules/devtools-protocol": { 1162 | "version": "0.0.981744", 1163 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", 1164 | "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", 1165 | "dev": true 1166 | }, 1167 | "node_modules/dot-prop": { 1168 | "version": "5.3.0", 1169 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", 1170 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", 1171 | "dev": true, 1172 | "dependencies": { 1173 | "is-obj": "^2.0.0" 1174 | }, 1175 | "engines": { 1176 | "node": ">=8" 1177 | } 1178 | }, 1179 | "node_modules/dotenv": { 1180 | "version": "16.3.1", 1181 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 1182 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", 1183 | "engines": { 1184 | "node": ">=12" 1185 | }, 1186 | "funding": { 1187 | "url": "https://github.com/motdotla/dotenv?sponsor=1" 1188 | } 1189 | }, 1190 | "node_modules/ee-first": { 1191 | "version": "1.1.1", 1192 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1193 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1194 | }, 1195 | "node_modules/emoji-regex": { 1196 | "version": "8.0.0", 1197 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1198 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1199 | "dev": true 1200 | }, 1201 | "node_modules/enabled": { 1202 | "version": "2.0.0", 1203 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", 1204 | "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" 1205 | }, 1206 | "node_modules/encodeurl": { 1207 | "version": "1.0.2", 1208 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1209 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1210 | "engines": { 1211 | "node": ">= 0.8" 1212 | } 1213 | }, 1214 | "node_modules/end-of-stream": { 1215 | "version": "1.4.4", 1216 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1217 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1218 | "dev": true, 1219 | "dependencies": { 1220 | "once": "^1.4.0" 1221 | } 1222 | }, 1223 | "node_modules/enquirer": { 1224 | "version": "2.3.6", 1225 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 1226 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 1227 | "dev": true, 1228 | "dependencies": { 1229 | "ansi-colors": "^4.1.1" 1230 | }, 1231 | "engines": { 1232 | "node": ">=8.6" 1233 | } 1234 | }, 1235 | "node_modules/error-ex": { 1236 | "version": "1.3.2", 1237 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1238 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1239 | "dev": true, 1240 | "dependencies": { 1241 | "is-arrayish": "^0.2.1" 1242 | } 1243 | }, 1244 | "node_modules/escalade": { 1245 | "version": "3.1.1", 1246 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1247 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1248 | "dev": true, 1249 | "engines": { 1250 | "node": ">=6" 1251 | } 1252 | }, 1253 | "node_modules/escape-html": { 1254 | "version": "1.0.3", 1255 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1256 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1257 | }, 1258 | "node_modules/escape-string-regexp": { 1259 | "version": "4.0.0", 1260 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1261 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1262 | "dev": true, 1263 | "engines": { 1264 | "node": ">=10" 1265 | }, 1266 | "funding": { 1267 | "url": "https://github.com/sponsors/sindresorhus" 1268 | } 1269 | }, 1270 | "node_modules/etag": { 1271 | "version": "1.8.1", 1272 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1273 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 1274 | "engines": { 1275 | "node": ">= 0.6" 1276 | } 1277 | }, 1278 | "node_modules/execa": { 1279 | "version": "7.1.1", 1280 | "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", 1281 | "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", 1282 | "dev": true, 1283 | "dependencies": { 1284 | "cross-spawn": "^7.0.3", 1285 | "get-stream": "^6.0.1", 1286 | "human-signals": "^4.3.0", 1287 | "is-stream": "^3.0.0", 1288 | "merge-stream": "^2.0.0", 1289 | "npm-run-path": "^5.1.0", 1290 | "onetime": "^6.0.0", 1291 | "signal-exit": "^3.0.7", 1292 | "strip-final-newline": "^3.0.0" 1293 | }, 1294 | "engines": { 1295 | "node": "^14.18.0 || ^16.14.0 || >=18.0.0" 1296 | }, 1297 | "funding": { 1298 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1299 | } 1300 | }, 1301 | "node_modules/execa/node_modules/get-stream": { 1302 | "version": "6.0.1", 1303 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1304 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1305 | "dev": true, 1306 | "engines": { 1307 | "node": ">=10" 1308 | }, 1309 | "funding": { 1310 | "url": "https://github.com/sponsors/sindresorhus" 1311 | } 1312 | }, 1313 | "node_modules/express": { 1314 | "version": "4.18.2", 1315 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1316 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1317 | "dependencies": { 1318 | "accepts": "~1.3.8", 1319 | "array-flatten": "1.1.1", 1320 | "body-parser": "1.20.1", 1321 | "content-disposition": "0.5.4", 1322 | "content-type": "~1.0.4", 1323 | "cookie": "0.5.0", 1324 | "cookie-signature": "1.0.6", 1325 | "debug": "2.6.9", 1326 | "depd": "2.0.0", 1327 | "encodeurl": "~1.0.2", 1328 | "escape-html": "~1.0.3", 1329 | "etag": "~1.8.1", 1330 | "finalhandler": "1.2.0", 1331 | "fresh": "0.5.2", 1332 | "http-errors": "2.0.0", 1333 | "merge-descriptors": "1.0.1", 1334 | "methods": "~1.1.2", 1335 | "on-finished": "2.4.1", 1336 | "parseurl": "~1.3.3", 1337 | "path-to-regexp": "0.1.7", 1338 | "proxy-addr": "~2.0.7", 1339 | "qs": "6.11.0", 1340 | "range-parser": "~1.2.1", 1341 | "safe-buffer": "5.2.1", 1342 | "send": "0.18.0", 1343 | "serve-static": "1.15.0", 1344 | "setprototypeof": "1.2.0", 1345 | "statuses": "2.0.1", 1346 | "type-is": "~1.6.18", 1347 | "utils-merge": "1.0.1", 1348 | "vary": "~1.1.2" 1349 | }, 1350 | "engines": { 1351 | "node": ">= 0.10.0" 1352 | } 1353 | }, 1354 | "node_modules/express/node_modules/cookie": { 1355 | "version": "0.5.0", 1356 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1357 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 1358 | "engines": { 1359 | "node": ">= 0.6" 1360 | } 1361 | }, 1362 | "node_modules/express/node_modules/debug": { 1363 | "version": "2.6.9", 1364 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1365 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1366 | "dependencies": { 1367 | "ms": "2.0.0" 1368 | } 1369 | }, 1370 | "node_modules/express/node_modules/ms": { 1371 | "version": "2.0.0", 1372 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1373 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1374 | }, 1375 | "node_modules/extract-zip": { 1376 | "version": "2.0.1", 1377 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 1378 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 1379 | "dev": true, 1380 | "dependencies": { 1381 | "debug": "^4.1.1", 1382 | "get-stream": "^5.1.0", 1383 | "yauzl": "^2.10.0" 1384 | }, 1385 | "bin": { 1386 | "extract-zip": "cli.js" 1387 | }, 1388 | "engines": { 1389 | "node": ">= 10.17.0" 1390 | }, 1391 | "optionalDependencies": { 1392 | "@types/yauzl": "^2.9.1" 1393 | } 1394 | }, 1395 | "node_modules/eyes": { 1396 | "version": "0.1.8", 1397 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 1398 | "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", 1399 | "dev": true, 1400 | "engines": { 1401 | "node": "> 0.1.90" 1402 | } 1403 | }, 1404 | "node_modules/fd-slicer": { 1405 | "version": "1.1.0", 1406 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 1407 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 1408 | "dev": true, 1409 | "dependencies": { 1410 | "pend": "~1.2.0" 1411 | } 1412 | }, 1413 | "node_modules/fecha": { 1414 | "version": "4.2.3", 1415 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", 1416 | "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" 1417 | }, 1418 | "node_modules/file-type": { 1419 | "version": "18.4.0", 1420 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", 1421 | "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", 1422 | "dev": true, 1423 | "dependencies": { 1424 | "readable-web-to-node-stream": "^3.0.2", 1425 | "strtok3": "^7.0.0", 1426 | "token-types": "^5.0.1" 1427 | }, 1428 | "engines": { 1429 | "node": ">=14.16" 1430 | }, 1431 | "funding": { 1432 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 1433 | } 1434 | }, 1435 | "node_modules/finalhandler": { 1436 | "version": "1.2.0", 1437 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1438 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1439 | "dependencies": { 1440 | "debug": "2.6.9", 1441 | "encodeurl": "~1.0.2", 1442 | "escape-html": "~1.0.3", 1443 | "on-finished": "2.4.1", 1444 | "parseurl": "~1.3.3", 1445 | "statuses": "2.0.1", 1446 | "unpipe": "~1.0.0" 1447 | }, 1448 | "engines": { 1449 | "node": ">= 0.8" 1450 | } 1451 | }, 1452 | "node_modules/finalhandler/node_modules/debug": { 1453 | "version": "2.6.9", 1454 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1455 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1456 | "dependencies": { 1457 | "ms": "2.0.0" 1458 | } 1459 | }, 1460 | "node_modules/finalhandler/node_modules/ms": { 1461 | "version": "2.0.0", 1462 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1463 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1464 | }, 1465 | "node_modules/find-up": { 1466 | "version": "4.1.0", 1467 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1468 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1469 | "dev": true, 1470 | "dependencies": { 1471 | "locate-path": "^5.0.0", 1472 | "path-exists": "^4.0.0" 1473 | }, 1474 | "engines": { 1475 | "node": ">=8" 1476 | } 1477 | }, 1478 | "node_modules/fn.name": { 1479 | "version": "1.1.0", 1480 | "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", 1481 | "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" 1482 | }, 1483 | "node_modules/follow-redirects": { 1484 | "version": "1.15.2", 1485 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1486 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 1487 | "funding": [ 1488 | { 1489 | "type": "individual", 1490 | "url": "https://github.com/sponsors/RubenVerborgh" 1491 | } 1492 | ], 1493 | "engines": { 1494 | "node": ">=4.0" 1495 | }, 1496 | "peerDependenciesMeta": { 1497 | "debug": { 1498 | "optional": true 1499 | } 1500 | } 1501 | }, 1502 | "node_modules/form-data": { 1503 | "version": "4.0.0", 1504 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1505 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1506 | "dependencies": { 1507 | "asynckit": "^0.4.0", 1508 | "combined-stream": "^1.0.8", 1509 | "mime-types": "^2.1.12" 1510 | }, 1511 | "engines": { 1512 | "node": ">= 6" 1513 | } 1514 | }, 1515 | "node_modules/forwarded": { 1516 | "version": "0.2.0", 1517 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1518 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1519 | "engines": { 1520 | "node": ">= 0.6" 1521 | } 1522 | }, 1523 | "node_modules/fresh": { 1524 | "version": "0.5.2", 1525 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1526 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1527 | "engines": { 1528 | "node": ">= 0.6" 1529 | } 1530 | }, 1531 | "node_modules/fs-constants": { 1532 | "version": "1.0.0", 1533 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1534 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 1535 | "dev": true 1536 | }, 1537 | "node_modules/fs-extra": { 1538 | "version": "11.1.1", 1539 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", 1540 | "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", 1541 | "dependencies": { 1542 | "graceful-fs": "^4.2.0", 1543 | "jsonfile": "^6.0.1", 1544 | "universalify": "^2.0.0" 1545 | }, 1546 | "engines": { 1547 | "node": ">=14.14" 1548 | } 1549 | }, 1550 | "node_modules/fs.realpath": { 1551 | "version": "1.0.0", 1552 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1553 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1554 | "dev": true 1555 | }, 1556 | "node_modules/fsevents": { 1557 | "version": "2.3.2", 1558 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1559 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1560 | "dev": true, 1561 | "hasInstallScript": true, 1562 | "optional": true, 1563 | "os": [ 1564 | "darwin" 1565 | ], 1566 | "engines": { 1567 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1568 | } 1569 | }, 1570 | "node_modules/function-bind": { 1571 | "version": "1.1.1", 1572 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1573 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1574 | }, 1575 | "node_modules/get-caller-file": { 1576 | "version": "2.0.5", 1577 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1578 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1579 | "dev": true, 1580 | "engines": { 1581 | "node": "6.* || 8.* || >= 10.*" 1582 | } 1583 | }, 1584 | "node_modules/get-intrinsic": { 1585 | "version": "1.2.1", 1586 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 1587 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 1588 | "dependencies": { 1589 | "function-bind": "^1.1.1", 1590 | "has": "^1.0.3", 1591 | "has-proto": "^1.0.1", 1592 | "has-symbols": "^1.0.3" 1593 | }, 1594 | "funding": { 1595 | "url": "https://github.com/sponsors/ljharb" 1596 | } 1597 | }, 1598 | "node_modules/get-stdin": { 1599 | "version": "9.0.0", 1600 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", 1601 | "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", 1602 | "dev": true, 1603 | "engines": { 1604 | "node": ">=12" 1605 | }, 1606 | "funding": { 1607 | "url": "https://github.com/sponsors/sindresorhus" 1608 | } 1609 | }, 1610 | "node_modules/get-stream": { 1611 | "version": "5.2.0", 1612 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1613 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1614 | "dev": true, 1615 | "dependencies": { 1616 | "pump": "^3.0.0" 1617 | }, 1618 | "engines": { 1619 | "node": ">=8" 1620 | }, 1621 | "funding": { 1622 | "url": "https://github.com/sponsors/sindresorhus" 1623 | } 1624 | }, 1625 | "node_modules/glob": { 1626 | "version": "7.2.3", 1627 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1628 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1629 | "dev": true, 1630 | "dependencies": { 1631 | "fs.realpath": "^1.0.0", 1632 | "inflight": "^1.0.4", 1633 | "inherits": "2", 1634 | "minimatch": "^3.1.1", 1635 | "once": "^1.3.0", 1636 | "path-is-absolute": "^1.0.0" 1637 | }, 1638 | "engines": { 1639 | "node": "*" 1640 | }, 1641 | "funding": { 1642 | "url": "https://github.com/sponsors/isaacs" 1643 | } 1644 | }, 1645 | "node_modules/graceful-fs": { 1646 | "version": "4.2.11", 1647 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1648 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 1649 | }, 1650 | "node_modules/graceful-readlink": { 1651 | "version": "1.0.1", 1652 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 1653 | "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", 1654 | "dev": true 1655 | }, 1656 | "node_modules/hard-rejection": { 1657 | "version": "2.1.0", 1658 | "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", 1659 | "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", 1660 | "dev": true, 1661 | "engines": { 1662 | "node": ">=6" 1663 | } 1664 | }, 1665 | "node_modules/has": { 1666 | "version": "1.0.3", 1667 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1668 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1669 | "dependencies": { 1670 | "function-bind": "^1.1.1" 1671 | }, 1672 | "engines": { 1673 | "node": ">= 0.4.0" 1674 | } 1675 | }, 1676 | "node_modules/has-flag": { 1677 | "version": "3.0.0", 1678 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1679 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1680 | "dev": true, 1681 | "engines": { 1682 | "node": ">=4" 1683 | } 1684 | }, 1685 | "node_modules/has-proto": { 1686 | "version": "1.0.1", 1687 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1688 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 1689 | "engines": { 1690 | "node": ">= 0.4" 1691 | }, 1692 | "funding": { 1693 | "url": "https://github.com/sponsors/ljharb" 1694 | } 1695 | }, 1696 | "node_modules/has-symbols": { 1697 | "version": "1.0.3", 1698 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1699 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1700 | "engines": { 1701 | "node": ">= 0.4" 1702 | }, 1703 | "funding": { 1704 | "url": "https://github.com/sponsors/ljharb" 1705 | } 1706 | }, 1707 | "node_modules/hosted-git-info": { 1708 | "version": "5.2.1", 1709 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", 1710 | "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", 1711 | "dev": true, 1712 | "dependencies": { 1713 | "lru-cache": "^7.5.1" 1714 | }, 1715 | "engines": { 1716 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1717 | } 1718 | }, 1719 | "node_modules/http-errors": { 1720 | "version": "2.0.0", 1721 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1722 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1723 | "dependencies": { 1724 | "depd": "2.0.0", 1725 | "inherits": "2.0.4", 1726 | "setprototypeof": "1.2.0", 1727 | "statuses": "2.0.1", 1728 | "toidentifier": "1.0.1" 1729 | }, 1730 | "engines": { 1731 | "node": ">= 0.8" 1732 | } 1733 | }, 1734 | "node_modules/http-link-header": { 1735 | "version": "0.8.0", 1736 | "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-0.8.0.tgz", 1737 | "integrity": "sha512-qsh/wKe1Mk1vtYEFr+LpQBFWTO1gxZQBdii2D0Umj+IUQ23r5sT088Rhpq4XzpSyIpaX7vwjB8Rrtx8u9JTg+Q==", 1738 | "dev": true 1739 | }, 1740 | "node_modules/https-proxy-agent": { 1741 | "version": "5.0.1", 1742 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1743 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1744 | "dev": true, 1745 | "dependencies": { 1746 | "agent-base": "6", 1747 | "debug": "4" 1748 | }, 1749 | "engines": { 1750 | "node": ">= 6" 1751 | } 1752 | }, 1753 | "node_modules/human-signals": { 1754 | "version": "4.3.1", 1755 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", 1756 | "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", 1757 | "dev": true, 1758 | "engines": { 1759 | "node": ">=14.18.0" 1760 | } 1761 | }, 1762 | "node_modules/iconv-lite": { 1763 | "version": "0.4.24", 1764 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1765 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1766 | "dependencies": { 1767 | "safer-buffer": ">= 2.1.2 < 3" 1768 | }, 1769 | "engines": { 1770 | "node": ">=0.10.0" 1771 | } 1772 | }, 1773 | "node_modules/ieee754": { 1774 | "version": "1.2.1", 1775 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1776 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1777 | "dev": true, 1778 | "funding": [ 1779 | { 1780 | "type": "github", 1781 | "url": "https://github.com/sponsors/feross" 1782 | }, 1783 | { 1784 | "type": "patreon", 1785 | "url": "https://www.patreon.com/feross" 1786 | }, 1787 | { 1788 | "type": "consulting", 1789 | "url": "https://feross.org/support" 1790 | } 1791 | ] 1792 | }, 1793 | "node_modules/image-ssim": { 1794 | "version": "0.2.0", 1795 | "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", 1796 | "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", 1797 | "dev": true 1798 | }, 1799 | "node_modules/imurmurhash": { 1800 | "version": "0.1.4", 1801 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1802 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1803 | "dev": true, 1804 | "engines": { 1805 | "node": ">=0.8.19" 1806 | } 1807 | }, 1808 | "node_modules/indent-string": { 1809 | "version": "5.0.0", 1810 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", 1811 | "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", 1812 | "dev": true, 1813 | "engines": { 1814 | "node": ">=12" 1815 | }, 1816 | "funding": { 1817 | "url": "https://github.com/sponsors/sindresorhus" 1818 | } 1819 | }, 1820 | "node_modules/inflight": { 1821 | "version": "1.0.6", 1822 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1823 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1824 | "dev": true, 1825 | "dependencies": { 1826 | "once": "^1.3.0", 1827 | "wrappy": "1" 1828 | } 1829 | }, 1830 | "node_modules/inherits": { 1831 | "version": "2.0.4", 1832 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1833 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1834 | }, 1835 | "node_modules/intl-messageformat": { 1836 | "version": "4.4.0", 1837 | "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", 1838 | "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", 1839 | "dev": true, 1840 | "dependencies": { 1841 | "intl-messageformat-parser": "^1.8.1" 1842 | } 1843 | }, 1844 | "node_modules/intl-messageformat-parser": { 1845 | "version": "1.8.1", 1846 | "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", 1847 | "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", 1848 | "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", 1849 | "dev": true 1850 | }, 1851 | "node_modules/ipaddr.js": { 1852 | "version": "1.9.1", 1853 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1854 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1855 | "engines": { 1856 | "node": ">= 0.10" 1857 | } 1858 | }, 1859 | "node_modules/is-arrayish": { 1860 | "version": "0.2.1", 1861 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1862 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 1863 | "dev": true 1864 | }, 1865 | "node_modules/is-buffer": { 1866 | "version": "1.1.6", 1867 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1868 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1869 | "dev": true 1870 | }, 1871 | "node_modules/is-core-module": { 1872 | "version": "2.13.0", 1873 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", 1874 | "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", 1875 | "dev": true, 1876 | "dependencies": { 1877 | "has": "^1.0.3" 1878 | }, 1879 | "funding": { 1880 | "url": "https://github.com/sponsors/ljharb" 1881 | } 1882 | }, 1883 | "node_modules/is-docker": { 1884 | "version": "2.2.1", 1885 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 1886 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 1887 | "dev": true, 1888 | "bin": { 1889 | "is-docker": "cli.js" 1890 | }, 1891 | "engines": { 1892 | "node": ">=8" 1893 | }, 1894 | "funding": { 1895 | "url": "https://github.com/sponsors/sindresorhus" 1896 | } 1897 | }, 1898 | "node_modules/is-fullwidth-code-point": { 1899 | "version": "3.0.0", 1900 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1901 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1902 | "dev": true, 1903 | "engines": { 1904 | "node": ">=8" 1905 | } 1906 | }, 1907 | "node_modules/is-inside-container": { 1908 | "version": "1.0.0", 1909 | "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 1910 | "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 1911 | "dev": true, 1912 | "dependencies": { 1913 | "is-docker": "^3.0.0" 1914 | }, 1915 | "bin": { 1916 | "is-inside-container": "cli.js" 1917 | }, 1918 | "engines": { 1919 | "node": ">=14.16" 1920 | }, 1921 | "funding": { 1922 | "url": "https://github.com/sponsors/sindresorhus" 1923 | } 1924 | }, 1925 | "node_modules/is-inside-container/node_modules/is-docker": { 1926 | "version": "3.0.0", 1927 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 1928 | "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 1929 | "dev": true, 1930 | "bin": { 1931 | "is-docker": "cli.js" 1932 | }, 1933 | "engines": { 1934 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1935 | }, 1936 | "funding": { 1937 | "url": "https://github.com/sponsors/sindresorhus" 1938 | } 1939 | }, 1940 | "node_modules/is-obj": { 1941 | "version": "2.0.0", 1942 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 1943 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", 1944 | "dev": true, 1945 | "engines": { 1946 | "node": ">=8" 1947 | } 1948 | }, 1949 | "node_modules/is-plain-obj": { 1950 | "version": "1.1.0", 1951 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 1952 | "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", 1953 | "dev": true, 1954 | "engines": { 1955 | "node": ">=0.10.0" 1956 | } 1957 | }, 1958 | "node_modules/is-promise": { 1959 | "version": "2.2.2", 1960 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 1961 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", 1962 | "dev": true 1963 | }, 1964 | "node_modules/is-stream": { 1965 | "version": "3.0.0", 1966 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", 1967 | "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", 1968 | "dev": true, 1969 | "engines": { 1970 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1971 | }, 1972 | "funding": { 1973 | "url": "https://github.com/sponsors/sindresorhus" 1974 | } 1975 | }, 1976 | "node_modules/is-typedarray": { 1977 | "version": "1.0.0", 1978 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1979 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", 1980 | "dev": true 1981 | }, 1982 | "node_modules/is-wsl": { 1983 | "version": "2.2.0", 1984 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 1985 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 1986 | "dev": true, 1987 | "dependencies": { 1988 | "is-docker": "^2.0.0" 1989 | }, 1990 | "engines": { 1991 | "node": ">=8" 1992 | } 1993 | }, 1994 | "node_modules/isexe": { 1995 | "version": "2.0.0", 1996 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1997 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1998 | "dev": true 1999 | }, 2000 | "node_modules/isstream": { 2001 | "version": "0.1.2", 2002 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 2003 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", 2004 | "dev": true 2005 | }, 2006 | "node_modules/jade": { 2007 | "version": "1.11.0", 2008 | "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", 2009 | "integrity": "sha512-J76sbGKeLtu7uwW97Ntzb1UvGnpKTDplYa9ROr2gNRhM+SxvlBSG0Ees3TQ8+7ya2UVkzMEeFxhRhEpN68s7Tg==", 2010 | "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", 2011 | "dev": true, 2012 | "dependencies": { 2013 | "character-parser": "1.2.1", 2014 | "clean-css": "^3.1.9", 2015 | "commander": "~2.6.0", 2016 | "constantinople": "~3.0.1", 2017 | "jstransformer": "0.0.2", 2018 | "mkdirp": "~0.5.0", 2019 | "transformers": "2.1.0", 2020 | "uglify-js": "^2.4.19", 2021 | "void-elements": "~2.0.1", 2022 | "with": "~4.0.0" 2023 | }, 2024 | "bin": { 2025 | "jade": "bin/jade.js" 2026 | } 2027 | }, 2028 | "node_modules/jade/node_modules/commander": { 2029 | "version": "2.6.0", 2030 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", 2031 | "integrity": "sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg==", 2032 | "dev": true, 2033 | "engines": { 2034 | "node": ">= 0.6.x" 2035 | } 2036 | }, 2037 | "node_modules/jade/node_modules/mkdirp": { 2038 | "version": "0.5.6", 2039 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 2040 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 2041 | "dev": true, 2042 | "dependencies": { 2043 | "minimist": "^1.2.6" 2044 | }, 2045 | "bin": { 2046 | "mkdirp": "bin/cmd.js" 2047 | } 2048 | }, 2049 | "node_modules/jpeg-js": { 2050 | "version": "0.4.4", 2051 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", 2052 | "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", 2053 | "dev": true 2054 | }, 2055 | "node_modules/js-library-detector": { 2056 | "version": "6.6.0", 2057 | "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.6.0.tgz", 2058 | "integrity": "sha512-z8OkDmXALZ22bIzBtIW8cpJ39MV93/Zu1rWrFdhsNw+sity2rOLaGT2kfWWQ6mnRTWs4ddONY5kiroA8e98Gvg==", 2059 | "dev": true, 2060 | "engines": { 2061 | "node": ">=12" 2062 | } 2063 | }, 2064 | "node_modules/js-tokens": { 2065 | "version": "4.0.0", 2066 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2067 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2068 | "dev": true 2069 | }, 2070 | "node_modules/json-parse-even-better-errors": { 2071 | "version": "2.3.1", 2072 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2073 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2074 | "dev": true 2075 | }, 2076 | "node_modules/jsonfile": { 2077 | "version": "6.1.0", 2078 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 2079 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 2080 | "dependencies": { 2081 | "universalify": "^2.0.0" 2082 | }, 2083 | "optionalDependencies": { 2084 | "graceful-fs": "^4.1.6" 2085 | } 2086 | }, 2087 | "node_modules/jstransformer": { 2088 | "version": "0.0.2", 2089 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", 2090 | "integrity": "sha512-b7tmf91j1ChMuYhwbPBnNgB62dmHuqiHpOdd6QLKzde8HydZqm+ud3qWreGWecSxPBFFNOf1Ozjx0xo2plFdHA==", 2091 | "dev": true, 2092 | "dependencies": { 2093 | "is-promise": "^2.0.0", 2094 | "promise": "^6.0.1" 2095 | } 2096 | }, 2097 | "node_modules/k6": { 2098 | "version": "0.0.0", 2099 | "resolved": "https://registry.npmjs.org/k6/-/k6-0.0.0.tgz", 2100 | "integrity": "sha512-GAQSWayS2+LjbH5bkRi+pMPYyP1JSp7o+4j58ANZ762N/RH/SdlAT3CHHztnn8s/xgg8kYNM24Gd2IPo9b5W+g==", 2101 | "dev": true 2102 | }, 2103 | "node_modules/kind-of": { 2104 | "version": "6.0.3", 2105 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 2106 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 2107 | "dev": true, 2108 | "engines": { 2109 | "node": ">=0.10.0" 2110 | } 2111 | }, 2112 | "node_modules/kuler": { 2113 | "version": "2.0.0", 2114 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", 2115 | "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" 2116 | }, 2117 | "node_modules/lazy-cache": { 2118 | "version": "1.0.4", 2119 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 2120 | "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", 2121 | "dev": true, 2122 | "engines": { 2123 | "node": ">=0.10.0" 2124 | } 2125 | }, 2126 | "node_modules/lighthouse": { 2127 | "version": "9.6.8", 2128 | "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-9.6.8.tgz", 2129 | "integrity": "sha512-5aRSvnqazci8D2oE7GJM6C7IStvUuMVV+74cGyBuS4n4NCixsDd6+uJdX834XiInSfo+OuVbAJCX4Xu6d2+N9Q==", 2130 | "dev": true, 2131 | "dependencies": { 2132 | "@sentry/node": "^6.17.4", 2133 | "axe-core": "4.4.1", 2134 | "chrome-launcher": "^0.15.0", 2135 | "configstore": "^5.0.1", 2136 | "csp_evaluator": "1.1.1", 2137 | "cssstyle": "1.2.1", 2138 | "enquirer": "^2.3.6", 2139 | "http-link-header": "^0.8.0", 2140 | "intl-messageformat": "^4.4.0", 2141 | "jpeg-js": "^0.4.3", 2142 | "js-library-detector": "^6.5.0", 2143 | "lighthouse-logger": "^1.3.0", 2144 | "lighthouse-stack-packs": "1.8.2", 2145 | "lodash": "^4.17.21", 2146 | "lookup-closest-locale": "6.2.0", 2147 | "metaviewport-parser": "0.2.0", 2148 | "open": "^8.4.0", 2149 | "parse-cache-control": "1.0.1", 2150 | "ps-list": "^8.0.0", 2151 | "puppeteer-core": "^13.7.0", 2152 | "robots-parser": "^3.0.0", 2153 | "semver": "^5.3.0", 2154 | "speedline-core": "^1.4.3", 2155 | "third-party-web": "^0.17.1", 2156 | "ws": "^7.0.0", 2157 | "yargs": "^17.3.1", 2158 | "yargs-parser": "^21.0.0" 2159 | }, 2160 | "bin": { 2161 | "chrome-debug": "lighthouse-core/scripts/manual-chrome-launcher.js", 2162 | "lighthouse": "lighthouse-cli/index.js", 2163 | "smokehouse": "lighthouse-cli/test/smokehouse/frontends/smokehouse-bin.js" 2164 | }, 2165 | "engines": { 2166 | "node": ">=14.15" 2167 | } 2168 | }, 2169 | "node_modules/lighthouse-logger": { 2170 | "version": "1.4.2", 2171 | "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", 2172 | "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", 2173 | "dev": true, 2174 | "dependencies": { 2175 | "debug": "^2.6.9", 2176 | "marky": "^1.2.2" 2177 | } 2178 | }, 2179 | "node_modules/lighthouse-logger/node_modules/debug": { 2180 | "version": "2.6.9", 2181 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2182 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2183 | "dev": true, 2184 | "dependencies": { 2185 | "ms": "2.0.0" 2186 | } 2187 | }, 2188 | "node_modules/lighthouse-logger/node_modules/ms": { 2189 | "version": "2.0.0", 2190 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2191 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 2192 | "dev": true 2193 | }, 2194 | "node_modules/lighthouse-stack-packs": { 2195 | "version": "1.8.2", 2196 | "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.8.2.tgz", 2197 | "integrity": "sha512-vlCUxxQAB8Nu6LQHqPpDRiMi06Du593/my/6JbMttQeEfJ7pf4OS8obSTh5xSOS80U/O7fq59Q8rQGAUxQatUQ==", 2198 | "dev": true 2199 | }, 2200 | "node_modules/lines-and-columns": { 2201 | "version": "1.2.4", 2202 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2203 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2204 | "dev": true 2205 | }, 2206 | "node_modules/locate-path": { 2207 | "version": "5.0.0", 2208 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2209 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2210 | "dev": true, 2211 | "dependencies": { 2212 | "p-locate": "^4.1.0" 2213 | }, 2214 | "engines": { 2215 | "node": ">=8" 2216 | } 2217 | }, 2218 | "node_modules/lodash": { 2219 | "version": "4.17.21", 2220 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2221 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2222 | "dev": true 2223 | }, 2224 | "node_modules/logform": { 2225 | "version": "2.5.1", 2226 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", 2227 | "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", 2228 | "dependencies": { 2229 | "@colors/colors": "1.5.0", 2230 | "@types/triple-beam": "^1.3.2", 2231 | "fecha": "^4.2.0", 2232 | "ms": "^2.1.1", 2233 | "safe-stable-stringify": "^2.3.1", 2234 | "triple-beam": "^1.3.0" 2235 | } 2236 | }, 2237 | "node_modules/longest": { 2238 | "version": "1.0.1", 2239 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 2240 | "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", 2241 | "dev": true, 2242 | "engines": { 2243 | "node": ">=0.10.0" 2244 | } 2245 | }, 2246 | "node_modules/lookup-closest-locale": { 2247 | "version": "6.2.0", 2248 | "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", 2249 | "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", 2250 | "dev": true 2251 | }, 2252 | "node_modules/lru_map": { 2253 | "version": "0.3.3", 2254 | "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", 2255 | "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", 2256 | "dev": true 2257 | }, 2258 | "node_modules/lru-cache": { 2259 | "version": "7.18.3", 2260 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 2261 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 2262 | "dev": true, 2263 | "engines": { 2264 | "node": ">=12" 2265 | } 2266 | }, 2267 | "node_modules/make-dir": { 2268 | "version": "3.1.0", 2269 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2270 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2271 | "dev": true, 2272 | "dependencies": { 2273 | "semver": "^6.0.0" 2274 | }, 2275 | "engines": { 2276 | "node": ">=8" 2277 | }, 2278 | "funding": { 2279 | "url": "https://github.com/sponsors/sindresorhus" 2280 | } 2281 | }, 2282 | "node_modules/make-dir/node_modules/semver": { 2283 | "version": "6.3.1", 2284 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2285 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2286 | "dev": true, 2287 | "bin": { 2288 | "semver": "bin/semver.js" 2289 | } 2290 | }, 2291 | "node_modules/map-obj": { 2292 | "version": "4.3.0", 2293 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", 2294 | "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", 2295 | "dev": true, 2296 | "engines": { 2297 | "node": ">=8" 2298 | }, 2299 | "funding": { 2300 | "url": "https://github.com/sponsors/sindresorhus" 2301 | } 2302 | }, 2303 | "node_modules/marky": { 2304 | "version": "1.2.5", 2305 | "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", 2306 | "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", 2307 | "dev": true 2308 | }, 2309 | "node_modules/media-typer": { 2310 | "version": "0.3.0", 2311 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2312 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 2313 | "engines": { 2314 | "node": ">= 0.6" 2315 | } 2316 | }, 2317 | "node_modules/meow": { 2318 | "version": "11.0.0", 2319 | "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", 2320 | "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", 2321 | "dev": true, 2322 | "dependencies": { 2323 | "@types/minimist": "^1.2.2", 2324 | "camelcase-keys": "^8.0.2", 2325 | "decamelize": "^6.0.0", 2326 | "decamelize-keys": "^1.1.0", 2327 | "hard-rejection": "^2.1.0", 2328 | "minimist-options": "4.1.0", 2329 | "normalize-package-data": "^4.0.1", 2330 | "read-pkg-up": "^9.1.0", 2331 | "redent": "^4.0.0", 2332 | "trim-newlines": "^4.0.2", 2333 | "type-fest": "^3.1.0", 2334 | "yargs-parser": "^21.1.1" 2335 | }, 2336 | "engines": { 2337 | "node": ">=14.16" 2338 | }, 2339 | "funding": { 2340 | "url": "https://github.com/sponsors/sindresorhus" 2341 | } 2342 | }, 2343 | "node_modules/merge-descriptors": { 2344 | "version": "1.0.1", 2345 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2346 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 2347 | }, 2348 | "node_modules/merge-stream": { 2349 | "version": "2.0.0", 2350 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2351 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2352 | "dev": true 2353 | }, 2354 | "node_modules/metaviewport-parser": { 2355 | "version": "0.2.0", 2356 | "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz", 2357 | "integrity": "sha512-qL5NtY18LGs7lvZCkj3ep2H4Pes9rIiSLZRUyfDdvVw7pWFA0eLwmqaIxApD74RGvUrNEtk9e5Wt1rT+VlCvGw==", 2358 | "dev": true 2359 | }, 2360 | "node_modules/methods": { 2361 | "version": "1.1.2", 2362 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2363 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 2364 | "engines": { 2365 | "node": ">= 0.6" 2366 | } 2367 | }, 2368 | "node_modules/mime": { 2369 | "version": "1.6.0", 2370 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2371 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 2372 | "bin": { 2373 | "mime": "cli.js" 2374 | }, 2375 | "engines": { 2376 | "node": ">=4" 2377 | } 2378 | }, 2379 | "node_modules/mime-db": { 2380 | "version": "1.52.0", 2381 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2382 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2383 | "engines": { 2384 | "node": ">= 0.6" 2385 | } 2386 | }, 2387 | "node_modules/mime-types": { 2388 | "version": "2.1.35", 2389 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2390 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2391 | "dependencies": { 2392 | "mime-db": "1.52.0" 2393 | }, 2394 | "engines": { 2395 | "node": ">= 0.6" 2396 | } 2397 | }, 2398 | "node_modules/mimic-fn": { 2399 | "version": "4.0.0", 2400 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 2401 | "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", 2402 | "dev": true, 2403 | "engines": { 2404 | "node": ">=12" 2405 | }, 2406 | "funding": { 2407 | "url": "https://github.com/sponsors/sindresorhus" 2408 | } 2409 | }, 2410 | "node_modules/min-indent": { 2411 | "version": "1.0.1", 2412 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 2413 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 2414 | "dev": true, 2415 | "engines": { 2416 | "node": ">=4" 2417 | } 2418 | }, 2419 | "node_modules/minimatch": { 2420 | "version": "3.1.2", 2421 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2422 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2423 | "dev": true, 2424 | "dependencies": { 2425 | "brace-expansion": "^1.1.7" 2426 | }, 2427 | "engines": { 2428 | "node": "*" 2429 | } 2430 | }, 2431 | "node_modules/minimist": { 2432 | "version": "1.2.8", 2433 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 2434 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 2435 | "dev": true, 2436 | "funding": { 2437 | "url": "https://github.com/sponsors/ljharb" 2438 | } 2439 | }, 2440 | "node_modules/minimist-options": { 2441 | "version": "4.1.0", 2442 | "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", 2443 | "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", 2444 | "dev": true, 2445 | "dependencies": { 2446 | "arrify": "^1.0.1", 2447 | "is-plain-obj": "^1.1.0", 2448 | "kind-of": "^6.0.3" 2449 | }, 2450 | "engines": { 2451 | "node": ">= 6" 2452 | } 2453 | }, 2454 | "node_modules/mkdirp-classic": { 2455 | "version": "0.5.3", 2456 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 2457 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 2458 | "dev": true 2459 | }, 2460 | "node_modules/ms": { 2461 | "version": "2.1.2", 2462 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2463 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2464 | }, 2465 | "node_modules/negotiator": { 2466 | "version": "0.6.3", 2467 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2468 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 2469 | "engines": { 2470 | "node": ">= 0.6" 2471 | } 2472 | }, 2473 | "node_modules/node-fetch": { 2474 | "version": "2.6.7", 2475 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 2476 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 2477 | "dev": true, 2478 | "dependencies": { 2479 | "whatwg-url": "^5.0.0" 2480 | }, 2481 | "engines": { 2482 | "node": "4.x || >=6.0.0" 2483 | }, 2484 | "peerDependencies": { 2485 | "encoding": "^0.1.0" 2486 | }, 2487 | "peerDependenciesMeta": { 2488 | "encoding": { 2489 | "optional": true 2490 | } 2491 | } 2492 | }, 2493 | "node_modules/normalize-package-data": { 2494 | "version": "4.0.1", 2495 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", 2496 | "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", 2497 | "dev": true, 2498 | "dependencies": { 2499 | "hosted-git-info": "^5.0.0", 2500 | "is-core-module": "^2.8.1", 2501 | "semver": "^7.3.5", 2502 | "validate-npm-package-license": "^3.0.4" 2503 | }, 2504 | "engines": { 2505 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 2506 | } 2507 | }, 2508 | "node_modules/normalize-package-data/node_modules/lru-cache": { 2509 | "version": "6.0.0", 2510 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2511 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2512 | "dev": true, 2513 | "dependencies": { 2514 | "yallist": "^4.0.0" 2515 | }, 2516 | "engines": { 2517 | "node": ">=10" 2518 | } 2519 | }, 2520 | "node_modules/normalize-package-data/node_modules/semver": { 2521 | "version": "7.5.4", 2522 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2523 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2524 | "dev": true, 2525 | "dependencies": { 2526 | "lru-cache": "^6.0.0" 2527 | }, 2528 | "bin": { 2529 | "semver": "bin/semver.js" 2530 | }, 2531 | "engines": { 2532 | "node": ">=10" 2533 | } 2534 | }, 2535 | "node_modules/npm-run-path": { 2536 | "version": "5.1.0", 2537 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", 2538 | "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", 2539 | "dev": true, 2540 | "dependencies": { 2541 | "path-key": "^4.0.0" 2542 | }, 2543 | "engines": { 2544 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2545 | }, 2546 | "funding": { 2547 | "url": "https://github.com/sponsors/sindresorhus" 2548 | } 2549 | }, 2550 | "node_modules/npm-run-path/node_modules/path-key": { 2551 | "version": "4.0.0", 2552 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 2553 | "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 2554 | "dev": true, 2555 | "engines": { 2556 | "node": ">=12" 2557 | }, 2558 | "funding": { 2559 | "url": "https://github.com/sponsors/sindresorhus" 2560 | } 2561 | }, 2562 | "node_modules/object-inspect": { 2563 | "version": "1.12.3", 2564 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 2565 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 2566 | "funding": { 2567 | "url": "https://github.com/sponsors/ljharb" 2568 | } 2569 | }, 2570 | "node_modules/on-finished": { 2571 | "version": "2.4.1", 2572 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2573 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2574 | "dependencies": { 2575 | "ee-first": "1.1.1" 2576 | }, 2577 | "engines": { 2578 | "node": ">= 0.8" 2579 | } 2580 | }, 2581 | "node_modules/once": { 2582 | "version": "1.4.0", 2583 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2584 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2585 | "dev": true, 2586 | "dependencies": { 2587 | "wrappy": "1" 2588 | } 2589 | }, 2590 | "node_modules/one-time": { 2591 | "version": "1.0.0", 2592 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", 2593 | "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", 2594 | "dependencies": { 2595 | "fn.name": "1.x.x" 2596 | } 2597 | }, 2598 | "node_modules/onetime": { 2599 | "version": "6.0.0", 2600 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", 2601 | "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", 2602 | "dev": true, 2603 | "dependencies": { 2604 | "mimic-fn": "^4.0.0" 2605 | }, 2606 | "engines": { 2607 | "node": ">=12" 2608 | }, 2609 | "funding": { 2610 | "url": "https://github.com/sponsors/sindresorhus" 2611 | } 2612 | }, 2613 | "node_modules/open": { 2614 | "version": "8.4.2", 2615 | "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", 2616 | "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", 2617 | "dev": true, 2618 | "dependencies": { 2619 | "define-lazy-prop": "^2.0.0", 2620 | "is-docker": "^2.1.1", 2621 | "is-wsl": "^2.2.0" 2622 | }, 2623 | "engines": { 2624 | "node": ">=12" 2625 | }, 2626 | "funding": { 2627 | "url": "https://github.com/sponsors/sindresorhus" 2628 | } 2629 | }, 2630 | "node_modules/open-cli": { 2631 | "version": "7.2.0", 2632 | "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.2.0.tgz", 2633 | "integrity": "sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==", 2634 | "dev": true, 2635 | "dependencies": { 2636 | "file-type": "^18.2.1", 2637 | "get-stdin": "^9.0.0", 2638 | "meow": "^11.0.0", 2639 | "open": "^9.0.0", 2640 | "tempy": "^3.0.0" 2641 | }, 2642 | "bin": { 2643 | "open-cli": "cli.js" 2644 | }, 2645 | "engines": { 2646 | "node": ">=14.16" 2647 | }, 2648 | "funding": { 2649 | "url": "https://github.com/sponsors/sindresorhus" 2650 | } 2651 | }, 2652 | "node_modules/open-cli/node_modules/define-lazy-prop": { 2653 | "version": "3.0.0", 2654 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", 2655 | "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", 2656 | "dev": true, 2657 | "engines": { 2658 | "node": ">=12" 2659 | }, 2660 | "funding": { 2661 | "url": "https://github.com/sponsors/sindresorhus" 2662 | } 2663 | }, 2664 | "node_modules/open-cli/node_modules/open": { 2665 | "version": "9.1.0", 2666 | "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", 2667 | "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", 2668 | "dev": true, 2669 | "dependencies": { 2670 | "default-browser": "^4.0.0", 2671 | "define-lazy-prop": "^3.0.0", 2672 | "is-inside-container": "^1.0.0", 2673 | "is-wsl": "^2.2.0" 2674 | }, 2675 | "engines": { 2676 | "node": ">=14.16" 2677 | }, 2678 | "funding": { 2679 | "url": "https://github.com/sponsors/sindresorhus" 2680 | } 2681 | }, 2682 | "node_modules/optimist": { 2683 | "version": "0.3.7", 2684 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 2685 | "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", 2686 | "dev": true, 2687 | "dependencies": { 2688 | "wordwrap": "~0.0.2" 2689 | } 2690 | }, 2691 | "node_modules/p-limit": { 2692 | "version": "2.3.0", 2693 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2694 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2695 | "dev": true, 2696 | "dependencies": { 2697 | "p-try": "^2.0.0" 2698 | }, 2699 | "engines": { 2700 | "node": ">=6" 2701 | }, 2702 | "funding": { 2703 | "url": "https://github.com/sponsors/sindresorhus" 2704 | } 2705 | }, 2706 | "node_modules/p-locate": { 2707 | "version": "4.1.0", 2708 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2709 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2710 | "dev": true, 2711 | "dependencies": { 2712 | "p-limit": "^2.2.0" 2713 | }, 2714 | "engines": { 2715 | "node": ">=8" 2716 | } 2717 | }, 2718 | "node_modules/p-try": { 2719 | "version": "2.2.0", 2720 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2721 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2722 | "dev": true, 2723 | "engines": { 2724 | "node": ">=6" 2725 | } 2726 | }, 2727 | "node_modules/parse-cache-control": { 2728 | "version": "1.0.1", 2729 | "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", 2730 | "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", 2731 | "dev": true 2732 | }, 2733 | "node_modules/parse-json": { 2734 | "version": "5.2.0", 2735 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2736 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2737 | "dev": true, 2738 | "dependencies": { 2739 | "@babel/code-frame": "^7.0.0", 2740 | "error-ex": "^1.3.1", 2741 | "json-parse-even-better-errors": "^2.3.0", 2742 | "lines-and-columns": "^1.1.6" 2743 | }, 2744 | "engines": { 2745 | "node": ">=8" 2746 | }, 2747 | "funding": { 2748 | "url": "https://github.com/sponsors/sindresorhus" 2749 | } 2750 | }, 2751 | "node_modules/parseurl": { 2752 | "version": "1.3.3", 2753 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2754 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 2755 | "engines": { 2756 | "node": ">= 0.8" 2757 | } 2758 | }, 2759 | "node_modules/path-exists": { 2760 | "version": "4.0.0", 2761 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2762 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2763 | "dev": true, 2764 | "engines": { 2765 | "node": ">=8" 2766 | } 2767 | }, 2768 | "node_modules/path-is-absolute": { 2769 | "version": "1.0.1", 2770 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2771 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2772 | "dev": true, 2773 | "engines": { 2774 | "node": ">=0.10.0" 2775 | } 2776 | }, 2777 | "node_modules/path-key": { 2778 | "version": "3.1.1", 2779 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2780 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2781 | "dev": true, 2782 | "engines": { 2783 | "node": ">=8" 2784 | } 2785 | }, 2786 | "node_modules/path-to-regexp": { 2787 | "version": "0.1.7", 2788 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2789 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 2790 | }, 2791 | "node_modules/peek-readable": { 2792 | "version": "5.0.0", 2793 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", 2794 | "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", 2795 | "dev": true, 2796 | "engines": { 2797 | "node": ">=14.16" 2798 | }, 2799 | "funding": { 2800 | "type": "github", 2801 | "url": "https://github.com/sponsors/Borewit" 2802 | } 2803 | }, 2804 | "node_modules/pend": { 2805 | "version": "1.2.0", 2806 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 2807 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 2808 | "dev": true 2809 | }, 2810 | "node_modules/pkg-dir": { 2811 | "version": "4.2.0", 2812 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2813 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2814 | "dev": true, 2815 | "dependencies": { 2816 | "find-up": "^4.0.0" 2817 | }, 2818 | "engines": { 2819 | "node": ">=8" 2820 | } 2821 | }, 2822 | "node_modules/playwright": { 2823 | "version": "1.38.1", 2824 | "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.1.tgz", 2825 | "integrity": "sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow==", 2826 | "dev": true, 2827 | "dependencies": { 2828 | "playwright-core": "1.38.1" 2829 | }, 2830 | "bin": { 2831 | "playwright": "cli.js" 2832 | }, 2833 | "engines": { 2834 | "node": ">=16" 2835 | }, 2836 | "optionalDependencies": { 2837 | "fsevents": "2.3.2" 2838 | } 2839 | }, 2840 | "node_modules/playwright-core": { 2841 | "version": "1.38.1", 2842 | "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.1.tgz", 2843 | "integrity": "sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==", 2844 | "dev": true, 2845 | "bin": { 2846 | "playwright-core": "cli.js" 2847 | }, 2848 | "engines": { 2849 | "node": ">=16" 2850 | } 2851 | }, 2852 | "node_modules/progress": { 2853 | "version": "2.0.3", 2854 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2855 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2856 | "dev": true, 2857 | "engines": { 2858 | "node": ">=0.4.0" 2859 | } 2860 | }, 2861 | "node_modules/promise": { 2862 | "version": "6.1.0", 2863 | "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", 2864 | "integrity": "sha512-O+uwGKreKNKkshzZv2P7N64lk6EP17iXBn0PbUnNQhk+Q0AHLstiTrjkx3v5YBd3cxUe7Sq6KyRhl/A0xUjk7Q==", 2865 | "dev": true, 2866 | "dependencies": { 2867 | "asap": "~1.0.0" 2868 | } 2869 | }, 2870 | "node_modules/properties": { 2871 | "version": "1.2.1", 2872 | "resolved": "https://registry.npmjs.org/properties/-/properties-1.2.1.tgz", 2873 | "integrity": "sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ==", 2874 | "dev": true, 2875 | "engines": { 2876 | "node": ">=0.10" 2877 | } 2878 | }, 2879 | "node_modules/proxy-addr": { 2880 | "version": "2.0.7", 2881 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2882 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2883 | "dependencies": { 2884 | "forwarded": "0.2.0", 2885 | "ipaddr.js": "1.9.1" 2886 | }, 2887 | "engines": { 2888 | "node": ">= 0.10" 2889 | } 2890 | }, 2891 | "node_modules/proxy-from-env": { 2892 | "version": "1.1.0", 2893 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 2894 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 2895 | }, 2896 | "node_modules/ps-list": { 2897 | "version": "8.1.1", 2898 | "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", 2899 | "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", 2900 | "dev": true, 2901 | "engines": { 2902 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2903 | }, 2904 | "funding": { 2905 | "url": "https://github.com/sponsors/sindresorhus" 2906 | } 2907 | }, 2908 | "node_modules/pump": { 2909 | "version": "3.0.0", 2910 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2911 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2912 | "dev": true, 2913 | "dependencies": { 2914 | "end-of-stream": "^1.1.0", 2915 | "once": "^1.3.1" 2916 | } 2917 | }, 2918 | "node_modules/puppeteer-core": { 2919 | "version": "13.7.0", 2920 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", 2921 | "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", 2922 | "dev": true, 2923 | "dependencies": { 2924 | "cross-fetch": "3.1.5", 2925 | "debug": "4.3.4", 2926 | "devtools-protocol": "0.0.981744", 2927 | "extract-zip": "2.0.1", 2928 | "https-proxy-agent": "5.0.1", 2929 | "pkg-dir": "4.2.0", 2930 | "progress": "2.0.3", 2931 | "proxy-from-env": "1.1.0", 2932 | "rimraf": "3.0.2", 2933 | "tar-fs": "2.1.1", 2934 | "unbzip2-stream": "1.4.3", 2935 | "ws": "8.5.0" 2936 | }, 2937 | "engines": { 2938 | "node": ">=10.18.1" 2939 | } 2940 | }, 2941 | "node_modules/puppeteer-core/node_modules/ws": { 2942 | "version": "8.5.0", 2943 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 2944 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 2945 | "dev": true, 2946 | "engines": { 2947 | "node": ">=10.0.0" 2948 | }, 2949 | "peerDependencies": { 2950 | "bufferutil": "^4.0.1", 2951 | "utf-8-validate": "^5.0.2" 2952 | }, 2953 | "peerDependenciesMeta": { 2954 | "bufferutil": { 2955 | "optional": true 2956 | }, 2957 | "utf-8-validate": { 2958 | "optional": true 2959 | } 2960 | } 2961 | }, 2962 | "node_modules/qs": { 2963 | "version": "6.11.0", 2964 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 2965 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 2966 | "dependencies": { 2967 | "side-channel": "^1.0.4" 2968 | }, 2969 | "engines": { 2970 | "node": ">=0.6" 2971 | }, 2972 | "funding": { 2973 | "url": "https://github.com/sponsors/ljharb" 2974 | } 2975 | }, 2976 | "node_modules/quick-lru": { 2977 | "version": "6.1.1", 2978 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", 2979 | "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", 2980 | "dev": true, 2981 | "engines": { 2982 | "node": ">=12" 2983 | }, 2984 | "funding": { 2985 | "url": "https://github.com/sponsors/sindresorhus" 2986 | } 2987 | }, 2988 | "node_modules/range-parser": { 2989 | "version": "1.2.1", 2990 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2991 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 2992 | "engines": { 2993 | "node": ">= 0.6" 2994 | } 2995 | }, 2996 | "node_modules/raw-body": { 2997 | "version": "2.5.1", 2998 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 2999 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 3000 | "dependencies": { 3001 | "bytes": "3.1.2", 3002 | "http-errors": "2.0.0", 3003 | "iconv-lite": "0.4.24", 3004 | "unpipe": "1.0.0" 3005 | }, 3006 | "engines": { 3007 | "node": ">= 0.8" 3008 | } 3009 | }, 3010 | "node_modules/read-pkg": { 3011 | "version": "7.1.0", 3012 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", 3013 | "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", 3014 | "dev": true, 3015 | "dependencies": { 3016 | "@types/normalize-package-data": "^2.4.1", 3017 | "normalize-package-data": "^3.0.2", 3018 | "parse-json": "^5.2.0", 3019 | "type-fest": "^2.0.0" 3020 | }, 3021 | "engines": { 3022 | "node": ">=12.20" 3023 | }, 3024 | "funding": { 3025 | "url": "https://github.com/sponsors/sindresorhus" 3026 | } 3027 | }, 3028 | "node_modules/read-pkg-up": { 3029 | "version": "9.1.0", 3030 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", 3031 | "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", 3032 | "dev": true, 3033 | "dependencies": { 3034 | "find-up": "^6.3.0", 3035 | "read-pkg": "^7.1.0", 3036 | "type-fest": "^2.5.0" 3037 | }, 3038 | "engines": { 3039 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3040 | }, 3041 | "funding": { 3042 | "url": "https://github.com/sponsors/sindresorhus" 3043 | } 3044 | }, 3045 | "node_modules/read-pkg-up/node_modules/find-up": { 3046 | "version": "6.3.0", 3047 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", 3048 | "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", 3049 | "dev": true, 3050 | "dependencies": { 3051 | "locate-path": "^7.1.0", 3052 | "path-exists": "^5.0.0" 3053 | }, 3054 | "engines": { 3055 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3056 | }, 3057 | "funding": { 3058 | "url": "https://github.com/sponsors/sindresorhus" 3059 | } 3060 | }, 3061 | "node_modules/read-pkg-up/node_modules/locate-path": { 3062 | "version": "7.2.0", 3063 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", 3064 | "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", 3065 | "dev": true, 3066 | "dependencies": { 3067 | "p-locate": "^6.0.0" 3068 | }, 3069 | "engines": { 3070 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3071 | }, 3072 | "funding": { 3073 | "url": "https://github.com/sponsors/sindresorhus" 3074 | } 3075 | }, 3076 | "node_modules/read-pkg-up/node_modules/p-limit": { 3077 | "version": "4.0.0", 3078 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", 3079 | "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", 3080 | "dev": true, 3081 | "dependencies": { 3082 | "yocto-queue": "^1.0.0" 3083 | }, 3084 | "engines": { 3085 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3086 | }, 3087 | "funding": { 3088 | "url": "https://github.com/sponsors/sindresorhus" 3089 | } 3090 | }, 3091 | "node_modules/read-pkg-up/node_modules/p-locate": { 3092 | "version": "6.0.0", 3093 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", 3094 | "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", 3095 | "dev": true, 3096 | "dependencies": { 3097 | "p-limit": "^4.0.0" 3098 | }, 3099 | "engines": { 3100 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3101 | }, 3102 | "funding": { 3103 | "url": "https://github.com/sponsors/sindresorhus" 3104 | } 3105 | }, 3106 | "node_modules/read-pkg-up/node_modules/path-exists": { 3107 | "version": "5.0.0", 3108 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", 3109 | "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", 3110 | "dev": true, 3111 | "engines": { 3112 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3113 | } 3114 | }, 3115 | "node_modules/read-pkg-up/node_modules/type-fest": { 3116 | "version": "2.19.0", 3117 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", 3118 | "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", 3119 | "dev": true, 3120 | "engines": { 3121 | "node": ">=12.20" 3122 | }, 3123 | "funding": { 3124 | "url": "https://github.com/sponsors/sindresorhus" 3125 | } 3126 | }, 3127 | "node_modules/read-pkg/node_modules/hosted-git-info": { 3128 | "version": "4.1.0", 3129 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", 3130 | "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", 3131 | "dev": true, 3132 | "dependencies": { 3133 | "lru-cache": "^6.0.0" 3134 | }, 3135 | "engines": { 3136 | "node": ">=10" 3137 | } 3138 | }, 3139 | "node_modules/read-pkg/node_modules/lru-cache": { 3140 | "version": "6.0.0", 3141 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 3142 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 3143 | "dev": true, 3144 | "dependencies": { 3145 | "yallist": "^4.0.0" 3146 | }, 3147 | "engines": { 3148 | "node": ">=10" 3149 | } 3150 | }, 3151 | "node_modules/read-pkg/node_modules/normalize-package-data": { 3152 | "version": "3.0.3", 3153 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", 3154 | "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", 3155 | "dev": true, 3156 | "dependencies": { 3157 | "hosted-git-info": "^4.0.1", 3158 | "is-core-module": "^2.5.0", 3159 | "semver": "^7.3.4", 3160 | "validate-npm-package-license": "^3.0.1" 3161 | }, 3162 | "engines": { 3163 | "node": ">=10" 3164 | } 3165 | }, 3166 | "node_modules/read-pkg/node_modules/semver": { 3167 | "version": "7.5.4", 3168 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 3169 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 3170 | "dev": true, 3171 | "dependencies": { 3172 | "lru-cache": "^6.0.0" 3173 | }, 3174 | "bin": { 3175 | "semver": "bin/semver.js" 3176 | }, 3177 | "engines": { 3178 | "node": ">=10" 3179 | } 3180 | }, 3181 | "node_modules/read-pkg/node_modules/type-fest": { 3182 | "version": "2.19.0", 3183 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", 3184 | "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", 3185 | "dev": true, 3186 | "engines": { 3187 | "node": ">=12.20" 3188 | }, 3189 | "funding": { 3190 | "url": "https://github.com/sponsors/sindresorhus" 3191 | } 3192 | }, 3193 | "node_modules/readable-stream": { 3194 | "version": "3.6.2", 3195 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 3196 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 3197 | "dependencies": { 3198 | "inherits": "^2.0.3", 3199 | "string_decoder": "^1.1.1", 3200 | "util-deprecate": "^1.0.1" 3201 | }, 3202 | "engines": { 3203 | "node": ">= 6" 3204 | } 3205 | }, 3206 | "node_modules/readable-web-to-node-stream": { 3207 | "version": "3.0.2", 3208 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 3209 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 3210 | "dev": true, 3211 | "dependencies": { 3212 | "readable-stream": "^3.6.0" 3213 | }, 3214 | "engines": { 3215 | "node": ">=8" 3216 | }, 3217 | "funding": { 3218 | "type": "github", 3219 | "url": "https://github.com/sponsors/Borewit" 3220 | } 3221 | }, 3222 | "node_modules/redent": { 3223 | "version": "4.0.0", 3224 | "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", 3225 | "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", 3226 | "dev": true, 3227 | "dependencies": { 3228 | "indent-string": "^5.0.0", 3229 | "strip-indent": "^4.0.0" 3230 | }, 3231 | "engines": { 3232 | "node": ">=12" 3233 | }, 3234 | "funding": { 3235 | "url": "https://github.com/sponsors/sindresorhus" 3236 | } 3237 | }, 3238 | "node_modules/repeat-string": { 3239 | "version": "1.6.1", 3240 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 3241 | "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", 3242 | "dev": true, 3243 | "engines": { 3244 | "node": ">=0.10" 3245 | } 3246 | }, 3247 | "node_modules/require-directory": { 3248 | "version": "2.1.1", 3249 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3250 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 3251 | "dev": true, 3252 | "engines": { 3253 | "node": ">=0.10.0" 3254 | } 3255 | }, 3256 | "node_modules/right-align": { 3257 | "version": "0.1.3", 3258 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 3259 | "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", 3260 | "dev": true, 3261 | "dependencies": { 3262 | "align-text": "^0.1.1" 3263 | }, 3264 | "engines": { 3265 | "node": ">=0.10.0" 3266 | } 3267 | }, 3268 | "node_modules/rimraf": { 3269 | "version": "3.0.2", 3270 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3271 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3272 | "dev": true, 3273 | "dependencies": { 3274 | "glob": "^7.1.3" 3275 | }, 3276 | "bin": { 3277 | "rimraf": "bin.js" 3278 | }, 3279 | "funding": { 3280 | "url": "https://github.com/sponsors/isaacs" 3281 | } 3282 | }, 3283 | "node_modules/robots-parser": { 3284 | "version": "3.0.1", 3285 | "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", 3286 | "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", 3287 | "dev": true, 3288 | "engines": { 3289 | "node": ">=10.0.0" 3290 | } 3291 | }, 3292 | "node_modules/run-applescript": { 3293 | "version": "5.0.0", 3294 | "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", 3295 | "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", 3296 | "dev": true, 3297 | "dependencies": { 3298 | "execa": "^5.0.0" 3299 | }, 3300 | "engines": { 3301 | "node": ">=12" 3302 | }, 3303 | "funding": { 3304 | "url": "https://github.com/sponsors/sindresorhus" 3305 | } 3306 | }, 3307 | "node_modules/run-applescript/node_modules/execa": { 3308 | "version": "5.1.1", 3309 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 3310 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 3311 | "dev": true, 3312 | "dependencies": { 3313 | "cross-spawn": "^7.0.3", 3314 | "get-stream": "^6.0.0", 3315 | "human-signals": "^2.1.0", 3316 | "is-stream": "^2.0.0", 3317 | "merge-stream": "^2.0.0", 3318 | "npm-run-path": "^4.0.1", 3319 | "onetime": "^5.1.2", 3320 | "signal-exit": "^3.0.3", 3321 | "strip-final-newline": "^2.0.0" 3322 | }, 3323 | "engines": { 3324 | "node": ">=10" 3325 | }, 3326 | "funding": { 3327 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 3328 | } 3329 | }, 3330 | "node_modules/run-applescript/node_modules/get-stream": { 3331 | "version": "6.0.1", 3332 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 3333 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 3334 | "dev": true, 3335 | "engines": { 3336 | "node": ">=10" 3337 | }, 3338 | "funding": { 3339 | "url": "https://github.com/sponsors/sindresorhus" 3340 | } 3341 | }, 3342 | "node_modules/run-applescript/node_modules/human-signals": { 3343 | "version": "2.1.0", 3344 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 3345 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 3346 | "dev": true, 3347 | "engines": { 3348 | "node": ">=10.17.0" 3349 | } 3350 | }, 3351 | "node_modules/run-applescript/node_modules/is-stream": { 3352 | "version": "2.0.1", 3353 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 3354 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 3355 | "dev": true, 3356 | "engines": { 3357 | "node": ">=8" 3358 | }, 3359 | "funding": { 3360 | "url": "https://github.com/sponsors/sindresorhus" 3361 | } 3362 | }, 3363 | "node_modules/run-applescript/node_modules/mimic-fn": { 3364 | "version": "2.1.0", 3365 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 3366 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 3367 | "dev": true, 3368 | "engines": { 3369 | "node": ">=6" 3370 | } 3371 | }, 3372 | "node_modules/run-applescript/node_modules/npm-run-path": { 3373 | "version": "4.0.1", 3374 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 3375 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 3376 | "dev": true, 3377 | "dependencies": { 3378 | "path-key": "^3.0.0" 3379 | }, 3380 | "engines": { 3381 | "node": ">=8" 3382 | } 3383 | }, 3384 | "node_modules/run-applescript/node_modules/onetime": { 3385 | "version": "5.1.2", 3386 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 3387 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 3388 | "dev": true, 3389 | "dependencies": { 3390 | "mimic-fn": "^2.1.0" 3391 | }, 3392 | "engines": { 3393 | "node": ">=6" 3394 | }, 3395 | "funding": { 3396 | "url": "https://github.com/sponsors/sindresorhus" 3397 | } 3398 | }, 3399 | "node_modules/run-applescript/node_modules/strip-final-newline": { 3400 | "version": "2.0.0", 3401 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3402 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 3403 | "dev": true, 3404 | "engines": { 3405 | "node": ">=6" 3406 | } 3407 | }, 3408 | "node_modules/safe-buffer": { 3409 | "version": "5.2.1", 3410 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3411 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 3412 | "funding": [ 3413 | { 3414 | "type": "github", 3415 | "url": "https://github.com/sponsors/feross" 3416 | }, 3417 | { 3418 | "type": "patreon", 3419 | "url": "https://www.patreon.com/feross" 3420 | }, 3421 | { 3422 | "type": "consulting", 3423 | "url": "https://feross.org/support" 3424 | } 3425 | ] 3426 | }, 3427 | "node_modules/safe-stable-stringify": { 3428 | "version": "2.4.3", 3429 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", 3430 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", 3431 | "engines": { 3432 | "node": ">=10" 3433 | } 3434 | }, 3435 | "node_modules/safer-buffer": { 3436 | "version": "2.1.2", 3437 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3438 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 3439 | }, 3440 | "node_modules/semver": { 3441 | "version": "5.7.2", 3442 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 3443 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 3444 | "dev": true, 3445 | "bin": { 3446 | "semver": "bin/semver" 3447 | } 3448 | }, 3449 | "node_modules/send": { 3450 | "version": "0.18.0", 3451 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 3452 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 3453 | "dependencies": { 3454 | "debug": "2.6.9", 3455 | "depd": "2.0.0", 3456 | "destroy": "1.2.0", 3457 | "encodeurl": "~1.0.2", 3458 | "escape-html": "~1.0.3", 3459 | "etag": "~1.8.1", 3460 | "fresh": "0.5.2", 3461 | "http-errors": "2.0.0", 3462 | "mime": "1.6.0", 3463 | "ms": "2.1.3", 3464 | "on-finished": "2.4.1", 3465 | "range-parser": "~1.2.1", 3466 | "statuses": "2.0.1" 3467 | }, 3468 | "engines": { 3469 | "node": ">= 0.8.0" 3470 | } 3471 | }, 3472 | "node_modules/send/node_modules/debug": { 3473 | "version": "2.6.9", 3474 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 3475 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 3476 | "dependencies": { 3477 | "ms": "2.0.0" 3478 | } 3479 | }, 3480 | "node_modules/send/node_modules/debug/node_modules/ms": { 3481 | "version": "2.0.0", 3482 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 3483 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 3484 | }, 3485 | "node_modules/send/node_modules/ms": { 3486 | "version": "2.1.3", 3487 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3488 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 3489 | }, 3490 | "node_modules/serve-static": { 3491 | "version": "1.15.0", 3492 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 3493 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 3494 | "dependencies": { 3495 | "encodeurl": "~1.0.2", 3496 | "escape-html": "~1.0.3", 3497 | "parseurl": "~1.3.3", 3498 | "send": "0.18.0" 3499 | }, 3500 | "engines": { 3501 | "node": ">= 0.8.0" 3502 | } 3503 | }, 3504 | "node_modules/setprototypeof": { 3505 | "version": "1.2.0", 3506 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 3507 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 3508 | }, 3509 | "node_modules/shebang-command": { 3510 | "version": "2.0.0", 3511 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3512 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3513 | "dev": true, 3514 | "dependencies": { 3515 | "shebang-regex": "^3.0.0" 3516 | }, 3517 | "engines": { 3518 | "node": ">=8" 3519 | } 3520 | }, 3521 | "node_modules/shebang-regex": { 3522 | "version": "3.0.0", 3523 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3524 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3525 | "dev": true, 3526 | "engines": { 3527 | "node": ">=8" 3528 | } 3529 | }, 3530 | "node_modules/side-channel": { 3531 | "version": "1.0.4", 3532 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 3533 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 3534 | "dependencies": { 3535 | "call-bind": "^1.0.0", 3536 | "get-intrinsic": "^1.0.2", 3537 | "object-inspect": "^1.9.0" 3538 | }, 3539 | "funding": { 3540 | "url": "https://github.com/sponsors/ljharb" 3541 | } 3542 | }, 3543 | "node_modules/signal-exit": { 3544 | "version": "3.0.7", 3545 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3546 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 3547 | "dev": true 3548 | }, 3549 | "node_modules/simple-swizzle": { 3550 | "version": "0.2.2", 3551 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 3552 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 3553 | "dependencies": { 3554 | "is-arrayish": "^0.3.1" 3555 | } 3556 | }, 3557 | "node_modules/simple-swizzle/node_modules/is-arrayish": { 3558 | "version": "0.3.2", 3559 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 3560 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 3561 | }, 3562 | "node_modules/spdx-correct": { 3563 | "version": "3.2.0", 3564 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", 3565 | "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", 3566 | "dev": true, 3567 | "dependencies": { 3568 | "spdx-expression-parse": "^3.0.0", 3569 | "spdx-license-ids": "^3.0.0" 3570 | } 3571 | }, 3572 | "node_modules/spdx-exceptions": { 3573 | "version": "2.3.0", 3574 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 3575 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 3576 | "dev": true 3577 | }, 3578 | "node_modules/spdx-expression-parse": { 3579 | "version": "3.0.1", 3580 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 3581 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 3582 | "dev": true, 3583 | "dependencies": { 3584 | "spdx-exceptions": "^2.1.0", 3585 | "spdx-license-ids": "^3.0.0" 3586 | } 3587 | }, 3588 | "node_modules/spdx-license-ids": { 3589 | "version": "3.0.13", 3590 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", 3591 | "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", 3592 | "dev": true 3593 | }, 3594 | "node_modules/speedline-core": { 3595 | "version": "1.4.3", 3596 | "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", 3597 | "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", 3598 | "dev": true, 3599 | "dependencies": { 3600 | "@types/node": "*", 3601 | "image-ssim": "^0.2.0", 3602 | "jpeg-js": "^0.4.1" 3603 | }, 3604 | "engines": { 3605 | "node": ">=8.0" 3606 | } 3607 | }, 3608 | "node_modules/stack-trace": { 3609 | "version": "0.0.10", 3610 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 3611 | "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", 3612 | "engines": { 3613 | "node": "*" 3614 | } 3615 | }, 3616 | "node_modules/statuses": { 3617 | "version": "2.0.1", 3618 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 3619 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 3620 | "engines": { 3621 | "node": ">= 0.8" 3622 | } 3623 | }, 3624 | "node_modules/string_decoder": { 3625 | "version": "1.3.0", 3626 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3627 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3628 | "dependencies": { 3629 | "safe-buffer": "~5.2.0" 3630 | } 3631 | }, 3632 | "node_modules/string-width": { 3633 | "version": "4.2.3", 3634 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3635 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3636 | "dev": true, 3637 | "dependencies": { 3638 | "emoji-regex": "^8.0.0", 3639 | "is-fullwidth-code-point": "^3.0.0", 3640 | "strip-ansi": "^6.0.1" 3641 | }, 3642 | "engines": { 3643 | "node": ">=8" 3644 | } 3645 | }, 3646 | "node_modules/strip-ansi": { 3647 | "version": "6.0.1", 3648 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3649 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3650 | "dev": true, 3651 | "dependencies": { 3652 | "ansi-regex": "^5.0.1" 3653 | }, 3654 | "engines": { 3655 | "node": ">=8" 3656 | } 3657 | }, 3658 | "node_modules/strip-final-newline": { 3659 | "version": "3.0.0", 3660 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", 3661 | "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", 3662 | "dev": true, 3663 | "engines": { 3664 | "node": ">=12" 3665 | }, 3666 | "funding": { 3667 | "url": "https://github.com/sponsors/sindresorhus" 3668 | } 3669 | }, 3670 | "node_modules/strip-indent": { 3671 | "version": "4.0.0", 3672 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", 3673 | "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", 3674 | "dev": true, 3675 | "dependencies": { 3676 | "min-indent": "^1.0.1" 3677 | }, 3678 | "engines": { 3679 | "node": ">=12" 3680 | }, 3681 | "funding": { 3682 | "url": "https://github.com/sponsors/sindresorhus" 3683 | } 3684 | }, 3685 | "node_modules/strtok3": { 3686 | "version": "7.0.0", 3687 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", 3688 | "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", 3689 | "dev": true, 3690 | "dependencies": { 3691 | "@tokenizer/token": "^0.3.0", 3692 | "peek-readable": "^5.0.0" 3693 | }, 3694 | "engines": { 3695 | "node": ">=14.16" 3696 | }, 3697 | "funding": { 3698 | "type": "github", 3699 | "url": "https://github.com/sponsors/Borewit" 3700 | } 3701 | }, 3702 | "node_modules/supports-color": { 3703 | "version": "5.5.0", 3704 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3705 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3706 | "dev": true, 3707 | "dependencies": { 3708 | "has-flag": "^3.0.0" 3709 | }, 3710 | "engines": { 3711 | "node": ">=4" 3712 | } 3713 | }, 3714 | "node_modules/tar-fs": { 3715 | "version": "2.1.1", 3716 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 3717 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 3718 | "dev": true, 3719 | "dependencies": { 3720 | "chownr": "^1.1.1", 3721 | "mkdirp-classic": "^0.5.2", 3722 | "pump": "^3.0.0", 3723 | "tar-stream": "^2.1.4" 3724 | } 3725 | }, 3726 | "node_modules/tar-stream": { 3727 | "version": "2.2.0", 3728 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 3729 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 3730 | "dev": true, 3731 | "dependencies": { 3732 | "bl": "^4.0.3", 3733 | "end-of-stream": "^1.4.1", 3734 | "fs-constants": "^1.0.0", 3735 | "inherits": "^2.0.3", 3736 | "readable-stream": "^3.1.1" 3737 | }, 3738 | "engines": { 3739 | "node": ">=6" 3740 | } 3741 | }, 3742 | "node_modules/temp-dir": { 3743 | "version": "2.0.0", 3744 | "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", 3745 | "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", 3746 | "dev": true, 3747 | "engines": { 3748 | "node": ">=8" 3749 | } 3750 | }, 3751 | "node_modules/tempy": { 3752 | "version": "3.0.0", 3753 | "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", 3754 | "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", 3755 | "dev": true, 3756 | "dependencies": { 3757 | "is-stream": "^3.0.0", 3758 | "temp-dir": "^2.0.0", 3759 | "type-fest": "^2.12.2", 3760 | "unique-string": "^3.0.0" 3761 | }, 3762 | "engines": { 3763 | "node": ">=14.16" 3764 | }, 3765 | "funding": { 3766 | "url": "https://github.com/sponsors/sindresorhus" 3767 | } 3768 | }, 3769 | "node_modules/tempy/node_modules/crypto-random-string": { 3770 | "version": "4.0.0", 3771 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", 3772 | "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", 3773 | "dev": true, 3774 | "dependencies": { 3775 | "type-fest": "^1.0.1" 3776 | }, 3777 | "engines": { 3778 | "node": ">=12" 3779 | }, 3780 | "funding": { 3781 | "url": "https://github.com/sponsors/sindresorhus" 3782 | } 3783 | }, 3784 | "node_modules/tempy/node_modules/crypto-random-string/node_modules/type-fest": { 3785 | "version": "1.4.0", 3786 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", 3787 | "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", 3788 | "dev": true, 3789 | "engines": { 3790 | "node": ">=10" 3791 | }, 3792 | "funding": { 3793 | "url": "https://github.com/sponsors/sindresorhus" 3794 | } 3795 | }, 3796 | "node_modules/tempy/node_modules/type-fest": { 3797 | "version": "2.19.0", 3798 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", 3799 | "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", 3800 | "dev": true, 3801 | "engines": { 3802 | "node": ">=12.20" 3803 | }, 3804 | "funding": { 3805 | "url": "https://github.com/sponsors/sindresorhus" 3806 | } 3807 | }, 3808 | "node_modules/tempy/node_modules/unique-string": { 3809 | "version": "3.0.0", 3810 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", 3811 | "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", 3812 | "dev": true, 3813 | "dependencies": { 3814 | "crypto-random-string": "^4.0.0" 3815 | }, 3816 | "engines": { 3817 | "node": ">=12" 3818 | }, 3819 | "funding": { 3820 | "url": "https://github.com/sponsors/sindresorhus" 3821 | } 3822 | }, 3823 | "node_modules/text-hex": { 3824 | "version": "1.0.0", 3825 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 3826 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 3827 | }, 3828 | "node_modules/third-party-web": { 3829 | "version": "0.17.1", 3830 | "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.17.1.tgz", 3831 | "integrity": "sha512-X9Mha8cVeBwakunlZXkXL6xRzw8VCcDGWqT59EzeTYAJIi8ien3CuufnEGEx4ZUFahumNQdoOwf4H2T9Ca6lBg==", 3832 | "dev": true 3833 | }, 3834 | "node_modules/through": { 3835 | "version": "2.3.8", 3836 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3837 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 3838 | "dev": true 3839 | }, 3840 | "node_modules/titleize": { 3841 | "version": "3.0.0", 3842 | "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", 3843 | "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", 3844 | "dev": true, 3845 | "engines": { 3846 | "node": ">=12" 3847 | }, 3848 | "funding": { 3849 | "url": "https://github.com/sponsors/sindresorhus" 3850 | } 3851 | }, 3852 | "node_modules/toidentifier": { 3853 | "version": "1.0.1", 3854 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 3855 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 3856 | "engines": { 3857 | "node": ">=0.6" 3858 | } 3859 | }, 3860 | "node_modules/token-types": { 3861 | "version": "5.0.1", 3862 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", 3863 | "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", 3864 | "dev": true, 3865 | "dependencies": { 3866 | "@tokenizer/token": "^0.3.0", 3867 | "ieee754": "^1.2.1" 3868 | }, 3869 | "engines": { 3870 | "node": ">=14.16" 3871 | }, 3872 | "funding": { 3873 | "type": "github", 3874 | "url": "https://github.com/sponsors/Borewit" 3875 | } 3876 | }, 3877 | "node_modules/tr46": { 3878 | "version": "0.0.3", 3879 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3880 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 3881 | "dev": true 3882 | }, 3883 | "node_modules/transformers": { 3884 | "version": "2.1.0", 3885 | "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", 3886 | "integrity": "sha512-zJf5m2EIOngmBbDe2fhTPpCjzM2qkZVqrFJZc2jaln+KBeEaYKhS2QMOIkfVrNUyoOwqgbTwOHATzr3jZRQDyg==", 3887 | "deprecated": "Deprecated, use jstransformer", 3888 | "dev": true, 3889 | "dependencies": { 3890 | "css": "~1.0.8", 3891 | "promise": "~2.0", 3892 | "uglify-js": "~2.2.5" 3893 | } 3894 | }, 3895 | "node_modules/transformers/node_modules/is-promise": { 3896 | "version": "1.0.1", 3897 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", 3898 | "integrity": "sha512-mjWH5XxnhMA8cFnDchr6qRP9S/kLntKuEfIYku+PaN1CnS8v+OG9O/BKpRCVRJvpIkgAZm0Pf5Is3iSSOILlcg==", 3899 | "dev": true 3900 | }, 3901 | "node_modules/transformers/node_modules/promise": { 3902 | "version": "2.0.0", 3903 | "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", 3904 | "integrity": "sha512-OgMc+sxI3zWF8D5BJGtA0z7/IsrDy1/0cPaDv6HPpqa2fSTo7AdON5U10NbZCUeF+zCAj3PtfPE50Hf02386aA==", 3905 | "dev": true, 3906 | "dependencies": { 3907 | "is-promise": "~1" 3908 | } 3909 | }, 3910 | "node_modules/transformers/node_modules/source-map": { 3911 | "version": "0.1.43", 3912 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 3913 | "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", 3914 | "dev": true, 3915 | "dependencies": { 3916 | "amdefine": ">=0.0.4" 3917 | }, 3918 | "engines": { 3919 | "node": ">=0.8.0" 3920 | } 3921 | }, 3922 | "node_modules/transformers/node_modules/uglify-js": { 3923 | "version": "2.2.5", 3924 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", 3925 | "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", 3926 | "dev": true, 3927 | "dependencies": { 3928 | "optimist": "~0.3.5", 3929 | "source-map": "~0.1.7" 3930 | }, 3931 | "bin": { 3932 | "uglifyjs": "bin/uglifyjs" 3933 | }, 3934 | "engines": { 3935 | "node": ">=0.4.0" 3936 | } 3937 | }, 3938 | "node_modules/trim-newlines": { 3939 | "version": "4.1.1", 3940 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", 3941 | "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", 3942 | "dev": true, 3943 | "engines": { 3944 | "node": ">=12" 3945 | }, 3946 | "funding": { 3947 | "url": "https://github.com/sponsors/sindresorhus" 3948 | } 3949 | }, 3950 | "node_modules/triple-beam": { 3951 | "version": "1.4.1", 3952 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", 3953 | "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", 3954 | "engines": { 3955 | "node": ">= 14.0.0" 3956 | } 3957 | }, 3958 | "node_modules/tslib": { 3959 | "version": "1.14.1", 3960 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 3961 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 3962 | "dev": true 3963 | }, 3964 | "node_modules/type-fest": { 3965 | "version": "3.11.0", 3966 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.11.0.tgz", 3967 | "integrity": "sha512-JaPw5U9ixP0XcpUbQoVSbxSDcK/K4nww20C3kjm9yE6cDRRhptU28AH60VWf9ltXmCrIfIbtt9J+2OUk2Uqiaw==", 3968 | "dev": true, 3969 | "engines": { 3970 | "node": ">=14.16" 3971 | }, 3972 | "funding": { 3973 | "url": "https://github.com/sponsors/sindresorhus" 3974 | } 3975 | }, 3976 | "node_modules/type-is": { 3977 | "version": "1.6.18", 3978 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3979 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3980 | "dependencies": { 3981 | "media-typer": "0.3.0", 3982 | "mime-types": "~2.1.24" 3983 | }, 3984 | "engines": { 3985 | "node": ">= 0.6" 3986 | } 3987 | }, 3988 | "node_modules/typedarray-to-buffer": { 3989 | "version": "3.1.5", 3990 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 3991 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 3992 | "dev": true, 3993 | "dependencies": { 3994 | "is-typedarray": "^1.0.0" 3995 | } 3996 | }, 3997 | "node_modules/typescript": { 3998 | "version": "5.2.2", 3999 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", 4000 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", 4001 | "dev": true, 4002 | "bin": { 4003 | "tsc": "bin/tsc", 4004 | "tsserver": "bin/tsserver" 4005 | }, 4006 | "engines": { 4007 | "node": ">=14.17" 4008 | } 4009 | }, 4010 | "node_modules/uglify-js": { 4011 | "version": "2.8.29", 4012 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 4013 | "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", 4014 | "dev": true, 4015 | "dependencies": { 4016 | "source-map": "~0.5.1", 4017 | "yargs": "~3.10.0" 4018 | }, 4019 | "bin": { 4020 | "uglifyjs": "bin/uglifyjs" 4021 | }, 4022 | "engines": { 4023 | "node": ">=0.8.0" 4024 | }, 4025 | "optionalDependencies": { 4026 | "uglify-to-browserify": "~1.0.0" 4027 | } 4028 | }, 4029 | "node_modules/uglify-js/node_modules/camelcase": { 4030 | "version": "1.2.1", 4031 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 4032 | "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", 4033 | "dev": true, 4034 | "engines": { 4035 | "node": ">=0.10.0" 4036 | } 4037 | }, 4038 | "node_modules/uglify-js/node_modules/cliui": { 4039 | "version": "2.1.0", 4040 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 4041 | "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", 4042 | "dev": true, 4043 | "dependencies": { 4044 | "center-align": "^0.1.1", 4045 | "right-align": "^0.1.1", 4046 | "wordwrap": "0.0.2" 4047 | } 4048 | }, 4049 | "node_modules/uglify-js/node_modules/decamelize": { 4050 | "version": "1.2.0", 4051 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 4052 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 4053 | "dev": true, 4054 | "engines": { 4055 | "node": ">=0.10.0" 4056 | } 4057 | }, 4058 | "node_modules/uglify-js/node_modules/source-map": { 4059 | "version": "0.5.7", 4060 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 4061 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 4062 | "dev": true, 4063 | "engines": { 4064 | "node": ">=0.10.0" 4065 | } 4066 | }, 4067 | "node_modules/uglify-js/node_modules/wordwrap": { 4068 | "version": "0.0.2", 4069 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 4070 | "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", 4071 | "dev": true, 4072 | "engines": { 4073 | "node": ">=0.4.0" 4074 | } 4075 | }, 4076 | "node_modules/uglify-js/node_modules/yargs": { 4077 | "version": "3.10.0", 4078 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 4079 | "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", 4080 | "dev": true, 4081 | "dependencies": { 4082 | "camelcase": "^1.0.2", 4083 | "cliui": "^2.1.0", 4084 | "decamelize": "^1.0.0", 4085 | "window-size": "0.1.0" 4086 | } 4087 | }, 4088 | "node_modules/uglify-to-browserify": { 4089 | "version": "1.0.2", 4090 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 4091 | "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", 4092 | "dev": true, 4093 | "optional": true 4094 | }, 4095 | "node_modules/unbzip2-stream": { 4096 | "version": "1.4.3", 4097 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 4098 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 4099 | "dev": true, 4100 | "dependencies": { 4101 | "buffer": "^5.2.1", 4102 | "through": "^2.3.8" 4103 | } 4104 | }, 4105 | "node_modules/unique-string": { 4106 | "version": "2.0.0", 4107 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 4108 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 4109 | "dev": true, 4110 | "dependencies": { 4111 | "crypto-random-string": "^2.0.0" 4112 | }, 4113 | "engines": { 4114 | "node": ">=8" 4115 | } 4116 | }, 4117 | "node_modules/universalify": { 4118 | "version": "2.0.0", 4119 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 4120 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 4121 | "engines": { 4122 | "node": ">= 10.0.0" 4123 | } 4124 | }, 4125 | "node_modules/unpipe": { 4126 | "version": "1.0.0", 4127 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 4128 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 4129 | "engines": { 4130 | "node": ">= 0.8" 4131 | } 4132 | }, 4133 | "node_modules/untildify": { 4134 | "version": "4.0.0", 4135 | "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", 4136 | "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", 4137 | "dev": true, 4138 | "engines": { 4139 | "node": ">=8" 4140 | } 4141 | }, 4142 | "node_modules/util-deprecate": { 4143 | "version": "1.0.2", 4144 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 4145 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 4146 | }, 4147 | "node_modules/utils-merge": { 4148 | "version": "1.0.1", 4149 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 4150 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 4151 | "engines": { 4152 | "node": ">= 0.4.0" 4153 | } 4154 | }, 4155 | "node_modules/validate-npm-package-license": { 4156 | "version": "3.0.4", 4157 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 4158 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 4159 | "dev": true, 4160 | "dependencies": { 4161 | "spdx-correct": "^3.0.0", 4162 | "spdx-expression-parse": "^3.0.0" 4163 | } 4164 | }, 4165 | "node_modules/vary": { 4166 | "version": "1.1.2", 4167 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 4168 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 4169 | "engines": { 4170 | "node": ">= 0.8" 4171 | } 4172 | }, 4173 | "node_modules/void-elements": { 4174 | "version": "2.0.1", 4175 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 4176 | "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", 4177 | "dev": true, 4178 | "engines": { 4179 | "node": ">=0.10.0" 4180 | } 4181 | }, 4182 | "node_modules/webidl-conversions": { 4183 | "version": "3.0.1", 4184 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 4185 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 4186 | "dev": true 4187 | }, 4188 | "node_modules/whatwg-url": { 4189 | "version": "5.0.0", 4190 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 4191 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 4192 | "dev": true, 4193 | "dependencies": { 4194 | "tr46": "~0.0.3", 4195 | "webidl-conversions": "^3.0.0" 4196 | } 4197 | }, 4198 | "node_modules/which": { 4199 | "version": "2.0.2", 4200 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 4201 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 4202 | "dev": true, 4203 | "dependencies": { 4204 | "isexe": "^2.0.0" 4205 | }, 4206 | "bin": { 4207 | "node-which": "bin/node-which" 4208 | }, 4209 | "engines": { 4210 | "node": ">= 8" 4211 | } 4212 | }, 4213 | "node_modules/window-size": { 4214 | "version": "0.1.0", 4215 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 4216 | "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", 4217 | "dev": true, 4218 | "engines": { 4219 | "node": ">= 0.8.0" 4220 | } 4221 | }, 4222 | "node_modules/winston": { 4223 | "version": "3.11.0", 4224 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", 4225 | "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", 4226 | "dependencies": { 4227 | "@colors/colors": "^1.6.0", 4228 | "@dabh/diagnostics": "^2.0.2", 4229 | "async": "^3.2.3", 4230 | "is-stream": "^2.0.0", 4231 | "logform": "^2.4.0", 4232 | "one-time": "^1.0.0", 4233 | "readable-stream": "^3.4.0", 4234 | "safe-stable-stringify": "^2.3.1", 4235 | "stack-trace": "0.0.x", 4236 | "triple-beam": "^1.3.0", 4237 | "winston-transport": "^4.5.0" 4238 | }, 4239 | "engines": { 4240 | "node": ">= 12.0.0" 4241 | } 4242 | }, 4243 | "node_modules/winston-logs-display": { 4244 | "version": "1.0.0", 4245 | "resolved": "https://registry.npmjs.org/winston-logs-display/-/winston-logs-display-1.0.0.tgz", 4246 | "integrity": "sha512-CTb3VKNNRDPEiFwGKftpaNwzERuZ/UO3bbRaZU/hce8IWPC5/SFZ78vdjvgppoK53P8hVIglj1ArJM2oZj2FuA==", 4247 | "dev": true, 4248 | "dependencies": { 4249 | "bluebird": "^3.5.1", 4250 | "express": "^4.9.4", 4251 | "jade": "^1.7.0", 4252 | "lodash": "^4.17.5", 4253 | "serve-static": "^1.10.1", 4254 | "winston": "^2.4.2" 4255 | }, 4256 | "engines": { 4257 | "node": ">=6.5.0" 4258 | } 4259 | }, 4260 | "node_modules/winston-logs-display/node_modules/async": { 4261 | "version": "2.6.4", 4262 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", 4263 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", 4264 | "dev": true, 4265 | "dependencies": { 4266 | "lodash": "^4.17.14" 4267 | } 4268 | }, 4269 | "node_modules/winston-logs-display/node_modules/winston": { 4270 | "version": "2.4.7", 4271 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.7.tgz", 4272 | "integrity": "sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==", 4273 | "dev": true, 4274 | "dependencies": { 4275 | "async": "^2.6.4", 4276 | "colors": "1.0.x", 4277 | "cycle": "1.0.x", 4278 | "eyes": "0.1.x", 4279 | "isstream": "0.1.x", 4280 | "stack-trace": "0.0.x" 4281 | }, 4282 | "engines": { 4283 | "node": ">= 0.10.0" 4284 | } 4285 | }, 4286 | "node_modules/winston-transport": { 4287 | "version": "4.5.0", 4288 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", 4289 | "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", 4290 | "dependencies": { 4291 | "logform": "^2.3.2", 4292 | "readable-stream": "^3.6.0", 4293 | "triple-beam": "^1.3.0" 4294 | }, 4295 | "engines": { 4296 | "node": ">= 6.4.0" 4297 | } 4298 | }, 4299 | "node_modules/winston/node_modules/@colors/colors": { 4300 | "version": "1.6.0", 4301 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", 4302 | "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", 4303 | "engines": { 4304 | "node": ">=0.1.90" 4305 | } 4306 | }, 4307 | "node_modules/winston/node_modules/is-stream": { 4308 | "version": "2.0.1", 4309 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 4310 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 4311 | "engines": { 4312 | "node": ">=8" 4313 | }, 4314 | "funding": { 4315 | "url": "https://github.com/sponsors/sindresorhus" 4316 | } 4317 | }, 4318 | "node_modules/with": { 4319 | "version": "4.0.3", 4320 | "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", 4321 | "integrity": "sha512-mJZFpyEc1JTAdxhi/vhVeAM2S7vsltEKDiexDDo1HuAzlYKhcVUU6cwY8cHrFYdt82ZNkfKCeyhA3IYFegI0Kg==", 4322 | "dev": true, 4323 | "dependencies": { 4324 | "acorn": "^1.0.1", 4325 | "acorn-globals": "^1.0.3" 4326 | } 4327 | }, 4328 | "node_modules/with/node_modules/acorn": { 4329 | "version": "1.2.2", 4330 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 4331 | "integrity": "sha512-FsqWmApWGMGLKKNpHt12PMc5AK7BaZee0WRh04fCysmTzHe+rrKOa2MKjORhnzfpe4r0JnfdqHn02iDA9Dqj2A==", 4332 | "dev": true, 4333 | "bin": { 4334 | "acorn": "bin/acorn" 4335 | }, 4336 | "engines": { 4337 | "node": ">=0.4.0" 4338 | } 4339 | }, 4340 | "node_modules/wordwrap": { 4341 | "version": "0.0.3", 4342 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 4343 | "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", 4344 | "dev": true, 4345 | "engines": { 4346 | "node": ">=0.4.0" 4347 | } 4348 | }, 4349 | "node_modules/wrap-ansi": { 4350 | "version": "7.0.0", 4351 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 4352 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 4353 | "dev": true, 4354 | "dependencies": { 4355 | "ansi-styles": "^4.0.0", 4356 | "string-width": "^4.1.0", 4357 | "strip-ansi": "^6.0.0" 4358 | }, 4359 | "engines": { 4360 | "node": ">=10" 4361 | }, 4362 | "funding": { 4363 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 4364 | } 4365 | }, 4366 | "node_modules/wrappy": { 4367 | "version": "1.0.2", 4368 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4369 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 4370 | "dev": true 4371 | }, 4372 | "node_modules/write-file-atomic": { 4373 | "version": "3.0.3", 4374 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 4375 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 4376 | "dev": true, 4377 | "dependencies": { 4378 | "imurmurhash": "^0.1.4", 4379 | "is-typedarray": "^1.0.0", 4380 | "signal-exit": "^3.0.2", 4381 | "typedarray-to-buffer": "^3.1.5" 4382 | } 4383 | }, 4384 | "node_modules/ws": { 4385 | "version": "7.5.9", 4386 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 4387 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 4388 | "dev": true, 4389 | "engines": { 4390 | "node": ">=8.3.0" 4391 | }, 4392 | "peerDependencies": { 4393 | "bufferutil": "^4.0.1", 4394 | "utf-8-validate": "^5.0.2" 4395 | }, 4396 | "peerDependenciesMeta": { 4397 | "bufferutil": { 4398 | "optional": true 4399 | }, 4400 | "utf-8-validate": { 4401 | "optional": true 4402 | } 4403 | } 4404 | }, 4405 | "node_modules/xdg-basedir": { 4406 | "version": "4.0.0", 4407 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 4408 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", 4409 | "dev": true, 4410 | "engines": { 4411 | "node": ">=8" 4412 | } 4413 | }, 4414 | "node_modules/y18n": { 4415 | "version": "5.0.8", 4416 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 4417 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 4418 | "dev": true, 4419 | "engines": { 4420 | "node": ">=10" 4421 | } 4422 | }, 4423 | "node_modules/yallist": { 4424 | "version": "4.0.0", 4425 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 4426 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 4427 | "dev": true 4428 | }, 4429 | "node_modules/yargs": { 4430 | "version": "17.7.2", 4431 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 4432 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 4433 | "dev": true, 4434 | "dependencies": { 4435 | "cliui": "^8.0.1", 4436 | "escalade": "^3.1.1", 4437 | "get-caller-file": "^2.0.5", 4438 | "require-directory": "^2.1.1", 4439 | "string-width": "^4.2.3", 4440 | "y18n": "^5.0.5", 4441 | "yargs-parser": "^21.1.1" 4442 | }, 4443 | "engines": { 4444 | "node": ">=12" 4445 | } 4446 | }, 4447 | "node_modules/yargs-parser": { 4448 | "version": "21.1.1", 4449 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 4450 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 4451 | "dev": true, 4452 | "engines": { 4453 | "node": ">=12" 4454 | } 4455 | }, 4456 | "node_modules/yauzl": { 4457 | "version": "2.10.0", 4458 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 4459 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 4460 | "dev": true, 4461 | "dependencies": { 4462 | "buffer-crc32": "~0.2.3", 4463 | "fd-slicer": "~1.1.0" 4464 | } 4465 | }, 4466 | "node_modules/yocto-queue": { 4467 | "version": "1.0.0", 4468 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", 4469 | "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", 4470 | "dev": true, 4471 | "engines": { 4472 | "node": ">=12.20" 4473 | }, 4474 | "funding": { 4475 | "url": "https://github.com/sponsors/sindresorhus" 4476 | } 4477 | } 4478 | } 4479 | } 4480 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@script-savvy/playwright", 3 | "version": "1.0.0", 4 | "description": "A Comprehensive Test Automation Framework Based on Playwright. Intuitive. Efficient. Made simple.", 5 | "main": "index.js", 6 | "keywords": [ 7 | "testing", 8 | "playwright", 9 | "automation", 10 | "bdd" 11 | ], 12 | "author": "Luca Ahumada", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@playwright/test": "^1.38.1", 16 | "@types/node": "^20.8.3", 17 | "allure-commandline": "^2.24.1", 18 | "allure-playwright": "^2.9.2", 19 | "k6": "^0.0.0", 20 | "lighthouse": "^9.6.8", 21 | "open-cli": "^7.2.0", 22 | "typescript": "^5.2.2", 23 | "winston-logs-display": "^1.0.0" 24 | }, 25 | "dependencies": { 26 | "@datadog/browser-logs": "^4.50.0", 27 | "axios": "^1.5.1", 28 | "dotenv": "^16.3.1", 29 | "express": "^4.18.2", 30 | "fs-extra": "^11.1.1", 31 | "winston": "^3.11.0" 32 | }, 33 | "repository": { 34 | "type": "git", 35 | "url": "https://github.com/LucaAhumada/script-savvy-playwright" 36 | }, 37 | "bugs": { 38 | "url": "https://github.com/LucaAhumada/script-savvy-playwright/issues" 39 | }, 40 | "homepage": "https://github.com/LucaAhumada/script-savvy-playwright", 41 | "engines": { 42 | "node": ">=14.0.0" 43 | }, 44 | "scripts": { 45 | "test": "playwright test --headed", 46 | "test:monitor": "playwright test --ui", 47 | "test:chrome": "playwright test --project=chrome --headed", 48 | "test:firefox": "playwright test --project=firefox --headed", 49 | "test:record": "playwright codegen", 50 | "test:trace": "playwright show-trace", 51 | "test:report": "robocopy .\\allure-report\\history .\\allure-results\\history /MIR && allure generate --clean ./allure-results && allure open", 52 | "test:load": "k6 run ./performance/runner.js", 53 | "audit:desktop": "node ./src/core/lighthouse.js desktop && open-cli ./reports/lighthouse/LighthouseReport.html", 54 | "audit:mobile": "node ./src/core/lighthouse.js mobile && open-cli ./reports/lighthouse/LighthouseReport.html" 55 | }, 56 | "publishConfig": { 57 | "access": "public" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /pageObjectModel/LoginPage.ts: -------------------------------------------------------------------------------- 1 | import { Page, BrowserContext, Locator, expect } from '@playwright/test' 2 | import { BasePage } from './commonActions' 3 | import { loadEnvironmentConfig, loadTestDataConfig } from '../config/configLoader' 4 | 5 | export class LoginPage extends BasePage { 6 | readonly LOGIN_START_BUTTON: Locator 7 | readonly USERNAME_INPUT: Locator 8 | readonly PASSWORD_INPUT: Locator 9 | readonly LOGIN_FINISH_BUTTON: Locator 10 | readonly UNREAD_MESSAGES: Locator 11 | 12 | private env: any 13 | 14 | constructor(page: Page, context: BrowserContext, environment: string) { 15 | super(page, context) 16 | this.env = loadEnvironmentConfig(environment) 17 | 18 | this.LOGIN_START_BUTTON = this.page.getByRole('link', { name: ' Iniciar sesión' }) 19 | this.USERNAME_INPUT = this.page.locator('#ajax_loginuser') 20 | this.PASSWORD_INPUT = this.page.locator('#ajax_loginpass') 21 | this.LOGIN_FINISH_BUTTON = this.page.getByRole('button', { name: 'Iniciar sesión' }) 22 | this.UNREAD_MESSAGES = this.page.getByRole('link', { name: 'Mensajes no leídos' }) 23 | } 24 | 25 | async navigateToLoginPage(): Promise { 26 | await this.goto(this.env.baseURL) 27 | } 28 | 29 | async startLoginProcess(): Promise { 30 | await this.click(this.LOGIN_START_BUTTON) 31 | } 32 | 33 | async fillCredentials(): Promise { 34 | await this.fill(this.USERNAME_INPUT, this.env.username) 35 | await this.fill(this.PASSWORD_INPUT, this.env.password) 36 | } 37 | 38 | async endLoginProcess(): Promise { 39 | await this.click(this.LOGIN_FINISH_BUTTON) 40 | } 41 | 42 | async verifyLoginStatus(): Promise { 43 | await expect(this.UNREAD_MESSAGES).toBeVisible() 44 | } 45 | 46 | async navigateToUrlAndLogin(): Promise { 47 | await this.navigateToLoginPage() 48 | await this.startLoginProcess() 49 | await this.fillCredentials() 50 | await this.endLoginProcess() 51 | await this.verifyLoginStatus() 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /pageObjectModel/ProfilePage.ts: -------------------------------------------------------------------------------- 1 | import { Page, BrowserContext, Locator, expect } from '@playwright/test' 2 | import { BasePage } from './commonActions' 3 | import { loadEnvironmentConfig } from '../config/configLoader' 4 | 5 | export class ProfilePage extends BasePage { 6 | readonly PROFILE_DROPDOWN_MENU: Locator 7 | readonly PROFILE_DETAILS_BUTTON: Locator 8 | readonly PERSONAL_TEXT: Locator 9 | readonly BIRTHDATE_YEAR: Locator 10 | readonly BIRTHDATE_MONTH: Locator 11 | readonly BIRTHDATE_DAY: Locator 12 | readonly SIGNATURE: Locator 13 | readonly LOCATION: Locator 14 | readonly AVATAR_URL_MENU: Locator 15 | readonly AVATAR_URL_INPUT: Locator 16 | readonly SAVE_BUTTON: Locator 17 | readonly SUCCESS_MESSAGE: Locator 18 | 19 | private env: any 20 | 21 | constructor(page: Page, context: BrowserContext, environment: string) { 22 | super(page, context) 23 | 24 | this.env = loadEnvironmentConfig(environment) 25 | 26 | this.PROFILE_DROPDOWN_MENU = this.page.getByRole('link', { name: '▼' }) 27 | this.PROFILE_DETAILS_BUTTON = this.page.getByRole('link', { name: 'Detalles del Perfil' }) 28 | this.PERSONAL_TEXT = this.page.getByLabel('Texto Personal') 29 | this.BIRTHDATE_YEAR = this.page.locator('input[name="bday3"]') 30 | this.BIRTHDATE_MONTH = this.page.locator('input[name="bday1"]') 31 | this.BIRTHDATE_DAY = this.page.locator('input[name="bday2"]') 32 | this.SIGNATURE = this.page.locator('#signature') 33 | this.LOCATION = this.page.locator('[id="customfield\\[cust_loca\\]"]') 34 | this.AVATAR_URL_MENU = this.page.getByText('Especificar avatar mediante URL') 35 | this.AVATAR_URL_INPUT = this.page.locator('input[name="userpicpersonal"]') 36 | this.SAVE_BUTTON = this.page.getByRole('button', { name: 'Cambiar perfil' }) 37 | this.SUCCESS_MESSAGE = this.page.getByText('Se ha actualizado correctamente tu perfil') 38 | } 39 | 40 | async navigateToURL(): Promise { 41 | await this.goto(this.env.baseURL) 42 | } 43 | 44 | async clickProfileDropdownMenu(): Promise { 45 | await this.click(this.PROFILE_DROPDOWN_MENU) 46 | } 47 | 48 | async clickProfileDetailsButton(): Promise { 49 | await this.click(this.PROFILE_DETAILS_BUTTON) 50 | } 51 | 52 | async fillBirthdate(year: string, month: string, day: string): Promise { 53 | await this.fill(this.BIRTHDATE_YEAR, year) 54 | await this.fill(this.BIRTHDATE_MONTH, month) 55 | await this.fill(this.BIRTHDATE_DAY, day) 56 | } 57 | 58 | async fillPersonalText(text: string): Promise { 59 | await this.fill(this.PERSONAL_TEXT, text) 60 | } 61 | 62 | async fillSignature(text: string): Promise { 63 | await this.fill(this.SIGNATURE, text) 64 | } 65 | 66 | async fillLocation(text: string): Promise { 67 | await this.fill(this.LOCATION, text) 68 | } 69 | 70 | async clickAvatarUrlMenu(): Promise { 71 | await this.click(this.AVATAR_URL_MENU) 72 | } 73 | 74 | async fillAvatarUrl(text: string): Promise { 75 | await this.fill(this.AVATAR_URL_INPUT, text) 76 | } 77 | 78 | async clickSaveProfileChanges(): Promise { 79 | await this.click(this.SAVE_BUTTON) 80 | } 81 | 82 | async verifySuccessMessage(): Promise { 83 | await expect(this.SUCCESS_MESSAGE, 'Should have profile updated successfully').toBeVisible() 84 | } 85 | 86 | async cleanProfile(): Promise { 87 | await this.fillBirthdate('', '', '') 88 | await this.fillPersonalText('') 89 | await this.fillSignature('') 90 | await this.fillLocation('') 91 | await this.clickAvatarUrlMenu() 92 | await this.fillAvatarUrl('') 93 | await this.clickSaveProfileChanges() 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /pageObjectModel/commonActions.ts: -------------------------------------------------------------------------------- 1 | import { Page, Locator, BrowserContext } from '@playwright/test' 2 | import logger from '../src/core/logger' 3 | 4 | export class BasePage { 5 | protected page: Page 6 | protected context: BrowserContext 7 | protected defaultTimeout = 5000 8 | 9 | constructor(page: Page, context: BrowserContext) { 10 | this.page = page 11 | this.context = context 12 | } 13 | 14 | protected async click(locator: Locator, timeout = this.defaultTimeout, delayMilliseconds?: number): Promise { 15 | try { 16 | await locator.waitFor({ state: 'visible', timeout: timeout }) 17 | await locator.click() 18 | if (delayMilliseconds !== undefined) { 19 | await this.page.waitForTimeout(delayMilliseconds) 20 | } 21 | } catch (error) { 22 | logger.error(`Error occurred while clicking on element: ${locator}: ${error}`) 23 | } 24 | } 25 | 26 | protected async fill(locator: Locator, value: string, delayMilliseconds?: number): Promise { 27 | try { 28 | await locator.fill(value) 29 | if (delayMilliseconds !== undefined) { 30 | await this.page.waitForTimeout(delayMilliseconds) 31 | } 32 | } catch (error) { 33 | logger.error(`Error occurred while filling element with value ${value}: ${error}`) 34 | } 35 | } 36 | 37 | protected async goto(url: string, delayMilliseconds?: number): Promise { 38 | try { 39 | await this.page.goto(url) 40 | await this.page.waitForFunction(() => document.readyState === 'complete') 41 | if (delayMilliseconds !== undefined) { 42 | await this.page.waitForTimeout(delayMilliseconds) 43 | } 44 | } catch (error) { 45 | logger.error(`Error occurred while navigating to URL: ${url}: ${error}`) 46 | } 47 | } 48 | 49 | protected async pressSequentially(locator: Locator, text: string, delayMilliseconds?: number): Promise { 50 | try { 51 | await locator.pressSequentially(text) 52 | if (delayMilliseconds !== undefined) { 53 | await this.page.waitForTimeout(delayMilliseconds) 54 | } 55 | } catch (error) { 56 | logger.error(`Error occurred while pressing keys ${text} on the element: ${error}`) 57 | } 58 | } 59 | 60 | protected async selectOption(locator: Locator, value: string, delayMilliseconds?: number): Promise { 61 | try { 62 | await locator.selectOption(value) 63 | if (delayMilliseconds !== undefined) { 64 | await this.page.waitForTimeout(delayMilliseconds) 65 | } 66 | } catch (error) { 67 | logger.error(`Error occurred while selecting option ${value} from the element: ${error}`) 68 | } 69 | } 70 | 71 | protected async check(locator: Locator, delayMilliseconds?: number): Promise { 72 | try { 73 | await locator.check() 74 | if (delayMilliseconds !== undefined) { 75 | await this.page.waitForTimeout(delayMilliseconds) 76 | } 77 | } catch (error) { 78 | logger.error(`Error occurred while checking element: ${locator}: ${error}`) 79 | } 80 | } 81 | 82 | protected async uncheck(locator: Locator, delayMilliseconds?: number): Promise { 83 | try { 84 | await locator.uncheck() 85 | if (delayMilliseconds !== undefined) { 86 | await this.page.waitForTimeout(delayMilliseconds) 87 | } 88 | } catch (error) { 89 | logger.error(`Error occurred while unchecking element: ${locator} : ${error}`) 90 | } 91 | } 92 | 93 | public async closeContext(): Promise { 94 | await this.context.close() 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from '@playwright/test'; 2 | 3 | export default defineConfig({ 4 | 5 | // Test location 6 | testDir: './tests', 7 | 8 | outputDir: './reports/artifacts', 9 | 10 | // Wheter to run spec files sequentially 11 | fullyParallel: false, 12 | 13 | // Fail build on CI if there are tests marked as 'only'. 14 | forbidOnly: !!process.env.CI, 15 | 16 | // Amount of retries on failure (flaky test) 17 | retries: process.env.CI ? 1 : 1, 18 | 19 | // Amount of jobs to run in parallel 20 | workers: process.env.CI ? 1 : 1, 21 | 22 | // Maximum time expect() should wait to met a condition 23 | expect: { timeout: 6 * 1000 }, 24 | 25 | globalTeardown: "./global-teardown.ts", 26 | 27 | // Reporter to use. See https://playwright.dev/docs/test-reporters 28 | reporter: [ 29 | ['list'], 30 | ["allure-playwright", { detail: true }], 31 | ['html', { outputFolder: './reports/html-reports', open: 'never' }] 32 | // To generate Azure Pipeline Results use the following reporter 33 | // ['junit', { outputFile: 'test-results/junit.xml' }], 34 | ], 35 | 36 | use: { 37 | actionTimeout: 10 * 1000, // Maximum time each action like click() can take 38 | viewport: { width: 1500, height: 730 }, 39 | headless: true, 40 | ignoreHTTPSErrors: true, 41 | acceptDownloads: true, 42 | screenshot: 'only-on-failure', 43 | video: 'on-first-retry', 44 | trace: 'on-first-retry', 45 | }, 46 | 47 | /* Configure projects for major browsers */ 48 | projects: [ 49 | 50 | { 51 | name: 'Chrome', 52 | use: { channel: 'chrome' }, 53 | }, 54 | 55 | // { 56 | // name: 'firefox', 57 | // use: { ...devices['Desktop Firefox'] }, 58 | // }, 59 | 60 | // { 61 | // name: 'Microsoft Edge', 62 | // use: { channel: 'msedge' }, 63 | // }, 64 | 65 | // { 66 | // name: 'webkit', 67 | // use: { ...devices['Desktop Safari'] }, 68 | // }, 69 | 70 | { 71 | name: 'Mobile Chrome', 72 | use: { ...devices['Pixel 5'] }, 73 | }, 74 | 75 | { 76 | name: 'Mobile Safari', 77 | use: { ...devices['iPhone 12'] }, 78 | } 79 | ], 80 | 81 | // In case you need to run your local env before the tests run 82 | // webServer: { 83 | // command: 'npm run start', 84 | // url: 'http://127.0.0.1:3000', 85 | // reuseExistingServer: !process.env.CI, 86 | // }, 87 | 88 | }); 89 | 90 | module.exports = exports.default; -------------------------------------------------------------------------------- /src/AuthConfig.ts: -------------------------------------------------------------------------------- 1 | export interface AuthConfig { 2 | type: string 3 | keyName?: string 4 | value?: string 5 | } 6 | 7 | // Currently supports Bearer Token, API Key, Basic Auth, and No Auth 8 | -------------------------------------------------------------------------------- /src/api/client.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from '../http/httpClient' 2 | import { AxiosResponse } from 'axios' 3 | import { AuthConfig } from '../authConfig' 4 | 5 | export class Library { 6 | private httpClient: HttpClient 7 | private authConfig: AuthConfig 8 | 9 | constructor(httpClient: HttpClient, authConfig: AuthConfig = { type: 'No Auth' }) { 10 | this.httpClient = httpClient 11 | this.authConfig = authConfig 12 | } 13 | 14 | private getHeaders() { 15 | switch (this.authConfig.type) { 16 | case 'Bearer': 17 | return { Authorization: `Bearer ${this.authConfig.value}` } 18 | case 'API Key': 19 | return { [`${this.authConfig.keyName}`]: `${this.authConfig.value}` } 20 | case 'No Auth': 21 | default: 22 | return {} 23 | } 24 | } 25 | 26 | async get(resource: string): Promise> { 27 | const headers = this.getHeaders() 28 | return this.httpClient.get(`/${resource}`, { headers }) 29 | } 30 | 31 | async post(resource: string, data?: any): Promise> { 32 | const headers = this.getHeaders() 33 | return this.httpClient.post(`/${resource}`, data, { headers }) 34 | } 35 | 36 | async put(resource: string, data?: any): Promise> { 37 | const headers = this.getHeaders() 38 | return this.httpClient.put(`/${resource}`, data, { headers }) 39 | } 40 | 41 | async delete(resource: string): Promise> { 42 | const headers = this.getHeaders() 43 | return this.httpClient.delete(`/${resource}`, { headers }) 44 | } 45 | 46 | async getMessage(response: AxiosResponse): Promise { 47 | if (response && response.data && response.data.message) { 48 | return response.data.message 49 | } 50 | return null 51 | } 52 | 53 | async getStatus(response: AxiosResponse): Promise { 54 | if (response) { 55 | return response.status 56 | } 57 | return null 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/core/lighthouse.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const lighthouse = require('lighthouse'); 3 | const chromeLauncher = require('chrome-launcher'); 4 | 5 | async function runLighthouse(url, config) { 6 | const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] }); 7 | const options = { 8 | logLevel: 'info', 9 | output: 'html', 10 | onlyCategories: ['performance'], 11 | port: chrome.port, 12 | }; 13 | 14 | const runnerResult = await lighthouse(url, options, config); 15 | const { report, lhr } = runnerResult; 16 | 17 | fs.writeFileSync('./reports/lighthouse/LighthouseReport.html', report); 18 | 19 | console.log('Report is done for', lhr.finalUrl); 20 | console.log('Performance score was', lhr.categories.performance.score * 100); 21 | 22 | await chrome.kill(); 23 | } 24 | 25 | (async () => { 26 | try { 27 | const url = 'https://www.underc0de.org/foro/'; // Change this to the URL you want to test 28 | let config; 29 | 30 | const environment = process.argv[2] || 'desktop'; // Command-line argument (e.g., node lighthouse.js mobile) 31 | 32 | switch (environment) { 33 | case 'desktop': 34 | config = { 35 | extends: 'lighthouse:default', 36 | settings: { formFactor: 'desktop', screenEmulation: { mobile: false } }, 37 | }; 38 | break; 39 | case 'mobile': 40 | config = { 41 | extends: 'lighthouse:default', 42 | settings: { formFactor: 'mobile', screenEmulation: { mobile: true } }, 43 | }; 44 | break; 45 | default: 46 | throw new Error('Invalid environment. Please provide either "desktop" or "mobile".'); 47 | } 48 | 49 | await runLighthouse(url, config); 50 | } catch (error) { 51 | console.error('An error occurred.', error); 52 | } 53 | })(); -------------------------------------------------------------------------------- /src/core/logger.ts: -------------------------------------------------------------------------------- 1 | import winston from 'winston' 2 | import { format } from 'winston' 3 | 4 | const logFormat = format.combine(format.timestamp(), format.json()) 5 | 6 | const logger = winston.createLogger({ 7 | format: logFormat, 8 | transports: [ 9 | new winston.transports.File({ 10 | filename: './logs/trace.log', 11 | maxsize: 5242880, // 5MB log file max size 12 | maxFiles: 5, // Retain up to 5 log files 13 | }), 14 | ], 15 | }) 16 | 17 | export default logger 18 | -------------------------------------------------------------------------------- /src/http/AxiosHttpClient.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosInstance, AxiosResponse } from 'axios' 2 | 3 | export interface HttpClient { 4 | get(url: string, config?: object): Promise> 5 | post(url: string, data?: any, config?: object): Promise> 6 | put(url: string, data?: any, config?: object): Promise> 7 | delete(url: string, config?: object): Promise> 8 | } 9 | 10 | export class AxiosHttpClient implements HttpClient { 11 | private instance: AxiosInstance 12 | 13 | constructor(baseURL: string) { 14 | this.instance = axios.create({ baseURL }) 15 | } 16 | 17 | async get(url: string, config?: object) { 18 | try { 19 | return await this.instance.get(url, config) 20 | } catch (error) { 21 | if (error.response && error.response.status === 404) { 22 | // Handle the 404 status code without logging 23 | return error.response 24 | } else { 25 | console.error(`GET request to ${url} failed`, error) 26 | throw error 27 | } 28 | } 29 | } 30 | 31 | async post(url: string, data?: any, config?: object) { 32 | try { 33 | return await this.instance.post(url, data, config) 34 | } catch (error) { 35 | console.error(`POST request to ${url} failed`, error) 36 | throw error 37 | } 38 | } 39 | 40 | async put(url: string, data?: any, config?: object) { 41 | try { 42 | return await this.instance.put(url, data, config) 43 | } catch (error) { 44 | console.error(`PUT request to ${url} failed`, error) 45 | throw error 46 | } 47 | } 48 | 49 | async delete(url: string, config?: object) { 50 | try { 51 | return await this.instance.delete(url, config) 52 | } catch (error) { 53 | console.error(`DELETE request to ${url} failed`, error) 54 | throw error 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/http/HttpClient.ts: -------------------------------------------------------------------------------- 1 | export interface HttpClient { 2 | get(url: string, config?: object): Promise 3 | post(url: string, data: any, config?: object): Promise 4 | put(url: string, data: any, config?: object): Promise 5 | delete(url: string, config?: object): Promise 6 | } 7 | -------------------------------------------------------------------------------- /tests/Login.test.ts: -------------------------------------------------------------------------------- 1 | import test from '../config/testManager' 2 | 3 | // We can use steps like this to reproduce Cucumber formatting 4 | 5 | test('@Smoke Navigate to the forum and login with valid credentials', async ({ loginPage }) => { 6 | await test.step(`Navigate to the forum`, async () => { 7 | await loginPage.navigateToLoginPage() 8 | }) 9 | await test.step('Start the login process', async () => { 10 | await loginPage.startLoginProcess() 11 | }) 12 | await test.step('Write the username and password', async () => { 13 | await loginPage.fillCredentials() 14 | }) 15 | await test.step('Finish the login process', async () => { 16 | await loginPage.endLoginProcess() 17 | }) 18 | await test.step('Verify that the user is logged in', async () => { 19 | await loginPage.verifyLoginStatus() 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /tests/Profile.test.ts: -------------------------------------------------------------------------------- 1 | import test from '../config/testManager' 2 | 3 | test.beforeEach(async ({ loginPage, profilePage }) => { 4 | await test.step(`Navigate to the forum and login with valid credentials`, async () => { 5 | await loginPage.navigateToUrlAndLogin() 6 | }) 7 | 8 | await test.step(`Open the profile menu`, async () => { 9 | await profilePage.clickProfileDropdownMenu() 10 | }) 11 | 12 | await test.step('Click the profile details button', async () => { 13 | await profilePage.clickProfileDetailsButton() 14 | }) 15 | }) 16 | 17 | test('@Regression Change birthdate', async ({ profilePage }) => { 18 | await test.step('Fill the user birthdate', async () => { 19 | let birthdate = { year: '1990', month: '10', day: '25' } 20 | await profilePage.fillBirthdate(birthdate.year, birthdate.month, birthdate.day) 21 | }) 22 | }) 23 | 24 | test('@Regression Change personal text', async ({ profilePage }) => { 25 | await test.step('Fill the user personal text', async () => { 26 | let personalText = 'This is a personal text test' 27 | await profilePage.PERSONAL_TEXT.fill(personalText) 28 | }) 29 | }) 30 | 31 | test('@Regression Change signature', async ({ profilePage }) => { 32 | await test.step('Fill the user signature', async () => { 33 | let signature = 'This is a signature test' 34 | await profilePage.SIGNATURE.fill(signature) 35 | }) 36 | }) 37 | 38 | test('@Regression Change location', async ({ profilePage }) => { 39 | await test.step('Fill the user location', async () => { 40 | let location = 'Argentina' 41 | await profilePage.LOCATION.fill(location) 42 | }) 43 | }) 44 | 45 | test.afterEach(async ({ profilePage }) => { 46 | await test.step('Click the save button', async () => { 47 | await profilePage.clickSaveProfileChanges() 48 | }) 49 | 50 | await test.step('Verify the changed successfully message', async () => { 51 | await profilePage.verifySuccessMessage() 52 | }) 53 | 54 | await test.step('Clean the profile data', async () => { 55 | await profilePage.cleanProfile() 56 | }) 57 | 58 | await test.step('Close the browser', async () => { 59 | await profilePage.closeContext() 60 | }) 61 | }) 62 | -------------------------------------------------------------------------------- /tests/api/example.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test' 2 | import { Library } from '../../src/api/client' 3 | import { AxiosHttpClient } from '../../src/http/AxiosHttpClient' 4 | 5 | const httpClient = new AxiosHttpClient('https://library-api.postmanlabs.com') 6 | const library = new Library(httpClient, { 7 | type: 'API Key', 8 | keyName: 'api-key', 9 | value: 'postmanrulz', 10 | }) 11 | 12 | // test('@API Response must return books', async () => { 13 | // await test.step('Send GET Request', async () => { 14 | // const response = await library.get('books'); 15 | // expect(Array.isArray(response.data), 'Should receive an array').toBe(true); 16 | // }); 17 | // }); 18 | 19 | // test('@API Response must return a non-empty array with Books', async () => { 20 | // await test.step('Send GET Request', async () => { 21 | // const response = await library.get('books'); 22 | // expect(response.data.length, 'Should receive a non-empty array').toBeGreaterThan(0); 23 | // }); 24 | // }); 25 | 26 | // test('@API book in response should have all necessary properties', async () => { 27 | // await test.step('Send GET Request', async () => { 28 | // const response = await library.get('books'); 29 | 30 | // // The properties we expect to see in each book 31 | // const expectedProperties = ['id', 'title', 'author', 'genre', 'yearPublished', 'checkedOut', 'isPermanentCollection', 'createdAt']; 32 | 33 | // // We assume that the most recently created book is the first one in the array 34 | // const mostRecentBook = response.data[0]; 35 | 36 | // // Check if each property exists in the mostRecentBook 37 | // for (let prop of expectedProperties) { 38 | // await test.step(`Should have property ${prop}`, async () => { 39 | // const hasProperty = mostRecentBook.hasOwnProperty(prop); 40 | // expect(hasProperty).toBe(true); 41 | // }); 42 | // } 43 | // }); 44 | // }); 45 | 46 | // test('@API Add/Delete a book from the Library', async () => { 47 | // let bookId; 48 | 49 | // await test.step('Send POST Request', async () => { 50 | // const book = await library.post('books', { 51 | // title: "Playwright Automation", 52 | // author: "Luca Ahumada", 53 | // genre: "programming", 54 | // yearPublished: 2023 55 | // }); 56 | // bookId = book.data.id; 57 | // expect(bookId).toBeTruthy(); 58 | // }); 59 | 60 | // await test.step('Send DELETE Request', async () => { 61 | // const response = await library.delete(`books/${bookId}`); 62 | // expect(response.status).toBe(204); 63 | // }); 64 | 65 | // await test.step('Try to GET deleted book', async () => { 66 | // try { 67 | // await library.get(`books/${bookId}`); 68 | // } catch (error) { 69 | // const errorMessage = error.response.data.message; 70 | // expect(errorMessage).toContain(`Book with id '${bookId}' not found`); 71 | // } 72 | // }); 73 | // }); 74 | --------------------------------------------------------------------------------