├── .env.example ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── question-or-help-wanted.md ├── .gitignore ├── README.md ├── exercises ├── chapter1.MD ├── chapter2.MD ├── chapter3.MD ├── chapter4.MD └── chapter5.MD ├── extra-resources ├── chapter1.MD ├── chapter2.MD ├── chapter3.MD ├── chapter4.MD └── chapter5.MD ├── package-lock.json ├── package.json ├── pages ├── home-page.ts └── top-menu-page.ts ├── playwright.config.ts ├── tests-examples └── demo-todo-app.spec.ts ├── tests ├── example-applitools.spec.ts ├── example.spec.ts ├── example2.spec.ts ├── example3.spec.ts └── template.spec.ts └── utils └── environmentBaseUrl.ts /.env.example: -------------------------------------------------------------------------------- 1 | PASSWORD="happyTesting" 2 | API_KEY="secret" 3 | APPLITOOLS_API_KEY= -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug, pending 6 | assignees: raptatinha 7 | 8 | --- 9 | 10 | **🐞 Describe the bug:** 11 | A clear and concise description of what the bug is. 12 | 13 | **👻 To Reproduce:** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **🌵 Expected behavior:** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **📸 Screenshots/GIFs/Videos:** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **💈 Dependencies' Version (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Playwright Version [e.g. 22] 30 | - DotEnv Version [e.g. 22] 31 | - Applitools Version [e.g. 22] 32 | - VS Code Version [e.g. 22] 33 | - npm Version [e.g. 22] 34 | 35 | **🛝 Additional context:** 36 | Add any other context about the problem here. 37 | 38 | **🎡 A picture of your pet or a toy or something really cool:** 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question-or-help-wanted.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question Or Help Wanted 3 | about: Send your question or describe what you need help for 4 | title: "[QUESTION]" 5 | labels: help wanted, pending, question 6 | assignees: raptatinha 7 | 8 | --- 9 | 10 | **🐞 Describe the question:** 11 | A clear and concise description of what the question is or what you need. 12 | 13 | **📸 Screenshots/GIFs/Videos:** 14 | If applicable, add screenshots to help explain your needs. 15 | 16 | **🛝 Additional context:** 17 | Add any other context here. 18 | 19 | **🎡 A picture of your pet or a toy or something really cool:** 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | node_modules/ 4 | /test-results/ 5 | /playwright-report/ 6 | /playwright/.cache/ 7 | 8 | *.env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Dependencies 8 | 9 | - Playwright v1.33.0 10 | - Node v19.8.1 11 | - npm v9.6.5 12 | - VSCode 1.77.3 (Universal) 13 | - Applitools v1.17.0 14 | 15 | > Pre requirements: 16 | - [Node setup](https://nodejs.dev/en/learn/how-to-install-nodejs/) 17 | - [VS Code setup](https://code.visualstudio.com/learn/get-started/basics) 18 | - [iTerm setup](https://iterm2.com/documentation-one-page.html) 19 | 20 | ## Fork and clone the project 21 | 22 | 1. Copy the project URL `https://github.com/raptatinha/tau-introduction-to-playwright.git`; 23 | 1. Fork the project following the [GitHub instructions](https://docs.github.com/en/get-started/quickstart/fork-a-repo) - (use the parameter --clone=true); 24 | 1. Access the forked project `cd tau-introduction-to-playwright` 25 | 26 | ## Instal the project 27 | 28 | On your terminal, type: 29 | 30 | 1. `npm i` 31 | 32 | IMPORTANT: to run the tests from `main`, you'll need to setup your [.env](.env) following the [.env.example](.env.example), otherwise many tests will fail - this setup is explained in the Chapter 4 video. The recommendation is to access each branch (`git checkout [branchname]`) and run the tests from the branch. 33 | 34 | ___ 35 | 36 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 37 | 38 | 💜 If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 39 | 40 | Happy Testing 🎭 41 | -------------------------------------------------------------------------------- /exercises/chapter1.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 1 - Exercises 8 | 9 | 1. Take a look at the 2 test files that were created [example.spec.ts](/tests/example.spec.ts) and [demo-todo-app.spec.ts](/tests-examples/demo-todo-app.spec.ts) and get familiar with the terminology used there. Maybe use the Search available on the [Website](https://playwright.dev/docs/intro) to learn more about the commands. 10 | 11 | 1. Run the tests using the UI Mode and also the command line. What differences do you see? 12 | 13 | 1. Take a look at the other existing files (listed below) and try to identify their function in the project: 14 | - [.gitignore](/.gitignore) 15 | - [package-lock.json](/package-lock.json) 16 | - [package-lock.json](/package-lock.json) 17 | - [playwright.config.ts](/playwright.config.ts) 18 | 19 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 20 | 21 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 22 | 23 | Happy Testing 🎭! -------------------------------------------------------------------------------- /exercises/chapter2.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 2 - Exercises 8 | 9 | 1. Change the number of workers on [playwright.config.ts](/playwright.config.ts) and see how it affects the tests run time. Use the command `npm run test:e2e:all` to run all the existing tests. Note that the number of workers will change too on the terminal. Suggestions: 1, 10, 100. What happens when you change it to 100? 10 | 11 | 1. Change the reporter to 2 different options of your preference (mouse hover "reporter" to see the valid options). Besides the HTML, which ones could be useful for a project and why? 12 | 13 | 1. Change the value of trace for each option available and identify the differences between them. Note how the size of the folder changes for each option. 14 | 15 | 1. Enable the video and check how it looks. Is it more useful than the trace in your opinion? 16 | 17 | 1. Create a new project on [playwright.config.ts](/playwright.config.ts), define a few unique settings and create a new script on [package.json](/package.json). Execute the new script. What useful params would make the test run even easier for you? Suggestion: Play with the different browsers and devices. 18 | 19 | 1. Create a new test file, describe a simple new test case and implement a new test. What other locators did you use besides `getByRole` and `getByText`. How about assertions, what other LocatorAssertions did you use besides `toBeVisible`, `toHaveURL` and `not.toBeVisible`? 20 | 21 | 1. Open the [demo-todo-app.spec.ts](/tests-examples/demo-todo-app.spec.ts) and add a .only to one of the describes, run the tests. Use the command `npm run test:e2e:all`. Did it work? 22 | 23 | 1. Still in the [demo-todo-app.spec.ts](/tests-examples/demo-todo-app.spec.ts) revert the .only and add a new tag to some of the tests/describes. Update the script `test:e2e:smoke` in [package.json](/package.json) to use the new tag. Did it work? 24 | 25 | 26 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 27 | 28 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 29 | 30 | Happy Testing 🎭! -------------------------------------------------------------------------------- /exercises/chapter3.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 3 - Exercises 8 | 9 | 1. Delete the file top-menu-page.ts and try to recreate it. What did you learn? 10 | 11 | 1. Describe and implement a scenario for the search using page object models. Make sure you fill the search with a term and use the keyboard arrows to select one of the results. 12 | 13 | 1. Describe and implement a scenario where you need to use the beforeAll. What did you use it for? 14 | 15 | 1. Describe and implement a scenario where you need to use the afterAll. What did you use it for? 16 | 17 | 1. Describe and implement a scenario where you need to use the afterEach. What did you use it for? 18 | 19 | 1. Explore few of the methods of the testInfo. Which one did you find more interesting? 20 | 21 | 22 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 23 | 24 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 25 | 26 | Happy Testing 🎭! -------------------------------------------------------------------------------- /exercises/chapter4.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 4 - Exercises 8 | 9 | 1. Revisit the previous tests you implemented and add visual testing via Applitools to them. How much that increased the test runtime? 10 | 11 | 1. Add visual testing via Playwright to the [example2.spec.ts](/tests/example2.spec.ts) file. What differences have you noticed from Applitools? 12 | 13 | 1. Run the [example3.spec.ts](/tests/example3.spec.ts) with the Ultra Fast Grid. How does it compare to the Classic Runner? 14 | 15 | 1. Explore other check settings. Can you list a few scenarios that each of them is most appropriate for? 16 | 17 | 1. In the Eyes Test Manager (Applitools Dashboard) explore the commands to accept/reject a baseline. What changes have you noticed in the test results? 18 | 19 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 20 | 21 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 22 | 23 | Happy Testing 🎭! -------------------------------------------------------------------------------- /exercises/chapter5.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 5 - Exercises 8 | 9 | 1. Make a few other tests fail and explore the reports. What new things have you observed? 10 | 11 | 1. Debug a test via VS Code Playwright extension and also via Playwright Inspector. What differences have you noticed? What is the best option in your opinion and why? 12 | 13 | 1. Explore the option `await page.pause();` to debug a test. Is it helpful? How is that compared to the Playwright Inspector and VS Code extension? 14 | 15 | 1. When running the tests in UI, activate the [watch mode](https://playwright.dev/docs/test-ui-mode#watch-mode) and update a few tests. What happens? 16 | 17 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 18 | 19 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 20 | 21 | Happy Testing 🎭! -------------------------------------------------------------------------------- /extra-resources/chapter1.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 1 - Extra Resources 8 | 9 | 1. [Setup your Node.js environment from scratch - for Playwright implementation](https://www.youtube.com/@testingwithrenata) 10 | 11 | 1. [Introduction to Javascript](https://testautomationu.applitools.com/javascript-tutorial/) 12 | 13 | 1. [Web Element Locator Strategies](https://testautomationu.applitools.com/web-element-locator-strategies/) 14 | 15 | 16 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 17 | 18 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 19 | 20 | Happy Testing 🎭! -------------------------------------------------------------------------------- /extra-resources/chapter2.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 2 - Extra Resources 8 | 9 | ### Test Configuration (playwright.config.ts) 10 | 1. https://playwright.dev/docs/test-configuration 11 | 12 | ### Command Line 13 | 1. https://playwright.dev/docs/test-cli 14 | 15 | ### Environment Variables 16 | 1. https://playwright.dev/docs/test-parameterize#passing-environment-variables 17 | 18 | ### Locators 19 | 1. https://playwright.dev/docs/api/class-framelocator 20 | 1. https://playwright.dev/docs/best-practices#use-locators 21 | 22 | ### Assertions 23 | 1. https://playwright.dev/docs/best-practices#use-web-first-assertions 24 | 25 | ### Regular Expressions (RegExp) 26 | 1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp 27 | 28 | ### Auto-waiting 29 | 1. https://playwright.dev/docs/actionability 30 | 31 | ### Async functions and Await 32 | 1. [Why do we write await in Playwright](https://jadala-ajay16.medium.com/why-do-we-write-await-async-in-playwright-javascript-typescript-fa3c92f82841#:~:text=The%20await%20expression%20causes%20async,line%20of%20code%20executes%20completely) 33 | 34 | 35 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 36 | 37 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 38 | 39 | Happy Testing 🎭! -------------------------------------------------------------------------------- /extra-resources/chapter3.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 3 - Extra Resources 8 | 9 | ### Arrange Act Assert (AAA) 10 | 1. https://medium.com/@pjbgf/title-testing-code-ocd-and-the-aaa-pattern-df453975ab80 11 | 12 | ### Test Info 13 | 1. https://playwright.dev/docs/api/class-testinfo 14 | 15 | ### Test Step 16 | 1. https://playwright.dev/docs/api/class-test#test-step 17 | 18 | ### Page Object Model (POM) 19 | 1. https://playwright.dev/docs/pom 20 | 21 | ### Locators 22 | 1. https://playwright.dev/docs/locators 23 | 24 | ### Actions 25 | 1. https://playwright.dev/docs/input 26 | 27 | ### BDD 28 | 1. [Playwright, BDD, Cucumber and my opinion about it](https://testingwithrenata.com/blog/test-automation/playwright-bdd-cucumber-e-a-minha-opiniao-sobre-isso/) 29 | 30 | ### Most used commands 31 | 1. .click() 32 | 1. .fill() 33 | 1. .type() 34 | 1. .check() 35 | 1. .uncheck() 36 | 1. .keyboard.press() 37 | 38 | ### Most used asserts 39 | 1. .toHaveText() 40 | 1. .toBeVisible() 41 | 1. .toEqual() 42 | 1. .toContainText() 43 | 1. .toBeEnabled() 44 | 1. .toBe() 45 | 1. .toBeGreaterThan() 46 | 1. .toHaveCount() 47 | 1. .not 48 | 49 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 50 | 51 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 52 | 53 | Happy Testing 🎭! -------------------------------------------------------------------------------- /extra-resources/chapter4.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 4 - Extra Resources 8 | 9 | ### Playwright Visual Comparisons 10 | 1. https://playwright.dev/docs/test-snapshots 11 | 12 | ### Applitools 13 | 1. https://auth.applitools.com/users/register 14 | 1. https://applitools.com/tutorials/quickstart/web/playwright/typescript 15 | 1. https://applitools.com/docs/api-ref/category/playwright-javascript-class-index 16 | 1. https://applitools.com/docs/topics/overview/using-the-ultrafast-grid.html 17 | 1. https://applitools.com/docs/topics/overview/overview-writing-tests-with-eyes-runner.html 18 | 1. https://applitools.com/docs/api-ref/sdk-api/playwright/javascript/ 19 | 1. https://applitools.com/docs/api-ref/sdk-api/playwright/js-intro/checksettings 20 | 1. https://applitools.com/docs/api-ref/sdk-api/playwright/js-intro/runners 21 | 1. https://applitools.com/docs/api-ref/sdk-api/playwright/js-intro/ufg 22 | 23 | ### More about visual testing 24 | 1. https://testingwithrenata.com/blog/visual-regression/visual-regression-testing-with-applitools/ 25 | 1. https://testingwithrenata.com/blog/visual-regression/how-to-structure-visual-regression-testing-based-on-business-needs/ 26 | 27 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 28 | 29 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 30 | 31 | Happy Testing 🎭! -------------------------------------------------------------------------------- /extra-resources/chapter5.MD: -------------------------------------------------------------------------------- 1 | # Introduction to Playwright 2 | 3 | Hi 👋🏽! 4 | 5 | Welcome to the course "Introduction to Playwright" by [Renata Andrade](https://testingwithrenata.com/) for the [Test Automation University](https://testautomationu.applitools.com/). 6 | 7 | ## Chapter 5 - Extra Resources 8 | 9 | ### Playwright 10 | 1. https://playwright.dev/docs/trace-viewer-intro 11 | 1. https://playwright.dev/docs/test-ui-mode 12 | 1. https://playwright.dev/docs/debug 13 | 1. https://playwright.dev/docs/codegen-intro 14 | 1. https://playwright.dev/docs/test-configuration 15 | 16 | 💡 Share on LinkedIn something interesting you've learned! Don't forget to tag me [Renata Andrade](https://www.linkedin.com/in/raptatinha/). 17 | 18 | If you have questions, feel free to post them on [github](https://github.com/raptatinha/tau-introduction-to-playwright/issues). 19 | 20 | Happy Testing 🎭! -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tau-introduction-to-playwright", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "tau-introduction-to-playwright", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@applitools/eyes-playwright": "^1.17.0", 13 | "@playwright/test": "^1.34.2", 14 | "dotenv": "^16.0.3" 15 | } 16 | }, 17 | "node_modules/@applitools/core": { 18 | "version": "3.0.1", 19 | "resolved": "https://registry.npmjs.org/@applitools/core/-/core-3.0.1.tgz", 20 | "integrity": "sha512-K91LkD0zvcyIX3E9PB1JNocQqwOZUlL+8kWh7VH0XK5XvyGW/LEz94AwdJLXBTAzYOY5+CKRleb9fraRzVQUQQ==", 21 | "dev": true, 22 | "dependencies": { 23 | "@applitools/core-base": "1.1.54", 24 | "@applitools/dom-capture": "11.2.2", 25 | "@applitools/dom-snapshot": "4.7.9", 26 | "@applitools/driver": "1.11.51", 27 | "@applitools/ec-client": "1.2.30", 28 | "@applitools/logger": "2.0.0", 29 | "@applitools/nml-client": "1.3.53", 30 | "@applitools/req": "1.2.6", 31 | "@applitools/screenshoter": "3.7.44", 32 | "@applitools/snippets": "2.4.20", 33 | "@applitools/socket": "1.0.14", 34 | "@applitools/spec-driver-webdriver": "1.0.31", 35 | "@applitools/ufg-client": "1.2.13", 36 | "@applitools/utils": "1.3.36", 37 | "@types/ws": "8.5.4", 38 | "abort-controller": "3.0.0", 39 | "chalk": "4.1.2", 40 | "node-fetch": "2.6.7", 41 | "webdriver": "7.30.0", 42 | "ws": "8.12.0", 43 | "yargs": "17.6.2" 44 | }, 45 | "bin": { 46 | "eyes": "dist/cli/cli.js", 47 | "eyes-check-network": "dist/troubleshoot/check-network.js" 48 | }, 49 | "engines": { 50 | "node": ">=12.13.0" 51 | } 52 | }, 53 | "node_modules/@applitools/core-base": { 54 | "version": "1.1.54", 55 | "resolved": "https://registry.npmjs.org/@applitools/core-base/-/core-base-1.1.54.tgz", 56 | "integrity": "sha512-bEf5YCG2Gg2J/kAalQKVkMP2a7j/fD9xN3sX7ixlZ89rQG+CLf4pWtq1SUO9cQlkgAGwjMPkIpCatsbtmVkDSw==", 57 | "dev": true, 58 | "dependencies": { 59 | "@applitools/image": "1.0.33", 60 | "@applitools/logger": "2.0.0", 61 | "@applitools/req": "1.2.6", 62 | "@applitools/utils": "1.3.36", 63 | "abort-controller": "3.0.0", 64 | "throat": "6.0.2" 65 | }, 66 | "engines": { 67 | "node": ">=12.13.0" 68 | } 69 | }, 70 | "node_modules/@applitools/dom-capture": { 71 | "version": "11.2.2", 72 | "resolved": "https://registry.npmjs.org/@applitools/dom-capture/-/dom-capture-11.2.2.tgz", 73 | "integrity": "sha512-omSH+c8+ij/mUPKVwRp7ulCOz33EHMnG8Q3s7XuwaB9m04onEAg82/25otOrntqMKmO2doGWN3E97qUstZJiPQ==", 74 | "dev": true, 75 | "dependencies": { 76 | "@applitools/dom-shared": "1.0.5", 77 | "@applitools/functional-commons": "1.6.0" 78 | }, 79 | "engines": { 80 | "node": ">=8.9.0" 81 | } 82 | }, 83 | "node_modules/@applitools/dom-shared": { 84 | "version": "1.0.5", 85 | "resolved": "https://registry.npmjs.org/@applitools/dom-shared/-/dom-shared-1.0.5.tgz", 86 | "integrity": "sha512-O2zgnnqVi3/Atq7EQjURLa73XNaDFJCj8wHht6WQtxIv1EWYnPutNTmnJSKwK7FnbJAg65OVjZylcz4EezyYZA==", 87 | "dev": true, 88 | "engines": { 89 | "node": ">=8.9.0" 90 | } 91 | }, 92 | "node_modules/@applitools/dom-snapshot": { 93 | "version": "4.7.9", 94 | "resolved": "https://registry.npmjs.org/@applitools/dom-snapshot/-/dom-snapshot-4.7.9.tgz", 95 | "integrity": "sha512-lY1tkNwNQUBM7snYUwVZ80EisgIYdNZxIBtbsRU0R60wKTQc8ccBPGo9e3TBbS4Z9XqQYVAupKQjZMlcMVEiwQ==", 96 | "dev": true, 97 | "dependencies": { 98 | "@applitools/dom-shared": "1.0.10", 99 | "@applitools/functional-commons": "1.6.0", 100 | "css-tree": "2.3.1", 101 | "pako": "1.0.11" 102 | }, 103 | "engines": { 104 | "node": ">=8.9.0" 105 | } 106 | }, 107 | "node_modules/@applitools/dom-snapshot/node_modules/@applitools/dom-shared": { 108 | "version": "1.0.10", 109 | "resolved": "https://registry.npmjs.org/@applitools/dom-shared/-/dom-shared-1.0.10.tgz", 110 | "integrity": "sha512-1k0CUQRm+38n6aTg/8IIppndYPDJLc/dU8Regbi/miP3xZmOG4Wwd5fBiu/MI5lgQm6RZU+at18lpCLFwU+Nng==", 111 | "dev": true, 112 | "engines": { 113 | "node": ">=8.9.0" 114 | } 115 | }, 116 | "node_modules/@applitools/driver": { 117 | "version": "1.11.51", 118 | "resolved": "https://registry.npmjs.org/@applitools/driver/-/driver-1.11.51.tgz", 119 | "integrity": "sha512-U/j+fM5J7nqhsMtT9/DaR6UFtcIuXTQu0Z443CRh7apk9WSx3nJX8Kx3b3AqnvBbsb/t9lZQtsF5VxXYAukgng==", 120 | "dev": true, 121 | "dependencies": { 122 | "@applitools/logger": "2.0.0", 123 | "@applitools/snippets": "2.4.20", 124 | "@applitools/utils": "1.3.36", 125 | "semver": "7.3.7" 126 | }, 127 | "engines": { 128 | "node": ">=12.13.0" 129 | } 130 | }, 131 | "node_modules/@applitools/ec-client": { 132 | "version": "1.2.30", 133 | "resolved": "https://registry.npmjs.org/@applitools/ec-client/-/ec-client-1.2.30.tgz", 134 | "integrity": "sha512-mDbegA7aoQY1Kq/Bj4oa1OXPNebbF1DV99qyqQkJSuL4LtM5em0GesfmK5yHBbq/0QQjfb0J+oAenbw3qEtcqA==", 135 | "dev": true, 136 | "dependencies": { 137 | "@applitools/core-base": "1.1.54", 138 | "@applitools/driver": "1.11.51", 139 | "@applitools/execution-grid-tunnel": "2.1.0", 140 | "@applitools/logger": "2.0.0", 141 | "@applitools/req": "1.2.6", 142 | "@applitools/socket": "1.0.14", 143 | "@applitools/spec-driver-webdriver": "1.0.31", 144 | "@applitools/utils": "1.3.36", 145 | "abort-controller": "3.0.0", 146 | "webdriver": "7", 147 | "yargs": "17.6.2" 148 | }, 149 | "bin": { 150 | "ec-client": "dist/cli/cli.js", 151 | "eg-client": "dist/cli/cli.js" 152 | }, 153 | "engines": { 154 | "node": ">=12.13.0" 155 | } 156 | }, 157 | "node_modules/@applitools/eg-frpc": { 158 | "version": "1.0.3", 159 | "resolved": "https://registry.npmjs.org/@applitools/eg-frpc/-/eg-frpc-1.0.3.tgz", 160 | "integrity": "sha512-16CrVdq2onkN5j6wpHxd8dfapJehHJq7GnYEg86QGFZPhTgZI5WukKrp9ryM0EblUJUjdTwEPymc5B8cffuZZQ==", 161 | "dev": true, 162 | "engines": { 163 | "node": ">=12.13.0" 164 | } 165 | }, 166 | "node_modules/@applitools/eg-socks5-proxy-server": { 167 | "version": "0.5.4", 168 | "resolved": "https://registry.npmjs.org/@applitools/eg-socks5-proxy-server/-/eg-socks5-proxy-server-0.5.4.tgz", 169 | "integrity": "sha512-LEucOmy1MXft6c07CkqKPS1Ov9Zg9WyHV2vI1SbbHR3AG4cEM2M3N0qcWlytxjzef9t22+1tOpEJhrBS65bSQw==", 170 | "dev": true, 171 | "dependencies": { 172 | "binary": "^0.3.0", 173 | "is-localhost-ip": "^2.0.0" 174 | }, 175 | "engines": { 176 | "node": ">=12" 177 | } 178 | }, 179 | "node_modules/@applitools/execution-grid-tunnel": { 180 | "version": "2.1.0", 181 | "resolved": "https://registry.npmjs.org/@applitools/execution-grid-tunnel/-/execution-grid-tunnel-2.1.0.tgz", 182 | "integrity": "sha512-OooDCcS93+reh1hIpalDZVMhAsSaG/h+T5jGn7WzIYL4wVdi/GLyibvzxlY1hLFGi0EhUJGckpMoHiTZ6EuV2w==", 183 | "dev": true, 184 | "dependencies": { 185 | "@applitools/eg-frpc": "1.0.3", 186 | "@applitools/eg-socks5-proxy-server": "^0.5.4", 187 | "@applitools/logger": "^1.0.12", 188 | "dotenv": "^16.0.0", 189 | "encoding": "^0.1.13", 190 | "fastify": "^3.24.1", 191 | "fastify-plugin": "^3.0.1", 192 | "find-process": "^1.4.7", 193 | "ini": "^3.0.0", 194 | "node-cleanup": "^2.1.2", 195 | "node-fetch": "^2.6.7", 196 | "p-retry": "^4.6.2", 197 | "teen_process": "^1.16.0" 198 | }, 199 | "bin": { 200 | "run-execution-grid-tunnel": "scripts/run-execution-grid-tunnel.js" 201 | }, 202 | "engines": { 203 | "node": ">=12.13.0" 204 | } 205 | }, 206 | "node_modules/@applitools/execution-grid-tunnel/node_modules/@applitools/logger": { 207 | "version": "1.1.53", 208 | "resolved": "https://registry.npmjs.org/@applitools/logger/-/logger-1.1.53.tgz", 209 | "integrity": "sha512-4mlzYxc0MgM3WIxEwKqIjn9W7G7kMtQc2bFRxozViKOXypTfr72j8iODs88wcetP0GsXtplhZQ5/6aZN5WY9ug==", 210 | "dev": true, 211 | "dependencies": { 212 | "@applitools/utils": "1.3.36", 213 | "chalk": "4.1.2", 214 | "debug": "4.3.3" 215 | }, 216 | "engines": { 217 | "node": ">=12.13.0" 218 | } 219 | }, 220 | "node_modules/@applitools/eyes": { 221 | "version": "1.2.10", 222 | "resolved": "https://registry.npmjs.org/@applitools/eyes/-/eyes-1.2.10.tgz", 223 | "integrity": "sha512-oUZFrS8cZiJJyPWvnrtEY03LGfyXedS9RXnWx2t3a5vHKi3yfhi5QzQFeX0Hf3Cjh4c1nuEOPewJJOi9NNJhoQ==", 224 | "dev": true, 225 | "dependencies": { 226 | "@applitools/core": "3.0.1", 227 | "@applitools/logger": "2.0.0", 228 | "@applitools/utils": "1.3.36" 229 | }, 230 | "engines": { 231 | "node": ">=12.13.0" 232 | } 233 | }, 234 | "node_modules/@applitools/eyes-playwright": { 235 | "version": "1.17.0", 236 | "resolved": "https://registry.npmjs.org/@applitools/eyes-playwright/-/eyes-playwright-1.17.0.tgz", 237 | "integrity": "sha512-bwVms1PIMTZp4IBzb3IQftQI2nWCpN6bLWr6iiKaUUX6V/tJOIJj9iKLvLBiZBvz311JZI4WzDZ0wRq6lHcdPA==", 238 | "dev": true, 239 | "dependencies": { 240 | "@applitools/eyes": "1.2.10", 241 | "@applitools/spec-driver-playwright": "1.3.12" 242 | }, 243 | "engines": { 244 | "node": ">=12.13.0" 245 | }, 246 | "peerDependencies": { 247 | "playwright": ">=1.0.0" 248 | } 249 | }, 250 | "node_modules/@applitools/functional-commons": { 251 | "version": "1.6.0", 252 | "resolved": "https://registry.npmjs.org/@applitools/functional-commons/-/functional-commons-1.6.0.tgz", 253 | "integrity": "sha512-fwiF0CbeYHDEOTD/NKaFgaI8LvRcGYG2GaJJiRwcedKko16sQ8F3TK5wXfj2Ytjf+8gjwHwsEEX550z3yvDWxA==", 254 | "dev": true, 255 | "engines": { 256 | "node": ">=8.0.0" 257 | } 258 | }, 259 | "node_modules/@applitools/image": { 260 | "version": "1.0.33", 261 | "resolved": "https://registry.npmjs.org/@applitools/image/-/image-1.0.33.tgz", 262 | "integrity": "sha512-+kK/wti750pMhtdgywJ1lG+9I8L7lcQr/CZV7BuVH4OGf9FyXYNmg9UxfNE6IACERvjudPT/BJDzwuJcC9XlPQ==", 263 | "dev": true, 264 | "dependencies": { 265 | "@applitools/utils": "1.3.36", 266 | "bmpimagejs": "1.0.4", 267 | "jpeg-js": "0.4.4", 268 | "png-async": "0.9.4" 269 | }, 270 | "engines": { 271 | "node": ">=12.13.0" 272 | } 273 | }, 274 | "node_modules/@applitools/jsdom": { 275 | "version": "1.0.4", 276 | "resolved": "https://registry.npmjs.org/@applitools/jsdom/-/jsdom-1.0.4.tgz", 277 | "integrity": "sha512-JtjNfTJtphJYHEkicW4xlwtYuRP3TRvjoszfkrcpxTNMCbGkbop8ed9MuUfR83dAZj5NY9begbmEqJohLJco6w==", 278 | "dev": true, 279 | "dependencies": { 280 | "abab": "^2.0.5", 281 | "acorn": "^8.5.0", 282 | "acorn-globals": "^6.0.0", 283 | "cssom": "^0.5.0", 284 | "cssstyle": "^2.3.0", 285 | "data-urls": "^3.0.1", 286 | "decimal.js": "^10.3.1", 287 | "domexception": "^4.0.0", 288 | "escodegen": "^2.0.0", 289 | "form-data": "^4.0.0", 290 | "html-encoding-sniffer": "^3.0.0", 291 | "http-proxy-agent": "^5.0.0", 292 | "https-proxy-agent": "^5.0.0", 293 | "is-potential-custom-element-name": "^1.0.1", 294 | "nwsapi": "^2.2.0", 295 | "parse5": "6.0.1", 296 | "saxes": "^5.0.1", 297 | "symbol-tree": "^3.2.4", 298 | "tough-cookie": "^4.0.0", 299 | "w3c-hr-time": "^1.0.2", 300 | "w3c-xmlserializer": "^3.0.0", 301 | "webidl-conversions": "^7.0.0", 302 | "whatwg-encoding": "^2.0.0", 303 | "whatwg-mimetype": "^3.0.0", 304 | "whatwg-url": "^10.0.0", 305 | "ws": "^8.2.3", 306 | "xml-name-validator": "^4.0.0" 307 | }, 308 | "engines": { 309 | "node": ">=12" 310 | } 311 | }, 312 | "node_modules/@applitools/logger": { 313 | "version": "2.0.0", 314 | "resolved": "https://registry.npmjs.org/@applitools/logger/-/logger-2.0.0.tgz", 315 | "integrity": "sha512-81ulcrNwC1lX46OzrjU5WBHTefxrb3RHtUa919ksnEwWwSTs2brIDcgn2+O54oHQB9J78B8sZxH4RUYWDViZFg==", 316 | "dev": true, 317 | "dependencies": { 318 | "@applitools/utils": "1.3.36", 319 | "chalk": "4.1.2", 320 | "debug": "4.3.3" 321 | }, 322 | "engines": { 323 | "node": ">=12.13.0" 324 | } 325 | }, 326 | "node_modules/@applitools/nml-client": { 327 | "version": "1.3.53", 328 | "resolved": "https://registry.npmjs.org/@applitools/nml-client/-/nml-client-1.3.53.tgz", 329 | "integrity": "sha512-5Yyq7RKpRt8ghOwQWyMjXIEuhG86UAz7rSqMGgUyS90lD8rusMzwvbJCqOwpeAaJP1upl5YET13CLsFuJTbiLA==", 330 | "dev": true, 331 | "dependencies": { 332 | "@applitools/logger": "2.0.0", 333 | "@applitools/req": "1.2.6", 334 | "@applitools/utils": "1.3.36" 335 | }, 336 | "engines": { 337 | "node": ">=12.13.0" 338 | } 339 | }, 340 | "node_modules/@applitools/req": { 341 | "version": "1.2.6", 342 | "resolved": "https://registry.npmjs.org/@applitools/req/-/req-1.2.6.tgz", 343 | "integrity": "sha512-5prGBUanKfqBVxMmFoGPHA9IyIknyGUPvoL6vKb5NkcPqfAOgytyuHpefvT8FFaKVA7F6GU4VwLakcMEBUU3+g==", 344 | "dev": true, 345 | "dependencies": { 346 | "@applitools/utils": "1.3.36", 347 | "abort-controller": "3.0.0", 348 | "http-proxy-agent": "5.0.0", 349 | "https-proxy-agent": "5.0.1", 350 | "node-fetch": "3.3.1" 351 | }, 352 | "engines": { 353 | "node": ">=12.13.0" 354 | } 355 | }, 356 | "node_modules/@applitools/req/node_modules/data-uri-to-buffer": { 357 | "version": "4.0.1", 358 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 359 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 360 | "dev": true, 361 | "engines": { 362 | "node": ">= 12" 363 | } 364 | }, 365 | "node_modules/@applitools/req/node_modules/node-fetch": { 366 | "version": "3.3.1", 367 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", 368 | "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", 369 | "dev": true, 370 | "dependencies": { 371 | "data-uri-to-buffer": "^4.0.0", 372 | "fetch-blob": "^3.1.4", 373 | "formdata-polyfill": "^4.0.10" 374 | }, 375 | "engines": { 376 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 377 | }, 378 | "funding": { 379 | "type": "opencollective", 380 | "url": "https://opencollective.com/node-fetch" 381 | } 382 | }, 383 | "node_modules/@applitools/screenshoter": { 384 | "version": "3.7.44", 385 | "resolved": "https://registry.npmjs.org/@applitools/screenshoter/-/screenshoter-3.7.44.tgz", 386 | "integrity": "sha512-ex6kW7w9Z+kplpplzhGHtGHnMvbt1t121ZYnwNJnEJvsqVUYIxaCBVpE2lZ1n/R7I7o2Tm773HWrncmQdLcYsQ==", 387 | "dev": true, 388 | "dependencies": { 389 | "@applitools/image": "1.0.33", 390 | "@applitools/logger": "2.0.0", 391 | "@applitools/snippets": "2.4.20", 392 | "@applitools/utils": "1.3.36", 393 | "jpeg-js": "0.4.4", 394 | "png-async": "0.9.4" 395 | }, 396 | "engines": { 397 | "node": ">=12.13.0" 398 | } 399 | }, 400 | "node_modules/@applitools/snippets": { 401 | "version": "2.4.20", 402 | "resolved": "https://registry.npmjs.org/@applitools/snippets/-/snippets-2.4.20.tgz", 403 | "integrity": "sha512-T0D23RkKRa+92shWpnBtsPnmcY23qv8SOB/aVH+VvLqZrHxsof0otcWi0dNTYHQNr+7AfJeDgimWqirQ+7X0QQ==", 404 | "dev": true, 405 | "engines": { 406 | "node": ">=12.13.0" 407 | } 408 | }, 409 | "node_modules/@applitools/socket": { 410 | "version": "1.0.14", 411 | "resolved": "https://registry.npmjs.org/@applitools/socket/-/socket-1.0.14.tgz", 412 | "integrity": "sha512-bskq94hvx+r37JvldWQvJ85/EoXCmjI3P4Glo0MrsllhK0gpDPIENWCXvQkqO3lZtM714gyCAzkUZObwG4uxCg==", 413 | "dev": true, 414 | "dependencies": { 415 | "@applitools/logger": "2.0.0", 416 | "@applitools/utils": "1.3.36" 417 | }, 418 | "engines": { 419 | "node": ">=12.13.0" 420 | } 421 | }, 422 | "node_modules/@applitools/spec-driver-playwright": { 423 | "version": "1.3.12", 424 | "resolved": "https://registry.npmjs.org/@applitools/spec-driver-playwright/-/spec-driver-playwright-1.3.12.tgz", 425 | "integrity": "sha512-rHt19zIDdKuIExxdz2nvGlI6IsKAn3x88y/iMSGaqSkExN/rISDR0iMmny8LavL1H9dpsv6b8DEFdkegRSUA6A==", 426 | "dev": true, 427 | "dependencies": { 428 | "@applitools/driver": "1.11.51", 429 | "@applitools/utils": "1.3.36" 430 | }, 431 | "engines": { 432 | "node": ">=12.13.0" 433 | }, 434 | "peerDependencies": { 435 | "playwright": ">=1.0.0" 436 | } 437 | }, 438 | "node_modules/@applitools/spec-driver-webdriver": { 439 | "version": "1.0.31", 440 | "resolved": "https://registry.npmjs.org/@applitools/spec-driver-webdriver/-/spec-driver-webdriver-1.0.31.tgz", 441 | "integrity": "sha512-o2V57DXGdSdFuLBKufeU+pgzqTio6rYoqSbUV4nH3/oz7or/jcqQmOpemwj+pa7eBBO/k8QiE2+8U3d0FDPs3g==", 442 | "dev": true, 443 | "dependencies": { 444 | "@applitools/driver": "1.11.51", 445 | "@applitools/utils": "1.3.36", 446 | "proxy-agent": "5.0.0" 447 | }, 448 | "engines": { 449 | "node": ">=12.13.0" 450 | }, 451 | "peerDependencies": { 452 | "webdriver": ">=7.27.0" 453 | } 454 | }, 455 | "node_modules/@applitools/ufg-client": { 456 | "version": "1.2.13", 457 | "resolved": "https://registry.npmjs.org/@applitools/ufg-client/-/ufg-client-1.2.13.tgz", 458 | "integrity": "sha512-wLhvks5EVLP1fTouybIM569fkRSgNipxlWpbFDLImX6apzLYk34aXmvP/0yqzzHnxPCVIutLyF/PKWUbzPvAiw==", 459 | "dev": true, 460 | "dependencies": { 461 | "@applitools/jsdom": "1.0.4", 462 | "@applitools/logger": "2.0.0", 463 | "@applitools/req": "1.2.6", 464 | "@applitools/utils": "1.3.36", 465 | "abort-controller": "3.0.0", 466 | "css-tree": "2.3.1", 467 | "throat": "6.0.1" 468 | }, 469 | "engines": { 470 | "node": ">=12.13.0" 471 | } 472 | }, 473 | "node_modules/@applitools/ufg-client/node_modules/throat": { 474 | "version": "6.0.1", 475 | "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", 476 | "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", 477 | "dev": true 478 | }, 479 | "node_modules/@applitools/utils": { 480 | "version": "1.3.36", 481 | "resolved": "https://registry.npmjs.org/@applitools/utils/-/utils-1.3.36.tgz", 482 | "integrity": "sha512-eROEssh7wIW+V87PvLiHI2hUPxqoBxXFMRx3+z5qOZqXUPSR1Uz7EMFwxZcDDR7T6C3O3UDckB2aVB5fJAg5JA==", 483 | "dev": true, 484 | "engines": { 485 | "node": ">=12.13.0" 486 | } 487 | }, 488 | "node_modules/@babel/runtime": { 489 | "version": "7.21.5", 490 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", 491 | "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", 492 | "dev": true, 493 | "dependencies": { 494 | "regenerator-runtime": "^0.13.11" 495 | }, 496 | "engines": { 497 | "node": ">=6.9.0" 498 | } 499 | }, 500 | "node_modules/@fastify/ajv-compiler": { 501 | "version": "1.1.0", 502 | "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz", 503 | "integrity": "sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==", 504 | "dev": true, 505 | "dependencies": { 506 | "ajv": "^6.12.6" 507 | } 508 | }, 509 | "node_modules/@fastify/error": { 510 | "version": "2.0.0", 511 | "resolved": "https://registry.npmjs.org/@fastify/error/-/error-2.0.0.tgz", 512 | "integrity": "sha512-wI3fpfDT0t7p8E6dA2eTECzzOd+bZsZCJ2Hcv+Onn2b7ZwK3RwD27uW2QDaMtQhAfWQQP+WNK7nKf0twLsBf9w==", 513 | "dev": true 514 | }, 515 | "node_modules/@playwright/test": { 516 | "version": "1.34.2", 517 | "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.34.2.tgz", 518 | "integrity": "sha512-v/LBnwzD0225q8xEv3t9DmNPX61yvNnEbiA8PoNk1fbkxApJFCWYLPpQbdVWzHaARdZD9g1PYBoOvnffortfKw==", 519 | "dev": true, 520 | "dependencies": { 521 | "@types/node": "*", 522 | "playwright-core": "1.34.2" 523 | }, 524 | "bin": { 525 | "playwright": "cli.js" 526 | }, 527 | "engines": { 528 | "node": ">=14" 529 | }, 530 | "optionalDependencies": { 531 | "fsevents": "2.3.2" 532 | } 533 | }, 534 | "node_modules/@sindresorhus/is": { 535 | "version": "4.6.0", 536 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 537 | "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", 538 | "dev": true, 539 | "engines": { 540 | "node": ">=10" 541 | }, 542 | "funding": { 543 | "url": "https://github.com/sindresorhus/is?sponsor=1" 544 | } 545 | }, 546 | "node_modules/@szmarczak/http-timer": { 547 | "version": "4.0.6", 548 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", 549 | "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", 550 | "dev": true, 551 | "dependencies": { 552 | "defer-to-connect": "^2.0.0" 553 | }, 554 | "engines": { 555 | "node": ">=10" 556 | } 557 | }, 558 | "node_modules/@tootallnate/once": { 559 | "version": "2.0.0", 560 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", 561 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", 562 | "dev": true, 563 | "engines": { 564 | "node": ">= 10" 565 | } 566 | }, 567 | "node_modules/@types/cacheable-request": { 568 | "version": "6.0.3", 569 | "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", 570 | "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", 571 | "dev": true, 572 | "dependencies": { 573 | "@types/http-cache-semantics": "*", 574 | "@types/keyv": "^3.1.4", 575 | "@types/node": "*", 576 | "@types/responselike": "^1.0.0" 577 | } 578 | }, 579 | "node_modules/@types/http-cache-semantics": { 580 | "version": "4.0.1", 581 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 582 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", 583 | "dev": true 584 | }, 585 | "node_modules/@types/keyv": { 586 | "version": "3.1.4", 587 | "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", 588 | "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", 589 | "dev": true, 590 | "dependencies": { 591 | "@types/node": "*" 592 | } 593 | }, 594 | "node_modules/@types/node": { 595 | "version": "18.16.3", 596 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", 597 | "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", 598 | "dev": true 599 | }, 600 | "node_modules/@types/responselike": { 601 | "version": "1.0.0", 602 | "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", 603 | "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", 604 | "dev": true, 605 | "dependencies": { 606 | "@types/node": "*" 607 | } 608 | }, 609 | "node_modules/@types/retry": { 610 | "version": "0.12.0", 611 | "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 612 | "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", 613 | "dev": true 614 | }, 615 | "node_modules/@types/ws": { 616 | "version": "8.5.4", 617 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", 618 | "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", 619 | "dev": true, 620 | "dependencies": { 621 | "@types/node": "*" 622 | } 623 | }, 624 | "node_modules/@wdio/config": { 625 | "version": "7.30.0", 626 | "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.30.0.tgz", 627 | "integrity": "sha512-/38rol9WCfFTMtXyd/C856/aexxIZnfVvXg7Fw2WXpqZ9qadLA+R4N35S2703n/RByjK/5XAYtHoljtvh3727w==", 628 | "dev": true, 629 | "dependencies": { 630 | "@wdio/logger": "7.26.0", 631 | "@wdio/types": "7.26.0", 632 | "@wdio/utils": "7.26.0", 633 | "deepmerge": "^4.0.0", 634 | "glob": "^8.0.3" 635 | }, 636 | "engines": { 637 | "node": ">=12.0.0" 638 | } 639 | }, 640 | "node_modules/@wdio/logger": { 641 | "version": "7.26.0", 642 | "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", 643 | "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", 644 | "dev": true, 645 | "dependencies": { 646 | "chalk": "^4.0.0", 647 | "loglevel": "^1.6.0", 648 | "loglevel-plugin-prefix": "^0.8.4", 649 | "strip-ansi": "^6.0.0" 650 | }, 651 | "engines": { 652 | "node": ">=12.0.0" 653 | } 654 | }, 655 | "node_modules/@wdio/protocols": { 656 | "version": "7.27.0", 657 | "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.27.0.tgz", 658 | "integrity": "sha512-hT/U22R5i3HhwPjkaKAG0yd59eaOaZB0eibRj2+esCImkb5Y6rg8FirrlYRxIGFVBl0+xZV0jKHzR5+o097nvg==", 659 | "dev": true, 660 | "engines": { 661 | "node": ">=12.0.0" 662 | } 663 | }, 664 | "node_modules/@wdio/types": { 665 | "version": "7.26.0", 666 | "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", 667 | "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", 668 | "dev": true, 669 | "dependencies": { 670 | "@types/node": "^18.0.0", 671 | "got": "^11.8.1" 672 | }, 673 | "engines": { 674 | "node": ">=12.0.0" 675 | }, 676 | "peerDependencies": { 677 | "typescript": "^4.6.2" 678 | }, 679 | "peerDependenciesMeta": { 680 | "typescript": { 681 | "optional": true 682 | } 683 | } 684 | }, 685 | "node_modules/@wdio/utils": { 686 | "version": "7.26.0", 687 | "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", 688 | "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", 689 | "dev": true, 690 | "dependencies": { 691 | "@wdio/logger": "7.26.0", 692 | "@wdio/types": "7.26.0", 693 | "p-iteration": "^1.1.8" 694 | }, 695 | "engines": { 696 | "node": ">=12.0.0" 697 | } 698 | }, 699 | "node_modules/abab": { 700 | "version": "2.0.6", 701 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", 702 | "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", 703 | "dev": true 704 | }, 705 | "node_modules/abort-controller": { 706 | "version": "3.0.0", 707 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 708 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 709 | "dev": true, 710 | "dependencies": { 711 | "event-target-shim": "^5.0.0" 712 | }, 713 | "engines": { 714 | "node": ">=6.5" 715 | } 716 | }, 717 | "node_modules/abstract-logging": { 718 | "version": "2.0.1", 719 | "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", 720 | "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", 721 | "dev": true 722 | }, 723 | "node_modules/acorn": { 724 | "version": "8.8.2", 725 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 726 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 727 | "dev": true, 728 | "bin": { 729 | "acorn": "bin/acorn" 730 | }, 731 | "engines": { 732 | "node": ">=0.4.0" 733 | } 734 | }, 735 | "node_modules/acorn-globals": { 736 | "version": "6.0.0", 737 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", 738 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", 739 | "dev": true, 740 | "dependencies": { 741 | "acorn": "^7.1.1", 742 | "acorn-walk": "^7.1.1" 743 | } 744 | }, 745 | "node_modules/acorn-globals/node_modules/acorn": { 746 | "version": "7.4.1", 747 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 748 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 749 | "dev": true, 750 | "bin": { 751 | "acorn": "bin/acorn" 752 | }, 753 | "engines": { 754 | "node": ">=0.4.0" 755 | } 756 | }, 757 | "node_modules/acorn-walk": { 758 | "version": "7.2.0", 759 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 760 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 761 | "dev": true, 762 | "engines": { 763 | "node": ">=0.4.0" 764 | } 765 | }, 766 | "node_modules/agent-base": { 767 | "version": "6.0.2", 768 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 769 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 770 | "dev": true, 771 | "dependencies": { 772 | "debug": "4" 773 | }, 774 | "engines": { 775 | "node": ">= 6.0.0" 776 | } 777 | }, 778 | "node_modules/ajv": { 779 | "version": "6.12.6", 780 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 781 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 782 | "dev": true, 783 | "dependencies": { 784 | "fast-deep-equal": "^3.1.1", 785 | "fast-json-stable-stringify": "^2.0.0", 786 | "json-schema-traverse": "^0.4.1", 787 | "uri-js": "^4.2.2" 788 | }, 789 | "funding": { 790 | "type": "github", 791 | "url": "https://github.com/sponsors/epoberezkin" 792 | } 793 | }, 794 | "node_modules/ansi-regex": { 795 | "version": "5.0.1", 796 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 797 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 798 | "dev": true, 799 | "engines": { 800 | "node": ">=8" 801 | } 802 | }, 803 | "node_modules/ansi-styles": { 804 | "version": "4.3.0", 805 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 806 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 807 | "dev": true, 808 | "dependencies": { 809 | "color-convert": "^2.0.1" 810 | }, 811 | "engines": { 812 | "node": ">=8" 813 | }, 814 | "funding": { 815 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 816 | } 817 | }, 818 | "node_modules/archy": { 819 | "version": "1.0.0", 820 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 821 | "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", 822 | "dev": true 823 | }, 824 | "node_modules/ast-types": { 825 | "version": "0.13.4", 826 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 827 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 828 | "dev": true, 829 | "dependencies": { 830 | "tslib": "^2.0.1" 831 | }, 832 | "engines": { 833 | "node": ">=4" 834 | } 835 | }, 836 | "node_modules/asynckit": { 837 | "version": "0.4.0", 838 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 839 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 840 | "dev": true 841 | }, 842 | "node_modules/atomic-sleep": { 843 | "version": "1.0.0", 844 | "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", 845 | "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", 846 | "dev": true, 847 | "engines": { 848 | "node": ">=8.0.0" 849 | } 850 | }, 851 | "node_modules/avvio": { 852 | "version": "7.2.5", 853 | "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.5.tgz", 854 | "integrity": "sha512-AOhBxyLVdpOad3TujtC9kL/9r3HnTkxwQ5ggOsYrvvZP1cCFvzHWJd5XxZDFuTn+IN8vkKSG5SEJrd27vCSbeA==", 855 | "dev": true, 856 | "dependencies": { 857 | "archy": "^1.0.0", 858 | "debug": "^4.0.0", 859 | "fastq": "^1.6.1", 860 | "queue-microtask": "^1.1.2" 861 | } 862 | }, 863 | "node_modules/balanced-match": { 864 | "version": "1.0.2", 865 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 866 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 867 | "dev": true 868 | }, 869 | "node_modules/binary": { 870 | "version": "0.3.0", 871 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 872 | "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", 873 | "dev": true, 874 | "dependencies": { 875 | "buffers": "~0.1.1", 876 | "chainsaw": "~0.1.0" 877 | }, 878 | "engines": { 879 | "node": "*" 880 | } 881 | }, 882 | "node_modules/bluebird": { 883 | "version": "3.7.2", 884 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 885 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 886 | "dev": true 887 | }, 888 | "node_modules/bmpimagejs": { 889 | "version": "1.0.4", 890 | "resolved": "https://registry.npmjs.org/bmpimagejs/-/bmpimagejs-1.0.4.tgz", 891 | "integrity": "sha512-21oKU7kbRt2OgOOj7rdiNr/yznDNUQ585plxR00rsmECcZr+6O1oCwB8OIoSHk/bDhbG8mFXIdeQuCPHgZ6QBw==", 892 | "dev": true 893 | }, 894 | "node_modules/brace-expansion": { 895 | "version": "2.0.1", 896 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 897 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 898 | "dev": true, 899 | "dependencies": { 900 | "balanced-match": "^1.0.0" 901 | } 902 | }, 903 | "node_modules/browser-process-hrtime": { 904 | "version": "1.0.0", 905 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", 906 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", 907 | "dev": true 908 | }, 909 | "node_modules/buffer-from": { 910 | "version": "1.1.2", 911 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 912 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 913 | "dev": true 914 | }, 915 | "node_modules/buffers": { 916 | "version": "0.1.1", 917 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 918 | "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", 919 | "dev": true, 920 | "engines": { 921 | "node": ">=0.2.0" 922 | } 923 | }, 924 | "node_modules/bytes": { 925 | "version": "3.1.2", 926 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 927 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 928 | "dev": true, 929 | "engines": { 930 | "node": ">= 0.8" 931 | } 932 | }, 933 | "node_modules/cacheable-lookup": { 934 | "version": "5.0.4", 935 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", 936 | "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", 937 | "dev": true, 938 | "engines": { 939 | "node": ">=10.6.0" 940 | } 941 | }, 942 | "node_modules/cacheable-request": { 943 | "version": "7.0.2", 944 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", 945 | "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", 946 | "dev": true, 947 | "dependencies": { 948 | "clone-response": "^1.0.2", 949 | "get-stream": "^5.1.0", 950 | "http-cache-semantics": "^4.0.0", 951 | "keyv": "^4.0.0", 952 | "lowercase-keys": "^2.0.0", 953 | "normalize-url": "^6.0.1", 954 | "responselike": "^2.0.0" 955 | }, 956 | "engines": { 957 | "node": ">=8" 958 | } 959 | }, 960 | "node_modules/chainsaw": { 961 | "version": "0.1.0", 962 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 963 | "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", 964 | "dev": true, 965 | "dependencies": { 966 | "traverse": ">=0.3.0 <0.4" 967 | }, 968 | "engines": { 969 | "node": "*" 970 | } 971 | }, 972 | "node_modules/chalk": { 973 | "version": "4.1.2", 974 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 975 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 976 | "dev": true, 977 | "dependencies": { 978 | "ansi-styles": "^4.1.0", 979 | "supports-color": "^7.1.0" 980 | }, 981 | "engines": { 982 | "node": ">=10" 983 | }, 984 | "funding": { 985 | "url": "https://github.com/chalk/chalk?sponsor=1" 986 | } 987 | }, 988 | "node_modules/cliui": { 989 | "version": "8.0.1", 990 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 991 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 992 | "dev": true, 993 | "dependencies": { 994 | "string-width": "^4.2.0", 995 | "strip-ansi": "^6.0.1", 996 | "wrap-ansi": "^7.0.0" 997 | }, 998 | "engines": { 999 | "node": ">=12" 1000 | } 1001 | }, 1002 | "node_modules/clone-response": { 1003 | "version": "1.0.3", 1004 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", 1005 | "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", 1006 | "dev": true, 1007 | "dependencies": { 1008 | "mimic-response": "^1.0.0" 1009 | }, 1010 | "funding": { 1011 | "url": "https://github.com/sponsors/sindresorhus" 1012 | } 1013 | }, 1014 | "node_modules/color-convert": { 1015 | "version": "2.0.1", 1016 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1017 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1018 | "dev": true, 1019 | "dependencies": { 1020 | "color-name": "~1.1.4" 1021 | }, 1022 | "engines": { 1023 | "node": ">=7.0.0" 1024 | } 1025 | }, 1026 | "node_modules/color-name": { 1027 | "version": "1.1.4", 1028 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1029 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1030 | "dev": true 1031 | }, 1032 | "node_modules/combined-stream": { 1033 | "version": "1.0.8", 1034 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1035 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1036 | "dev": true, 1037 | "dependencies": { 1038 | "delayed-stream": "~1.0.0" 1039 | }, 1040 | "engines": { 1041 | "node": ">= 0.8" 1042 | } 1043 | }, 1044 | "node_modules/commander": { 1045 | "version": "5.1.0", 1046 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 1047 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", 1048 | "dev": true, 1049 | "engines": { 1050 | "node": ">= 6" 1051 | } 1052 | }, 1053 | "node_modules/cookie": { 1054 | "version": "0.5.0", 1055 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1056 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 1057 | "dev": true, 1058 | "engines": { 1059 | "node": ">= 0.6" 1060 | } 1061 | }, 1062 | "node_modules/core-util-is": { 1063 | "version": "1.0.3", 1064 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1065 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 1066 | "dev": true 1067 | }, 1068 | "node_modules/css-tree": { 1069 | "version": "2.3.1", 1070 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", 1071 | "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", 1072 | "dev": true, 1073 | "dependencies": { 1074 | "mdn-data": "2.0.30", 1075 | "source-map-js": "^1.0.1" 1076 | }, 1077 | "engines": { 1078 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 1079 | } 1080 | }, 1081 | "node_modules/cssom": { 1082 | "version": "0.5.0", 1083 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", 1084 | "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", 1085 | "dev": true 1086 | }, 1087 | "node_modules/cssstyle": { 1088 | "version": "2.3.0", 1089 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", 1090 | "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", 1091 | "dev": true, 1092 | "dependencies": { 1093 | "cssom": "~0.3.6" 1094 | }, 1095 | "engines": { 1096 | "node": ">=8" 1097 | } 1098 | }, 1099 | "node_modules/cssstyle/node_modules/cssom": { 1100 | "version": "0.3.8", 1101 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", 1102 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", 1103 | "dev": true 1104 | }, 1105 | "node_modules/data-uri-to-buffer": { 1106 | "version": "3.0.1", 1107 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", 1108 | "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", 1109 | "dev": true, 1110 | "engines": { 1111 | "node": ">= 6" 1112 | } 1113 | }, 1114 | "node_modules/data-urls": { 1115 | "version": "3.0.2", 1116 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", 1117 | "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", 1118 | "dev": true, 1119 | "dependencies": { 1120 | "abab": "^2.0.6", 1121 | "whatwg-mimetype": "^3.0.0", 1122 | "whatwg-url": "^11.0.0" 1123 | }, 1124 | "engines": { 1125 | "node": ">=12" 1126 | } 1127 | }, 1128 | "node_modules/data-urls/node_modules/whatwg-url": { 1129 | "version": "11.0.0", 1130 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", 1131 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", 1132 | "dev": true, 1133 | "dependencies": { 1134 | "tr46": "^3.0.0", 1135 | "webidl-conversions": "^7.0.0" 1136 | }, 1137 | "engines": { 1138 | "node": ">=12" 1139 | } 1140 | }, 1141 | "node_modules/debug": { 1142 | "version": "4.3.3", 1143 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 1144 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 1145 | "dev": true, 1146 | "dependencies": { 1147 | "ms": "2.1.2" 1148 | }, 1149 | "engines": { 1150 | "node": ">=6.0" 1151 | }, 1152 | "peerDependenciesMeta": { 1153 | "supports-color": { 1154 | "optional": true 1155 | } 1156 | } 1157 | }, 1158 | "node_modules/decimal.js": { 1159 | "version": "10.4.3", 1160 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", 1161 | "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", 1162 | "dev": true 1163 | }, 1164 | "node_modules/decompress-response": { 1165 | "version": "6.0.0", 1166 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 1167 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 1168 | "dev": true, 1169 | "dependencies": { 1170 | "mimic-response": "^3.1.0" 1171 | }, 1172 | "engines": { 1173 | "node": ">=10" 1174 | }, 1175 | "funding": { 1176 | "url": "https://github.com/sponsors/sindresorhus" 1177 | } 1178 | }, 1179 | "node_modules/decompress-response/node_modules/mimic-response": { 1180 | "version": "3.1.0", 1181 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1182 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1183 | "dev": true, 1184 | "engines": { 1185 | "node": ">=10" 1186 | }, 1187 | "funding": { 1188 | "url": "https://github.com/sponsors/sindresorhus" 1189 | } 1190 | }, 1191 | "node_modules/deep-is": { 1192 | "version": "0.1.4", 1193 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1194 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1195 | "dev": true 1196 | }, 1197 | "node_modules/deepmerge": { 1198 | "version": "4.3.1", 1199 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 1200 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 1201 | "dev": true, 1202 | "engines": { 1203 | "node": ">=0.10.0" 1204 | } 1205 | }, 1206 | "node_modules/defer-to-connect": { 1207 | "version": "2.0.1", 1208 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 1209 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", 1210 | "dev": true, 1211 | "engines": { 1212 | "node": ">=10" 1213 | } 1214 | }, 1215 | "node_modules/degenerator": { 1216 | "version": "3.0.4", 1217 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.4.tgz", 1218 | "integrity": "sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==", 1219 | "dev": true, 1220 | "dependencies": { 1221 | "ast-types": "^0.13.2", 1222 | "escodegen": "^1.8.1", 1223 | "esprima": "^4.0.0", 1224 | "vm2": "^3.9.17" 1225 | }, 1226 | "engines": { 1227 | "node": ">= 6" 1228 | } 1229 | }, 1230 | "node_modules/degenerator/node_modules/escodegen": { 1231 | "version": "1.14.3", 1232 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", 1233 | "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", 1234 | "dev": true, 1235 | "dependencies": { 1236 | "esprima": "^4.0.1", 1237 | "estraverse": "^4.2.0", 1238 | "esutils": "^2.0.2", 1239 | "optionator": "^0.8.1" 1240 | }, 1241 | "bin": { 1242 | "escodegen": "bin/escodegen.js", 1243 | "esgenerate": "bin/esgenerate.js" 1244 | }, 1245 | "engines": { 1246 | "node": ">=4.0" 1247 | }, 1248 | "optionalDependencies": { 1249 | "source-map": "~0.6.1" 1250 | } 1251 | }, 1252 | "node_modules/degenerator/node_modules/estraverse": { 1253 | "version": "4.3.0", 1254 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1255 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1256 | "dev": true, 1257 | "engines": { 1258 | "node": ">=4.0" 1259 | } 1260 | }, 1261 | "node_modules/delayed-stream": { 1262 | "version": "1.0.0", 1263 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1264 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1265 | "dev": true, 1266 | "engines": { 1267 | "node": ">=0.4.0" 1268 | } 1269 | }, 1270 | "node_modules/depd": { 1271 | "version": "2.0.0", 1272 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1273 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 1274 | "dev": true, 1275 | "engines": { 1276 | "node": ">= 0.8" 1277 | } 1278 | }, 1279 | "node_modules/domexception": { 1280 | "version": "4.0.0", 1281 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", 1282 | "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", 1283 | "dev": true, 1284 | "dependencies": { 1285 | "webidl-conversions": "^7.0.0" 1286 | }, 1287 | "engines": { 1288 | "node": ">=12" 1289 | } 1290 | }, 1291 | "node_modules/dotenv": { 1292 | "version": "16.0.3", 1293 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 1294 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 1295 | "dev": true, 1296 | "engines": { 1297 | "node": ">=12" 1298 | } 1299 | }, 1300 | "node_modules/emoji-regex": { 1301 | "version": "8.0.0", 1302 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1303 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1304 | "dev": true 1305 | }, 1306 | "node_modules/encoding": { 1307 | "version": "0.1.13", 1308 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 1309 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 1310 | "dev": true, 1311 | "dependencies": { 1312 | "iconv-lite": "^0.6.2" 1313 | } 1314 | }, 1315 | "node_modules/end-of-stream": { 1316 | "version": "1.4.4", 1317 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1318 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1319 | "dev": true, 1320 | "dependencies": { 1321 | "once": "^1.4.0" 1322 | } 1323 | }, 1324 | "node_modules/escalade": { 1325 | "version": "3.1.1", 1326 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1327 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1328 | "dev": true, 1329 | "engines": { 1330 | "node": ">=6" 1331 | } 1332 | }, 1333 | "node_modules/escodegen": { 1334 | "version": "2.0.0", 1335 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", 1336 | "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", 1337 | "dev": true, 1338 | "dependencies": { 1339 | "esprima": "^4.0.1", 1340 | "estraverse": "^5.2.0", 1341 | "esutils": "^2.0.2", 1342 | "optionator": "^0.8.1" 1343 | }, 1344 | "bin": { 1345 | "escodegen": "bin/escodegen.js", 1346 | "esgenerate": "bin/esgenerate.js" 1347 | }, 1348 | "engines": { 1349 | "node": ">=6.0" 1350 | }, 1351 | "optionalDependencies": { 1352 | "source-map": "~0.6.1" 1353 | } 1354 | }, 1355 | "node_modules/esprima": { 1356 | "version": "4.0.1", 1357 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1358 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1359 | "dev": true, 1360 | "bin": { 1361 | "esparse": "bin/esparse.js", 1362 | "esvalidate": "bin/esvalidate.js" 1363 | }, 1364 | "engines": { 1365 | "node": ">=4" 1366 | } 1367 | }, 1368 | "node_modules/estraverse": { 1369 | "version": "5.3.0", 1370 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1371 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1372 | "dev": true, 1373 | "engines": { 1374 | "node": ">=4.0" 1375 | } 1376 | }, 1377 | "node_modules/esutils": { 1378 | "version": "2.0.3", 1379 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1380 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1381 | "dev": true, 1382 | "engines": { 1383 | "node": ">=0.10.0" 1384 | } 1385 | }, 1386 | "node_modules/event-target-shim": { 1387 | "version": "5.0.1", 1388 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1389 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1390 | "dev": true, 1391 | "engines": { 1392 | "node": ">=6" 1393 | } 1394 | }, 1395 | "node_modules/fast-content-type-parse": { 1396 | "version": "1.0.0", 1397 | "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.0.0.tgz", 1398 | "integrity": "sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==", 1399 | "dev": true 1400 | }, 1401 | "node_modules/fast-decode-uri-component": { 1402 | "version": "1.0.1", 1403 | "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", 1404 | "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", 1405 | "dev": true 1406 | }, 1407 | "node_modules/fast-deep-equal": { 1408 | "version": "3.1.3", 1409 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1410 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1411 | "dev": true 1412 | }, 1413 | "node_modules/fast-json-stable-stringify": { 1414 | "version": "2.1.0", 1415 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1416 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1417 | "dev": true 1418 | }, 1419 | "node_modules/fast-json-stringify": { 1420 | "version": "2.7.13", 1421 | "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", 1422 | "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", 1423 | "dev": true, 1424 | "dependencies": { 1425 | "ajv": "^6.11.0", 1426 | "deepmerge": "^4.2.2", 1427 | "rfdc": "^1.2.0", 1428 | "string-similarity": "^4.0.1" 1429 | }, 1430 | "engines": { 1431 | "node": ">= 10.0.0" 1432 | } 1433 | }, 1434 | "node_modules/fast-levenshtein": { 1435 | "version": "2.0.6", 1436 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1437 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1438 | "dev": true 1439 | }, 1440 | "node_modules/fast-redact": { 1441 | "version": "3.2.0", 1442 | "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", 1443 | "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", 1444 | "dev": true, 1445 | "engines": { 1446 | "node": ">=6" 1447 | } 1448 | }, 1449 | "node_modules/fast-safe-stringify": { 1450 | "version": "2.1.1", 1451 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 1452 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", 1453 | "dev": true 1454 | }, 1455 | "node_modules/fastify": { 1456 | "version": "3.29.5", 1457 | "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.29.5.tgz", 1458 | "integrity": "sha512-FBDgb1gkenZxxh4sTD6AdI6mFnZnsgckpjIXzIvfLSYCa4isfQeD8QWGPib63dxq6btnY0l1j8I0xYhMvUb+sw==", 1459 | "dev": true, 1460 | "dependencies": { 1461 | "@fastify/ajv-compiler": "^1.0.0", 1462 | "@fastify/error": "^2.0.0", 1463 | "abstract-logging": "^2.0.0", 1464 | "avvio": "^7.1.2", 1465 | "fast-content-type-parse": "^1.0.0", 1466 | "fast-json-stringify": "^2.5.2", 1467 | "find-my-way": "^4.5.0", 1468 | "flatstr": "^1.0.12", 1469 | "light-my-request": "^4.2.0", 1470 | "pino": "^6.13.0", 1471 | "process-warning": "^1.0.0", 1472 | "proxy-addr": "^2.0.7", 1473 | "rfdc": "^1.1.4", 1474 | "secure-json-parse": "^2.0.0", 1475 | "semver": "^7.3.2", 1476 | "tiny-lru": "^8.0.1" 1477 | } 1478 | }, 1479 | "node_modules/fastify-plugin": { 1480 | "version": "3.0.1", 1481 | "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-3.0.1.tgz", 1482 | "integrity": "sha512-qKcDXmuZadJqdTm6vlCqioEbyewF60b/0LOFCcYN1B6BIZGlYJumWWOYs70SFYLDAH4YqdE1cxH/RKMG7rFxgA==", 1483 | "dev": true 1484 | }, 1485 | "node_modules/fastq": { 1486 | "version": "1.15.0", 1487 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 1488 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 1489 | "dev": true, 1490 | "dependencies": { 1491 | "reusify": "^1.0.4" 1492 | } 1493 | }, 1494 | "node_modules/fetch-blob": { 1495 | "version": "3.2.0", 1496 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 1497 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 1498 | "dev": true, 1499 | "funding": [ 1500 | { 1501 | "type": "github", 1502 | "url": "https://github.com/sponsors/jimmywarting" 1503 | }, 1504 | { 1505 | "type": "paypal", 1506 | "url": "https://paypal.me/jimmywarting" 1507 | } 1508 | ], 1509 | "dependencies": { 1510 | "node-domexception": "^1.0.0", 1511 | "web-streams-polyfill": "^3.0.3" 1512 | }, 1513 | "engines": { 1514 | "node": "^12.20 || >= 14.13" 1515 | } 1516 | }, 1517 | "node_modules/file-uri-to-path": { 1518 | "version": "2.0.0", 1519 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", 1520 | "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", 1521 | "dev": true, 1522 | "engines": { 1523 | "node": ">= 6" 1524 | } 1525 | }, 1526 | "node_modules/find-my-way": { 1527 | "version": "4.5.1", 1528 | "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.5.1.tgz", 1529 | "integrity": "sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==", 1530 | "dev": true, 1531 | "dependencies": { 1532 | "fast-decode-uri-component": "^1.0.1", 1533 | "fast-deep-equal": "^3.1.3", 1534 | "safe-regex2": "^2.0.0", 1535 | "semver-store": "^0.3.0" 1536 | }, 1537 | "engines": { 1538 | "node": ">=10" 1539 | } 1540 | }, 1541 | "node_modules/find-process": { 1542 | "version": "1.4.7", 1543 | "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", 1544 | "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", 1545 | "dev": true, 1546 | "dependencies": { 1547 | "chalk": "^4.0.0", 1548 | "commander": "^5.1.0", 1549 | "debug": "^4.1.1" 1550 | }, 1551 | "bin": { 1552 | "find-process": "bin/find-process.js" 1553 | } 1554 | }, 1555 | "node_modules/flatstr": { 1556 | "version": "1.0.12", 1557 | "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", 1558 | "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==", 1559 | "dev": true 1560 | }, 1561 | "node_modules/form-data": { 1562 | "version": "4.0.0", 1563 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1564 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1565 | "dev": true, 1566 | "dependencies": { 1567 | "asynckit": "^0.4.0", 1568 | "combined-stream": "^1.0.8", 1569 | "mime-types": "^2.1.12" 1570 | }, 1571 | "engines": { 1572 | "node": ">= 6" 1573 | } 1574 | }, 1575 | "node_modules/formdata-polyfill": { 1576 | "version": "4.0.10", 1577 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 1578 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 1579 | "dev": true, 1580 | "dependencies": { 1581 | "fetch-blob": "^3.1.2" 1582 | }, 1583 | "engines": { 1584 | "node": ">=12.20.0" 1585 | } 1586 | }, 1587 | "node_modules/forwarded": { 1588 | "version": "0.2.0", 1589 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1590 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1591 | "dev": true, 1592 | "engines": { 1593 | "node": ">= 0.6" 1594 | } 1595 | }, 1596 | "node_modules/fs-extra": { 1597 | "version": "8.1.0", 1598 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 1599 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 1600 | "dev": true, 1601 | "dependencies": { 1602 | "graceful-fs": "^4.2.0", 1603 | "jsonfile": "^4.0.0", 1604 | "universalify": "^0.1.0" 1605 | }, 1606 | "engines": { 1607 | "node": ">=6 <7 || >=8" 1608 | } 1609 | }, 1610 | "node_modules/fs.realpath": { 1611 | "version": "1.0.0", 1612 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1613 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1614 | "dev": true 1615 | }, 1616 | "node_modules/fsevents": { 1617 | "version": "2.3.2", 1618 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1619 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1620 | "dev": true, 1621 | "hasInstallScript": true, 1622 | "optional": true, 1623 | "os": [ 1624 | "darwin" 1625 | ], 1626 | "engines": { 1627 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1628 | } 1629 | }, 1630 | "node_modules/ftp": { 1631 | "version": "0.3.10", 1632 | "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", 1633 | "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", 1634 | "dev": true, 1635 | "dependencies": { 1636 | "readable-stream": "1.1.x", 1637 | "xregexp": "2.0.0" 1638 | }, 1639 | "engines": { 1640 | "node": ">=0.8.0" 1641 | } 1642 | }, 1643 | "node_modules/get-caller-file": { 1644 | "version": "2.0.5", 1645 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1646 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1647 | "dev": true, 1648 | "engines": { 1649 | "node": "6.* || 8.* || >= 10.*" 1650 | } 1651 | }, 1652 | "node_modules/get-stream": { 1653 | "version": "5.2.0", 1654 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1655 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1656 | "dev": true, 1657 | "dependencies": { 1658 | "pump": "^3.0.0" 1659 | }, 1660 | "engines": { 1661 | "node": ">=8" 1662 | }, 1663 | "funding": { 1664 | "url": "https://github.com/sponsors/sindresorhus" 1665 | } 1666 | }, 1667 | "node_modules/get-uri": { 1668 | "version": "3.0.2", 1669 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", 1670 | "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", 1671 | "dev": true, 1672 | "dependencies": { 1673 | "@tootallnate/once": "1", 1674 | "data-uri-to-buffer": "3", 1675 | "debug": "4", 1676 | "file-uri-to-path": "2", 1677 | "fs-extra": "^8.1.0", 1678 | "ftp": "^0.3.10" 1679 | }, 1680 | "engines": { 1681 | "node": ">= 6" 1682 | } 1683 | }, 1684 | "node_modules/get-uri/node_modules/@tootallnate/once": { 1685 | "version": "1.1.2", 1686 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 1687 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 1688 | "dev": true, 1689 | "engines": { 1690 | "node": ">= 6" 1691 | } 1692 | }, 1693 | "node_modules/glob": { 1694 | "version": "8.1.0", 1695 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1696 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1697 | "dev": true, 1698 | "dependencies": { 1699 | "fs.realpath": "^1.0.0", 1700 | "inflight": "^1.0.4", 1701 | "inherits": "2", 1702 | "minimatch": "^5.0.1", 1703 | "once": "^1.3.0" 1704 | }, 1705 | "engines": { 1706 | "node": ">=12" 1707 | }, 1708 | "funding": { 1709 | "url": "https://github.com/sponsors/isaacs" 1710 | } 1711 | }, 1712 | "node_modules/got": { 1713 | "version": "11.8.6", 1714 | "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", 1715 | "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", 1716 | "dev": true, 1717 | "dependencies": { 1718 | "@sindresorhus/is": "^4.0.0", 1719 | "@szmarczak/http-timer": "^4.0.5", 1720 | "@types/cacheable-request": "^6.0.1", 1721 | "@types/responselike": "^1.0.0", 1722 | "cacheable-lookup": "^5.0.3", 1723 | "cacheable-request": "^7.0.2", 1724 | "decompress-response": "^6.0.0", 1725 | "http2-wrapper": "^1.0.0-beta.5.2", 1726 | "lowercase-keys": "^2.0.0", 1727 | "p-cancelable": "^2.0.0", 1728 | "responselike": "^2.0.0" 1729 | }, 1730 | "engines": { 1731 | "node": ">=10.19.0" 1732 | }, 1733 | "funding": { 1734 | "url": "https://github.com/sindresorhus/got?sponsor=1" 1735 | } 1736 | }, 1737 | "node_modules/graceful-fs": { 1738 | "version": "4.2.11", 1739 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1740 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1741 | "dev": true 1742 | }, 1743 | "node_modules/has-flag": { 1744 | "version": "4.0.0", 1745 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1746 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1747 | "dev": true, 1748 | "engines": { 1749 | "node": ">=8" 1750 | } 1751 | }, 1752 | "node_modules/html-encoding-sniffer": { 1753 | "version": "3.0.0", 1754 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", 1755 | "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", 1756 | "dev": true, 1757 | "dependencies": { 1758 | "whatwg-encoding": "^2.0.0" 1759 | }, 1760 | "engines": { 1761 | "node": ">=12" 1762 | } 1763 | }, 1764 | "node_modules/http-cache-semantics": { 1765 | "version": "4.1.1", 1766 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 1767 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 1768 | "dev": true 1769 | }, 1770 | "node_modules/http-errors": { 1771 | "version": "2.0.0", 1772 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1773 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1774 | "dev": true, 1775 | "dependencies": { 1776 | "depd": "2.0.0", 1777 | "inherits": "2.0.4", 1778 | "setprototypeof": "1.2.0", 1779 | "statuses": "2.0.1", 1780 | "toidentifier": "1.0.1" 1781 | }, 1782 | "engines": { 1783 | "node": ">= 0.8" 1784 | } 1785 | }, 1786 | "node_modules/http-proxy-agent": { 1787 | "version": "5.0.0", 1788 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", 1789 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", 1790 | "dev": true, 1791 | "dependencies": { 1792 | "@tootallnate/once": "2", 1793 | "agent-base": "6", 1794 | "debug": "4" 1795 | }, 1796 | "engines": { 1797 | "node": ">= 6" 1798 | } 1799 | }, 1800 | "node_modules/http2-wrapper": { 1801 | "version": "1.0.3", 1802 | "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", 1803 | "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", 1804 | "dev": true, 1805 | "dependencies": { 1806 | "quick-lru": "^5.1.1", 1807 | "resolve-alpn": "^1.0.0" 1808 | }, 1809 | "engines": { 1810 | "node": ">=10.19.0" 1811 | } 1812 | }, 1813 | "node_modules/https-proxy-agent": { 1814 | "version": "5.0.1", 1815 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1816 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1817 | "dev": true, 1818 | "dependencies": { 1819 | "agent-base": "6", 1820 | "debug": "4" 1821 | }, 1822 | "engines": { 1823 | "node": ">= 6" 1824 | } 1825 | }, 1826 | "node_modules/iconv-lite": { 1827 | "version": "0.6.3", 1828 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1829 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1830 | "dev": true, 1831 | "dependencies": { 1832 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1833 | }, 1834 | "engines": { 1835 | "node": ">=0.10.0" 1836 | } 1837 | }, 1838 | "node_modules/inflight": { 1839 | "version": "1.0.6", 1840 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1841 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1842 | "dev": true, 1843 | "dependencies": { 1844 | "once": "^1.3.0", 1845 | "wrappy": "1" 1846 | } 1847 | }, 1848 | "node_modules/inherits": { 1849 | "version": "2.0.4", 1850 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1851 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1852 | "dev": true 1853 | }, 1854 | "node_modules/ini": { 1855 | "version": "3.0.1", 1856 | "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", 1857 | "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", 1858 | "dev": true, 1859 | "engines": { 1860 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1861 | } 1862 | }, 1863 | "node_modules/ip": { 1864 | "version": "1.1.8", 1865 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", 1866 | "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", 1867 | "dev": true 1868 | }, 1869 | "node_modules/ipaddr.js": { 1870 | "version": "1.9.1", 1871 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1872 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1873 | "dev": true, 1874 | "engines": { 1875 | "node": ">= 0.10" 1876 | } 1877 | }, 1878 | "node_modules/is-fullwidth-code-point": { 1879 | "version": "3.0.0", 1880 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1881 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1882 | "dev": true, 1883 | "engines": { 1884 | "node": ">=8" 1885 | } 1886 | }, 1887 | "node_modules/is-localhost-ip": { 1888 | "version": "2.0.0", 1889 | "resolved": "https://registry.npmjs.org/is-localhost-ip/-/is-localhost-ip-2.0.0.tgz", 1890 | "integrity": "sha512-vlgs2cSgMOfnKU8c1ewgKPyum9rVrjjLLW2HBdL5i0iAJjOs8NY55ZBd/hqUTaYR0EO9CKZd3hVSC2HlIbygTQ==", 1891 | "dev": true, 1892 | "engines": { 1893 | "node": ">=12" 1894 | } 1895 | }, 1896 | "node_modules/is-potential-custom-element-name": { 1897 | "version": "1.0.1", 1898 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 1899 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", 1900 | "dev": true 1901 | }, 1902 | "node_modules/isarray": { 1903 | "version": "0.0.1", 1904 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1905 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", 1906 | "dev": true 1907 | }, 1908 | "node_modules/isexe": { 1909 | "version": "2.0.0", 1910 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1911 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1912 | "dev": true 1913 | }, 1914 | "node_modules/jpeg-js": { 1915 | "version": "0.4.4", 1916 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", 1917 | "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", 1918 | "dev": true 1919 | }, 1920 | "node_modules/json-buffer": { 1921 | "version": "3.0.1", 1922 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1923 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1924 | "dev": true 1925 | }, 1926 | "node_modules/json-schema-traverse": { 1927 | "version": "0.4.1", 1928 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1929 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1930 | "dev": true 1931 | }, 1932 | "node_modules/jsonfile": { 1933 | "version": "4.0.0", 1934 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1935 | "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", 1936 | "dev": true, 1937 | "optionalDependencies": { 1938 | "graceful-fs": "^4.1.6" 1939 | } 1940 | }, 1941 | "node_modules/keyv": { 1942 | "version": "4.5.2", 1943 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", 1944 | "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", 1945 | "dev": true, 1946 | "dependencies": { 1947 | "json-buffer": "3.0.1" 1948 | } 1949 | }, 1950 | "node_modules/ky": { 1951 | "version": "0.30.0", 1952 | "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", 1953 | "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", 1954 | "dev": true, 1955 | "engines": { 1956 | "node": ">=12" 1957 | }, 1958 | "funding": { 1959 | "url": "https://github.com/sindresorhus/ky?sponsor=1" 1960 | } 1961 | }, 1962 | "node_modules/levn": { 1963 | "version": "0.3.0", 1964 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1965 | "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", 1966 | "dev": true, 1967 | "dependencies": { 1968 | "prelude-ls": "~1.1.2", 1969 | "type-check": "~0.3.2" 1970 | }, 1971 | "engines": { 1972 | "node": ">= 0.8.0" 1973 | } 1974 | }, 1975 | "node_modules/light-my-request": { 1976 | "version": "4.12.0", 1977 | "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.12.0.tgz", 1978 | "integrity": "sha512-0y+9VIfJEsPVzK5ArSIJ8Dkxp8QMP7/aCuxCUtG/tr9a2NoOf/snATE/OUc05XUplJCEnRh6gTkH7xh9POt1DQ==", 1979 | "dev": true, 1980 | "dependencies": { 1981 | "ajv": "^8.1.0", 1982 | "cookie": "^0.5.0", 1983 | "process-warning": "^1.0.0", 1984 | "set-cookie-parser": "^2.4.1" 1985 | } 1986 | }, 1987 | "node_modules/light-my-request/node_modules/ajv": { 1988 | "version": "8.12.0", 1989 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", 1990 | "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", 1991 | "dev": true, 1992 | "dependencies": { 1993 | "fast-deep-equal": "^3.1.1", 1994 | "json-schema-traverse": "^1.0.0", 1995 | "require-from-string": "^2.0.2", 1996 | "uri-js": "^4.2.2" 1997 | }, 1998 | "funding": { 1999 | "type": "github", 2000 | "url": "https://github.com/sponsors/epoberezkin" 2001 | } 2002 | }, 2003 | "node_modules/light-my-request/node_modules/json-schema-traverse": { 2004 | "version": "1.0.0", 2005 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2006 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 2007 | "dev": true 2008 | }, 2009 | "node_modules/lodash": { 2010 | "version": "4.17.21", 2011 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2012 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2013 | "dev": true 2014 | }, 2015 | "node_modules/lodash.merge": { 2016 | "version": "4.6.2", 2017 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2018 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2019 | "dev": true 2020 | }, 2021 | "node_modules/loglevel": { 2022 | "version": "1.8.1", 2023 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", 2024 | "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", 2025 | "dev": true, 2026 | "engines": { 2027 | "node": ">= 0.6.0" 2028 | }, 2029 | "funding": { 2030 | "type": "tidelift", 2031 | "url": "https://tidelift.com/funding/github/npm/loglevel" 2032 | } 2033 | }, 2034 | "node_modules/loglevel-plugin-prefix": { 2035 | "version": "0.8.4", 2036 | "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", 2037 | "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", 2038 | "dev": true 2039 | }, 2040 | "node_modules/lowercase-keys": { 2041 | "version": "2.0.0", 2042 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 2043 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 2044 | "dev": true, 2045 | "engines": { 2046 | "node": ">=8" 2047 | } 2048 | }, 2049 | "node_modules/lru-cache": { 2050 | "version": "5.1.1", 2051 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2052 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2053 | "dev": true, 2054 | "dependencies": { 2055 | "yallist": "^3.0.2" 2056 | } 2057 | }, 2058 | "node_modules/mdn-data": { 2059 | "version": "2.0.30", 2060 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", 2061 | "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", 2062 | "dev": true 2063 | }, 2064 | "node_modules/mime-db": { 2065 | "version": "1.52.0", 2066 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2067 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2068 | "dev": true, 2069 | "engines": { 2070 | "node": ">= 0.6" 2071 | } 2072 | }, 2073 | "node_modules/mime-types": { 2074 | "version": "2.1.35", 2075 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2076 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2077 | "dev": true, 2078 | "dependencies": { 2079 | "mime-db": "1.52.0" 2080 | }, 2081 | "engines": { 2082 | "node": ">= 0.6" 2083 | } 2084 | }, 2085 | "node_modules/mimic-response": { 2086 | "version": "1.0.1", 2087 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 2088 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 2089 | "dev": true, 2090 | "engines": { 2091 | "node": ">=4" 2092 | } 2093 | }, 2094 | "node_modules/minimatch": { 2095 | "version": "5.1.6", 2096 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 2097 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 2098 | "dev": true, 2099 | "dependencies": { 2100 | "brace-expansion": "^2.0.1" 2101 | }, 2102 | "engines": { 2103 | "node": ">=10" 2104 | } 2105 | }, 2106 | "node_modules/ms": { 2107 | "version": "2.1.2", 2108 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2109 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2110 | "dev": true 2111 | }, 2112 | "node_modules/netmask": { 2113 | "version": "2.0.2", 2114 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 2115 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", 2116 | "dev": true, 2117 | "engines": { 2118 | "node": ">= 0.4.0" 2119 | } 2120 | }, 2121 | "node_modules/node-cleanup": { 2122 | "version": "2.1.2", 2123 | "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", 2124 | "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", 2125 | "dev": true 2126 | }, 2127 | "node_modules/node-domexception": { 2128 | "version": "1.0.0", 2129 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 2130 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 2131 | "dev": true, 2132 | "funding": [ 2133 | { 2134 | "type": "github", 2135 | "url": "https://github.com/sponsors/jimmywarting" 2136 | }, 2137 | { 2138 | "type": "github", 2139 | "url": "https://paypal.me/jimmywarting" 2140 | } 2141 | ], 2142 | "engines": { 2143 | "node": ">=10.5.0" 2144 | } 2145 | }, 2146 | "node_modules/node-fetch": { 2147 | "version": "2.6.7", 2148 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 2149 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 2150 | "dev": true, 2151 | "dependencies": { 2152 | "whatwg-url": "^5.0.0" 2153 | }, 2154 | "engines": { 2155 | "node": "4.x || >=6.0.0" 2156 | }, 2157 | "peerDependencies": { 2158 | "encoding": "^0.1.0" 2159 | }, 2160 | "peerDependenciesMeta": { 2161 | "encoding": { 2162 | "optional": true 2163 | } 2164 | } 2165 | }, 2166 | "node_modules/node-fetch/node_modules/tr46": { 2167 | "version": "0.0.3", 2168 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2169 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 2170 | "dev": true 2171 | }, 2172 | "node_modules/node-fetch/node_modules/webidl-conversions": { 2173 | "version": "3.0.1", 2174 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2175 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 2176 | "dev": true 2177 | }, 2178 | "node_modules/node-fetch/node_modules/whatwg-url": { 2179 | "version": "5.0.0", 2180 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2181 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2182 | "dev": true, 2183 | "dependencies": { 2184 | "tr46": "~0.0.3", 2185 | "webidl-conversions": "^3.0.0" 2186 | } 2187 | }, 2188 | "node_modules/normalize-url": { 2189 | "version": "6.1.0", 2190 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", 2191 | "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", 2192 | "dev": true, 2193 | "engines": { 2194 | "node": ">=10" 2195 | }, 2196 | "funding": { 2197 | "url": "https://github.com/sponsors/sindresorhus" 2198 | } 2199 | }, 2200 | "node_modules/nwsapi": { 2201 | "version": "2.2.4", 2202 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", 2203 | "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", 2204 | "dev": true 2205 | }, 2206 | "node_modules/once": { 2207 | "version": "1.4.0", 2208 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2209 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2210 | "dev": true, 2211 | "dependencies": { 2212 | "wrappy": "1" 2213 | } 2214 | }, 2215 | "node_modules/optionator": { 2216 | "version": "0.8.3", 2217 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 2218 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 2219 | "dev": true, 2220 | "dependencies": { 2221 | "deep-is": "~0.1.3", 2222 | "fast-levenshtein": "~2.0.6", 2223 | "levn": "~0.3.0", 2224 | "prelude-ls": "~1.1.2", 2225 | "type-check": "~0.3.2", 2226 | "word-wrap": "~1.2.3" 2227 | }, 2228 | "engines": { 2229 | "node": ">= 0.8.0" 2230 | } 2231 | }, 2232 | "node_modules/p-cancelable": { 2233 | "version": "2.1.1", 2234 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", 2235 | "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", 2236 | "dev": true, 2237 | "engines": { 2238 | "node": ">=8" 2239 | } 2240 | }, 2241 | "node_modules/p-iteration": { 2242 | "version": "1.1.8", 2243 | "resolved": "https://registry.npmjs.org/p-iteration/-/p-iteration-1.1.8.tgz", 2244 | "integrity": "sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==", 2245 | "dev": true, 2246 | "engines": { 2247 | "node": ">=8.0.0" 2248 | } 2249 | }, 2250 | "node_modules/p-retry": { 2251 | "version": "4.6.2", 2252 | "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", 2253 | "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", 2254 | "dev": true, 2255 | "dependencies": { 2256 | "@types/retry": "0.12.0", 2257 | "retry": "^0.13.1" 2258 | }, 2259 | "engines": { 2260 | "node": ">=8" 2261 | } 2262 | }, 2263 | "node_modules/pac-proxy-agent": { 2264 | "version": "5.0.0", 2265 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", 2266 | "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", 2267 | "dev": true, 2268 | "dependencies": { 2269 | "@tootallnate/once": "1", 2270 | "agent-base": "6", 2271 | "debug": "4", 2272 | "get-uri": "3", 2273 | "http-proxy-agent": "^4.0.1", 2274 | "https-proxy-agent": "5", 2275 | "pac-resolver": "^5.0.0", 2276 | "raw-body": "^2.2.0", 2277 | "socks-proxy-agent": "5" 2278 | }, 2279 | "engines": { 2280 | "node": ">= 8" 2281 | } 2282 | }, 2283 | "node_modules/pac-proxy-agent/node_modules/@tootallnate/once": { 2284 | "version": "1.1.2", 2285 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 2286 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 2287 | "dev": true, 2288 | "engines": { 2289 | "node": ">= 6" 2290 | } 2291 | }, 2292 | "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { 2293 | "version": "4.0.1", 2294 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 2295 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 2296 | "dev": true, 2297 | "dependencies": { 2298 | "@tootallnate/once": "1", 2299 | "agent-base": "6", 2300 | "debug": "4" 2301 | }, 2302 | "engines": { 2303 | "node": ">= 6" 2304 | } 2305 | }, 2306 | "node_modules/pac-resolver": { 2307 | "version": "5.0.1", 2308 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", 2309 | "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", 2310 | "dev": true, 2311 | "dependencies": { 2312 | "degenerator": "^3.0.2", 2313 | "ip": "^1.1.5", 2314 | "netmask": "^2.0.2" 2315 | }, 2316 | "engines": { 2317 | "node": ">= 8" 2318 | } 2319 | }, 2320 | "node_modules/pako": { 2321 | "version": "1.0.11", 2322 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 2323 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 2324 | "dev": true 2325 | }, 2326 | "node_modules/parse5": { 2327 | "version": "6.0.1", 2328 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 2329 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", 2330 | "dev": true 2331 | }, 2332 | "node_modules/pino": { 2333 | "version": "6.14.0", 2334 | "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", 2335 | "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", 2336 | "dev": true, 2337 | "dependencies": { 2338 | "fast-redact": "^3.0.0", 2339 | "fast-safe-stringify": "^2.0.8", 2340 | "flatstr": "^1.0.12", 2341 | "pino-std-serializers": "^3.1.0", 2342 | "process-warning": "^1.0.0", 2343 | "quick-format-unescaped": "^4.0.3", 2344 | "sonic-boom": "^1.0.2" 2345 | }, 2346 | "bin": { 2347 | "pino": "bin.js" 2348 | } 2349 | }, 2350 | "node_modules/pino-std-serializers": { 2351 | "version": "3.2.0", 2352 | "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", 2353 | "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==", 2354 | "dev": true 2355 | }, 2356 | "node_modules/playwright": { 2357 | "version": "1.34.1", 2358 | "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.34.1.tgz", 2359 | "integrity": "sha512-RonTwQifzkCZHsjZKYUKsOJkQAVe1HArnyLcSRrkyDxN46Ytpwki5XzQFdpuv0XD8WtAjs4gI3oMYJiEj5Qo6g==", 2360 | "dev": true, 2361 | "hasInstallScript": true, 2362 | "peer": true, 2363 | "dependencies": { 2364 | "playwright-core": "1.34.1" 2365 | }, 2366 | "bin": { 2367 | "playwright": "cli.js" 2368 | }, 2369 | "engines": { 2370 | "node": ">=14" 2371 | } 2372 | }, 2373 | "node_modules/playwright-core": { 2374 | "version": "1.34.2", 2375 | "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.34.2.tgz", 2376 | "integrity": "sha512-MrkgGWLANc5qthXduvIY1a/tuafROyTORVd86fwKwgoYrmnBooN/GgeZSBm7ljTLV2FCWNSXV3se7qeScKn83g==", 2377 | "dev": true, 2378 | "bin": { 2379 | "playwright": "cli.js" 2380 | }, 2381 | "engines": { 2382 | "node": ">=14" 2383 | } 2384 | }, 2385 | "node_modules/playwright/node_modules/playwright-core": { 2386 | "version": "1.34.1", 2387 | "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.34.1.tgz", 2388 | "integrity": "sha512-4Y5hGLoSrnB/BXj2NFKBNWP/bI9uVejTVbso1ZBtkKZ+O2KiVIeCJ3R4c7Cf2PbP7htjLolHXY+mImt2IWOlEg==", 2389 | "dev": true, 2390 | "peer": true, 2391 | "bin": { 2392 | "playwright": "cli.js" 2393 | }, 2394 | "engines": { 2395 | "node": ">=14" 2396 | } 2397 | }, 2398 | "node_modules/png-async": { 2399 | "version": "0.9.4", 2400 | "resolved": "https://registry.npmjs.org/png-async/-/png-async-0.9.4.tgz", 2401 | "integrity": "sha512-B//AXX9TkneKfgtOpT1mdUnnhk2BImGD+a98vImsMU8uo1dBeHyW/kM2erWZ/CsYteTPU/xKG+t6T62heHkC3A==", 2402 | "dev": true 2403 | }, 2404 | "node_modules/prelude-ls": { 2405 | "version": "1.1.2", 2406 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2407 | "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", 2408 | "dev": true, 2409 | "engines": { 2410 | "node": ">= 0.8.0" 2411 | } 2412 | }, 2413 | "node_modules/process-warning": { 2414 | "version": "1.0.0", 2415 | "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", 2416 | "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", 2417 | "dev": true 2418 | }, 2419 | "node_modules/proxy-addr": { 2420 | "version": "2.0.7", 2421 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2422 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2423 | "dev": true, 2424 | "dependencies": { 2425 | "forwarded": "0.2.0", 2426 | "ipaddr.js": "1.9.1" 2427 | }, 2428 | "engines": { 2429 | "node": ">= 0.10" 2430 | } 2431 | }, 2432 | "node_modules/proxy-agent": { 2433 | "version": "5.0.0", 2434 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", 2435 | "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", 2436 | "dev": true, 2437 | "dependencies": { 2438 | "agent-base": "^6.0.0", 2439 | "debug": "4", 2440 | "http-proxy-agent": "^4.0.0", 2441 | "https-proxy-agent": "^5.0.0", 2442 | "lru-cache": "^5.1.1", 2443 | "pac-proxy-agent": "^5.0.0", 2444 | "proxy-from-env": "^1.0.0", 2445 | "socks-proxy-agent": "^5.0.0" 2446 | }, 2447 | "engines": { 2448 | "node": ">= 8" 2449 | } 2450 | }, 2451 | "node_modules/proxy-agent/node_modules/@tootallnate/once": { 2452 | "version": "1.1.2", 2453 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 2454 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 2455 | "dev": true, 2456 | "engines": { 2457 | "node": ">= 6" 2458 | } 2459 | }, 2460 | "node_modules/proxy-agent/node_modules/http-proxy-agent": { 2461 | "version": "4.0.1", 2462 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 2463 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 2464 | "dev": true, 2465 | "dependencies": { 2466 | "@tootallnate/once": "1", 2467 | "agent-base": "6", 2468 | "debug": "4" 2469 | }, 2470 | "engines": { 2471 | "node": ">= 6" 2472 | } 2473 | }, 2474 | "node_modules/proxy-from-env": { 2475 | "version": "1.1.0", 2476 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 2477 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 2478 | "dev": true 2479 | }, 2480 | "node_modules/psl": { 2481 | "version": "1.9.0", 2482 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", 2483 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", 2484 | "dev": true 2485 | }, 2486 | "node_modules/pump": { 2487 | "version": "3.0.0", 2488 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2489 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2490 | "dev": true, 2491 | "dependencies": { 2492 | "end-of-stream": "^1.1.0", 2493 | "once": "^1.3.1" 2494 | } 2495 | }, 2496 | "node_modules/punycode": { 2497 | "version": "2.3.0", 2498 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 2499 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 2500 | "dev": true, 2501 | "engines": { 2502 | "node": ">=6" 2503 | } 2504 | }, 2505 | "node_modules/querystringify": { 2506 | "version": "2.2.0", 2507 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 2508 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", 2509 | "dev": true 2510 | }, 2511 | "node_modules/queue-microtask": { 2512 | "version": "1.2.3", 2513 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2514 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2515 | "dev": true, 2516 | "funding": [ 2517 | { 2518 | "type": "github", 2519 | "url": "https://github.com/sponsors/feross" 2520 | }, 2521 | { 2522 | "type": "patreon", 2523 | "url": "https://www.patreon.com/feross" 2524 | }, 2525 | { 2526 | "type": "consulting", 2527 | "url": "https://feross.org/support" 2528 | } 2529 | ] 2530 | }, 2531 | "node_modules/quick-format-unescaped": { 2532 | "version": "4.0.4", 2533 | "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", 2534 | "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", 2535 | "dev": true 2536 | }, 2537 | "node_modules/quick-lru": { 2538 | "version": "5.1.1", 2539 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 2540 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 2541 | "dev": true, 2542 | "engines": { 2543 | "node": ">=10" 2544 | }, 2545 | "funding": { 2546 | "url": "https://github.com/sponsors/sindresorhus" 2547 | } 2548 | }, 2549 | "node_modules/raw-body": { 2550 | "version": "2.5.2", 2551 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 2552 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 2553 | "dev": true, 2554 | "dependencies": { 2555 | "bytes": "3.1.2", 2556 | "http-errors": "2.0.0", 2557 | "iconv-lite": "0.4.24", 2558 | "unpipe": "1.0.0" 2559 | }, 2560 | "engines": { 2561 | "node": ">= 0.8" 2562 | } 2563 | }, 2564 | "node_modules/raw-body/node_modules/iconv-lite": { 2565 | "version": "0.4.24", 2566 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2567 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2568 | "dev": true, 2569 | "dependencies": { 2570 | "safer-buffer": ">= 2.1.2 < 3" 2571 | }, 2572 | "engines": { 2573 | "node": ">=0.10.0" 2574 | } 2575 | }, 2576 | "node_modules/readable-stream": { 2577 | "version": "1.1.14", 2578 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 2579 | "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", 2580 | "dev": true, 2581 | "dependencies": { 2582 | "core-util-is": "~1.0.0", 2583 | "inherits": "~2.0.1", 2584 | "isarray": "0.0.1", 2585 | "string_decoder": "~0.10.x" 2586 | } 2587 | }, 2588 | "node_modules/regenerator-runtime": { 2589 | "version": "0.13.11", 2590 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 2591 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", 2592 | "dev": true 2593 | }, 2594 | "node_modules/require-directory": { 2595 | "version": "2.1.1", 2596 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2597 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2598 | "dev": true, 2599 | "engines": { 2600 | "node": ">=0.10.0" 2601 | } 2602 | }, 2603 | "node_modules/require-from-string": { 2604 | "version": "2.0.2", 2605 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2606 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2607 | "dev": true, 2608 | "engines": { 2609 | "node": ">=0.10.0" 2610 | } 2611 | }, 2612 | "node_modules/requires-port": { 2613 | "version": "1.0.0", 2614 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 2615 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 2616 | "dev": true 2617 | }, 2618 | "node_modules/resolve-alpn": { 2619 | "version": "1.2.1", 2620 | "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 2621 | "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", 2622 | "dev": true 2623 | }, 2624 | "node_modules/responselike": { 2625 | "version": "2.0.1", 2626 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", 2627 | "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", 2628 | "dev": true, 2629 | "dependencies": { 2630 | "lowercase-keys": "^2.0.0" 2631 | }, 2632 | "funding": { 2633 | "url": "https://github.com/sponsors/sindresorhus" 2634 | } 2635 | }, 2636 | "node_modules/ret": { 2637 | "version": "0.2.2", 2638 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", 2639 | "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", 2640 | "dev": true, 2641 | "engines": { 2642 | "node": ">=4" 2643 | } 2644 | }, 2645 | "node_modules/retry": { 2646 | "version": "0.13.1", 2647 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 2648 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", 2649 | "dev": true, 2650 | "engines": { 2651 | "node": ">= 4" 2652 | } 2653 | }, 2654 | "node_modules/reusify": { 2655 | "version": "1.0.4", 2656 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2657 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2658 | "dev": true, 2659 | "engines": { 2660 | "iojs": ">=1.0.0", 2661 | "node": ">=0.10.0" 2662 | } 2663 | }, 2664 | "node_modules/rfdc": { 2665 | "version": "1.3.0", 2666 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", 2667 | "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", 2668 | "dev": true 2669 | }, 2670 | "node_modules/safe-regex2": { 2671 | "version": "2.0.0", 2672 | "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", 2673 | "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", 2674 | "dev": true, 2675 | "dependencies": { 2676 | "ret": "~0.2.0" 2677 | } 2678 | }, 2679 | "node_modules/safer-buffer": { 2680 | "version": "2.1.2", 2681 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2682 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2683 | "dev": true 2684 | }, 2685 | "node_modules/saxes": { 2686 | "version": "5.0.1", 2687 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", 2688 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", 2689 | "dev": true, 2690 | "dependencies": { 2691 | "xmlchars": "^2.2.0" 2692 | }, 2693 | "engines": { 2694 | "node": ">=10" 2695 | } 2696 | }, 2697 | "node_modules/secure-json-parse": { 2698 | "version": "2.7.0", 2699 | "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", 2700 | "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", 2701 | "dev": true 2702 | }, 2703 | "node_modules/semver": { 2704 | "version": "7.3.7", 2705 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 2706 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 2707 | "dev": true, 2708 | "dependencies": { 2709 | "lru-cache": "^6.0.0" 2710 | }, 2711 | "bin": { 2712 | "semver": "bin/semver.js" 2713 | }, 2714 | "engines": { 2715 | "node": ">=10" 2716 | } 2717 | }, 2718 | "node_modules/semver-store": { 2719 | "version": "0.3.0", 2720 | "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", 2721 | "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==", 2722 | "dev": true 2723 | }, 2724 | "node_modules/semver/node_modules/lru-cache": { 2725 | "version": "6.0.0", 2726 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2727 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2728 | "dev": true, 2729 | "dependencies": { 2730 | "yallist": "^4.0.0" 2731 | }, 2732 | "engines": { 2733 | "node": ">=10" 2734 | } 2735 | }, 2736 | "node_modules/semver/node_modules/yallist": { 2737 | "version": "4.0.0", 2738 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2739 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2740 | "dev": true 2741 | }, 2742 | "node_modules/set-cookie-parser": { 2743 | "version": "2.6.0", 2744 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 2745 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", 2746 | "dev": true 2747 | }, 2748 | "node_modules/setprototypeof": { 2749 | "version": "1.2.0", 2750 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2751 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 2752 | "dev": true 2753 | }, 2754 | "node_modules/shell-quote": { 2755 | "version": "1.8.1", 2756 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", 2757 | "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", 2758 | "dev": true, 2759 | "funding": { 2760 | "url": "https://github.com/sponsors/ljharb" 2761 | } 2762 | }, 2763 | "node_modules/smart-buffer": { 2764 | "version": "4.2.0", 2765 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 2766 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 2767 | "dev": true, 2768 | "engines": { 2769 | "node": ">= 6.0.0", 2770 | "npm": ">= 3.0.0" 2771 | } 2772 | }, 2773 | "node_modules/socks": { 2774 | "version": "2.7.1", 2775 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", 2776 | "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", 2777 | "dev": true, 2778 | "dependencies": { 2779 | "ip": "^2.0.0", 2780 | "smart-buffer": "^4.2.0" 2781 | }, 2782 | "engines": { 2783 | "node": ">= 10.13.0", 2784 | "npm": ">= 3.0.0" 2785 | } 2786 | }, 2787 | "node_modules/socks-proxy-agent": { 2788 | "version": "5.0.1", 2789 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", 2790 | "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", 2791 | "dev": true, 2792 | "dependencies": { 2793 | "agent-base": "^6.0.2", 2794 | "debug": "4", 2795 | "socks": "^2.3.3" 2796 | }, 2797 | "engines": { 2798 | "node": ">= 6" 2799 | } 2800 | }, 2801 | "node_modules/socks/node_modules/ip": { 2802 | "version": "2.0.0", 2803 | "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", 2804 | "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", 2805 | "dev": true 2806 | }, 2807 | "node_modules/sonic-boom": { 2808 | "version": "1.4.1", 2809 | "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", 2810 | "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", 2811 | "dev": true, 2812 | "dependencies": { 2813 | "atomic-sleep": "^1.0.0", 2814 | "flatstr": "^1.0.12" 2815 | } 2816 | }, 2817 | "node_modules/source-map": { 2818 | "version": "0.6.1", 2819 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2820 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2821 | "dev": true, 2822 | "engines": { 2823 | "node": ">=0.10.0" 2824 | } 2825 | }, 2826 | "node_modules/source-map-js": { 2827 | "version": "1.0.2", 2828 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2829 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2830 | "dev": true, 2831 | "engines": { 2832 | "node": ">=0.10.0" 2833 | } 2834 | }, 2835 | "node_modules/source-map-support": { 2836 | "version": "0.5.21", 2837 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2838 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2839 | "dev": true, 2840 | "dependencies": { 2841 | "buffer-from": "^1.0.0", 2842 | "source-map": "^0.6.0" 2843 | } 2844 | }, 2845 | "node_modules/statuses": { 2846 | "version": "2.0.1", 2847 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2848 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2849 | "dev": true, 2850 | "engines": { 2851 | "node": ">= 0.8" 2852 | } 2853 | }, 2854 | "node_modules/string_decoder": { 2855 | "version": "0.10.31", 2856 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2857 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", 2858 | "dev": true 2859 | }, 2860 | "node_modules/string-similarity": { 2861 | "version": "4.0.4", 2862 | "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", 2863 | "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==", 2864 | "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", 2865 | "dev": true 2866 | }, 2867 | "node_modules/string-width": { 2868 | "version": "4.2.3", 2869 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2870 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2871 | "dev": true, 2872 | "dependencies": { 2873 | "emoji-regex": "^8.0.0", 2874 | "is-fullwidth-code-point": "^3.0.0", 2875 | "strip-ansi": "^6.0.1" 2876 | }, 2877 | "engines": { 2878 | "node": ">=8" 2879 | } 2880 | }, 2881 | "node_modules/strip-ansi": { 2882 | "version": "6.0.1", 2883 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2884 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2885 | "dev": true, 2886 | "dependencies": { 2887 | "ansi-regex": "^5.0.1" 2888 | }, 2889 | "engines": { 2890 | "node": ">=8" 2891 | } 2892 | }, 2893 | "node_modules/supports-color": { 2894 | "version": "7.2.0", 2895 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2896 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2897 | "dev": true, 2898 | "dependencies": { 2899 | "has-flag": "^4.0.0" 2900 | }, 2901 | "engines": { 2902 | "node": ">=8" 2903 | } 2904 | }, 2905 | "node_modules/symbol-tree": { 2906 | "version": "3.2.4", 2907 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 2908 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", 2909 | "dev": true 2910 | }, 2911 | "node_modules/teen_process": { 2912 | "version": "1.16.0", 2913 | "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-1.16.0.tgz", 2914 | "integrity": "sha512-RnW7HHZD1XuhSTzD3djYOdIl1adE3oNEprE3HOFFxWs5m4FZsqYRhKJ4mDU2udtNGMLUS7jV7l8vVRLWAvmPDw==", 2915 | "dev": true, 2916 | "engines": [ 2917 | "node" 2918 | ], 2919 | "dependencies": { 2920 | "@babel/runtime": "^7.0.0", 2921 | "bluebird": "^3.5.1", 2922 | "lodash": "^4.17.4", 2923 | "shell-quote": "^1.4.3", 2924 | "source-map-support": "^0.5.3", 2925 | "which": "^2.0.2" 2926 | } 2927 | }, 2928 | "node_modules/throat": { 2929 | "version": "6.0.2", 2930 | "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", 2931 | "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", 2932 | "dev": true 2933 | }, 2934 | "node_modules/tiny-lru": { 2935 | "version": "8.0.2", 2936 | "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-8.0.2.tgz", 2937 | "integrity": "sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==", 2938 | "dev": true, 2939 | "engines": { 2940 | "node": ">=6" 2941 | } 2942 | }, 2943 | "node_modules/toidentifier": { 2944 | "version": "1.0.1", 2945 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2946 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2947 | "dev": true, 2948 | "engines": { 2949 | "node": ">=0.6" 2950 | } 2951 | }, 2952 | "node_modules/tough-cookie": { 2953 | "version": "4.1.2", 2954 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", 2955 | "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", 2956 | "dev": true, 2957 | "dependencies": { 2958 | "psl": "^1.1.33", 2959 | "punycode": "^2.1.1", 2960 | "universalify": "^0.2.0", 2961 | "url-parse": "^1.5.3" 2962 | }, 2963 | "engines": { 2964 | "node": ">=6" 2965 | } 2966 | }, 2967 | "node_modules/tough-cookie/node_modules/universalify": { 2968 | "version": "0.2.0", 2969 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", 2970 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", 2971 | "dev": true, 2972 | "engines": { 2973 | "node": ">= 4.0.0" 2974 | } 2975 | }, 2976 | "node_modules/tr46": { 2977 | "version": "3.0.0", 2978 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 2979 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 2980 | "dev": true, 2981 | "dependencies": { 2982 | "punycode": "^2.1.1" 2983 | }, 2984 | "engines": { 2985 | "node": ">=12" 2986 | } 2987 | }, 2988 | "node_modules/traverse": { 2989 | "version": "0.3.9", 2990 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 2991 | "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", 2992 | "dev": true, 2993 | "engines": { 2994 | "node": "*" 2995 | } 2996 | }, 2997 | "node_modules/tslib": { 2998 | "version": "2.5.2", 2999 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", 3000 | "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==", 3001 | "dev": true 3002 | }, 3003 | "node_modules/type-check": { 3004 | "version": "0.3.2", 3005 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3006 | "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", 3007 | "dev": true, 3008 | "dependencies": { 3009 | "prelude-ls": "~1.1.2" 3010 | }, 3011 | "engines": { 3012 | "node": ">= 0.8.0" 3013 | } 3014 | }, 3015 | "node_modules/universalify": { 3016 | "version": "0.1.2", 3017 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 3018 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 3019 | "dev": true, 3020 | "engines": { 3021 | "node": ">= 4.0.0" 3022 | } 3023 | }, 3024 | "node_modules/unpipe": { 3025 | "version": "1.0.0", 3026 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3027 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 3028 | "dev": true, 3029 | "engines": { 3030 | "node": ">= 0.8" 3031 | } 3032 | }, 3033 | "node_modules/uri-js": { 3034 | "version": "4.4.1", 3035 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3036 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3037 | "dev": true, 3038 | "dependencies": { 3039 | "punycode": "^2.1.0" 3040 | } 3041 | }, 3042 | "node_modules/url-parse": { 3043 | "version": "1.5.10", 3044 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", 3045 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 3046 | "dev": true, 3047 | "dependencies": { 3048 | "querystringify": "^2.1.1", 3049 | "requires-port": "^1.0.0" 3050 | } 3051 | }, 3052 | "node_modules/vm2": { 3053 | "version": "3.9.19", 3054 | "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", 3055 | "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", 3056 | "dev": true, 3057 | "dependencies": { 3058 | "acorn": "^8.7.0", 3059 | "acorn-walk": "^8.2.0" 3060 | }, 3061 | "bin": { 3062 | "vm2": "bin/vm2" 3063 | }, 3064 | "engines": { 3065 | "node": ">=6.0" 3066 | } 3067 | }, 3068 | "node_modules/vm2/node_modules/acorn-walk": { 3069 | "version": "8.2.0", 3070 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 3071 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 3072 | "dev": true, 3073 | "engines": { 3074 | "node": ">=0.4.0" 3075 | } 3076 | }, 3077 | "node_modules/w3c-hr-time": { 3078 | "version": "1.0.2", 3079 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", 3080 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", 3081 | "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", 3082 | "dev": true, 3083 | "dependencies": { 3084 | "browser-process-hrtime": "^1.0.0" 3085 | } 3086 | }, 3087 | "node_modules/w3c-xmlserializer": { 3088 | "version": "3.0.0", 3089 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", 3090 | "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", 3091 | "dev": true, 3092 | "dependencies": { 3093 | "xml-name-validator": "^4.0.0" 3094 | }, 3095 | "engines": { 3096 | "node": ">=12" 3097 | } 3098 | }, 3099 | "node_modules/web-streams-polyfill": { 3100 | "version": "3.2.1", 3101 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", 3102 | "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", 3103 | "dev": true, 3104 | "engines": { 3105 | "node": ">= 8" 3106 | } 3107 | }, 3108 | "node_modules/webdriver": { 3109 | "version": "7.30.0", 3110 | "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.30.0.tgz", 3111 | "integrity": "sha512-bQE4oVgjjg5sb3VkCD+Eb8mscEvf3TioP0mnEZK0f5OJUNI045gMCJgpX8X4J8ScGyEhzlhn1KvlAn3yzxjxog==", 3112 | "dev": true, 3113 | "dependencies": { 3114 | "@types/node": "^18.0.0", 3115 | "@wdio/config": "7.30.0", 3116 | "@wdio/logger": "7.26.0", 3117 | "@wdio/protocols": "7.27.0", 3118 | "@wdio/types": "7.26.0", 3119 | "@wdio/utils": "7.26.0", 3120 | "got": "^11.0.2", 3121 | "ky": "0.30.0", 3122 | "lodash.merge": "^4.6.1" 3123 | }, 3124 | "engines": { 3125 | "node": ">=12.0.0" 3126 | } 3127 | }, 3128 | "node_modules/webidl-conversions": { 3129 | "version": "7.0.0", 3130 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 3131 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 3132 | "dev": true, 3133 | "engines": { 3134 | "node": ">=12" 3135 | } 3136 | }, 3137 | "node_modules/whatwg-encoding": { 3138 | "version": "2.0.0", 3139 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", 3140 | "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", 3141 | "dev": true, 3142 | "dependencies": { 3143 | "iconv-lite": "0.6.3" 3144 | }, 3145 | "engines": { 3146 | "node": ">=12" 3147 | } 3148 | }, 3149 | "node_modules/whatwg-mimetype": { 3150 | "version": "3.0.0", 3151 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", 3152 | "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", 3153 | "dev": true, 3154 | "engines": { 3155 | "node": ">=12" 3156 | } 3157 | }, 3158 | "node_modules/whatwg-url": { 3159 | "version": "10.0.0", 3160 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", 3161 | "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", 3162 | "dev": true, 3163 | "dependencies": { 3164 | "tr46": "^3.0.0", 3165 | "webidl-conversions": "^7.0.0" 3166 | }, 3167 | "engines": { 3168 | "node": ">=12" 3169 | } 3170 | }, 3171 | "node_modules/which": { 3172 | "version": "2.0.2", 3173 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3174 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3175 | "dev": true, 3176 | "dependencies": { 3177 | "isexe": "^2.0.0" 3178 | }, 3179 | "bin": { 3180 | "node-which": "bin/node-which" 3181 | }, 3182 | "engines": { 3183 | "node": ">= 8" 3184 | } 3185 | }, 3186 | "node_modules/word-wrap": { 3187 | "version": "1.2.3", 3188 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3189 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 3190 | "dev": true, 3191 | "engines": { 3192 | "node": ">=0.10.0" 3193 | } 3194 | }, 3195 | "node_modules/wrap-ansi": { 3196 | "version": "7.0.0", 3197 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3198 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3199 | "dev": true, 3200 | "dependencies": { 3201 | "ansi-styles": "^4.0.0", 3202 | "string-width": "^4.1.0", 3203 | "strip-ansi": "^6.0.0" 3204 | }, 3205 | "engines": { 3206 | "node": ">=10" 3207 | }, 3208 | "funding": { 3209 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3210 | } 3211 | }, 3212 | "node_modules/wrappy": { 3213 | "version": "1.0.2", 3214 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3215 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3216 | "dev": true 3217 | }, 3218 | "node_modules/ws": { 3219 | "version": "8.12.0", 3220 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", 3221 | "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", 3222 | "dev": true, 3223 | "engines": { 3224 | "node": ">=10.0.0" 3225 | }, 3226 | "peerDependencies": { 3227 | "bufferutil": "^4.0.1", 3228 | "utf-8-validate": ">=5.0.2" 3229 | }, 3230 | "peerDependenciesMeta": { 3231 | "bufferutil": { 3232 | "optional": true 3233 | }, 3234 | "utf-8-validate": { 3235 | "optional": true 3236 | } 3237 | } 3238 | }, 3239 | "node_modules/xml-name-validator": { 3240 | "version": "4.0.0", 3241 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", 3242 | "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", 3243 | "dev": true, 3244 | "engines": { 3245 | "node": ">=12" 3246 | } 3247 | }, 3248 | "node_modules/xmlchars": { 3249 | "version": "2.2.0", 3250 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 3251 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", 3252 | "dev": true 3253 | }, 3254 | "node_modules/xregexp": { 3255 | "version": "2.0.0", 3256 | "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", 3257 | "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", 3258 | "dev": true, 3259 | "engines": { 3260 | "node": "*" 3261 | } 3262 | }, 3263 | "node_modules/y18n": { 3264 | "version": "5.0.8", 3265 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3266 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3267 | "dev": true, 3268 | "engines": { 3269 | "node": ">=10" 3270 | } 3271 | }, 3272 | "node_modules/yallist": { 3273 | "version": "3.1.1", 3274 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3275 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3276 | "dev": true 3277 | }, 3278 | "node_modules/yargs": { 3279 | "version": "17.6.2", 3280 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", 3281 | "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", 3282 | "dev": true, 3283 | "dependencies": { 3284 | "cliui": "^8.0.1", 3285 | "escalade": "^3.1.1", 3286 | "get-caller-file": "^2.0.5", 3287 | "require-directory": "^2.1.1", 3288 | "string-width": "^4.2.3", 3289 | "y18n": "^5.0.5", 3290 | "yargs-parser": "^21.1.1" 3291 | }, 3292 | "engines": { 3293 | "node": ">=12" 3294 | } 3295 | }, 3296 | "node_modules/yargs-parser": { 3297 | "version": "21.1.1", 3298 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3299 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3300 | "dev": true, 3301 | "engines": { 3302 | "node": ">=12" 3303 | } 3304 | } 3305 | } 3306 | } 3307 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tau-introduction-to-playwright", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test:e2e": "npx playwright test tests/", 8 | "test:e2e:all": "npx playwright test tests --project=all-browsers-and-tests", 9 | "test:e2e:ci": "CI=1 npx playwright test --project=ci --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL", 10 | "test:e2e:dev": "npx playwright test tests-examples/ --project=chromium --headed --retries=0 --reporter=line", 11 | "test:e2e:smoke": "npx playwright test tests-examples/ --grep @smoke --project=chromium", 12 | "test:e2e:non-smoke": "npx playwright test tests-examples/ --grep-invert @smoke --project=firefox", 13 | "test:visual:acme": "npx playwright test example-applitools.spec.ts --project=chromium", 14 | "test:visual:playwright": "npx playwright test example3.spec.ts --project=all-browsers-and-tests" 15 | }, 16 | "keywords": [], 17 | "author": "", 18 | "license": "ISC", 19 | "devDependencies": { 20 | "@applitools/eyes-playwright": "^1.17.0", 21 | "@playwright/test": "^1.34.2", 22 | "dotenv": "^16.0.3" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pages/home-page.ts: -------------------------------------------------------------------------------- 1 | import { type Locator, type Page, expect } from '@playwright/test'; 2 | 3 | export class HomePage { 4 | readonly page: Page; 5 | readonly getStartedButton: Locator; 6 | readonly pageTitle: RegExp; 7 | 8 | constructor(page: Page) { 9 | this.page = page; 10 | this.getStartedButton = page.getByRole('link', { name: 'Get started' }); 11 | this.pageTitle = /Playwright/; 12 | } 13 | 14 | async clickGetStarted() { 15 | await this.getStartedButton.click(); 16 | } 17 | 18 | async assertPageTitle() { 19 | await expect(this.page).toHaveTitle(this.pageTitle); 20 | } 21 | } 22 | 23 | export default HomePage; -------------------------------------------------------------------------------- /pages/top-menu-page.ts: -------------------------------------------------------------------------------- 1 | import { expect, Locator, Page } from '@playwright/test'; 2 | 3 | export class TopMenuPage { 4 | readonly page: Page; 5 | readonly getStartedLink: Locator; 6 | readonly nodeLink: Locator; 7 | readonly javaLink: Locator; 8 | readonly nodeLabel: Locator; 9 | readonly javaLabel: Locator; 10 | readonly nodeDescription: string = 'Installing Playwright'; 11 | readonly javaDescription: string = `Playwright is distributed as a set of Maven modules. The easiest way to use it is to add one dependency to your project's pom.xml as described below. If you're not familiar with Maven please refer to its documentation.`; 12 | 13 | constructor(page: Page) { 14 | this.page = page; 15 | this.getStartedLink = page.getByRole('link', { name: 'Get started' }); 16 | this.nodeLink = page.getByRole('button', {name: 'Node.js'}); 17 | this.javaLink = page.getByRole('navigation', { name: 'Main' }).getByText('Java'); 18 | this.nodeLabel = page.getByText(this.nodeDescription, {exact:true}); 19 | this.javaLabel = page.getByText(this.javaDescription); 20 | } 21 | 22 | async hoverNode() { 23 | await this.nodeLink.hover(); 24 | } 25 | 26 | async clickJava() { 27 | await this.javaLink.click(); 28 | } 29 | 30 | async assertPageUrl(pageUrl: RegExp) { 31 | await expect(this.page).toHaveURL(pageUrl); 32 | } 33 | 34 | async assertNodeDescriptionNotVisible() { 35 | await expect(this.nodeLabel).not.toBeVisible(); 36 | } 37 | 38 | async assertJavaDescriptionVisible() { 39 | await expect(this.javaLabel).toBeVisible(); 40 | } 41 | 42 | } 43 | export default TopMenuPage; -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from '@playwright/test'; 2 | import baseEnvUrl from './utils/environmentBaseUrl'; 3 | 4 | /** 5 | * Read environment variables from file. 6 | * https://github.com/motdotla/dotenv 7 | */ 8 | require('dotenv').config(); 9 | 10 | /** 11 | * See https://playwright.dev/docs/test-configuration. 12 | */ 13 | export default defineConfig({ 14 | // testDir: './tests', 15 | 16 | /* Run tests in files in parallel */ 17 | fullyParallel: true, 18 | 19 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 20 | forbidOnly: !!process.env.CI, 21 | 22 | /* Retry on CI only */ 23 | // retries: process.env.CI ? 2 : 0, 24 | retries: 2, 25 | 26 | /* Opt out of parallel tests on CI. */ 27 | workers: process.env.CI ? 1 : undefined, 28 | 29 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 30 | reporter: 'html', 31 | // reporter: [['html', { open: 'always' }]], //always, never and on-failure (default). 32 | // reporter: [['html', { outputFolder: 'my-report' }]], // report is written into the playwright-report folder in the current working directory. override it using the PLAYWRIGHT_HTML_REPORT 33 | // reporter: 'dot', 34 | // reporter: 'list', 35 | /** 36 | reporter: [ 37 | ['list'], 38 | ['json', { outputFile: 'test-results.json' }] 39 | ], 40 | */ 41 | /** 42 | * custom reports: https://playwright.dev/docs/test-reporters#custom-reporters 43 | */ 44 | 45 | /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 46 | use: { 47 | /* Base URL to use in actions like `await page.goto('/')`. */ 48 | // baseURL: 'http://127.0.0.1:3000', 49 | 50 | /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 51 | trace: 'on-first-retry', 52 | screenshot: 'only-on-failure', 53 | // headless: false, 54 | // ignoreHTTPSErrors: true, 55 | // viewport: { width: 1280, height: 720 }, 56 | // video: 'on-first-retry', 57 | }, 58 | // timeout: 30000, //https://playwright.dev/docs/test-timeouts 59 | // expect: { 60 | /** 61 | * Maximum time expect() should wait for the condition to be met. 62 | * For example in `await expect(locator).toHaveText();` 63 | */ 64 | // timeout: 10000, 65 | // }, 66 | 67 | /* Folder for test artifacts such as screenshots, videos, traces, etc. */ 68 | // outputDir: 'test-results/', 69 | 70 | /* Configure projects for major browsers */ 71 | projects: [ 72 | { 73 | name: 'chromium', 74 | use: { 75 | ...devices['Desktop Chrome'], 76 | // viewport: { width: 1280, height: 720 }, 77 | }, 78 | }, 79 | 80 | { 81 | name: 'firefox', 82 | use: { ...devices['Desktop Firefox'] }, 83 | }, 84 | 85 | { 86 | name: 'webkit', 87 | use: { ...devices['Desktop Safari'] }, 88 | }, 89 | 90 | { 91 | name: 'all-browsers-and-tests', 92 | use: { 93 | baseURL: 'https://playwright.dev/', 94 | ...devices['Desktop Chrome'] 95 | }, 96 | }, 97 | 98 | { 99 | name: 'all-browsers-and-tests', 100 | use: { 101 | baseURL: 'https://playwright.dev/', 102 | ...devices['Desktop Safari'] 103 | }, 104 | }, 105 | 106 | { 107 | name: 'all-browsers-and-tests', 108 | use: { 109 | baseURL: 'https://playwright.dev/', 110 | ...devices['Desktop Firefox'] 111 | }, 112 | }, 113 | 114 | // Example only 115 | { 116 | name: 'local', 117 | use: { 118 | baseURL: baseEnvUrl.local.home, 119 | }, 120 | }, 121 | 122 | // Example only 123 | { 124 | name: 'ci', 125 | use: { 126 | baseURL: process.env.CI 127 | ? baseEnvUrl.ci.prefix + process.env.GITHUB_REF_NAME + baseEnvUrl.ci.suffix //https://dev-myapp-chapter-2.mydomain.com 128 | : baseEnvUrl.staging.home, 129 | }, 130 | /** 131 | * GitHub variables: https://docs.github.com/en/actions/learn-github-actions/variables 132 | * GitLab variables: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-reference 133 | */ 134 | }, 135 | 136 | /* Test against mobile viewports. */ 137 | // { 138 | // name: 'Mobile Chrome', 139 | // use: { ...devices['Pixel 5'] }, 140 | // }, 141 | // { 142 | // name: 'Mobile Safari', 143 | // use: { ...devices['iPhone 12'] }, 144 | // }, 145 | 146 | /* Test against branded browsers. */ 147 | // { 148 | // name: 'Microsoft Edge', 149 | // use: { ...devices['Desktop Edge'], channel: 'msedge' }, 150 | // }, 151 | // { 152 | // name: 'Google Chrome', 153 | // use: { ..devices['Desktop Chrome'], channel: 'chrome' }, 154 | // }, 155 | ], 156 | 157 | /* Run your local dev server before starting the tests */ 158 | // webServer: { 159 | // command: 'npm run start', 160 | // url: 'http://127.0.0.1:3000', 161 | // reuseExistingServer: !process.env.CI, 162 | // }, 163 | }); 164 | -------------------------------------------------------------------------------- /tests-examples/demo-todo-app.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect, type Page } from '@playwright/test'; 2 | 3 | test.beforeEach(async ({ page }) => { 4 | await page.goto('https://demo.playwright.dev/todomvc'); 5 | }); 6 | 7 | const TODO_ITEMS = [ 8 | 'buy some cheese', 9 | 'feed the cat', 10 | 'book a doctors appointment' 11 | ]; 12 | 13 | test.describe('New Todo', () => { 14 | test('@smoke - should allow me to add todo items ', async ({ page }) => { 15 | // create a new todo locator 16 | const newTodo = page.getByPlaceholder('What needs to be done?'); 17 | 18 | // Create 1st todo. 19 | await newTodo.fill(TODO_ITEMS[0]); 20 | await newTodo.press('Enter'); 21 | 22 | // Make sure the list only has one todo item. 23 | await expect(page.getByTestId('todo-title')).toHaveText([ 24 | TODO_ITEMS[1] // intentionally changed here to fail the test 25 | ]); 26 | 27 | // Create 2nd todo. 28 | await newTodo.fill(TODO_ITEMS[1]); 29 | await newTodo.press('Enter'); 30 | 31 | // Make sure the list now has two todo items. 32 | await expect(page.getByTestId('todo-title')).toHaveText([ 33 | TODO_ITEMS[0], 34 | TODO_ITEMS[1] 35 | ]); 36 | 37 | await checkNumberOfTodosInLocalStorage(page, 2); 38 | }); 39 | 40 | test('should clear text input field when an item is added', async ({ page }) => { 41 | // create a new todo locator 42 | const newTodo = page.getByPlaceholder('What needs to be done?'); 43 | 44 | // Create one todo item. 45 | await newTodo.fill(TODO_ITEMS[0]); 46 | await newTodo.press('Enter'); 47 | 48 | // Check that input is empty. 49 | await expect(newTodo).toBeEmpty(); 50 | await checkNumberOfTodosInLocalStorage(page, 1); 51 | }); 52 | 53 | test('should append new items to the bottom of the list', async ({ page }) => { 54 | // Create 3 items. 55 | await createDefaultTodos(page); 56 | 57 | // create a todo count locator 58 | const todoCount = page.getByTestId('todo-count') 59 | 60 | // Check test using different methods. 61 | await expect(page.getByText('3 items left')).toBeVisible(); 62 | await expect(todoCount).toHaveText('3 items left'); 63 | await expect(todoCount).toContainText('3'); 64 | await expect(todoCount).toHaveText(/3/); 65 | 66 | // Check all items in one call. 67 | await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS); 68 | await checkNumberOfTodosInLocalStorage(page, 3); 69 | }); 70 | }); 71 | 72 | test.describe('Mark all as completed', () => { 73 | test.beforeEach(async ({ page }) => { 74 | await createDefaultTodos(page); 75 | await checkNumberOfTodosInLocalStorage(page, 3); 76 | }); 77 | 78 | test.afterEach(async ({ page }) => { 79 | await checkNumberOfTodosInLocalStorage(page, 3); 80 | }); 81 | 82 | test('@smoke - should allow me to mark all items as completed', async ({ page }) => { 83 | // Complete all todos. 84 | await page.getByLabel('Mark all as complete').check(); 85 | 86 | // Ensure all todos have 'completed' class. 87 | await expect(page.getByTestId('todo-item')).toHaveClass(['completed', 'completed', 'completed']); 88 | await checkNumberOfCompletedTodosInLocalStorage(page, 3); 89 | }); 90 | 91 | test('should allow me to clear the complete state of all items', async ({ page }) => { 92 | const toggleAll = page.getByLabel('Mark all as complete'); 93 | // Check and then immediately uncheck. 94 | await toggleAll.check(); 95 | await toggleAll.uncheck(); 96 | 97 | // Should be no completed classes. 98 | await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']); 99 | }); 100 | 101 | test('complete all checkbox should update state when items are completed / cleared', async ({ page }) => { 102 | const toggleAll = page.getByLabel('Mark all as complete'); 103 | await toggleAll.check(); 104 | await expect(toggleAll).toBeChecked(); 105 | await checkNumberOfCompletedTodosInLocalStorage(page, 3); 106 | 107 | // Uncheck first todo. 108 | const firstTodo = page.getByTestId('todo-item').nth(0); 109 | await firstTodo.getByRole('checkbox').uncheck(); 110 | 111 | // Reuse toggleAll locator and make sure its not checked. 112 | await expect(toggleAll).not.toBeChecked(); 113 | 114 | await firstTodo.getByRole('checkbox').check(); 115 | await checkNumberOfCompletedTodosInLocalStorage(page, 3); 116 | 117 | // Assert the toggle all is checked again. 118 | await expect(toggleAll).toBeChecked(); 119 | }); 120 | }); 121 | 122 | test.describe('Item', () => { 123 | 124 | test('@smoke - should allow me to mark items as complete', async ({ page }) => { 125 | // create a new todo locator 126 | const newTodo = page.getByPlaceholder('What needs to be done?'); 127 | 128 | // Create two items. 129 | for (const item of TODO_ITEMS.slice(0, 2)) { 130 | await newTodo.fill(item); 131 | await newTodo.press('Enter'); 132 | } 133 | 134 | // Check first item. 135 | const firstTodo = page.getByTestId('todo-item').nth(0); 136 | await firstTodo.getByRole('checkbox').check(); 137 | await expect(firstTodo).toHaveClass('completed'); 138 | 139 | // Check second item. 140 | const secondTodo = page.getByTestId('todo-item').nth(1); 141 | await expect(secondTodo).not.toHaveClass('completed'); 142 | await secondTodo.getByRole('checkbox').check(); 143 | 144 | // Assert completed class. 145 | await expect(firstTodo).toHaveClass('completed'); 146 | await expect(secondTodo).toHaveClass('completed'); 147 | }); 148 | 149 | test('should allow me to un-mark items as complete', async ({ page }) => { 150 | // create a new todo locator 151 | const newTodo = page.getByPlaceholder('What needs to be done?'); 152 | 153 | // Create two items. 154 | for (const item of TODO_ITEMS.slice(0, 2)) { 155 | await newTodo.fill(item); 156 | await newTodo.press('Enter'); 157 | } 158 | 159 | const firstTodo = page.getByTestId('todo-item').nth(0); 160 | const secondTodo = page.getByTestId('todo-item').nth(1); 161 | const firstTodoCheckbox = firstTodo.getByRole('checkbox'); 162 | 163 | await firstTodoCheckbox.check(); 164 | await expect(firstTodo).toHaveClass('completed'); 165 | await expect(secondTodo).not.toHaveClass('completed'); 166 | await checkNumberOfCompletedTodosInLocalStorage(page, 1); 167 | 168 | await firstTodoCheckbox.uncheck(); 169 | await expect(firstTodo).not.toHaveClass('completed'); 170 | await expect(secondTodo).not.toHaveClass('completed'); 171 | await checkNumberOfCompletedTodosInLocalStorage(page, 0); 172 | }); 173 | 174 | test('should allow me to edit an item', async ({ page }) => { 175 | await createDefaultTodos(page); 176 | 177 | const todoItems = page.getByTestId('todo-item'); 178 | const secondTodo = todoItems.nth(1); 179 | await secondTodo.dblclick(); 180 | await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]); 181 | await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); 182 | await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter'); 183 | 184 | // Explicitly assert the new text value. 185 | await expect(todoItems).toHaveText([ 186 | TODO_ITEMS[0], 187 | 'buy some sausages', 188 | TODO_ITEMS[2] 189 | ]); 190 | await checkTodosInLocalStorage(page, 'buy some sausages'); 191 | }); 192 | }); 193 | 194 | test.describe('@smoke - Editing', () => { 195 | test.beforeEach(async ({ page }) => { 196 | await createDefaultTodos(page); 197 | await checkNumberOfTodosInLocalStorage(page, 3); 198 | }); 199 | 200 | test('should hide other controls when editing', async ({ page }) => { 201 | // const todoItem = page.getByTestId('todo-item').nth(1); 202 | const todoItem = page.getByTestId('todo-item'); // intentionally changed here to fail the test 203 | await todoItem.dblclick(); 204 | await expect(todoItem.getByRole('checkbox')).not.toBeVisible(); 205 | await expect(todoItem.locator('label', { 206 | hasText: TODO_ITEMS[1], 207 | })).not.toBeVisible(); 208 | await checkNumberOfTodosInLocalStorage(page, 3); 209 | }); 210 | 211 | test('should save edits on blur', async ({ page }) => { 212 | const todoItems = page.getByTestId('todo-item'); 213 | await todoItems.nth(1).dblclick(); 214 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); 215 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur'); 216 | 217 | await expect(todoItems).toHaveText([ 218 | TODO_ITEMS[0], 219 | 'buy some sausages', 220 | TODO_ITEMS[2], 221 | ]); 222 | await checkTodosInLocalStorage(page, 'buy some sausages'); 223 | }); 224 | 225 | test('should trim entered text', async ({ page }) => { 226 | const todoItems = page.getByTestId('todo-item'); 227 | await todoItems.nth(1).dblclick(); 228 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages '); 229 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); 230 | 231 | await expect(todoItems).toHaveText([ 232 | TODO_ITEMS[0], 233 | 'buy some sausages', 234 | TODO_ITEMS[2], 235 | ]); 236 | await checkTodosInLocalStorage(page, 'buy some sausages'); 237 | }); 238 | 239 | test('should remove the item if an empty text string was entered', async ({ page }) => { 240 | const todoItems = page.getByTestId('todo-item'); 241 | await todoItems.nth(1).dblclick(); 242 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(''); 243 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); 244 | 245 | await expect(todoItems).toHaveText([ 246 | TODO_ITEMS[0], 247 | TODO_ITEMS[2], 248 | ]); 249 | }); 250 | 251 | test('should cancel edits on escape', async ({ page }) => { 252 | const todoItems = page.getByTestId('todo-item'); 253 | await todoItems.nth(1).dblclick(); 254 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); 255 | await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape'); 256 | await expect(todoItems).toHaveText(TODO_ITEMS); 257 | }); 258 | }); 259 | 260 | test.describe('Counter', () => { 261 | test('@smoke - should display the current number of todo items', async ({ page }) => { 262 | // create a new todo locator 263 | const newTodo = page.getByPlaceholder('What needs to be done?'); 264 | 265 | // create a todo count locator 266 | const todoCount = page.getByTestId('todo-count') 267 | 268 | await newTodo.fill(TODO_ITEMS[0]); 269 | await newTodo.press('Enter'); 270 | 271 | await expect(todoCount).toContainText('1'); 272 | 273 | await newTodo.fill(TODO_ITEMS[1]); 274 | await newTodo.press('Enter'); 275 | await expect(todoCount).toContainText('2'); 276 | 277 | await checkNumberOfTodosInLocalStorage(page, 2); 278 | }); 279 | }); 280 | 281 | test.describe('Clear completed button', () => { 282 | test.beforeEach(async ({ page }) => { 283 | await createDefaultTodos(page); 284 | }); 285 | 286 | test('@smoke - should display the correct text', async ({ page }) => { 287 | await page.locator('.todo-list li .toggle').first().check(); 288 | await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible(); 289 | }); 290 | 291 | test('should remove completed items when clicked', async ({ page }) => { 292 | const todoItems = page.getByTestId('todo-item'); 293 | await todoItems.nth(1).getByRole('checkbox').check(); 294 | await page.getByRole('button', { name: 'Clear completed' }).click(); 295 | await expect(todoItems).toHaveCount(2); 296 | await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); 297 | }); 298 | 299 | test('should be hidden when there are no items that are completed', async ({ page }) => { 300 | await page.locator('.todo-list li .toggle').first().check(); 301 | await page.getByRole('button', { name: 'Clear completed' }).click(); 302 | await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden(); 303 | }); 304 | }); 305 | 306 | test.describe('Persistence', () => { 307 | test('@smoke - should persist its data', async ({ page }) => { 308 | // create a new todo locator 309 | const newTodo = page.getByPlaceholder('What needs to be done?'); 310 | 311 | for (const item of TODO_ITEMS.slice(0, 2)) { 312 | await newTodo.fill(item); 313 | await newTodo.press('Enter'); 314 | } 315 | 316 | const todoItems = page.getByTestId('todo-item'); 317 | const firstTodoCheck = todoItems.nth(0).getByRole('checkbox'); 318 | await firstTodoCheck.check(); 319 | await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); 320 | await expect(firstTodoCheck).toBeChecked(); 321 | await expect(todoItems).toHaveClass(['completed', '']); 322 | 323 | // Ensure there is 1 completed item. 324 | await checkNumberOfCompletedTodosInLocalStorage(page, 1); 325 | 326 | // Now reload. 327 | await page.reload(); 328 | await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); 329 | await expect(firstTodoCheck).toBeChecked(); 330 | await expect(todoItems).toHaveClass(['completed', '']); 331 | }); 332 | }); 333 | 334 | test.describe('Routing', () => { 335 | test.beforeEach(async ({ page }) => { 336 | await createDefaultTodos(page); 337 | // make sure the app had a chance to save updated todos in storage 338 | // before navigating to a new view, otherwise the items can get lost :( 339 | // in some frameworks like Durandal 340 | await checkTodosInLocalStorage(page, TODO_ITEMS[0]); 341 | }); 342 | 343 | test('@smoke - should allow me to display active items', async ({ page }) => { 344 | const todoItem = page.getByTestId('todo-item'); 345 | await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); 346 | 347 | await checkNumberOfCompletedTodosInLocalStorage(page, 1); 348 | await page.getByRole('link', { name: 'Active' }).click(); 349 | await expect(todoItem).toHaveCount(2); 350 | await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); 351 | }); 352 | 353 | test('should respect the back button', async ({ page }) => { 354 | const todoItem = page.getByTestId('todo-item'); 355 | await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); 356 | 357 | await checkNumberOfCompletedTodosInLocalStorage(page, 1); 358 | 359 | await test.step('Showing all items', async () => { 360 | await page.getByRole('link', { name: 'All' }).click(); 361 | await expect(todoItem).toHaveCount(3); 362 | }); 363 | 364 | await test.step('Showing active items', async () => { 365 | await page.getByRole('link', { name: 'Active' }).click(); 366 | }); 367 | 368 | await test.step('Showing completed items', async () => { 369 | await page.getByRole('link', { name: 'Completed' }).click(); 370 | }); 371 | 372 | await expect(todoItem).toHaveCount(1); 373 | await page.goBack(); 374 | await expect(todoItem).toHaveCount(2); 375 | await page.goBack(); 376 | await expect(todoItem).toHaveCount(3); 377 | }); 378 | 379 | test('should allow me to display completed items', async ({ page }) => { 380 | await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); 381 | await checkNumberOfCompletedTodosInLocalStorage(page, 1); 382 | await page.getByRole('link', { name: 'Completed' }).click(); 383 | await expect(page.getByTestId('todo-item')).toHaveCount(1); 384 | }); 385 | 386 | test('should allow me to display all items', async ({ page }) => { 387 | await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); 388 | await checkNumberOfCompletedTodosInLocalStorage(page, 1); 389 | await page.getByRole('link', { name: 'Active' }).click(); 390 | await page.getByRole('link', { name: 'Completed' }).click(); 391 | await page.getByRole('link', { name: 'All' }).click(); 392 | await expect(page.getByTestId('todo-item')).toHaveCount(3); 393 | }); 394 | 395 | test('should highlight the currently applied filter', async ({ page }) => { 396 | await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected'); 397 | 398 | //create locators for active and completed links 399 | const activeLink = page.getByRole('link', { name: 'Active' }); 400 | const completedLink = page.getByRole('link', { name: 'Completed' }); 401 | await activeLink.click(); 402 | 403 | // Page change - active items. 404 | await expect(activeLink).toHaveClass('selected'); 405 | await completedLink.click(); 406 | 407 | // Page change - completed items. 408 | await expect(completedLink).toHaveClass('selected'); 409 | }); 410 | }); 411 | 412 | async function createDefaultTodos(page: Page) { 413 | // create a new todo locator 414 | const newTodo = page.getByPlaceholder('What needs to be done?'); 415 | 416 | for (const item of TODO_ITEMS) { 417 | await newTodo.fill(item); 418 | await newTodo.press('Enter'); 419 | } 420 | } 421 | 422 | async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) { 423 | return await page.waitForFunction(e => { 424 | return JSON.parse(localStorage['react-todos']).length === e; 425 | }, expected); 426 | } 427 | 428 | async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) { 429 | return await page.waitForFunction(e => { 430 | return JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e; 431 | }, expected); 432 | } 433 | 434 | async function checkTodosInLocalStorage(page: Page, title: string) { 435 | return await page.waitForFunction(t => { 436 | return JSON.parse(localStorage['react-todos']).map((todo: any) => todo.title).includes(t); 437 | }, title); 438 | } 439 | -------------------------------------------------------------------------------- /tests/example-applitools.spec.ts: -------------------------------------------------------------------------------- 1 | import { test } from '@playwright/test'; 2 | import { 3 | BatchInfo, 4 | Configuration, 5 | EyesRunner, 6 | ClassicRunner, 7 | VisualGridRunner, 8 | BrowserType, 9 | DeviceName, 10 | ScreenOrientation, 11 | Eyes, 12 | Target 13 | } from '@applitools/eyes-playwright'; 14 | 15 | export const USE_ULTRAFAST_GRID: boolean = true; 16 | // export const USE_ULTRAFAST_GRID: boolean = false; 17 | 18 | export let Batch: BatchInfo; 19 | export let Config: Configuration; 20 | export let Runner: EyesRunner; 21 | let eyes: Eyes; 22 | let URL = 'https://demo.applitools.com'; 23 | // let URL = 'https://demo.applitools.com/index_v2.html'; 24 | 25 | test.beforeAll(async() => { 26 | 27 | if (USE_ULTRAFAST_GRID) { 28 | Runner = new VisualGridRunner({ testConcurrency: 5 }); 29 | } 30 | else { 31 | Runner = new ClassicRunner(); 32 | } 33 | 34 | const runnerName = (USE_ULTRAFAST_GRID) ? 'Ultrafast Grid' : 'Classic runner'; 35 | Batch = new BatchInfo({name: `ACME Project - ${runnerName}`}); 36 | 37 | Config = new Configuration(); 38 | Config.setBatch(Batch); 39 | 40 | if (USE_ULTRAFAST_GRID) { 41 | Config.addBrowser(800, 600, BrowserType.CHROME); 42 | Config.addBrowser(1600, 1200, BrowserType.FIREFOX); 43 | Config.addBrowser(1024, 768, BrowserType.SAFARI); 44 | Config.addDeviceEmulation(DeviceName.iPhone_11, ScreenOrientation.PORTRAIT); 45 | Config.addDeviceEmulation(DeviceName.Nexus_10, ScreenOrientation.LANDSCAPE); 46 | } 47 | }); 48 | 49 | test.beforeEach(async ({ page }) => { 50 | eyes = new Eyes(Runner, Config); 51 | await eyes.open( 52 | page, 53 | 'ACME Bank', 54 | test.info().title, 55 | { width: 1024, height: 768 } 56 | ); 57 | }); 58 | 59 | test.afterEach(async () => { 60 | await eyes.close(); 61 | }); 62 | 63 | test.afterAll(async() => { 64 | const results = await Runner.getAllTestResults(); 65 | console.log('Visual test results', results); 66 | }); 67 | 68 | test.describe('ACME Bank', () => { 69 | test('log into a bank account', async ({ page }) => { 70 | await page.goto(URL); 71 | await eyes.check('Login page', Target.window().fully()); 72 | await page.locator('id=username').fill('jedi'); 73 | await page.locator('id=password').fill('happyTesting'); 74 | await page.locator('id=log-in').click(); 75 | await eyes.check('Main page', Target.window().fully().layout()); 76 | }); 77 | 78 | }); 79 | 80 | -------------------------------------------------------------------------------- /tests/example.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test'; 2 | 3 | test('has title', async ({ page }) => { 4 | await page.goto('https://playwright.dev/'); 5 | await expect(page).toHaveTitle(/Playwright/); 6 | }); 7 | 8 | test('get started link', async ({ page }) => { 9 | await page.goto('https://playwright.dev/'); 10 | await page.getByRole('link', { name: 'Get started' }).click(); 11 | await expect(page).toHaveURL(/.*intro/); 12 | }); 13 | 14 | test('check Java page', async ({ page }) => { 15 | await page.goto('https://playwright.dev/'); 16 | await page.getByRole('link', { name: 'Get started' }).click(); 17 | await page.getByRole('button', { name: 'Node.js' }).hover(); 18 | await page.getByText('Java', { exact: true }).click(); 19 | // await page.getByRole('navigation', { name: 'Main' }).getByText('Java').click(); // in case the locator above doesn't work, you can use this line. Remove the line above and use this one instead. 20 | await expect(page).toHaveURL('https://playwright.dev/java/docs/intro'); 21 | await expect(page.getByText('Installing Playwright', { exact: true })).not.toBeVisible(); 22 | const javaDescription = `Playwright is distributed as a set of Maven modules. The easiest way to use it is to add one dependency to your project's pom.xml as described below. If you're not familiar with Maven please refer to its documentation.`; 23 | await expect(page.getByText(javaDescription)).toBeVisible(); 24 | }); 25 | 26 | -------------------------------------------------------------------------------- /tests/example2.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, type Page } from '@playwright/test'; 2 | import { HomePage } from '../pages/home-page'; 3 | import { TopMenuPage } from '../pages/top-menu-page'; 4 | 5 | const URL = 'https://playwright.dev/'; 6 | let homePage: HomePage; 7 | let topMenuPage: TopMenuPage; 8 | const pageUrl = /.*intro/; 9 | 10 | test.beforeEach(async ({page}) => { 11 | await page.goto(URL); 12 | homePage = new HomePage(page); 13 | }); 14 | 15 | async function clickGetStarted(page: Page) { 16 | await homePage.clickGetStarted(); 17 | topMenuPage = new TopMenuPage(page); 18 | } 19 | 20 | test.describe('Playwright website', () => { 21 | 22 | test('has title', async () => { 23 | await homePage.assertPageTitle(); 24 | }); 25 | 26 | test('get started link', async ({ page }) => { 27 | // Act 28 | await clickGetStarted(page); 29 | // Assert 30 | await topMenuPage.assertPageUrl(pageUrl); 31 | }); 32 | 33 | test('check Java page', async ({ page }) => { 34 | await test.step('Act', async () => { 35 | await clickGetStarted(page); 36 | await topMenuPage.hoverNode(); 37 | await topMenuPage.clickJava(); 38 | }); 39 | 40 | await test.step('Assert', async () => { 41 | await topMenuPage.assertPageUrl(pageUrl); 42 | await topMenuPage.assertNodeDescriptionNotVisible(); 43 | await topMenuPage.assertJavaDescriptionVisible(); 44 | }); 45 | }); 46 | }); -------------------------------------------------------------------------------- /tests/example3.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, type Page } from '@playwright/test'; 2 | import { HomePage } from '../pages/home-page'; 3 | import { TopMenuPage } from '../pages/top-menu-page'; 4 | import { 5 | BatchInfo, 6 | Configuration, 7 | EyesRunner, 8 | ClassicRunner, 9 | VisualGridRunner, 10 | BrowserType, 11 | DeviceName, 12 | ScreenOrientation, 13 | Eyes, 14 | Target 15 | } from '@applitools/eyes-playwright'; 16 | 17 | const URL = 'https://playwright.dev/'; 18 | let homePage: HomePage; 19 | let topMenuPage: TopMenuPage; 20 | const pageUrl = /.*intro/; 21 | 22 | // Applitools 23 | // export const USE_ULTRAFAST_GRID: boolean = true; 24 | export const USE_ULTRAFAST_GRID: boolean = false; 25 | export let Batch: BatchInfo; 26 | export let Config: Configuration; 27 | export let Runner: EyesRunner; 28 | let eyes: Eyes; 29 | // end of Applitools 30 | 31 | // beforeAll for Applitools 32 | test.beforeAll(async() => { 33 | 34 | if (USE_ULTRAFAST_GRID) { 35 | Runner = new VisualGridRunner({ testConcurrency: 5 }); 36 | } 37 | else { 38 | Runner = new ClassicRunner(); 39 | } 40 | 41 | const runnerName = (USE_ULTRAFAST_GRID) ? 'Ultrafast Grid' : 'Classic runner'; 42 | Batch = new BatchInfo({name: `Playwright website - ${runnerName}`}); 43 | 44 | Config = new Configuration(); 45 | // Config.setApiKey(""); 46 | 47 | Config.setBatch(Batch); 48 | if (USE_ULTRAFAST_GRID) { 49 | Config.addBrowser(800, 600, BrowserType.CHROME); 50 | Config.addBrowser(1600, 1200, BrowserType.FIREFOX); 51 | Config.addBrowser(1024, 768, BrowserType.SAFARI); 52 | Config.addDeviceEmulation(DeviceName.iPhone_11, ScreenOrientation.PORTRAIT); 53 | Config.addDeviceEmulation(DeviceName.Nexus_10, ScreenOrientation.LANDSCAPE); 54 | } 55 | 56 | }); 57 | 58 | 59 | test.beforeEach(async ({page}) => { 60 | //Applitools 61 | eyes = new Eyes(Runner, Config); 62 | await eyes.open( 63 | page, 64 | 'Playwright', 65 | test.info().title, 66 | { width: 1024, height: 768 } 67 | ); 68 | //end of Applitools 69 | 70 | await page.goto(URL); 71 | homePage = new HomePage(page); 72 | }); 73 | 74 | test.afterEach(async () => { 75 | await eyes.close(); 76 | }); 77 | 78 | test.afterAll(async() => { 79 | // forces Playwright to wait synchronously for all visual checkpoints to complete. 80 | const results = await Runner.getAllTestResults(); 81 | console.log('Visual test results', results); 82 | }); 83 | 84 | async function clickGetStarted(page: Page) { 85 | await homePage.clickGetStarted(); 86 | topMenuPage = new TopMenuPage(page); 87 | } 88 | 89 | test.describe('Playwright website', () => { 90 | 91 | test('has title', async () => { 92 | await homePage.assertPageTitle(); 93 | // https://applitools.com/docs/api-ref/sdk-api/playwright/js-intro/checksettings 94 | await eyes.check('Home page', Target.window().fully()); 95 | }); 96 | 97 | test('get started link', async ({ page }) => { 98 | await clickGetStarted(page); 99 | await topMenuPage.assertPageUrl(pageUrl); 100 | // https://applitools.com/docs/api-ref/sdk-api/playwright/js-intro/checksettings#region-match-levels 101 | // Layout: Check only the layout and ignore actual text and graphics. 102 | await eyes.check('Get Started page', Target.window().fully().layout()); 103 | }); 104 | 105 | test('check Java page', async ({ page }) => { 106 | await test.step('Act', async () => { 107 | await clickGetStarted(page); 108 | await topMenuPage.hoverNode(); 109 | await topMenuPage.clickJava(); 110 | }); 111 | await test.step('Assert', async () => { 112 | await topMenuPage.assertPageUrl(pageUrl); 113 | await topMenuPage.assertNodeDescriptionNotVisible(); 114 | await topMenuPage.assertJavaDescriptionVisible(); 115 | // https://applitools.com/docs/api-ref/sdk-api/playwright/js-intro/checksettings#region-match-levels 116 | // Ignore colors: Similar to the strict match level but ignores changes in colors. 117 | await eyes.check('Java page', Target.window().fully().ignoreColors()); 118 | }); 119 | }); 120 | }); -------------------------------------------------------------------------------- /tests/template.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test'; 2 | 3 | //AAA Pattern 4 | 5 | // [Arrange] 6 | // [Act] 7 | // [Assert] 8 | 9 | const password = process.env.PASSWORD; 10 | 11 | test.beforeAll(async ({ playwright }) => { 12 | test.skip( 13 | !!process.env.PROD, 14 | 'Test intentionally skipped in production due to data dependency.' 15 | ); 16 | // start a server 17 | // create a db connection 18 | // reuse a sign in state 19 | }); 20 | 21 | test.beforeEach(async ({ page }, testInfo) => { 22 | console.log(`Running ${testInfo.title}`); 23 | // open a URL 24 | // clean up the DB 25 | // create a page object 26 | // dismiss a modal 27 | // load params 28 | }); 29 | 30 | test.afterAll(async ({ page }, testInfo) => { 31 | console.log('Test file completed.'); 32 | // close a DB connection 33 | }); 34 | 35 | test.afterEach( async ({ page }, testInfo) => { 36 | console.log(`Finished ${testInfo.title} with status ${testInfo.status}`); 37 | 38 | if (testInfo.status !== testInfo.expectedStatus) 39 | console.log(`Did not run as expected, ended up at ${page.url()}`); 40 | // clean up all the data we created for this test through API calls 41 | }); 42 | 43 | // test.describe('Test Case', () => { 44 | // test.describe.only('Test Case', () => { 45 | test.describe.skip('Test Case', () => { 46 | test('Test Scenario One', async ({ page }) => { 47 | await test.step('Step One', async () => { 48 | // ... 49 | }); 50 | 51 | await test.step('Step Two', async () => { 52 | // ... 53 | }); 54 | 55 | // ... 56 | }); 57 | 58 | test('Test Scenario Two', async ({ page }) => { 59 | // Arrange 60 | // Act 61 | // Assert 62 | }); 63 | /** 64 | test.only('Test Scenario Three', async ({ page }) => { 65 | // Arrange 66 | // Act 67 | // Assert 68 | }); 69 | */ 70 | /** 71 | test.skip('Test Scenario Four', async ({ page }) => { 72 | // Arrange 73 | // Act 74 | // Assert 75 | }); 76 | */ 77 | 78 | }); 79 | -------------------------------------------------------------------------------- /utils/environmentBaseUrl.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | ci: { 3 | prefix: 'https://dev-myapp-', 4 | suffix: '.mydomain.com', 5 | }, 6 | local: { 7 | api: 'https://local-myapp.mydomain.com/api', 8 | home: 'https://local-myapp.mydomain.com', 9 | }, 10 | production: { 11 | api: 'https://myapp.mydomain.com/api', 12 | home: 'https://myapp.mydomain.com', 13 | }, 14 | staging: { 15 | api: 'https://staging-myapp.mydomain.com/api', 16 | home: 'https://staging-myapp.mydomain.com', 17 | }, 18 | }; 19 | --------------------------------------------------------------------------------