├── .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 |
--------------------------------------------------------------------------------