diff --git a/.circleci/config.yml b/.circleci/config.yml
index 0a3ec0f42a..89944475ba 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,5 +1,8 @@
version: 2.1
+orbs:
+ cypress: cypress-io/cypress@3
+
executors:
node-executor:
resource_class: medium+
@@ -51,7 +54,27 @@ jobs:
- attach_workspace:
at: ~/repo
- run: npm run lint
-
+
+ install-and-persist:
+ executor: cypress/default
+ steps:
+ - cypress/install
+ - persist_to_workspace:
+ root: ~/
+ paths:
+ - .cache/Cypress
+ - project
+
+ run-tests-in-parallel:
+ executor: cypress/default
+ parallelism: 6
+ steps:
+ - attach_workspace:
+ at: ~/
+ - cypress/run-tests:
+ start-command: 'npm run start'
+ cypress-command: 'npx wait-on http://localhost:3000 && npx cypress run --parallel --record'
+
release:
<<: *job-defaults
steps:
@@ -67,7 +90,6 @@ jobs:
node ./scripts/search/scrape-and-compare-algolia-index.mjs
workflows:
- version: 2
build-and-test:
jobs:
- build
@@ -75,7 +97,13 @@ workflows:
name: "Lint JS/CSS/Markdown"
requires:
- build
-
+ - install-and-persist:
+ name: Install & Persist To Workspace
+ - run-tests-in-parallel:
+ name: Run Tests in Parallel
+ requires:
+ - build
+ - Install & Persist To Workspace
# Run Algolia scraper only on main.
- release:
name: 'Run Algolia scraper'
diff --git a/cypress.config.ts b/cypress.config.ts
new file mode 100644
index 0000000000..29b85f6ec8
--- /dev/null
+++ b/cypress.config.ts
@@ -0,0 +1,47 @@
+import { defineConfig } from "cypress";
+import { readdirSync } from 'fs'
+import { join } from 'path'
+
+export default defineConfig({
+ projectId: 'imown1',
+ fixturesFolder: false,
+ viewportHeight: 800,
+ viewportWidth: 1200,
+ experimentalMemoryManagement: true,
+ e2e: {
+ supportFile: false,
+ baseUrl: "http://localhost:3000",
+ setupNodeEvents(on, config) {
+ on("task", {
+ "createFileTree"({ path }) {
+ // take the given path and create an array of all file paths
+ // with each files and the directory path of the file as strings
+ // for example: given 'accessibility' return
+ // ['accessibility/get-started/introduction', 'accessibility/core-concepts/how-it-works']
+ path = 'docs/' + path;
+
+ function walk(dir: string): string[] {
+ return readdirSync(dir, { withFileTypes: true }).flatMap((file) => {
+ if (file.name.includes('_category_.json') || file.name.includes('.DS_Store')) {
+ return []
+ }
+
+ if (file.name.includes('.mdx')) {
+ // remove the .mdx file extension
+ file.name = file.name.slice(0, -4)
+ }
+
+ if (file.isDirectory()) {
+ return walk(join(dir, file.name))
+ } else {
+ return [join(dir, file.name)]
+ }
+ })
+ }
+
+ return walk(path).filter((file) => file !== undefined).map((file) => file.slice(5))
+ }
+ })
+ }
+ },
+});
diff --git a/cypress/e2e/a11y_pages.cy.ts b/cypress/e2e/a11y_pages.cy.ts
new file mode 100644
index 0000000000..303f649c16
--- /dev/null
+++ b/cypress/e2e/a11y_pages.cy.ts
@@ -0,0 +1,16 @@
+describe('Visit a11y pages', () => {
+ before(() => {
+ cy.task('createFileTree', { path: 'accessibility' }).then((urls) => {
+ // console.log('urlsLength', urls.length)
+ Cypress.env({ urls })
+ })
+ })
+
+ // Well, this number is hardcoded and should match the length of urls
+ Cypress._.range(0, 12).forEach(index => {
+ it(`Visit a11y page ${index} `, () => {
+ cy.visit(Cypress.env().urls[index])
+ cy.get('h1').should('be.visible')
+ })
+ })
+})
\ No newline at end of file
diff --git a/cypress/e2e/api_pages.cy.ts b/cypress/e2e/api_pages.cy.ts
new file mode 100644
index 0000000000..72dfef7116
--- /dev/null
+++ b/cypress/e2e/api_pages.cy.ts
@@ -0,0 +1,16 @@
+describe('Visit API pages', () => {
+ before(() => {
+ cy.task('createFileTree', { path: 'api' }).then((urls) => {
+ // console.log('urlsLength', urls.length)
+ Cypress.env({ urls })
+ })
+ })
+
+ // Well, this number is hardcoded and should match the length of urls
+ Cypress._.range(0, 132).forEach(index => {
+ it(`Visit API page ${index} `, () => {
+ cy.visit(Cypress.env().urls[index])
+ cy.get('h1').should('be.visible')
+ })
+ })
+})
\ No newline at end of file
diff --git a/cypress/e2e/app_pages.cy.ts b/cypress/e2e/app_pages.cy.ts
new file mode 100644
index 0000000000..a0026f4ac9
--- /dev/null
+++ b/cypress/e2e/app_pages.cy.ts
@@ -0,0 +1,16 @@
+describe('Visit App pages', () => {
+ before(() => {
+ cy.task('createFileTree', { path: 'app' }).then((urls) => {
+ console.log('urlsLength', urls.length)
+ Cypress.env({ urls })
+ })
+ })
+
+ // Well, this number is hardcoded and should match the length of urls
+ Cypress._.range(0, 81).forEach(index => {
+ it(`Visit App page ${index} `, () => {
+ cy.visit(Cypress.env().urls[index])
+ cy.get('h1').should('be.visible')
+ })
+ })
+})
\ No newline at end of file
diff --git a/cypress/e2e/basic_tests.cy.ts b/cypress/e2e/basic_tests.cy.ts
new file mode 100644
index 0000000000..71f9e21c0c
--- /dev/null
+++ b/cypress/e2e/basic_tests.cy.ts
@@ -0,0 +1,64 @@
+describe('Basic tests', () => {
+ beforeEach(() => {
+ cy.visit('/')
+ })
+
+ it('root reroutes to App ', () => {
+ cy.url().should('include', '/app/get-started/why-cypress')
+ })
+
+ describe('Main Nav', () => {
+ it('App', () => {
+ cy.get('nav a').contains('App').click()
+ cy.url().should('include', '/app/get-started/why-cypress')
+ cy.get('[aria-current="page"]').should('contain', 'App')
+ })
+
+ it('API', () => {
+ cy.get('nav a').contains('API').click()
+ cy.url().should('include', '/api/table-of-contents')
+ cy.get('[aria-current="page"]').should('contain', 'API')
+ })
+
+ it('Cloud', () => {
+ cy.get('nav a').contains('Cloud').click()
+ cy.url().should('include', '/cloud/get-started/introduction')
+ cy.get('[aria-current="page"]').should('contain', 'Cloud')
+ })
+
+ it('UI Coverage', () => {
+ cy.get('nav a').contains('UI Coverage').click()
+ cy.url().should('include', '/ui-coverage/get-started/introduction')
+ cy.get('[aria-current="page"]').should('contain', 'UI Coverage')
+ })
+
+ it('Accessibility', () => {
+ cy.get('nav a').contains('Accessibility').click()
+ cy.url().should('include', '/accessibility/get-started/introduction')
+ cy.get('[aria-current="page"]').should('contain', 'Accessibility')
+ })
+ })
+
+ describe('Announcement Bar', () => {
+ it('should close when clicking close btn', () => {
+ cy.get('[role="banner"]').should('be.visible')
+ cy.get('.close').click()
+ cy.get('[role="banner"]').should('not.exist')
+ })
+ })
+
+ describe('Dark mode', () => {
+ it('switch to dark mode when clicked', () => {
+ cy.get('[data-theme=light]').should('have.css', 'background-color', 'rgb(255, 255, 255)') // white
+ cy.get('[aria-label="Switch to dark mode"]').click()
+ cy.get('[data-theme=dark]').should('have.css', 'background-color', 'rgb(27, 30, 46)') // dark gray
+ })
+ })
+
+ describe('Search', () => {
+ it('search opens search popup', () => {
+ cy.contains('Search ⌘K').click()
+ cy.get('.DocSearch-Modal').should('be.visible')
+ })
+ })
+})
\ No newline at end of file
diff --git a/cypress/e2e/cloud_pages.cy.ts b/cypress/e2e/cloud_pages.cy.ts
new file mode 100644
index 0000000000..21d3ced782
--- /dev/null
+++ b/cypress/e2e/cloud_pages.cy.ts
@@ -0,0 +1,16 @@
+describe('Visit Cloud pages', () => {
+ before(() => {
+ cy.task('createFileTree', { path: 'cloud' }).then((urls) => {
+ // console.log('urlsLength', urls.length)
+ Cypress.env({ urls })
+ })
+ })
+
+ // Well, this number is hardcoded and should match the length of urls
+ Cypress._.range(0, 29).forEach(index => {
+ it(`Visit Cloud page ${index} `, () => {
+ cy.visit(Cypress.env().urls[index])
+ cy.get('h1').should('be.visible')
+ })
+ })
+})
\ No newline at end of file
diff --git a/cypress/e2e/ui_cov_pages.cy.ts b/cypress/e2e/ui_cov_pages.cy.ts
new file mode 100644
index 0000000000..089713117f
--- /dev/null
+++ b/cypress/e2e/ui_cov_pages.cy.ts
@@ -0,0 +1,16 @@
+describe('Visit UI Cov pages', () => {
+ before(() => {
+ cy.task('createFileTree', { path: 'ui-coverage' }).then((urls) => {
+ console.log('urlsLength', urls.length)
+ Cypress.env({ urls })
+ })
+ })
+
+ // Well, this number is hardcoded and should match the length of urls
+ Cypress._.range(0, 16).forEach(index => {
+ it(`Visit UI Cov page ${index} `, () => {
+ cy.visit(Cypress.env().urls[index])
+ cy.get('h1').should('be.visible')
+ })
+ })
+})
\ No newline at end of file
diff --git a/docs/accessibility/core-concepts/how-it-works.mdx b/docs/accessibility/core-concepts/how-it-works.mdx
index 23d44d5a82..8340cb6231 100644
--- a/docs/accessibility/core-concepts/how-it-works.mdx
+++ b/docs/accessibility/core-concepts/how-it-works.mdx
@@ -29,6 +29,6 @@ This means that a 100% axe score does not mean all possible accessibility errors
The value of this form of testing in Cypress Accessibility is to give you fast, reliable, easy-to-understand feedback about common accessibility mistakes that are found in most projects. Providing these results automatically as part of your test run means that you can find and fix these issues with minimal friction, shifting accessibility left in your software development lifecycle.
-## Test Replay limitations
+## Powered by Test Replay
-Because Cypress Accessibility uses data captured through the Test Replay protocol, it is subject to any [limitations of that protocol](https://docs.cypress.io/faq/questions/cloud-faq#Is-everything-captured-and-replayed-in-Test-Replay) related to data capture or browser support.
+Because Cypress Accessibility uses data captured through Cypress Test Replay, it is subject [Test Replay limitations](https://docs.cypress.io/faq/questions/cloud-faq#Is-everything-captured-and-replayed-in-Test-Replay).
diff --git a/docs/accessibility/get-started/introduction.mdx b/docs/accessibility/get-started/introduction.mdx
index 287a77cc92..1884e48161 100644
--- a/docs/accessibility/get-started/introduction.mdx
+++ b/docs/accessibility/get-started/introduction.mdx
@@ -23,6 +23,12 @@ Cypress Accessibility generates a sortable, filterable report, to see scores and
## How are reports created?
+:::caution
+
+Cypress Accessibility generates reports using [Cypress Test Replay](/cloud/features/test-replay) data and requires Cypress v13+.
+
+:::
+
Cypress Cloud generates an accessibility report for each unique state reached during your tests on a given Cypress run. This includes pages visited in end-to-end tests, as well as individual components rendered in component tests, and any states or pages that were encountered as a result of interactions performed during test execution.
All of these page or component states are detected using the same protocol that powers [Test Replay](/cloud/features/test-replay), meaning no additional code or setup is needed anywhere in your tests.
diff --git a/docs/api/commands/origin.mdx b/docs/api/commands/origin.mdx
index a674dd0d17..d98a40bd00 100644
--- a/docs/api/commands/origin.mdx
+++ b/docs/api/commands/origin.mdx
@@ -339,7 +339,10 @@ Cypress.Commands.add('login', (username, password) => {
### How to Test Multiple Origins
-
+
In this video we walk through how to test multiple origins in a single test. We
also look at how to use the `cy.session()` command to cache session information
diff --git a/docs/api/commands/scrollintoview.mdx b/docs/api/commands/scrollintoview.mdx
index 0d99f5ea67..b3982fc96b 100644
--- a/docs/api/commands/scrollintoview.mdx
+++ b/docs/api/commands/scrollintoview.mdx
@@ -1,6 +1,5 @@
---
title: scrollIntoView
-slug: /api/commands/scrollIntoView
---
Scroll an element into view.
@@ -131,4 +130,4 @@ console outputs the following:
## See also
-- [`cy.scrollTo()`](/api/commands/scrollTo)
+- [`cy.scrollTo()`](/api/commands/scrollto)
diff --git a/docs/api/commands/scrollto.mdx b/docs/api/commands/scrollto.mdx
index 6a88a6b210..e21e02d511 100644
--- a/docs/api/commands/scrollto.mdx
+++ b/docs/api/commands/scrollto.mdx
@@ -1,6 +1,5 @@
---
title: scrollTo
-slug: /api/commands/scrollTo
---
Scroll to a specific position.
@@ -224,4 +223,4 @@ following:
## See also
-- [`.scrollIntoView()`](/api/commands/scrollIntoView)
+- [`.scrollIntoView()`](/api/commands/scrollintoview)
diff --git a/docs/api/commands/session.mdx b/docs/api/commands/session.mdx
index f096d4bc1b..cd702490df 100644
--- a/docs/api/commands/session.mdx
+++ b/docs/api/commands/session.mdx
@@ -583,7 +583,7 @@ isolation is enabled with `testIsolation=true` (default in Cypress 12), This
guarantees consistent behavior whether a session is being created or restored
and allows you to switch sessions without first having to explicitly log out.
-| | Page cleared (test) | Session data cleared |
+| When cleared? | Page cleared (test) | Session data cleared |
| -------------------------- | :----------------------------------------: | :----------------------------------------: |
| Before `setup` | | |
| Before `cy.session()` ends | | |
@@ -596,7 +596,7 @@ to ensure the page to test is loaded.
When test isolation is disabled with `testIsolation=false`, the page will not
clear, however, the session data will clear when `cy.session()` runs.
-| | Page cleared (test) | Session data cleared |
+| When cleared | Page cleared (test) | Session data cleared |
| -------------------------- | :-----------------: | :----------------------------------------: |
| Before `setup` | | |
| Before `cy.session()` ends | | |
diff --git a/docs/api/cypress-api/custom-commands.mdx b/docs/api/cypress-api/custom-commands.mdx
index 2b23d48a51..272cd69b06 100644
--- a/docs/api/cypress-api/custom-commands.mdx
+++ b/docs/api/cypress-api/custom-commands.mdx
@@ -405,7 +405,7 @@ with an existing subject or without one.
Examples of dual commands:
- [`cy.screenshot()`](/api/commands/screenshot)
-- [`cy.scrollTo()`](/api/commands/scrollTo)
+- [`cy.scrollTo()`](/api/commands/scrollto)
- [`cy.wait()`](/api/commands/wait)
#### Custom Dual Command
@@ -497,7 +497,10 @@ cy.get('#username').type('username@email.com')
cy.get('#password').type('superSecret123')
```
-
+
You may want to mask some values passed to the [.type()](/api/commands/type)
command so that sensitive data does not display in screenshots or videos of your
@@ -529,7 +532,10 @@ cy.get('#password').type('superSecret123', { sensitive: true })
Now our sensitive password is not printed to the Cypress Command Log when
`sensitive: true` is passed as an option to [.type()](/api/commands/type).
-
+
#### Overwrite `screenshot` command
diff --git a/docs/api/table-of-contents.mdx b/docs/api/table-of-contents.mdx
index b858aabee2..754503a3ee 100644
--- a/docs/api/table-of-contents.mdx
+++ b/docs/api/table-of-contents.mdx
@@ -93,8 +93,8 @@ Learn more about action commands in our
| [`.click()`](/api/commands/click) | Click a DOM element. |
| [`.dblclick()`](/api/commands/dblclick) | Double-click a DOM element. |
| [`.rightclick()`](/api/commands/rightclick) | Right click a DOM element. |
-| [`.scrollIntoView()`](/api/commands/scrollIntoView) | Scroll an element into view. |
-| [`.scrollTo()`](/api/commands/scrollTo) | Scroll to a specific position. |
+| [`.scrollIntoView()`](/api/commands/scrollintoview) | Scroll an element into view. |
+| [`.scrollTo()`](/api/commands/scrollto) | Scroll to a specific position. |
| [`.select()`](/api/commands/select) | Select an `` within a ``. |
| [`.selectFile()`](/api/commands/selectfile) | Selects a file in an HTML5 input element, or simulates dragging a file into the browser. |
| [`.trigger()`](/api/commands/trigger) | Trigger an event on a DOM element. |
diff --git a/docs/api/utilities/lodash.mdx b/docs/api/utilities/lodash.mdx
index e561085c85..c520a64d5f 100644
--- a/docs/api/utilities/lodash.mdx
+++ b/docs/api/utilities/lodash.mdx
@@ -1,6 +1,7 @@
---
title: Cypress._
slug: _
+sidebar_position: 0
---
Cypress automatically includes [lodash](https://lodash.com/) and exposes it as
diff --git a/docs/app/component-testing/get-started.mdx b/docs/app/component-testing/get-started.mdx
index c627ba050f..cbd2220a8f 100644
--- a/docs/app/component-testing/get-started.mdx
+++ b/docs/app/component-testing/get-started.mdx
@@ -124,7 +124,10 @@ to open the Cypress App.
At this point, your project is configured to use Cypress Component Testing. However, when the app appears, it won't find any specs because we haven't created
any yet. Now we need write our first Component Test.
-
+
### Frameworks
diff --git a/docs/app/continuous-integration/github-actions.mdx b/docs/app/continuous-integration/github-actions.mdx
index 2a12340f15..c73e0d1d4e 100644
--- a/docs/app/continuous-integration/github-actions.mdx
+++ b/docs/app/continuous-integration/github-actions.mdx
@@ -34,7 +34,10 @@ in the [GitHub Action Documentation](https://docs.github.com/en/actions).
## Cypress GitHub Action
-
+
Workflows can be packaged and shared as
[GitHub Actions](https://github.com/features/actions). GitHub maintains many,
@@ -78,7 +81,10 @@ for more information.
## Basic Setup
-
+
The example below is a basic CI setup and job using the
[Cypress GitHub Action](https://github.com/marketplace/actions/cypress-io) to
@@ -105,23 +111,6 @@ jobs:
start: npm start
```
-
-
**How this action works:**
- On _push_ to this repository, this job will provision and start a
@@ -285,7 +274,10 @@ for more info.
## Parallelization
-
+
[Cypress Cloud](/cloud/get-started/introduction) offers the ability to
[parallelize and group test runs](/cloud/features/smart-orchestration/parallelization)
@@ -430,7 +422,10 @@ the browser is consistent during an image upgrade.
## Using Cypress Cloud with GitHub Actions
-
+
In the GitHub Actions configuration, we have defined in the previous section, we
are leveraging three useful features of
diff --git a/docs/app/continuous-integration/overview.mdx b/docs/app/continuous-integration/overview.mdx
index 3e0ac0c2ba..51a32d5931 100644
--- a/docs/app/continuous-integration/overview.mdx
+++ b/docs/app/continuous-integration/overview.mdx
@@ -16,11 +16,17 @@ sidebar_position: 10
## What is Continuous Integration?
-
+
## Setting up CI
-
+
### Basics
diff --git a/docs/app/core-concepts/testing-types.mdx b/docs/app/core-concepts/testing-types.mdx
index eef48ad9f7..9720dae64c 100644
--- a/docs/app/core-concepts/testing-types.mdx
+++ b/docs/app/core-concepts/testing-types.mdx
@@ -154,7 +154,7 @@ To learn more about component testing in Cypress, visit our guide on
## Testing Type Comparison
-| | E2E | Component |
+| Attributes | E2E | Component |
| ---------------------- | :----------------------------------------------: | :-------------------------------------------: |
| What's Tested | All app layers | Individual component |
| Characteristics | Comprehensive, slower, more susceptible to flake | Specialized, quick, reliable |
diff --git a/docs/app/core-concepts/writing-and-organizing-tests.mdx b/docs/app/core-concepts/writing-and-organizing-tests.mdx
index 99f83dbf5c..1c5b5b4d50 100644
--- a/docs/app/core-concepts/writing-and-organizing-tests.mdx
+++ b/docs/app/core-concepts/writing-and-organizing-tests.mdx
@@ -233,7 +233,7 @@ module API option, if specified)
Instead of administering assets yourself, you can
[save them to the cloud with Cypress Cloud](/cloud/features/recorded-runs#Run-Details).
-Replay the test as it executed during the recorded run with full debug capability using [ Test Replay](/cloud/features/test-replay).
+Replay the test as it executed during the recorded run with full debug capability using [ Cypress Test Replay](/cloud/features/test-replay).
Screenshots and videos are stored permanently, attached to their respective test
results, and easily shared or browsed through our web interface. To learn more about videos and settings available, see
diff --git a/docs/app/faq.mdx b/docs/app/faq.mdx
index 8a9c34f78c..8a21effffd 100644
--- a/docs/app/faq.mdx
+++ b/docs/app/faq.mdx
@@ -6,7 +6,7 @@ sidebar_label: FAQ
## General Cypress Questions
-##### Is Cypress free and open source?
+### Is Cypress free and open source?
The [Cypress App](/app/get-started/why-cypress) is a free, downloadable and open
source (MIT license) application. This is always free to use.
@@ -19,13 +19,13 @@ Additionally, we have add-ons like [UI Coverage](/ui-coverage/get-started/introd
Please see our [Pricing Page](https://www.cypress.io/pricing) for more details.
-##### What operating systems do you support?
+### What operating systems do you support?
You can [install Cypress](/app/get-started/install-cypress) on Mac,
Linux, and Windows. For additional information, please see our
[System requirements](/app/get-started/install-cypress#System-requirements).
-##### Do you support native mobile apps?
+### Do you support native mobile apps?
Cypress will never be able to run on a native mobile app, but we can test some
functionality of mobile web browsers and test mobile applications that are
@@ -42,7 +42,7 @@ You can read about testing mobile applications with Ionic and Cypress
and see how we manage testing the mobile viewport in the
[Cypress Real World App](https://github.com/cypress-io/cypress-realworld-app).
-##### How is this different from 'X' testing tool?
+### How is this different from 'X' testing tool?
The Cypress App is a hybrid application/framework/service all rolled into one. It takes
a little bit of other testing tools, brings them together and improves on them.
@@ -52,7 +52,7 @@ In addition to the App, Cypress offers solutions like the [Cypress Cloud](/cloud
You can see our evaluation of Cypress against some frameworks in our [Migrating from Selenium](/app/guides/migration/selenium-to-cypress) and [Migrating from Protractor](/app/guides/migration/protractor-to-cypress) guides.
-#### Do you support X language or X framework?
+### Do you support X language or X framework?
Any and all. Ruby, Node, C#, PHP - none of that matters. Cypress tests anything
that runs in the context of a browser. It is back end, front end, language and
@@ -60,32 +60,32 @@ framework agnostic.
You'll write your tests in JavaScript or TypeScript, but beyond that Cypress works everywhere.
-#### Will Cypress work in my CI provider?
+### Will Cypress work in my CI provider?
Cypress works in any [CI provider](/app/continuous-integration/overview).
-#### Does Cypress require me to change any of my existing code?
+### Does Cypress require me to change any of my existing code?
No. But if you're wanting to test parts of your application that are not easily
testable, you'll want to refactor those situations (as you would for any
testing).
-#### We use WebSockets; will Cypress work with that?
+### We use WebSockets; will Cypress work with that?
Yes.
-#### Is it possible to use cypress on `.jspa`?
+### Is it possible to use cypress on `.jspa`?
Yes. Cypress works on anything rendered to a browser.
-#### Can I use Cypress to script user-actions on an external site like `gmail.com`?
+### Can I use Cypress to script user-actions on an external site like `gmail.com`?
Using Cypress to test against a
3rd party application is not its intended use. It _may_ work but will defeat the
purpose of why it was created. You use Cypress _while_ you develop your
application, it helps you write your tests.
-#### Is there code coverage?
+### Is there code coverage?
There is a plugin and detailed documentation on how to get end-to-end, unit and
full stack code coverage.
@@ -94,7 +94,7 @@ full stack code coverage.
- Use the [@cypress/code-coverage](https://github.com/cypress-io/code-coverage)
plugin
-#### Are there driver bindings in my language?
+### Are there driver bindings in my language?
Cypress does _not_ utilize WebDriver for testing, so it does not use or have any
notion of driver bindings. If your language can be somehow transpiled to
@@ -104,7 +104,7 @@ or
[Cypress Browserify preprocessor](https://github.com/cypress-io/cypress-browserify-preprocessor)
to transpile your tests to JavaScript that Cypress can run.
-#### What's the difference between a Spec, Test, and a Test Suite?
+### What's the difference between a Spec, Test, and a Test Suite?
The terms _spec_, _test_, and _test suite_ have specific meanings. Here's how they are differentiated in Cypress:
@@ -114,11 +114,11 @@ The terms _spec_, _test_, and _test suite_ have specific meanings. Here's how th
**Test Suite ** A collection of spec files that are grouped together. It allows you to organize your tests based on different criteria, such as functional areas, modules, or specific features. A test suite can include multiple spec files, each containing one or more tests. By grouping related tests together in a test suite, you can organize and manage your tests more effectively. Cypress provides options to run individual spec files, multiple spec files, or the entire test suite during test execution.
-#### When should I write a End-to-End tests and when should I write Component Tests?
+### When should I write a End-to-End tests and when should I write Component Tests?
For more information on how to choose a Cypress testing type, we recommend this [Testing Types Guide](/app/core-concepts/testing-types).
-#### When should I write a unit test and when should I write an end-to-end test?
+### When should I write a unit test and when should I write an end-to-end test?
We believe unit tests and end-to-end tests have differences that should guide
your choice.
@@ -154,7 +154,7 @@ features. Good tests:
Certainly, unit and end-to-end tests are NOT in opposition to each other and are
complementary tools in your toolbox.
-#### How do I convince my company to use Cypress?
+### How do I convince my company to use Cypress?
First, be honest with yourself -
[is Cypress the right tool](/app/get-started/why-cypress) for your company and
@@ -166,7 +166,7 @@ prototype to others before proceeding any further. If you can demonstrate the
benefits of using Cypress as a developer tool for your project to other
engineers, then Cypress will likely be more quickly adopted.
-#### How can I find out about new versions of Cypress?
+### How can I find out about new versions of Cypress?
We publish our releases at GitHub and npm, together with the releases we also
publish a changelog with the principal changes, fixes, and updates. You can
@@ -176,20 +176,20 @@ follow through these links:
- [npm (Releases)](https://www.npmjs.com/package/cypress)
- [Changelog](/app/references/changelog)
-#### How often are Cypress versions released?
+### How often are Cypress versions released?
We try to release the Cypress App every two weeks.
If there is a significant bug outside of our release schedule then we release a
patch as soon as possible.
-#### What information is captured or transmitted when using the Cypress App?
+### What information is captured or transmitted when using the Cypress App?
The Cypress App runs locally so no data is sent to Cypress aside from exception data,
which can be disabled using the instructions
[here](/app/references/advanced-installation#Opt-out-of-sending-exception-data-to-Cypress).
-#### Can I write API tests using Cypress?
+### Can I write API tests using Cypress?
Cypress is mainly designed to run end-to-end and component tests, but if you
need to write a few tests that call the backend API using the
@@ -243,7 +243,7 @@ the
## "How-to" Cypress Questions
-#### How do I get an element's text contents?
+### How do I get an element's text contents?
Cypress commands yield jQuery objects, so you can call methods on them.
@@ -325,7 +325,7 @@ cy.get('div').should(($div) => {
This is the equivalent of Selenium's `getText()` method, which returns the
innerText of a visible element.
-#### How do I get an input's value?
+### How do I get an input's value?
Cypress yields you jQuery objects, so you can call methods on them.
@@ -369,12 +369,12 @@ cy.get('input')
})
```
-#### How do I compare the value or state of one thing to another?
+### How do I compare the value or state of one thing to another?
Our [Variables and Aliases guide](/app/core-concepts/variables-and-aliases)
gives you examples of doing exactly that.
-#### Can I store an attribute's value in a constant or a variable for later use?
+### Can I store an attribute's value in a constant or a variable for later use?
Yes, and there are a couple of ways to do this. One way to hold a value or
reference is with
@@ -386,7 +386,7 @@ change state).
For examples how to do this, please read our
[Variables and Aliases guide](/app/core-concepts/variables-and-aliases).
-#### How do I get the native DOM reference of an element found using Cypress?
+### How do I get the native DOM reference of an element found using Cypress?
Cypress wraps elements in jQuery so you'd get the native element from there
within a [.then()](/api/commands/then) command.
@@ -397,7 +397,7 @@ cy.get('button').then(($el) => {
})
```
-#### How do I do something different if an element doesn't exist?
+### How do I do something different if an element doesn't exist?
What you're asking about is conditional testing and control flow.
@@ -405,7 +405,7 @@ Please read our extensive
[Conditional Testing Guide](/app/guides/conditional-testing) which
explains this in detail.
-#### How can I make Cypress wait until something is visible in the DOM?
+### How can I make Cypress wait until something is visible in the DOM?
:::info
@@ -437,7 +437,7 @@ you can pass to most action commands.
This is the single most important guide for understanding how to test with
Cypress.
-#### How do I wait for my application to load?
+### How do I wait for my application to load?
We have seen many different iterations of this question. The answers can be
varied depending on how your application behaves and the circumstances under
@@ -474,7 +474,7 @@ asynchronous nature of these requests, Cypress cannot intuitively know to wait
for them. You must define these routes and be able to unambiguously tell Cypress
which requests you want to wait on.
-#### Can I throttle network speeds using Cypress?
+### Can I throttle network speeds using Cypress?
You can throttle your network connection by accessing your Developer Tools
Network panel. Additionally, you can add your own custom presets by selecting
@@ -482,7 +482,7 @@ Network panel. Additionally, you can add your own custom presets by selecting
We do not currently offer any options to simulate this during `cypress run`.
-#### Can I use ES7 async / await syntax?
+### Can I use ES7 async / await syntax?
No. The Command API is not designed in a way that makes this possible currently. To understand how Cypress commands work, please read:
@@ -492,12 +492,12 @@ No. The Command API is not designed in a way that makes this possible currently.
- Our [Variables and Aliases guide](/app/core-concepts/variables-and-aliases)
which talks about patterns dealing with async code
-#### How do I select or query for elements if my application uses dynamic classes or dynamic IDs?
+### How do I select or query for elements if my application uses dynamic classes or dynamic IDs?
Read more about the
[best practices for selecting elements here](/app/core-concepts/best-practices#Selecting-Elements).
-#### I want to run tests only within one specific folder. How do I do this?
+### I want to run tests only within one specific folder. How do I do this?
You can specify which test files to run during
[cypress run](/app/references/command-line#cypress-run) by
@@ -508,12 +508,12 @@ the specific folder where the tests are you want to run.
This feature is only available when using
[cypress run](/app/references/command-line#cypress-run).
-#### Is there a suggested way or best practice for how I should target elements or write element selectors?
+### Is there a suggested way or best practice for how I should target elements or write element selectors?
Yes. Read more about the
[best practices for selecting elements here](/app/core-concepts/best-practices#Selecting-Elements).
-#### Can I prevent Cypress from failing my test when my application throws an uncaught exception error?
+### Can I prevent Cypress from failing my test when my application throws an uncaught exception error?
Yes. By default Cypress will automatically fail tests whenever an uncaught exception
bubbles up out of your app.
@@ -528,7 +528,7 @@ This is documented in detail on the
[Catalog Of Events](/api/cypress-api/catalog-of-events) page and the recipe
[Handling errors](/app/references/recipes#Fundamentals).
-#### Will Cypress fail the test when an application has unhandled rejected promise?
+### Will Cypress fail the test when an application has unhandled rejected promise?
By default no, Cypress does not listen to the unhandled promise rejection event
in your application, and thus does not fail the test. You can set up your own
@@ -581,14 +581,14 @@ it('fails on unhandled rejection', () => {
})
```
-#### Can I override environment variables or create configuration for different environments?
+### Can I override environment variables or create configuration for different environments?
Yes, you can pass configuration to Cypress via environment variables, CLI
arguments, JSON files and other means.
[Read the Environment Variables guide.](/app/references/environment-variables)
-#### Can I override or change the default user agent the browser uses?
+### Can I override or change the default user agent the browser uses?
Yes.
@@ -601,7 +601,7 @@ Yes.
in the options, but this will not propagate the `userAgent` in the browser and
can lead to application rendering unexpectedly.
-#### Can I block traffic going to specific domains? I want to block Google Analytics or other providers.
+### Can I block traffic going to specific domains? I want to block Google Analytics or other providers.
Yes.
[You can set this with `blockHosts` in the Cypress configuration](/app/references/configuration#Browser).
@@ -609,28 +609,28 @@ Yes.
Also, check out our
[Stubbing Google Analytics Recipe](/app/references/recipes#Stubbing-and-spying).
-#### How can I verify that calls to analytics like Google Analytics are being made correct?
+### How can I verify that calls to analytics like Google Analytics are being made correct?
You can stub their functions and then ensure they're being called.
Check out our
[Stubbing Google Analytics Recipe](/app/references/recipes#Stubbing-and-spying).
-#### I'm trying to test a chat application. Can I run more than one browser at a time with Cypress?
+### I'm trying to test a chat application. Can I run more than one browser at a time with Cypress?
[We've answered this question in detail here.](/app/references/trade-offs#Multiple-browsers-open-at-the-same-time)
-#### How can I modify or pass arguments used to launch the browser?
+### How can I modify or pass arguments used to launch the browser?
You use the [`before:browser:launch`](/api/node-events/browser-launch-api) plugin
event.
-#### Can I make cy.request() poll until a condition is met?
+### Can I make cy.request() poll until a condition is met?
Yes. You do it the
[same way as any other recursive loop](/api/commands/request#Request-Polling).
-#### Can I use the Page Object pattern?
+### Can I use the Page Object pattern?
Yes.
@@ -643,7 +643,7 @@ For those wanting to use page objects, we've highlighted the
[best practices ](/api/cypress-api/custom-commands#Best-Practices) for
replicating the page object pattern.
-#### Can I run a single test or group of tests?
+### Can I run a single test or group of tests?
You can run a group of tests or a single test by placing an
[`.only`](/app/core-concepts/writing-and-organizing-tests#Excluding-and-Including-Tests)
@@ -652,7 +652,7 @@ on a test suite or specific test.
You can run a single test file or group of tests by passing the `--spec` flag to
[cypress run](/app/references/command-line#cypress-run).
-#### How do I test uploading a file?
+### How do I test uploading a file?
It is possible to upload files in your application but it's different based on
how you've written your own upload code. The various options are detailed in the
@@ -663,7 +663,7 @@ simplest option will work:
cy.get('[data-cy="file-input"]').selectFile('cypress/fixtures/data.json')
```
-#### How do I check that an email was sent out?
+### How do I check that an email was sent out?
:::caution
@@ -700,7 +700,7 @@ email's functionality and visual style:
for testing. Some of these services even offer a
Cypress plugin to access emails.
-#### How do I wait for multiple requests to the same url?
+### How do I wait for multiple requests to the same url?
You should set up an alias (using [`.as()`](/api/commands/as)) to a single
[`cy.intercept()`](/api/commands/intercept) that matches all of the XHRs. You
@@ -716,7 +716,7 @@ cy.wait('@getUsers') // Wait for second GET to /users/
cy.get('#list>li').should('have.length', 20)
```
-#### How do I seed / reset my database?
+### How do I seed / reset my database?
You can use [`cy.request()`](/api/commands/request),
[`cy.exec()`](/api/commands/exec), or [`cy.task()`](/api/commands/task) to talk
@@ -726,12 +726,12 @@ You could also stub requests directly using
[`cy.intercept()`](/api/commands/intercept) which avoids ever even needing to
fuss with your database.
-#### How do I test elements inside an iframe?
+### How do I test elements inside an iframe?
We have an [open proposal](https://github.com/cypress-io/cypress/issues/136) to
expand the APIs to support "switching into" an iframe and then back out of them.
-#### How do I preserve cookies / localStorage in between my tests?
+### How do I preserve cookies / localStorage in between my tests?
By default, Cypress automatically
[clears all cookies, local storage and session **before** each test](/app/core-concepts/test-isolation)
@@ -744,7 +744,7 @@ Alternatively, you can disable
[`testIsolation`](/app/references/configuration#e2e) at the suite or e2e
configuration-level to prevent the clearing of browser state.
-#### Some of my elements animate in; how do I work around that?
+### Some of my elements animate in; how do I work around that?
Oftentimes you can usually account for animation by asserting
[`.should('be.visible')`](/api/commands/should) or
@@ -776,7 +776,7 @@ not? Cypress will
elements to stop animating prior to interacting with them via action commands
like `.click()` or `.type()`.
-#### Can I test anchor links that open in a new tab?
+### Can I test anchor links that open in a new tab?
Cypress does not have native multi-tab support, but new tabs can be tested with the [@cypress/puppeteer plugin](https://github.com/cypress-io/cypress/blob/develop/npm/puppeteer/README.md).
@@ -784,11 +784,11 @@ If you would like to test anchor links natively, there are lots of workarounds t
[Read through the recipe on tab handling and links to see how to test anchor links.](/app/references/recipes#Testing-the-DOM)
-#### Can I dynamically test multiple viewports?
+### Can I dynamically test multiple viewports?
Yes, you can. We provide an [example here](/api/commands/viewport#Width-Height).
-#### Can I run the same tests on multiple subdomains?
+### Can I run the same tests on multiple subdomains?
Yes. In this example, we loop through an array of urls and make assertions on
the logo.
@@ -811,7 +811,7 @@ describe('Logo', () => {
alt="Command Log multiple urls"
/>
-#### How do I require or import node modules in Cypress?
+### How do I require or import node modules in Cypress?
The code you write in Cypress is executed in the browser, so you can import or
require JS modules, _but_ only those that work in a browser.
@@ -828,12 +828,12 @@ browser.
[Check out the "Node Modules" example recipe.](/app/references/recipes#Fundamentals)
-#### Is there a way to give a proper SSL certificate to your proxy so the page doesn't show up as "not secure"?
+### Is there a way to give a proper SSL certificate to your proxy so the page doesn't show up as "not secure"?
No, Cypress modifies network traffic in real time and therefore must sit between
your server and the browser. There is no other way for us to achieve that.
-#### Is there any way to detect if my app is running under Cypress?
+### Is there any way to detect if my app is running under Cypress?
You can check for the existence of `window.Cypress`, in your **application
code**.
@@ -854,7 +854,7 @@ If you want to detect if your Node.js code is running within Cypress, Cypress
sets an OS level environment variable of `CYPRESS=true`. You could detect that
you're running in Cypress by looking for `process.env.CYPRESS`.
-#### Is there a way to test that a file got downloaded? I want to test that a button click triggers a download.
+### Is there a way to test that a file got downloaded? I want to test that a button click triggers a download.
There are a lot of ways to test this, so it depends. You'll need to be aware of
what actually causes the download, then think of a way to test that mechanism.
@@ -876,12 +876,12 @@ recipe.
In the end, it's up to you to know your implementation and to test enough to
cover everything.
-#### Is it possible to catch the promise chain in Cypress?
+### Is it possible to catch the promise chain in Cypress?
No. You cannot add a `.catch` error handler to a failed command.
[Read more about how the Cypress commands are not Promises](/app/core-concepts/introduction-to-cypress#The-Cypress-Command-Queue)
-#### Is there a way to modify the screenshots/video resolution?
+### Is there a way to modify the screenshots/video resolution?
There is an [open issue](https://github.com/cypress-io/cypress/issues/587) for
more easily configuring this.
@@ -889,14 +889,14 @@ more easily configuring this.
You can modify the screenshot and video size when running headlessly with
[this workaround](/api/node-events/browser-launch-api#Set-screen-size-when-running-headless).
-#### Does Cypress support ES7?
+### Does Cypress support ES7?
Yes. You can customize how specs are processed by using one of our [preprocessor plugins](/app/plugins/plugins-list)
or by [writing your own custom preprocessor](/api/node-events/preprocessors-api).
Typically you'd reuse your existing Babel and webpack configurations.
-#### How does one determine what the latest version of Cypress is?
+### How does one determine what the latest version of Cypress is?
There are a few ways.
@@ -906,7 +906,7 @@ There are a few ways.
[here](https://download.cypress.io/desktop.json).
- It's also always in our [repo](https://github.com/cypress-io/cypress).
-#### When I visit my site directly, the certificate is verified, however the browser launched through Cypress is showing it as "Not Secure". Why?
+### When I visit my site directly, the certificate is verified, however the browser launched through Cypress is showing it as "Not Secure". Why?
When using Cypress to test an HTTPS site, you might see a browser warning next
to the browser URL. This is normal. Cypress modifies the traffic between your
@@ -918,12 +918,12 @@ HTTPS.
See also the [Cross Origin Testing](/app/guides/cross-origin-testing) guide.
-#### How do I run the server and tests together and then shutdown the server?
+### How do I run the server and tests together and then shutdown the server?
To start the server, run the tests and then shutdown the server we recommend
[these npm tools](/app/continuous-integration/overview#Boot-your-server).
-#### I found a bug! What do I do?
+### I found a bug! What do I do?
- Search existing [open issues](https://github.com/cypress-io/cypress/issues),
it may already be reported!
@@ -933,7 +933,7 @@ To start the server, run the tests and then shutdown the server we recommend
best chance of getting a bug looked at quickly is to provide a repository with
a reproducible bug that can be cloned and run.
-#### What is the right balance between custom commands and utility functions?
+### What is the right balance between custom commands and utility functions?
There is already a great section in
[Custom Commands](/api/cypress-api/custom-commands#Best-Practices) guide that
@@ -941,7 +941,7 @@ talks about trade-offs between custom commands and utility functions. We feel
reusable functions in general are a way to go. Plus they do not confuse
[IntelliSense like custom commands do](https://github.com/cypress-io/cypress/issues/1065).
-#### Can my tests interact with Redux / Vuex data store?
+### Can my tests interact with Redux / Vuex data store?
Usually your end-to-end tests interact with the application through public
browser APIs: DOM, network, storage, etc. But sometimes you might want to make
@@ -962,7 +962,7 @@ providers and plugins for state stores. See the
[Mount API Guide](/api/commands/mount) for various examples on using stores with
component testing.
-#### How do I spy on console.log?
+### How do I spy on console.log?
To spy on `console.log` you should use [cy.stub()](/api/commands/stub).
@@ -989,7 +989,7 @@ cy.get('@consoleLog').should('be.calledWith', 'Hello World!')
Also, check out our
[Stubbing `console` Recipe](/app/references/recipes#Stubbing-and-spying).
-#### How do I use special characters with `cy.get()`?
+### How do I use special characters with `cy.get()`?
Special characters like `/`, `.` are valid characters for ids
[according to the CSS spec](https://www.w3.org/TR/html50/dom.html#the-id-attribute).
@@ -1023,13 +1023,13 @@ it('test', () => {
Note that `cy.$$.escapeSelector()` doesn't work. `cy.$$` doesn't refer to
`jQuery`. It only queries DOM. [Learn more about why](/api/utilities/$#Notes)
-#### Why doesn't the `instanceof Event` work?
+### Why doesn't the `instanceof Event` work?
It might be because of the 2 different windows in the Cypress App. For
more information, please check
[the note here](/api/commands/window#Cypress-uses-2-different-windows).
-#### How do I prevent application redirecting to another URL?
+### How do I prevent application redirecting to another URL?
Sometimes, your application might redirect the browser to another domain, losing
the Cypress's control. If the application is using `window.location.replace`
@@ -1038,7 +1038,7 @@ option described in our [Experiments](/app/references/experiments) page.
## Continuous Integration (CI/CD)
-#### Why do my Cypress tests pass locally but not in CI?
+### Why do my Cypress tests pass locally but not in CI?
There are many reasons why tests may fail in CI but pass locally. Some of these
include:
@@ -1068,7 +1068,7 @@ these strategies:
- Ensure video recording and/or screenshots are enabled for the CI run and
compare the recording to the Command Log when running the test locally.
-#### Why are my video recordings freezing or dropping frames when running in CI?
+### Why are my video recordings freezing or dropping frames when running in CI?
Videos recorded on Continuous Integration may have frozen or dropped frames if
there are not enough resources available when running the tests in your CI
@@ -1080,7 +1080,7 @@ to identify and evaluate the resource utilization within your CI.
If you are experiencing this issue, we recommend switching to a more powerful CI
container or provider.
-#### What can I do if my tests crash or hang on CI?
+### What can I do if my tests crash or hang on CI?
As some users have noted, a longer test has a higher chance of hanging or even
crashing when running on CI. When a test runs for a long period of time, its
@@ -1094,12 +1094,12 @@ You can further split individual long-running tests. For example, you can verify
parts of the longer user feature in the separate tests as described in
[Split a very long Cypress test into shorter ones using App Actions](https://www.cypress.io/blog/2019/10/29/split-a-very-long-cypress-test-into-shorter-ones-using-app-actions/).
-#### How can I parallelize my runs?
+### How can I parallelize my runs?
You can read more about parallelization
[here](/cloud/features/smart-orchestration/parallelization).
-#### I tried to install Cypress in my CI, but I get the error: `EACCES: permission denied`.
+### I tried to install Cypress in my CI, but I get the error: `EACCES: permission denied`.
First, make sure you have [Node](https://nodejs.org) installed on your system.
`npm` is a Node package that is installed globally by default when you install
@@ -1109,25 +1109,25 @@ Node and is required to install our
Next, you'd want to check that you have the proper permissions for installing on
your system or you may need to run `sudo npm install cypress`.
-#### Is there an option to run Cypress in CI with Developer Tools open? We want to track network and console issues.
+### Is there an option to run Cypress in CI with Developer Tools open? We want to track network and console issues.
No. There is not currently a way to run Cypress in `cypress run` with Developer
Tools open. You can use Cypress [Test Replay](/cloud/features/test-replay) to see browser requests and console logs of tests that ran in CI.
## Distinct Cypress Use Cases
-#### Can I use Cypress to test charts and graphs?
+### Can I use Cypress to test charts and graphs?
Yes. You can leverage visual testing tools to test that charts and graphs are
rendering as expected. For more information, check out the
[Visual Testing guide](/app/tooling/visual-testing).
-#### Can I test a chrome extension? How do I load my chrome extension?
+### Can I test a chrome extension? How do I load my chrome extension?
Yes. You can test your extensions by
[loading them when we launch the browser](/api/node-events/browser-launch-api).
-#### Can I test my Electron app?
+### Can I test my Electron app?
Testing your Electron app will not 'just work', as Cypress is designed to test
anything that runs in a browser and Electron is a browser + Node.
@@ -1137,7 +1137,7 @@ stubbing events from Electron. These tests are open source so you can check them
out
[here](https://github.com/cypress-io/cypress/tree/develop/packages/launchpad/cypress/e2e).
-#### Can I test the HTML `` element?
+### Can I test the HTML `` element?
Yes, you can. While executing tests, you can view the entire
`window.document` object in your open console using
@@ -1187,7 +1187,7 @@ describe('The Document Metadata', () => {
})
```
-#### Can I check that a form's HTML form validation is shown when an input is invalid?
+### Can I check that a form's HTML form validation is shown when an input is invalid?
You certainly can.
@@ -1240,12 +1240,12 @@ cy.get('[type="email"]').then(($input) => {
})
```
-#### Can Cypress be used for model-based testing?
+### Can Cypress be used for model-based testing?
is implemented using XState
model state library.
-#### Can Cypress be used for performance testing?
+### Can Cypress be used for performance testing?
Cypress is not built for performance testing. Because Cypress instruments the
page under test, proxies the network requests, and tightly controls the test
@@ -1260,7 +1260,7 @@ plugin.
## Integrations with Other Tools/Frameworks/Libraries
-#### Can I test Gatsby.js sites using Cypress?
+### Can I test Gatsby.js sites using Cypress?
For end-to-end tests, yes, as you can read in the official
[Gatsby docs](https://www.gatsbyjs.com/docs/end-to-end-testing/). You can also
@@ -1271,7 +1271,7 @@ For component testing, Gatsby is not currently supported out of the box, but it
might be possible by
[configuring a custom devServer](/app/references/configuration#devServer).
-#### Can I test React applications using Cypress?
+### Can I test React applications using Cypress?
For end-to-end testing, yes, absolutely. A good example of a fully tested React
application is our
@@ -1287,7 +1287,7 @@ App, Vite, and Next.js for React applications. See the
[Framework Configuration Guide](/app/component-testing/component-framework-configuration)
for more info.
-#### Can I use Jest snapshots?
+### Can I use Jest snapshots?
While there is no built-in `snapshot` command in Cypress, you can make your own
snapshot assertion command. Read how to do so in our blog post
@@ -1296,7 +1296,7 @@ We recommend using the 3rd-party module
[cypress-plugin-snapshots](https://github.com/meinaart/cypress-plugin-snapshots).
For other snapshot plugins, search the [Plugins](/app/plugins/plugins-list) page.
-#### Can I use Testing Library?
+### Can I use Testing Library?
Absolutely! Feel free to add the
[@testing-library/cypress](https://testing-library.com/docs/cypress-testing-library/intro/)
@@ -1324,7 +1324,7 @@ cy.findByRole('dialog').within(() => {
})
```
-#### Can I use Cucumber to write tests?
+### Can I use Cucumber to write tests?
Yes, you can.
@@ -1353,12 +1353,12 @@ scenarios, you might be interested in these articles:
[BDD without Cucumber](https://filiphric.com/how-to-structure-a-big-project-in-cypress#bdd-without-cucumber)
for recommendations for writing tests without using Cucumber.
-#### Can I check the GraphQL network calls using Cypress?
+### Can I check the GraphQL network calls using Cypress?
Yes, by using the newer API command [cy.intercept()](/api/commands/intercept) as
described in the [Working with GraphQL](/app/guides/network-requests#Working-with-GraphQL)
-#### Is there an ESLint plugin for Cypress or a list of globals?
+### Is there an ESLint plugin for Cypress or a list of globals?
Yes! Check out our
[ESLint plugin](https://github.com/cypress-io/eslint-plugin-cypress). It will
@@ -1367,7 +1367,7 @@ and [Mocha](https://mochajs.org/) globals.
## Component Testing
-#### What is component testing?
+### What is component testing?
Many modern front-end UI libraries encourage writing applications using small,
reusable building blocks known as components. Components start small (think
@@ -1378,7 +1378,7 @@ Component testing is about testing an individual component in isolation from the
rest of the app. This allows only having to worry about the component's
functionality and not how it fits into an entire page.
-#### How does Cypress do component testing?
+### How does Cypress do component testing?
Cypress will take a component and mount it into a blank canvas. When doing so,
you have direct access to the component's API, making it easier to pass in props
@@ -1388,7 +1388,7 @@ Cypress commands, selectors, and assertions to write your tests.
Cypress supports multiple frameworks and development servers for component
testing.
-#### How does Cypress component testing compare to other options?
+### How does Cypress component testing compare to other options?
When Cypress mounts a component, it does so in an actual browser and not a
simulated environment like jsdom. This allows you to visually see and interact
@@ -1403,7 +1403,7 @@ Component tests can also use the vast Cypress ecosystem, plugins, and services
(like [Cypress Cloud](https://www.cypress.io/cloud)) already available to
complement your component tests.
-#### What is the Mount Function?
+### What is the Mount Function?
We ship a `mount` function for each UI library that is imported from the
`cypress` package. It is responsible for rendering components within Cypress's
@@ -1430,26 +1430,26 @@ This allows you to use `cy.mount()` in any component test without having to
your needs. See the examples guide for each framework for info on creating a
custom `cy.mount()` command.
-#### Why isn't my component rendering as it should?
+### Why isn't my component rendering as it should?
Any global styles and fonts must be imported and made available to your
component, just like in the application. See our guide on
[Styling Components](/app/component-testing/styling-components) for more
information on doing so.
-#### Why doesn't my spec show in the Specs page?
+### Why doesn't my spec show in the Specs page?
If something appears missing from the spec list, make sure the files have the
[proper extension and the `specPattern` is correctly defined](/app/component-testing/component-framework-configuration#Spec-Pattern-for-Component-Tests).
-#### How do I fix ESLint errors for things like using the global Cypress objects?
+### How do I fix ESLint errors for things like using the global Cypress objects?
If you experience ESLint errors in your code editor around Cypress globals,
install the
[`eslint-plugin-cypress`](https://www.npmjs.com/package/eslint-plugin-cypress)
ESLint plugin.
-#### Why isn't TypeScript recognizing the global Cypress objects or custom cypress commands (eg: `cy.mount`)?
+### Why isn't TypeScript recognizing the global Cypress objects or custom cypress commands (eg: `cy.mount`)?
In some instances, TypeScript might not recognize the custom `cy.mount()`
command in Cypress spec files not located in the **cypress** directory. You will
@@ -1473,7 +1473,7 @@ file in your **tsconfig.json** file. See our
[TypeScript Configuration](/app/tooling/typescript-support#Using-an-External-Typings-File)
guide for more info on doing this.
-#### How do I get TypeScript to recognize Cypress types and not Jest types?
+### How do I get TypeScript to recognize Cypress types and not Jest types?
For frameworks that include Jest out of the box (like Create React App), you
might run into issues where the Cypress global types for TypeScript conflict
diff --git a/docs/app/guides/authentication-testing/amazon-cognito-authentication.mdx b/docs/app/guides/authentication-testing/amazon-cognito-authentication.mdx
index de4fbf2ccd..5e85e454de 100644
--- a/docs/app/guides/authentication-testing/amazon-cognito-authentication.mdx
+++ b/docs/app/guides/authentication-testing/amazon-cognito-authentication.mdx
@@ -263,7 +263,10 @@ describe('Cognito, cy.origin() login', function () {
})
```
-
+
Now, we can refactor our login command to take advantage of
[`cy.session()`](/api/commands/session) to store our logged in user so we don't
@@ -291,7 +294,10 @@ Cypress.Commands.add(
)
```
-
+
### Programmatic Login
diff --git a/docs/app/guides/authentication-testing/auth0-authentication.mdx b/docs/app/guides/authentication-testing/auth0-authentication.mdx
index 5117c6927e..8d548d4a91 100644
--- a/docs/app/guides/authentication-testing/auth0-authentication.mdx
+++ b/docs/app/guides/authentication-testing/auth0-authentication.mdx
@@ -188,7 +188,10 @@ describe('Auth0', function () {
})
```
-
+
Lastly, we can refactor our login command to take advantage of
[`cy.session()`](/api/commands/session) to store our logged in user so we don't
@@ -224,7 +227,10 @@ Cypress.Commands.add('loginToAuth0', (username: string, password: string) => {
})
```
-
+
### Programmatic Login
diff --git a/docs/app/guides/authentication-testing/azure-active-directory-authentication.mdx b/docs/app/guides/authentication-testing/azure-active-directory-authentication.mdx
index 6ce292b25a..04e716cbf4 100644
--- a/docs/app/guides/authentication-testing/azure-active-directory-authentication.mdx
+++ b/docs/app/guides/authentication-testing/azure-active-directory-authentication.mdx
@@ -187,7 +187,10 @@ describe('Azure Active Directory Authentication', () => {
})
```
-
+
We now have working authentication and tests! But we are logging in before every
test, which is not only time consuming, but also can lead to API rate limiting
@@ -231,7 +234,10 @@ Cypress.Commands.add('loginToAAD', (username: string, password: string) => {
})
```
-
+
With the use of [`cy.session()`](/api/commands/session), our tests should now
run quicker!
diff --git a/docs/app/guides/authentication-testing/okta-authentication.mdx b/docs/app/guides/authentication-testing/okta-authentication.mdx
index 916fc53a9c..9d352b2d11 100644
--- a/docs/app/guides/authentication-testing/okta-authentication.mdx
+++ b/docs/app/guides/authentication-testing/okta-authentication.mdx
@@ -128,7 +128,10 @@ describe('Okta', function () {
})
```
-
+
Lastly, we can refactor our login command to take advantage of
[`cy.session()`](/api/commands/session) to store our logged in user so we don't
@@ -151,7 +154,10 @@ Cypress.Commands.add('loginByOkta', (username: string, password: string) => {
})
```
-
+
### Programmatic Login
diff --git a/docs/app/guides/authentication-testing/social-authentication.mdx b/docs/app/guides/authentication-testing/social-authentication.mdx
index 9b149866d9..6cc400d628 100644
--- a/docs/app/guides/authentication-testing/social-authentication.mdx
+++ b/docs/app/guides/authentication-testing/social-authentication.mdx
@@ -84,7 +84,10 @@ Select the dropdown and go to **Applications**.
Here is what this process should look like for Facebook setup:
-
+
## Test with Cypress
@@ -323,7 +326,10 @@ describe('Social Logins Demo', () => {
Here's a sample of what all 3 should look like in order.
-
+
Lastly, we can refactor our login command to take advantage of
[`cy.session()`](/api/commands/session) to store our logged in user so we don't
@@ -407,7 +413,10 @@ Cypress.Commands.add(
)
```
-
+
With the use of [`cy.session()`](/api/commands/session), our tests should now
run quicker!
diff --git a/docs/app/guides/cross-origin-testing.mdx b/docs/app/guides/cross-origin-testing.mdx
index 33cbbe3384..aa4e7d5e0f 100644
--- a/docs/app/guides/cross-origin-testing.mdx
+++ b/docs/app/guides/cross-origin-testing.mdx
@@ -131,7 +131,10 @@ same superdomain.
We understand this is a bit complicated to understand, so we have built a nifty
chart to help clarify the differences!
-
+
Given the URLs below, all have the same superdomain compared to
`https://www.cypress.io`.
diff --git a/docs/app/guides/test-retries.mdx b/docs/app/guides/test-retries.mdx
index 004898de03..2f0e2925d6 100644
--- a/docs/app/guides/test-retries.mdx
+++ b/docs/app/guides/test-retries.mdx
@@ -85,12 +85,18 @@ Assuming we have configured test retries with **2** retry attempts (for a total
5. If the test fails a third time, Cypress
will mark the test as failed and then move on to run any remaining tests.
-
+
The following is a screen capture of what test retries looks like on the same
failed test when run via [cypress run](/app/references/command-line#cypress-run).
-
+
During [cypress open](/app/references/command-line#cypress-open) you'll be able
to see the number of attempts made in the
diff --git a/docs/app/references/changelog.mdx b/docs/app/references/changelog.mdx
index c8786113e5..d44fbb8057 100644
--- a/docs/app/references/changelog.mdx
+++ b/docs/app/references/changelog.mdx
@@ -6393,7 +6393,7 @@ _Released 7/21/2020_
**Features:**
- You can now pass an `ensureScrollability: false` option to
- [.scrollTo()](/api/commands/scrollTo) to skip checking whether the element is
+ [.scrollTo()](/api/commands/scrollto) to skip checking whether the element is
scrollable. Addresses
[#1924](https://github.com/cypress-io/cypress/issues/1924).
- [cy.clock()](/api/commands/clock) now accepts Dates as well as a Number for
@@ -10372,7 +10372,7 @@ _Released 5/29/2018_
[#1753](https://github.com/cypress-io/cypress/issues/1753).
- The type definition for [`.filter()`](/api/commands/filter) now correctly
supports a function argument.
-- The type definition for [`.scrollIntoView()`](/api/commands/scrollIntoView) no
+- The type definition for [`.scrollIntoView()`](/api/commands/scrollintoview) no
longer errors when passed a `duration` option. Fixes
[#1606](https://github.com/cypress-io/cypress/issues/1606).
- `NODE_OPTIONS` environment variables now print within the `cypress:cli` logs
@@ -11376,11 +11376,11 @@ _Released 09/10/2017_
- New [.trigger()](/api/commands/trigger) command. Useful for triggering
arbitrary events. Fixes
[#406](https://github.com/cypress-io/cypress/issues/406).
-- New [cy.scrollTo()](/api/commands/scrollTo) command. Useful for having a
+- New [cy.scrollTo()](/api/commands/scrollto) command. Useful for having a
container scroll to a specific position. Fixes
[#497](https://github.com/cypress-io/cypress/issues/497) &
[#313](https://github.com/cypress-io/cypress/issues/313).
-- New [.scrollIntoView()](/api/commands/scrollIntoView) command. Useful for
+- New [.scrollIntoView()](/api/commands/scrollintoview) command. Useful for
scrolling an element into view. Fixes
[#498](https://github.com/cypress-io/cypress/issues/498) &
[#313](https://github.com/cypress-io/cypress/issues/313) &
@@ -11657,8 +11657,8 @@ Note: we are still updating all of the docs to reflect all the 0.20.0 changes.
- [New "Cypress.Commands"](/api/cypress-api/custom-commands)
- [New "Cypress.log"](/api/cypress-api/cypress-log)
- [New ".trigger()"](/api/commands/trigger)
-- [New "cy.scrollTo()"](/api/commands/scrollTo)
-- [New ".scrollIntoView()"](/api/commands/scrollIntoView)
+- [New "cy.scrollTo()"](/api/commands/scrollto)
+- [New ".scrollIntoView()"](/api/commands/scrollintoview)
- [Updated "Installing Cypress"](/app/get-started/install-cypress)
- [Updated "Writing Your First Test"](/app/end-to-end-testing/writing-your-first-end-to-end-test)
- [Updated "Testing Your App"](/app/end-to-end-testing/testing-your-app)
diff --git a/docs/app/references/migration-guide.mdx b/docs/app/references/migration-guide.mdx
index 0e38a9b0e0..03be597ce9 100644
--- a/docs/app/references/migration-guide.mdx
+++ b/docs/app/references/migration-guide.mdx
@@ -829,7 +829,10 @@ This guide details the changes and how to change your code to migrate to Cypress
version 10.0.
[See the full changelog for version 10.0](/app/references/changelog#10-0-0).
-
+
### Cypress Changes
diff --git a/docs/app/references/recipes.mdx b/docs/app/references/recipes.mdx
index 62478bd19c..e639d57cea 100644
--- a/docs/app/references/recipes.mdx
+++ b/docs/app/references/recipes.mdx
@@ -64,7 +64,7 @@ Recipes show you how to test common scenarios in Cypress.
| [Json Web Tokens](https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/logging-in__jwt) | Log in using JWT |
| [Using application code](https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/logging-in__using-app-code) | Log in by calling the application code |
-Also see Authentication plugins and watch
+Also see [Authentication plugins](/app/plugins/plugins-list) and watch
[Organizing Tests, Logging In, Controlling State](https://www.youtube.com/watch?v=5XQOK0v_YRE)
## Preprocessors
diff --git a/docs/app/tooling/code-coverage.mdx b/docs/app/tooling/code-coverage.mdx
index 506b957cfe..d224308f71 100644
--- a/docs/app/tooling/code-coverage.mdx
+++ b/docs/app/tooling/code-coverage.mdx
@@ -59,7 +59,10 @@ please see our [UI Coverage](/ui-coverage/get-started/introduction) guide.
## Instrumenting code
-
+
Instrumentation takes code that looks like this...
@@ -697,31 +700,52 @@ There is a series of videos we have recorded showing code coverage in Cypress
#### How to instrument react-scripts web application for code coverage
-
+
#### Get code coverage reports from Cypress tests
-
+
#### Excluding code from code coverage reports
-
+
#### Check code coverage robustly using 3rd party tool
-
+
#### Adding code coverage badge to your project
-
+
#### Show code coverage in commit status check
-
+
#### Checking code coverage on pull request
-
+
## Examples
diff --git a/docs/app/tooling/visual-testing.mdx b/docs/app/tooling/visual-testing.mdx
index a0dceea9af..d2033dc1e5 100644
--- a/docs/app/tooling/visual-testing.mdx
+++ b/docs/app/tooling/visual-testing.mdx
@@ -122,12 +122,18 @@ below.
See [Applitools' official docs](https://applitools.com/cypress) and our [tutorial](https://applitools.com/tutorials/cypress.html).
-
+
Second joint webinar with Applitools with a focus on
[Component Testing](/app/core-concepts/testing-types#What-is-Component-Testing)
-
+
### Percy
@@ -146,13 +152,19 @@ to see these Percy and Cypress in action.
:::
-
+
### Happo
See [Happo's official docs](https://docs.happo.io/docs/cypress) and our [webinar](https://www.youtube.com/watch?v=C_p12IvN5HU) and [blog](https://www.cypress.io/blog/2020/05/27/webcast-recording-keep-your-ui-sharp/).
-
+
### Chromatic
@@ -287,7 +299,7 @@ tests.
- [cy.screenshot()](/api/commands/screenshot)
- [Cypress.Screenshot](/api/cypress-api/screenshot-api)
- [Plugins](/app/plugins/plugins-guide)
-- Visual Testing Plugins
+- [Visual Testing Plugins](/app/plugins/plugins-list)
- [Node Events Overview](/api/node-events/overview)
- is a full stack example application that
demonstrates **best practices and scalable strategies with Cypress in practical
diff --git a/docs/cloud/account-management/billing-and-usage.mdx b/docs/cloud/account-management/billing-and-usage.mdx
index 8ad6e40b00..66ff1631af 100644
--- a/docs/cloud/account-management/billing-and-usage.mdx
+++ b/docs/cloud/account-management/billing-and-usage.mdx
@@ -1,8 +1,23 @@
---
-title: Billing & Usage
+title: 'Billing & Usage | Cypress Cloud'
+description: 'See how many tests you recorded in Cypress, billing plans, pricing, and when your plan renews'
+sidebar_label: Billing & Usage
sidebar_position: 50
---
+:::info
+
+##### What you'll learn
+
+- How to view billing and usage information
+- How to request an Open Source Plan
+
+:::
+
+Billing and usage information can be found in the Cypress Cloud under the
+**Billing & Usage** section. Here you can view your current plan, usage, and
+billing information.
+
What you'll learn
+
+- What data is stored in Cypress Cloud
+- How to control what data is sent to Cypress Cloud
+- How to mask data in screenshots and videos
+- How to control what is shown in the Cypress Command Log and network requests
+
+:::
+
:::caution
Please refer to the [Cypress Cloud Terms of Use](https://cloud.cypress.io/terms-of-use) and our [Security & Compliance](https://www.cypress.io/security/) guide for more specifics around reasonable use of Cypress Cloud, data storage and security at Cypress.
@@ -143,7 +156,10 @@ before(() => {
Users can mask passwords in the Cypress Command Log by using a custom command like the code below. [See our guide on masking the contents of the `.type()` command.](/api/cypress-api/custom-commands#Overwrite-type-command)
-
+
### Network requests controls
diff --git a/docs/cloud/account-management/enterprise-sso.mdx b/docs/cloud/account-management/enterprise-sso.mdx
index 2041a630ea..11700bea1e 100644
--- a/docs/cloud/account-management/enterprise-sso.mdx
+++ b/docs/cloud/account-management/enterprise-sso.mdx
@@ -1,30 +1,31 @@
---
-title: Enterprise SSO
+title: 'Enterprise SSO | Cypress Cloud'
+description: 'Configure SSO with Okta, SAML, or Azure AD in Cypress for your Cloud organization.'
+sidebar_label: Enterprise SSO
sidebar_position: 40
---
-:::tip
+# Enterprise SSO
- **Premium Cypress Cloud Feature**
+:::info
-Enterprise SSO is included in our
-[Business and Enterprise paid pricing plans](https://www.cypress.io/pricing).
+##### What you'll learn
-:::
+- How to enable Enterprise SSO for your organization
+- How to configure SSO with Okta, SAML, or Azure AD
-:::caution
+:::
-Requires Owner Permissions
+## Getting Started
-**All instructions below must be done by an Owner of the organization.** If you
-are not an Owner of the Organization, coordinate with an Owner of the
-Organization to set up SSO.
+**You need two things to get started:**
-:::
+- A Cypress Cloud account with a [Business or Enterprise paid pricing plans](https://www.cypress.io/pricing)
+- You must be an **owner** of your Cypress Cloud organization.
-#### Enable SSO
+## Enable SSO
-1. Log in to Cypress Cloud and navigate to the **Integrations** page for your
+1. Log in to [Cypress Cloud](https://cloud.cypess.io) and navigate to the **Integrations** page for your
organization.
2. Scroll down to the **Enterprise SSO** section. Select your SSO provider and
take note of the information provided and required. Keep this window open and
@@ -32,7 +33,7 @@ Organization to set up SSO.
[configuration instructions for your specific SSO provider](#SSO-Provider-Configuration)
below.
-#### SSO Provider Configuration
+## SSO Provider Configuration
Follow the instructions below for your specific SSO provider.
@@ -41,7 +42,7 @@ Follow the instructions below for your specific SSO provider.
Smart Card Authentication
For Smart Card implementation, please reach out to
-[Support](mailto:support@cypress.io) for assistance.
+support at support@cypress.io for assistance.
:::
@@ -49,7 +50,7 @@ For Smart Card implementation, please reach out to
- [SAML](#SAML)
- [Azure AD](#Azure-AD)
-##### **Okta**
+### **Okta**
Cypress Cloud can integrate with Okta via SAML. In addition to the documentation
below, refer to
@@ -71,30 +72,22 @@ below, refer to
width={600}
/>
1. Supply the following information requested in the Okta setup wizard:
-
-- **App name:** `Cypress Cloud`
-- **App logo:** [Cypress logo download](https://on.cypress.io/logo)
-- **Single sign on URL:** The URL provided in Cypress Cloud
-- **Audience URI:** The URI provided in Cypress Cloud
-- **Attribute statements:** Add the attribute statements described in Cypress
- Cloud
-
+ - **App name:** `Cypress Cloud`
+ - **App logo:** [Cypress logo download](https://on.cypress.io/logo)
+ - **Single sign on URL:** The URL provided in Cypress Cloud
+ - **Audience URI:** The URI provided in Cypress Cloud
+ - **Attribute statements:** Add the attribute statements described in Cypress
+ Cloud
1. Click **Next** then select **I'm an Okta customer** and click **Finish**.
1. Click the **View Setup Instructions** button in the middle of the page.
Cypress Cloud needs the information provided here:
-
-- Copy the Identity Provider Single sign-on URL to Cypress Cloud.
-- Download the certificate and upload that to Cypress Cloud.
-
-
+ - Copy the Identity Provider Single sign-on URL to Cypress Cloud.
+ - Download the certificate and upload that to Cypress Cloud.
1. Navigate to the **Assignments** tab and grant your users access to Cypress
Cloud.
1. [Save Configuration](#Save-Configuration).
-##### **SAML**
+### **SAML**
Cypress Cloud can integrate with your identity provider via SAML. In addition to
the documentation below, refer to your provider's official documentation for
@@ -104,21 +97,19 @@ configuring a SAML integration.
1. Log into the admin interface for your identity provider.
1. Work through the setup wizard supplying the information requested:
-
-- **App name:** `Cypress Cloud`
-- **App logo:** [Cypress logo download](https://on.cypress.io/logo)
-- **Single sign on URL:** Collect the URL provided by Cypress Cloud
-- **Audience URI:** Collect the URI provided by Cypress Cloud
-- Add a custom mapping of **AttributeStatements** with the following:
- - `User.Email`: User's email
- - `User.FirstName`: User's first name
- - `User.LastName`: User's last name
-
+ - **App name:** `Cypress Cloud`
+ - **App logo:** [Cypress logo download](https://on.cypress.io/logo)
+ - **Single sign on URL:** Collect the URL provided by Cypress Cloud
+ - **Audience URI:** Collect the URI provided by Cypress Cloud
+ - Add a custom mapping of **AttributeStatements** with the following:
+ - `User.Email`: User's email
+ - `User.FirstName`: User's first name
+ - `User.LastName`: User's last name
1. Collect the sign-on URL and certificate from your identity provider. Supply
that to Cypress Cloud.
1. [Save Configuration](#Save-Configuration).
-##### **Azure AD**
+### **Azure AD**
Cypress Cloud can integrate with your identity provider via Azure AD. In
addition to the documentation below, refer to the Microsoft Guides for
@@ -127,11 +118,9 @@ addition to the documentation below, refer to the Microsoft Guides for
1. Log into the Azure portal and create a new Application.
1. Work through the application setup, supplying the following information when
requested:
-
-- **App name:** `Cypress Cloud`
-- **App logo:** [Cypress logo download](https://on.cypress.io/logo)
-- **Login URL:** Collect the URL provided by Cypress Cloud
-
+ - **App name:** `Cypress Cloud`
+ - **App logo:** [Cypress logo download](https://on.cypress.io/logo)
+ - **Login URL:** Collect the URL provided by Cypress Cloud
1. Collect the `Client ID` for your application provided in the Application
overview page.
1. Go to **Certificates and Secrets** in your Azure Application and create a new
@@ -144,7 +133,7 @@ addition to the documentation below, refer to the Microsoft Guides for
is used for SSO discovery from the login screen.
1. [Save Configuration](#Save-Configuration).
-#### Save Configuration
+## Save Configuration
Return to Cypress Cloud and click **Save Configuration**. Cypress Cloud will
attempt to authenticate.
@@ -152,7 +141,7 @@ attempt to authenticate.
🎉 Your integration is now complete! You can invite all of the users in your
organization to sign in through your SSO provider.
-#### Notes
+## Notes
- Once SSO is successfully set up, users will need to be invited via your SSO
provider, as the Cypress Cloud invitation option will be disabled.
diff --git a/docs/cloud/account-management/organizations.mdx b/docs/cloud/account-management/organizations.mdx
index c494326436..5f478959cd 100644
--- a/docs/cloud/account-management/organizations.mdx
+++ b/docs/cloud/account-management/organizations.mdx
@@ -1,8 +1,22 @@
---
-title: Organizations
+title: 'Manage organizations | Cypress Cloud'
+description: 'Learn how to create projects, manage users, access billing and usage information, leverage third party integrations, and apply org-level settings.'
+sidebar_label: Organizations
sidebar_position: 20
---
+# Organizations
+
+:::info
+
+##### What you'll learn
+
+- How to create and manage organizations
+- How to locate your Organization ID
+- How to integrate source control providers, issue management, and team communications with your org
+
+:::
+
Organizations are used to group and manage projects. Here you can create
projects, manage users, access billing and usage information, leverage third
party integrations, and apply org-level settings.
@@ -63,17 +77,17 @@ See our integration guides to learn more:
{/* prettier-ignore-start */}
-- [GitHub integration guide](/cloud/integrations/source-control/github)
-- [GitLab integration guide](/cloud/integrations/source-control/gitlab)
-- [Bitbucket integration guide](/cloud/integrations/source-control/bitbucket)
+- [GitHub integration guide](/cloud/integrations/source-control/github)
+- [GitLab integration guide](/cloud/integrations/source-control/gitlab)
+- [Bitbucket integration guide](/cloud/integrations/source-control/bitbucket)
### Issue Management
-- [Jira integration guide](/cloud/integrations/jira)
+- [Jira integration guide](/cloud/integrations/jira)
### Team Communication
-- [Cypress integration for Slack guide](/cloud/integrations/slack)
-- [Cypress integration for Microsoft Teams guide](/cloud/integrations/teams)
+- [Cypress integration for Slack guide](/cloud/integrations/slack)
+- [Cypress integration for Microsoft Teams guide](/cloud/integrations/teams)
{/* prettier-ignore-end */}
diff --git a/docs/cloud/account-management/projects.mdx b/docs/cloud/account-management/projects.mdx
index 48cc633bc3..86627d9d23 100644
--- a/docs/cloud/account-management/projects.mdx
+++ b/docs/cloud/account-management/projects.mdx
@@ -1,8 +1,24 @@
---
-title: Projects
+title: 'How to manage projects | Cypress Cloud'
+description: 'Learn how to set up a project to record test runs, manage project settings, transfer ownership of a project, and how to integrate with third party integrations.'
+sidebar_label: Projects
sidebar_position: 10
---
+# Projects
+
+:::info
+
+##### What you'll learn
+
+- How to set up a project to record test runs
+- How to manage project settings
+- How to transfer ownership of a project
+- Best practices for multi-repo implementation
+- How to integrate with source control providers, issue management, and team communication tools
+
+:::
+
## Identification
Cypress uses your [projectId](#Project-ID) and [Record Key](#Record-key)
@@ -350,17 +366,17 @@ See our integration guides to learn more:
{/* prettier-ignore-start */}
-- [GitHub integration guide](/cloud/integrations/source-control/github)
-- [GitLab integration guide](/cloud/integrations/source-control/gitlab)
-- [Bitbucket integration guide](/cloud/integrations/source-control/bitbucket)
+- [GitHub integration guide](/cloud/integrations/source-control/github)
+- [GitLab integration guide](/cloud/integrations/source-control/gitlab)
+- [Bitbucket integration guide](/cloud/integrations/source-control/bitbucket)
### Issue Management
-- [Jira integration guide](/cloud/integrations/jira)
+- [Jira integration guide](/cloud/integrations/jira)
### Team Communication
-- [Cypress integration for Slack guide](/cloud/integrations/slack)
-- [Cypress integration for Microsoft Teams guide](/cloud/integrations/teams)
+- [Cypress integration for Slack guide](/cloud/integrations/slack)
+- [Cypress integration for Microsoft Teams guide](/cloud/integrations/teams)
{/* prettier-ignore-end */}
diff --git a/docs/cloud/account-management/users.mdx b/docs/cloud/account-management/users.mdx
index 00b61ef67c..4690c66f55 100644
--- a/docs/cloud/account-management/users.mdx
+++ b/docs/cloud/account-management/users.mdx
@@ -1,8 +1,20 @@
---
-title: Users
+title: 'Manage users | Cypress Cloud'
+description: 'Learn how to manage user logins in Cypress Cloud, manage user roles, and accept user requests.'
sidebar_position: 30
+sidebar_label: Users
---
+:::info
+
+##### What you'll learn
+
+- How to invite users to Cypress Cloud
+- How to manage user roles and updates
+- How to accept user requests
+
+:::
+
A user is anyone who logs in to Cypress Cloud.
## Invite users
@@ -73,36 +85,36 @@ Users can be assigned roles that affect their access to certain features of
The permissions for each user role for Cypress Cloud:
-| Permission | | | |
-| ----------------------------------------------- | ------------- | ------------ | ------------ |
-| See test results of private projects | ✅ **Member** | ✅ **Admin** | ✅ **Owner** |
-| See record keys of projects | ✅ **Member** | ✅ **Admin** | ✅ **Owner** |
-| See billing and usage information | | ✅ **Admin** | ✅ **Owner** |
-| Edit billing information | | ✅ **Admin** | ✅ **Owner** |
-| See users invited to organization | | ✅ **Admin** | ✅ **Owner** |
-| Resend invitation to invited user | | ✅ **Admin** | ✅ **Owner** |
-| Invite 'member' to organization | | ✅ **Admin** | ✅ **Owner** |
-| Invite 'admin' to organization | | ✅ **Admin** | ✅ **Owner** |
-| See user requests to join organization | | ✅ **Admin** | ✅ **Owner** |
-| Accept user requests to join organization | | ✅ **Admin** | ✅ **Owner** |
-| Remove 'member' from organization | | ✅ **Admin** | ✅ **Owner** |
-| Remove 'admin' from organization | | ✅ **Admin** | ✅ **Owner** |
-| Edit 'member' in organization | | ✅ **Admin** | ✅ **Owner** |
-| Edit 'admin' in organization | | ✅ **Admin** | ✅ **Owner** |
-| Edit project name | | ✅ **Admin** | ✅ **Owner** |
-| Edit project status (private/public) | | ✅ **Admin** | ✅ **Owner** |
-| Add or delete record keys | | ✅ **Admin** | ✅ **Owner** |
-| Set up GitHub Integration | | ✅ **Admin** | ✅ **Owner** |
-| Set up Slack Integration | | ✅ **Admin** | ✅ **Owner** |
-| Invite 'owner' to organization | | | ✅ **Owner** |
-| Edit 'owner' in organization | | | ✅ **Owner** |
-| Remove 'owner' from organization | | | ✅ **Owner** |
-| Add, edit, remove user in personal organization | | | ✅ **Owner** |
-| Edit organization name | | | ✅ **Owner** |
-| Delete organization | | | ✅ **Owner** |
-| Transfer project to another organization | | | ✅ **Owner** |
-| Delete project | | | ✅ **Owner** |
-| Set up SSO | | | ✅ **Owner** |
+| Permission | Member | Admin | Owner |
+| ----------------------------------------------- | ------ | ----- | ----- |
+| See test results of private projects | ✅ | ✅ | ✅ |
+| See record keys of projects | ✅ | ✅ | ✅ |
+| See billing and usage information | | ✅ | ✅ |
+| Edit billing information | | ✅ | ✅ |
+| See users invited to organization | | ✅ | ✅ |
+| Resend invitation to invited user | | ✅ | ✅ |
+| Invite 'member' to organization | | ✅ | ✅ |
+| Invite 'admin' to organization | | ✅ | ✅ |
+| See user requests to join organization | | ✅ | ✅ |
+| Accept user requests to join organization | | ✅ | ✅ |
+| Remove 'member' from organization | | ✅ | ✅ |
+| Remove 'admin' from organization | | ✅ | ✅ |
+| Edit 'member' in organization | | ✅ | ✅ |
+| Edit 'admin' in organization | | ✅ | ✅ |
+| Edit project name | | ✅ | ✅ |
+| Edit project status (private/public) | | ✅ | ✅ |
+| Add or delete record keys | | ✅ | ✅ |
+| Set up GitHub Integration | | ✅ | ✅ |
+| Set up Slack Integration | | ✅ | ✅ |
+| Invite 'owner' to organization | | | ✅ |
+| Edit 'owner' in organization | | | ✅ |
+| Remove 'owner' from organization | | | ✅ |
+| Add, edit, remove user in personal organization | | | ✅ |
+| Edit organization name | | | ✅ |
+| Delete organization | | | ✅ |
+| Transfer project to another organization | | | ✅ |
+| Delete project | | | ✅ |
+| Set up SSO | | | ✅ |
## User requests
diff --git a/docs/cloud/faq.mdx b/docs/cloud/faq.mdx
index 1da59347a5..459e0b7788 100644
--- a/docs/cloud/faq.mdx
+++ b/docs/cloud/faq.mdx
@@ -1,9 +1,14 @@
---
-title: Cypress Cloud FAQ
+title: 'Frequently Asked Questions (FAQ) | Cypress Cloud'
+description: 'Get answers to common questions about Cypress Cloud.'
sidebar_position: 200
sidebar_label: FAQ
---
+# Cypress Cloud FAQ
+
+## General
+
### What is Cypress Cloud?
total number introduced in your branch
- total number decreased or resolved in your branch
- total count, for example, _3 new and 1 existing_
4. The test state (failed, flaky, pending) is also indicated at the spec level
- _new_ = the state was not previously captured, but now is captured (newly pending tests can imply an `it.skip()` was not removed)
diff --git a/docs/cloud/features/test-replay.mdx b/docs/cloud/features/test-replay.mdx
index b1d67a5abc..852ea8176f 100644
--- a/docs/cloud/features/test-replay.mdx
+++ b/docs/cloud/features/test-replay.mdx
@@ -26,8 +26,8 @@ Test Replay currently only supports Chromium-based browsers (Chrome, Edge, Elect
Test Replay in Cypress Cloud allows developers to accurately and efficiently debug failed and flaky [continuous integration](/app/continuous-integration/overview) test runs. It captures every test run detail, enabling developers to replay it and inspect the DOM, network requests, console logs, JavaScript errors, and element rendering as they happened during `cypress run`.
### Test Replay vs Screenshots and Videos
diff --git a/docs/cloud/get-started/introduction.mdx b/docs/cloud/get-started/introduction.mdx
index fa8cc72e30..6a4c241862 100644
--- a/docs/cloud/get-started/introduction.mdx
+++ b/docs/cloud/get-started/introduction.mdx
@@ -36,13 +36,16 @@ read on for more benefits of Cypress Cloud.
Each test run is stored in Cypress Cloud, where you can see past results and the
current state of your app on the [Latest Runs](/cloud/features/recorded-runs) page.
-Replay the test as it executed during the recorded run with full debug capability using [ Test Replay](/cloud/features/test-replay).
+Replay the test as it executed during the recorded run with full debug capability using [ Test Replay](/cloud/features/test-replay).
Or view each test's
[command logs, screenshots, video replays, stack traces, and CI logs](/cloud/features/recorded-runs#Test-detail-sidebar).
Quickly identifying a test failure in CI is just a click away.
-
+
### Analyze and diagnose test health
@@ -51,7 +54,10 @@ past runs and analyze trends over time. You can quickly analyze changes in your
setup that might introduce problematic trends as well as identify unreliable
tests with [Flaky Test Management](/cloud/features/flaky-test-management).
-
+
The [analytics](/cloud/features/analytics/overview) capabilities show test metrics over time,
helping determine the overall health of your test suite. Quickly see which tests
diff --git a/docs/cloud/integrations/data-extract-api.mdx b/docs/cloud/integrations/data-extract-api.mdx
index 261331b8e5..dc174d596a 100644
--- a/docs/cloud/integrations/data-extract-api.mdx
+++ b/docs/cloud/integrations/data-extract-api.mdx
@@ -1,9 +1,24 @@
---
-title: Data Extract API
+title: 'Cypress API for Enterprise Reporting | Cypress Documentation'
+description: 'See test status, browsers tested, spec results, average run duration, and flaky test rates with the Cypress Cloud Data Extract API.'
sidebar_position: 70
+sidebar_label: Data Extract API
sidebar_custom_props: { 'new_label': true }
---
+# Data Extract API
+
+:::info
+
+##### What you'll learn
+
+- How to use the Cypress Cloud API to extract test data
+- The API endpoints available for extracting data
+- How to use the API to retrieve data in CSV, JSON, or XLSX format
+- How to use the API to retrieve data for a specific date range
+
+:::
+
Enterprise Reporting data can be downloaded from Cloud using the Cypress Cloud API. The data is returned in file
formats that allow you to easily incorporate it into your BI reporting platform, as well as a JSON file that can be
programmatically parsed. This API allows you to retrieve your test data at a variety of levels, including
diff --git a/docs/cloud/integrations/jira.mdx b/docs/cloud/integrations/jira.mdx
index 579b87a9c4..57eccb7d54 100644
--- a/docs/cloud/integrations/jira.mdx
+++ b/docs/cloud/integrations/jira.mdx
@@ -1,15 +1,18 @@
---
-title: Jira Integration
+title: 'Jira Integration | Cypress Documentation'
+description: 'Create a Jira issue for a given a test case from the Cypress Cloud.'
sidebar_position: 30
sidebar_label: Jira
---
-:::tip
+# Jira Integration
- **Premium Cypress Cloud Feature**
+:::info
-**Jira integration** is available to users with a
-[Team Cypress Cloud plan](https://cypress.io/pricing).
+##### What you'll learn
+
+- How to install the Cypress Jira integration
+- How to create a Jira issue for a test case from Cypress Cloud
:::
@@ -23,33 +26,42 @@ workflow to enable:
## Installing the Jira integration
-1. Visit **Integrations → Jira** in Cypress Cloud and click "Install Jira"
+:::tip
+
+ **Premium Cypress Cloud Feature**
+
+**Jira integration** is available to users with a
+[Team Cypress Cloud plan](https://cypress.io/pricing).
+
+:::
+
+1. Visit **Integrations → Jira** in Cypress Cloud and click **Install Jira**
-1. Click the "Get it Now" button on the
+1. Click the **Get it Now** button on the
[Atlassian Marketplace Cypress for Jira page](https://marketplace.atlassian.com/apps/1224341/cypress-for-jira?hosting=cloud&tab=overview)
-1. Login to Jira, Choose a site to install your app and click "Install app".
+1. Login to Jira, Choose a site to install your app and click **Install app**.
-1. On the "Add to Jira" screen, confirm installation by clicking "Get it now"
+1. On the "Add to Jira" screen, confirm installation by clicking **Get it now**
-1. Once installed, click the `Get Started` link in the notification.
+1. Once installed, click the **Get Started** link in the notification.
-1. On the next page, click the `Click to Finish Installation` button to be
+1. On the next page, click the **Click to Finish Installation** button to be
redirected to [Cypress Cloud](https://cloud.cypress.io/) and choose the
Cypress Organization for integration.
+:::info
-## Install the Cypress integration for Slack
+##### What you'll learn
-:::caution
+- How to install the Cypress integration for Slack
+- How to configure Slack notifications on failed runs, passed runs, and flaky tests
+- How to manage Slack notifications at the organization and project level
-Ownership Requirements
+:::
-In order to install the Cypress integration for Slack, you must be an admin or
-owner of both your Cypress Cloud organization and your Slack workspace.
+Cypress's Slack integration provides real-time results for your Cypress tests, all in one place - improving remote
+collaboration and giving wider visibility into test failures and flake, [UI Coverage](/ui-coverage/get-started/introduction),
+and [Cypress Accesibility](/accessibility/get-started/introduction) results.
-:::
+The Cypress integration for Slack allows you to:
-**To install the Cypress integration for Slack:**
+- Improve cross-team collaboration by instantly surfacing Cypress results to the teams that need visibility
+- Confirm that key tests pass prior to launching new products or features
+- Reduce the time it takes to catch failed tests
-1. Go to Cypress Cloud
- [Organizations page](https://cloud.cypress.io/organizations) or open the
- organization switcher.
-2. Select the organization you wish to integrate with Slack.
+
-
+## Getting Started
-3. Visit the selected organization's **Integrations** page via the side
- navigation.
+**You need three things to get started:**
-
+- A Cypress Cloud account
+- The ability to configure Cypress Cloud integrations - you must be an **admin** or the **owner** of your Cypress Cloud organization.
+- The ability to authorize Slack apps - by default, Slack allows **any workspace member** to authorize apps,
+ however workspace owners may require app approvals before installation. See this [Slack help article](https://slack.com/help/articles/202035138-Add-apps-to-your-Slack-workspace) for more details.
-4. Click the **Enable** button in the Slack section.
+## Install the Cypress app for Slack
-
+1. In the Cypress Cloud, visit the **Integrations** page for the organization you wish to integrate with Slack.
+2. Click the **Enable** button in the **Slack** section.
+3. A popup window will be displayed requesting permission for Cypress to access the
+ workspace.
+4. After you approve the app permissions, you can choose your Slack **workspace** and **channel** to
+ associate with the installation.
-5. You'll see a popup window that requests permission for Cypress to access the
- workspace and allows you to choose your Slack workspace and channel to
- associate with the installation. Once you've selected a channel and allowed
- access, the installation is complete! Cypress Cloud will post run results for
- all projects in your organization to the specified Slack channel.
+Now Cypress will post run results for all projects in your organization to the specified Slack channel.
-For more information about how the Cypress integration for Slack collects and
-manages your information, please visit our
-[Privacy Policy](https://on.cypress.io/privacy-policy).
+## Slack configuration
-## Per-organization configuration
+The Slack messages can be tailored to match your teams' needs. A few options include:
-### Add additional Slack channels
+- Sending results to one or more public or private Slack channels or directly to a specific user.
+- Set notification preferences for when and where run results should be posted.
+- Configure at the organization-level and/or project-level to support multiple teams working on separate projects.
-You can have Cypress Cloud post run results to an additional channels. To add a
-channel:
+### Per-Organization vs per-project configuration
-1. Navigate to the **Integrations** page for the organization with the installed
- integration.
-2. Within the Slack integration, click **Configure**.
-3. Click **Add Slack Channel**.
-4. You'll see a popup window that allows you to choose the channel to associate
- with the organization. Cypress Cloud will post run results for all projects
- in your organization to the new Slack channel.
+The following describes where to go to configure Slack for an organization and a project.
-### Set notification preferences
+#### Organization settings
-By default, Cypress Cloud will post a Slack message to each configured channel
-only for failing runs. If you'd like to change these preferences:
+Configure Slack for the organization:
-1. Navigate to the **Integrations** page for the organization with the installed
- integration.
-2. Within the Slack integration, click **Configure**.
-3. Under **Notifications**, select your preference for each Slack channel:
+1. Navigate to the **Integrations** page for the organization you wish to configure.
+2. Within the **Slack** integration, click **Configure**.
+3. Configure the app.
-- **Failed runs**: will notify on runs with a failed status.
-- **Passed runs**: will notify on runs with a passed status.
-- **Flaky tests**: will notify on runs that have an identified flaky test.
+#### Project settings
-### Mute a channel
+Configurate Slack for a project:
-If you want Cypress Cloud to temporarily stop posting Slack messages to a
-certain channel, you can **Mute** that channel. This allows you to easily pause
-and resume notifications for a specific channel without losing the configuration
-you've put in place.
+1. Navigate to the **Project Settings** page for the project you wish to configure.
+2. Click on the **Integrations** tab within the **Project Settings** page.
+3. Configure the app with the **Slack Integration** section.
-1. Navigate to the **Integrations** page for the organization with the installed
- integration.
-2. Within the Cypress integration for Slack, click **Configure**.
-3. Under **Actions**, select your **Mute** for each Slack channel you want
- muted.
+### Slack channels
-### Remove a Slack channel
+You can have Cypress Cloud post run results to specific channels. To add a
+channel:
-You can have Cypress Cloud stop posting notifications to a channel. You can
-remove all Slack channels if you'd prefer to disable global notifications
-altogether in favor of per-project notifications.
+1. Navigate to the **Slack** configuration page.
+2. Click **Add Slack Channel**.
+3. You'll see a popup window that allows you to choose the channel or individual to associate with the organization.
+4. Search for and selecting the channel messages should post to.
-1. Navigate to the **Integrations** page for the organization with the installed
- integration.
-2. Within the Cypress integration for Slack, click **Configure**.
-3. Under **Actions**, select your **Delete** for each Slack channel you want
- deleted.
+Cypress Cloud will begin to post run results to the channel.
-## Per-project configuration
-
-If your organization has multiple teams working on separate projects, you can
-tailor the Slack notifications of each project to match your teams' needs.
-
-### Add a new Slack channel
-
-You can have Cypress Cloud post run results for a specific project to an
-additional channel.
-
-1. Select your organization in the organization switcher.
-
-2. Select the project you wish to integrate with Slack.
-
-3. Go to the project's settings page.
-
-4. Scroll down to the **Slack Integration** section.
-5. Click **Add Slack Channel**.
-6. You'll see a popup window that allows you to choose the channel to associate
- with the project.
-
-### Set notification preferences
+### Direct messages
-By default, Cypress Cloud will post a Slack message to each configured channel
-only for failing runs.
+You can have Cypress Cloud post run results as a direct message to a single user. To post to a direct message:
-If you'd like to change these preferences:
+1. Navigate to the **Slack** configuration page
+2. Click **Add Slack Channel**.
+3. You'll see a popup window that allows you to choose the channel or individual to associate
+ with the organization.
+4. Search for and select the user that messages should be sent to.
-1. Navigate to the **Integrations** page for the project with the installed
- integration.
-2. Scroll down to the **Slack Integration** section.
-3. Under **Notifications**, select your preference for each Slack channel:
+Cypress Cloud will begin to send run results to this user.
-- **Failed runs**: will notify on runs with a failed status.
-- **Passed runs**: will notify on runs with a passed status.
-- **Flaky tests**: will notify on runs that have an identified flaky test.
+### Notification preferences
-:::info
+By default, Cypress Cloud will post a Slack message to each configured channel
+only for failing runs. However, you can select any combination of the followings preferences:
-You cannot override the notification preferences for globally configured Slack
-integrations.
+- **Failed runs**: will notify on runs with a _failed_ status.
+- **Passed runs**: will notify on runs with a _passed_ status.
+- **Flaky tests**: will notify on runs that have an identified _flaky_ test.
-:::
+To set notification preferences:
+
+1. Navigate to Slack configuration page
+2. Select the notification preferences for each channel
-### Filter notifications by tag
+#### Filter notifications by tag
-You can filter notifications posted to Slack based on a
+When configuring at the project-level, you can filter notifications posted to Slack based on a
[tag](/app/references/command-line#cypress-run-tag-lt-tag-gt) the run was
recorded with. This can be helpful to only post notifications on certain runs,
like those to a staging or release environment.
-1. Navigate to the **Integrations** page for the project with the installed
- integration.
-2. Scroll down to the **Slack Integration** section.
-3. Under **Tags**, select the **Tag** dropdown for the desired integration and
+1. Navigate to the **Slack** configuration page
+2. Under **Tags**, select the **Tag** dropdown for the desired integration and
select which tag to filter.
-:::info
-
-Filtering by tags is only available on integrations configured at the project
-level.
-
-:::
-
### Mute a channel
If you want Cypress Cloud to temporarily stop posting Slack messages to a
certain channel, you can **Mute** that channel. This allows you to easily pause
and resume notifications for a specific channel without losing the configuration
-you've put in place. You can even mute the messages for the global organization
-channels!
+you've put in place.
-1. Navigate to the **Integrations** page for the project with the installed
- integration.
-2. Scroll down to the **Slack Integration** section.
-3. Under **Actions**, select your **Mute** for each Slack channel you want
+1. Navigate to the **Slack** configuration page
+2. Under **Actions**, select **Mute** for each Slack channel you want
muted.
-### Remove a channel
+### Remove a Slack channel
-You can have Cypress Cloud stop posting notifications to a channel. You cannot
-delete the global notification channels from a project.
+You can have Cypress Cloud stop posting notifications to a channel. You can
+remove all Slack channels if you'd prefer to disable global notifications
+altogether in favor of per-project notifications.
-1. Navigate to the **Integrations** page for the project with the installed
- integration.
-2. Scroll down to the **Slack Integration** section.
-3. Under **Actions**, select your **Delete** for each Slack channel you want
+1. Navigate to the **Slack** configuration page
+2. Under **Actions**, select **Delete** for each Slack channel you want
deleted.
## Remove the integration
You can completely remove the Cypress integration for Slack from your workspace.
-This will remove the @cypress bot from your workspace and will delete all of the
-Slack configurations you've set in Cypress Cloud. You cannot undo this, but you
+This will remove the `@cypress` bot from your workspace and will delete all of the
+Slack configurations you've set in Cypress Cloud. **You cannot undo this**, but you
will be able to install the Cypress integration for Slack again in the future.
1. Navigate to the **Integrations** page for the organization with the installed
integration.
-2. Within the Slack Integration, click **Configure**.
+2. Within the **Slack Integration**, click **Configure**.
3. Click **Uninstall Slack Integration** to uninstall the Cypress integration
for Slack.
+
+## Security and compliance
+
+Review our [Privacy Policy](https://on.cypress.io/privacy-policy) for information about how the Cypress app for Slack collects and
+manages your information.
+
+### Authorizations
+
+When authorized, Cypress can:
+
+- View information about a user's identity
+- Post messages to specific channels in Slack & direct message conversations
+- Show previews of cloud.cypress.io URLs in messages
+- View URLs from cloud.cypress.io
+
+### App scopes
+
+- User token scopes: [`links:read`](https://api.slack.com/scopes/links:read), [`links:write`](https://api.slack.com/scopes/links:write)
+- Bot token scopes: [`chat:write`](https://api.slack.com/scopes/chat:write), [`incoming-webhook`](https://api.slack.com/scopes/incoming-webhook), [`links:read`](https://api.slack.com/scopes/links:read), [`links:write`](https://api.slack.com/scopes/links:write)
diff --git a/docs/cloud/integrations/source-control/bitbucket.mdx b/docs/cloud/integrations/source-control/bitbucket.mdx
index cf117903f0..1dde90b6c4 100644
--- a/docs/cloud/integrations/source-control/bitbucket.mdx
+++ b/docs/cloud/integrations/source-control/bitbucket.mdx
@@ -1,11 +1,23 @@
---
-title: Bitbucket Integration
+title: 'Bitbucket Integration | Cypress Documentation'
+description: 'Configure Bitbucket status checks and pull request comments to show Cypress test results from Cypress Cloud.'
sidebar_position: 30
sidebar_label: Bitbucket
---
+# Bitbucket
+
:::info
+##### What you'll learn
+
+- How to install the Cypress Bitbucket integration
+- How to configure status checks and pull request comments
+
+:::
+
+:::caution
+
Bitbucket integration is currently in beta
:::
@@ -18,6 +30,7 @@ to use Bitbucket integration.
diff --git a/docs/cloud/integrations/source-control/github.mdx b/docs/cloud/integrations/source-control/github.mdx
index 1d715e2b3c..1d13a3cea8 100644
--- a/docs/cloud/integrations/source-control/github.mdx
+++ b/docs/cloud/integrations/source-control/github.mdx
@@ -1,9 +1,22 @@
---
-title: GitHub Integration
+title: 'GitHub Integration | Cypress Documentation'
+description: 'Configure GitHub status checks and pull request comments to show Cypress test results from Cypress Cloud.'
sidebar_position: 10
sidebar_label: GitHub
---
+# GitHub Integration
+
+:::info
+
+##### What you'll learn
+
+- How to install the Cypress GitHub App
+- How to enable GitHub integration for a project
+- How to configure status checks and pull request comments
+
+:::
+
[Cypress Cloud](https://on.cypress.io/cloud) can integrate your Cypress tests
with your GitHub workflow via commit [status checks](#Status-checks) and
[pull request comments](#Pull-request-comments). A project first needs to be
diff --git a/docs/cloud/integrations/source-control/gitlab.mdx b/docs/cloud/integrations/source-control/gitlab.mdx
index 9c2146b8fe..8720c4275f 100644
--- a/docs/cloud/integrations/source-control/gitlab.mdx
+++ b/docs/cloud/integrations/source-control/gitlab.mdx
@@ -1,9 +1,21 @@
---
-title: GitLab Integration
+title: 'GitLab Integration | Cypress Documentation'
+description: 'Configure GitLab status checks and merge request comments to show Cypress test results from Cypress Cloud.'
sidebar_position: 20
sidebar_label: GitLab
---
+# GitLab
+
+:::info
+
+##### What you'll learn
+
+- How to install the Cypress GitLab integration
+- How to configure status checks and merge request comments
+
+:::
+
[Cypress Cloud](https://on.cypress.io/cloud) can integrate your Cypress tests
with your GitLab workflow via [status checks](#Status-checks) and
[merge request comments](#Merge-Request-comments). A project first needs to be
@@ -12,6 +24,7 @@ to use GitLab integration.
@@ -117,6 +130,7 @@ You can manage this behavior on your project's **Project Settings** page.
@@ -139,6 +153,7 @@ You can manage this behavior on your project's **Project Settings** page.
diff --git a/docs/cloud/integrations/teams.mdx b/docs/cloud/integrations/teams.mdx
index ec6740c475..766e1d0731 100644
--- a/docs/cloud/integrations/teams.mdx
+++ b/docs/cloud/integrations/teams.mdx
@@ -1,11 +1,22 @@
---
-title: Microsoft Teams Integration
+title: 'Microsoft Teams Integration | Cypress Documentation'
+description: 'Setup Microsoft Teams notifications for your Cypress Cloud organization and projects.'
sidebar_position: 60
sidebar_label: Microsoft Teams
---
:::info
+##### What you'll learn
+
+- How to enable the Cypress integration for Microsoft Teams
+- How to configure Microsoft Teams notifications for your Cypress Cloud organization and projects
+- How to manage Microsoft Teams notifications at the organization and project level
+
+:::
+
+:::caution
+
Microsoft Teams integration is currently in
beta
diff --git a/docs/ui-coverage/get-started/introduction.mdx b/docs/ui-coverage/get-started/introduction.mdx
index 8e1618aaf6..2572a4b2a6 100644
--- a/docs/ui-coverage/get-started/introduction.mdx
+++ b/docs/ui-coverage/get-started/introduction.mdx
@@ -16,12 +16,20 @@ UI Coverage is a visual test coverage report based on the interactive elements t
## How it Works
+:::caution
+
+UI Coverage generates reports using [Test Replay](/cloud/features/test-replay) data and requires Cypress v13+.
+
+:::
+
UI Coverage creates a dynamic visual map of test coverage across every page of your application. Each interactive element is identified and highlighted as either tested or untested, providing a clear and actionable overview of your test coverage.
UI Coverage captures "snapshots" of every page visited by your Cypress tests (and every component mounted in Component Testing). Snapshots represent all of the unique states found across your test run, and these states are analyzed to identify all of the unique elements that make up your application.
As a result, a UI Coverage score is generated. This score quantifies coverage across your application by measuring the ratio of the unique elements that have been tested to the total unique elements that are found across your application.
+Because Cypress Accessibility uses data captured through Cypress Test Replay, it is subject to any [limitations of Test Replay](https://docs.cypress.io/faq/questions/cloud-faq#Is-everything-captured-and-replayed-in-Test-Replay) data captured and browser support.
+
## Getting Started
To access UI Coverage, navigate to the 'UI Coverage' tab in a run's details page. You can access a run's details page by clicking on a run in the 'Latest runs' tab.
diff --git a/netlify.toml b/netlify.toml
index 022a8ddaf6..aa0ba0346f 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -67,7 +67,7 @@
[[redirects]]
from = "/guides/overview/choosing-testing-type"
- to = "/guides/core-concepts/testing-types"
+ to = "/app/core-concepts/testing-types"
status = 301
force = true
@@ -97,31 +97,31 @@
[[redirects]]
from = "/guides/component-testing/framework-configuration"
- to = "/guides/component-testing/component-framework-configuration"
+ to = "/app/component-testing/component-framework-configuration"
status = 301
force = true
[[redirects]]
from = "/guides/core-concepts/test-runner"
- to = "/guides/core-concepts/open-mode"
+ to = "/app/core-concepts/open-mode"
status = 301
force = true
[[redirects]]
from = "/guides/core-concepts/cypress-studio"
- to = "/guides/guides/cypress-studio"
+ to = "/app/guides/cypress-studio"
status = 301
force = true
[[redirects]]
from = "/guides/getting-started/writing-your-first-test"
- to = "/guides/end-to-end-testing/writing-your-first-end-to-end-test"
+ to = "/app/end-to-end-testing/writing-your-first-end-to-end-test"
status = 301
force = true
[[redirects]]
from = "/guides/getting-started/testing-your-app"
- to = "/guides/end-to-end-testing/testing-your-app"
+ to = "/app/end-to-end-testing/writing-your-first-end-to-end-test"
status = 301
force = true
@@ -175,37 +175,37 @@
[[redirects]]
from = "/guides/references/bundled-tools"
- to = "/guides/references/bundled-libraries"
+ to = "/app/references/bundled-libraries"
status = 301
force = true
[[redirects]]
from = "/guides/references/bundled-tools.html"
- to = "/guides/references/bundled-libraries"
+ to = "/app/references/bundled-libraries"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/quickstart-react"
- to = "/guides/component-testing/react/quickstart"
+ to = "/app/component-testing/react/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/mounting-react"
- to = "/guides/component-testing/react/quickstart"
+ to = "/app/component-testing/react/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/testing-react"
- to = "/guides/component-testing/react/quickstart"
+ to = "/app/component-testing/react/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/events-react"
- to = "/guides/component-testing/react/quickstart"
+ to = "/app/component-testing/react/overview"
status = 301
force = true
@@ -217,67 +217,67 @@
[[redirects]]
from = "/guides/component-testing/quickstart-angular"
- to = "/guides/component-testing/angular/quickstart"
+ to = "/app/component-testing/angular/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/mounting-angular"
- to = "/guides/component-testing/angular/quickstart"
+ to = "/app/component-testing/angular/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/testing-angular"
- to = "/guides/component-testing/angular/quickstart"
+ to = "/app/component-testing/angular/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/events-angular"
- to = "/guides/component-testing/angular/quickstart"
+ to = "/app/component-testing/angular/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/custom-mount-angular"
- to = "/guides/component-testing/angular/examples"
+ to = "/app/component-testing/angular/examples"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/slots-angular"
- to = "/guides/component-testing/angular/overview"
+ to = "/app/component-testing/angular/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/quickstart-vue"
- to = "/guides/component-testing/vue/quickstart"
+ to = "/app/component-testing/vue/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/mounting-vue"
- to = "/guides/component-testing/vue/quickstart"
+ to = "/app/component-testing/vue/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/testing-vue"
- to = "/guides/component-testing/vue/quickstart"
+ to = "/app/component-testing/vue/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/events-vue"
- to = "/guides/component-testing/vue/quickstart"
+ to = "/app/component-testing/vue/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/custom-mount-vue"
- to = "/guides/component-testing/vue/examples"
+ to = "/app/component-testing/vue/examples"
status = 301
force = true
@@ -289,31 +289,31 @@
[[redirects]]
from = "/guides/component-testing/quickstart-svelte"
- to = "/guides/component-testing/svelte/quickstart"
+ to = "/app/component-testing/svelte/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/mounting-svelte"
- to = "/guides/component-testing/svelte/quickstart"
+ to = "/app/component-testing/svelte/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/testing-svelte"
- to = "/guides/component-testing/svelte/quickstart"
+ to = "/app/component-testing/svelte/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/events-svelte"
- to = "/guides/component-testing/svelte/quickstart"
+ to = "/app/component-testing/svelte/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/custom-mount-svelte"
- to = "/guides/component-testing/svelte/examples"
+ to = "/app/component-testing/svelte/examples"
status = 301
force = true
@@ -325,55 +325,55 @@
[[redirects]]
from = "/guides/dashboard/analytics"
- to = "/guides/cloud/features/analytics/overview"
+ to = "/cloud/features/analytics/overview"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/features/analytics"
- to = "/guides/cloud/features/analytics/overview"
+ to = "/cloud/features/analytics/overview"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/flaky-test-management"
- to = "/guides/cloud/features/flaky-test-management"
+ to = "/cloud/features/flaky-test-management"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/flaky-test-management"
- to = "/guides/cloud/features/flaky-test-management"
+ to = "/cloud/features/flaky-test-management"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/introduction"
- to = "/guides/cloud/get-started/introduction"
+ to = "/cloud/get-started/introduction"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/github-integration"
- to = "/guides/cloud/integrations/github"
+ to = "/cloud/integrations/source-control/github"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/github-integration"
- to = "/guides/cloud/integrations/github"
+ to = "/cloud/integrations/source-control/github"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/gitlab-integration"
- to = "/guides/cloud/integrations/gitlab"
+ to = "/cloud/integrations/source-control/gitlab"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/gitlab-integration"
- to = "/guides/cloud/integrations/gitlab"
+ to = "/cloud/integrations/source-control/gitlab"
status = 301
force = true
@@ -403,43 +403,49 @@
[[redirects]]
from = "/guides/dashboard/bitbucket-integration"
- to = "/guides/cloud/integrations/bitbucket"
+ to = "/cloud/integrations/source-control/bitbucket"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/bitbucket-integration"
- to = "/guides/cloud/integrations/bitbucket"
+ to = "/cloud/integrations/source-control/bitbucket"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/organizations"
- to = "/guides/cloud/organizations"
+ to = "/cloud/account-management/organizations"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/projects"
- to = "/guides/cloud/projects"
+ to = "/cloud/account-management/projects"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/runs"
- to = "/guides/cloud/runs"
+ to = "/cloud/features/recorded-runs"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/smart-orchestration"
- to = "/guides/cloud/features/smart-orchestration"
+ to = "/cloud/features/smart-orchestration/overview"
+ status = 301
+ force = true
+
+[[redirects]]
+ from = "/guides/smart-orchestration"
+ to = "/cloud/features/smart-orchestration/overview"
status = 301
force = true
[[redirects]]
from = "/guides/dashboard/users"
- to = "/guides/cloud/users"
+ to = "/cloud/account-management/users"
status = 301
force = true
@@ -453,37 +459,37 @@
[[redirects]]
from = "/guides/cloud/projects"
- to = "/guides/cloud/account-management/projects"
+ to = "/cloud/account-management/projects"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/organizations"
- to = "/guides/cloud/account-management/organizations"
+ to = "/cloud/account-management/organizations"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/users"
- to = "/guides/cloud/account-management/users"
+ to = "/cloud/account-management/users"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/features/smart-orchestration"
- to = "/guides/cloud/features/smart-orchestration/overview"
+ to = "/cloud/features/smart-orchestration/overview"
status = 301
force = true
[[redirects]]
from = "/guides/guides/parallelization"
- to = "/guides/cloud/features/smart-orchestration/parallelization"
+ to = "/cloud/features/smart-orchestration/parallelization"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/runs"
- to = "/guides/cloud/features/recorded-runs"
+ to = "/cloud/features/recorded-runs"
status = 301
force = true
@@ -495,25 +501,25 @@
[[redirects]]
from = "/guides/cloud/integrations/gitlab"
- to = "/guides/cloud/integrations/source-control/gitlab"
+ to = "/cloud/integrations/source-control/gitlab"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/integrations/bitbucket"
- to = "/guides/cloud/integrations/source-control/bitbucket"
+ to = "/cloud/integrations/source-control/bitbucket"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/debugging/test-replay"
- to = "/guides/cloud/features/test-replay"
+ to = "/cloud/features/test-replay"
status = 301
force = true
[[redirects]]
from = "/guides/cloud/debugging/recorded-runs"
- to = "/guides/cloud/features/recorded-runs"
+ to = "/cloud/features/recorded-runs"
status = 301
force = true
@@ -567,85 +573,85 @@
[[redirects]]
from = "/api/utilities/moment"
- to = "/guides/overview/why-cypress"
+ to = "/cloud/get-started/introduction"
status = 301
force = true
[[redirects]]
from = "/coverage"
- to = "/guides/tooling/code-coverage"
+ to = "/app/tooling/code-coverage"
status = 301
force = true
[[redirects]]
from = "/dashboard-service"
- to = "/guides/cloud/get-started/introduction"
+ to = "/cloud/get-started/introduction"
status = 301
force = true
[[redirects]]
from = "/dashboard/overview/runs-dashboard"
- to = "/guides/cloud/features/recorded-runs"
+ to = "/cloud/features/recorded-runs"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/angular/quickstart"
- to = "/guides/component-testing/angular/overview"
+ to = "/app/component-testing/angular/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/react/quickstart"
- to = "/guides/component-testing/react/overview"
+ to = "/app/component-testing/react/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/svelte/quickstart"
- to = "/guides/component-testing/svelte/overview"
+ to = "/app/component-testing/svelte/overview"
status = 301
force = true
[[redirects]]
from = "/guides/component-testing/vue/quickstart"
- to = "/guides/component-testing/vue/overview"
+ to = "/app/component-testing/vue/overview"
status = 301
force = true
[[redirects]]
from = "/guides/core-concepts/dashboard-service"
- to = "/guides/cloud/get-started/introduction"
+ to = "/cloud/get-started/introduction"
status = 301
force = true
[[redirects]]
from = "/guides/core-concepts/launching-browsers"
- to = "/guides/guides/launching-browsers"
+ to = "/app/references/launching-browsers"
status = 301
force = true
[[redirects]]
from = "/guides/getting-started"
- to = "/guides/getting-started/install-cypress"
+ to = "/app/get-started/why-cypress"
status = 301
force = true
[[redirects]]
from = "/getting-started/install-cypress.md"
- to = "/guides/getting-started/install-cypress"
+ to = "/app/get-started/install-cypress"
status = 301
force = true
[[redirects]]
from = "/getting-started/why-cypress"
- to = "guides/overview/why-cypress"
+ to = "/app/get-started/why-cypress"
status = 301
force = true
[[redirects]]
from = "/guides/guides/continuous-integration"
- to = "/guides/continuous-integration/overview"
+ to = "/app/continuous-integration/overview"
status = 301
force = true
@@ -657,43 +663,43 @@
[[redirects]]
from = "/guides/guides/reporters"
- to = "/guides/tooling/reporters"
+ to = "/app/tooling/reporters"
status = 301
force = true
[[redirects]]
from = "/guides/installing-and-running"
- to = "/guides/getting-started/install-cypress"
+ to = "/app/get-started/install-cypress"
status = 301
force = true
[[redirects]]
from = "/guides/references/known-issues"
- to = "/guides/references/trade-offs"
+ to = "/app/get-started/why-cypress"
status = 301
force = true
[[redirects]]
from = "/guides/tooling/intelligent-code-completion"
- to = "/guides/tooling/IDE-integration"
+ to = "/app/tooling/IDE-integration"
status = 301
force = true
[[redirects]]
from = "/guides/web-security"
- to = "/guides/guides/web-security"
+ to = "/app/guides/cross-origin-testing"
status = 301
force = true
[[redirects]]
from = "/intelligent-code-completion"
- to = "/guides/tooling/IDE-integration"
+ to = "/app/tooling/IDE-integration"
status = 301
force = true
[[redirects]]
from = "/ja"
- to = "/guides/overview/why-cypress"
+ to = "/app/get-started/why-cypress"
status = 301
force = true
@@ -705,7 +711,7 @@
[[redirects]]
from = "/why-cypress"
- to = "/guides/overview/why-cypress"
+ to = "/app/get-started/why-cypress"
status = 301
force = true
@@ -723,25 +729,25 @@
[[redirects]]
from = "/zh-cn/guides/getting-started/install-cypress"
- to = "/guides/getting-started/install-cypress"
+ to = "/app/get-started/install-cypress"
status = 301
force = true
[[redirects]]
from = "/zh-cn/guides/references/command-line"
- to = "/guides/references/command-line"
+ to = "/app/references/command-line"
status = 301
force = true
[[redirects]]
from = "/zh-cn/guides/guides/module-api"
- to = "/guides/guides/module-api"
+ to = "/app/references/module-api"
status = 301
force = true
[[redirects]]
from = "/zh-cn/guides/overview/why-cypress"
- to = "/guides/overview/why-cypress"
+ to = "/app/get-started/why-cypress"
status = 301
force = true
@@ -753,13 +759,13 @@
[[redirects]]
from = "/zh-cn/guides/references/configuration"
- to = "/guides/references/configuration"
+ to = "/app/references/configuration"
status = 301
force = true
[[redirects]]
from = "/guides/references/legacy-configuration"
- to = "/guides/references/configuration"
+ to = "/app/references/configuration"
status = 301
force = true
@@ -1081,6 +1087,18 @@
status = 301
force = true
+[[redirects]]
+ from = "/faq"
+ to = "/app/faq"
+ status = 301
+ force = true
+
+[[redirects]]
+ from = "/installing-cypress"
+ to = "/app/get-started/install-cypress"
+ status = 301
+ force = true
+
[[redirects]]
from = "/api/plugins/*"
to = "/api/node-events/:splat"
diff --git a/package-lock.json b/package-lock.json
index c3f3e7be3a..72310971ce 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -34,10 +34,12 @@
"@docusaurus/module-type-aliases": "^3.1.1",
"@docusaurus/tsconfig": "3.1.1",
"@prettier/sync": "^0.5.1",
+ "cypress": "^13.15.0",
"node-fetch": "^3.3.2",
"patch-package": "^8.0.0",
"prettier": "^3.2.5",
- "typescript": "^5.3.3"
+ "typescript": "^5.3.3",
+ "wait-on": "^8.0.1"
}
},
"node_modules/@algolia/autocomplete-core": {
@@ -2212,6 +2214,90 @@
"clsx": "*"
}
},
+ "node_modules/@cypress/request": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz",
+ "integrity": "sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==",
+ "dev": true,
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~4.0.0",
+ "http-signature": "~1.4.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "performance-now": "^2.1.0",
+ "qs": "6.13.0",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "^4.1.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@cypress/request/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@cypress/request/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@cypress/request/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@cypress/xvfb": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
+ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.1.0",
+ "lodash.once": "^4.1.1"
+ }
+ },
+ "node_modules/@cypress/xvfb/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
"node_modules/@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@@ -3195,9 +3281,9 @@
}
},
"node_modules/@sideway/address": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
- "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
"dependencies": {
"@hapi/hoek": "^9.0.0"
}
@@ -3839,6 +3925,18 @@
"@types/node": "*"
}
},
+ "node_modules/@types/sinonjs__fake-timers": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+ "dev": true
+ },
+ "node_modules/@types/sizzle": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
+ "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
+ "dev": true
+ },
"node_modules/@types/sockjs": {
"version": "0.3.36",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
@@ -3873,6 +3971,16 @@
"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
"integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="
},
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@@ -4211,6 +4319,42 @@
"node": ">=8"
}
},
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/ansi-html-community": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
@@ -4261,6 +4405,26 @@
"node": ">= 8"
}
},
+ "node_modules/arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@@ -4284,6 +4448,33 @@
"node": ">=8"
}
},
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/astring": {
"version": "1.8.6",
"resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz",
@@ -4292,6 +4483,18 @@
"astring": "bin/astring"
}
},
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -4336,6 +4539,38 @@
"postcss": "^8.1.0"
}
},
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "dev": true
+ },
+ "node_modules/axios": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
+ "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "dev": true,
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true
+ },
"node_modules/babel-loader": {
"version": "9.1.3",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz",
@@ -4418,11 +4653,40 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="
},
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dev": true,
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -4439,6 +4703,18 @@
"node": ">=8"
}
},
+ "node_modules/blob-util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+ "dev": true
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
"node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -4569,6 +4845,39 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -4618,14 +4927,28 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/cachedir": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
+ "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/call-bind": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
- "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.1",
- "set-function-length": "^1.1.1"
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4697,6 +5020,12 @@
}
]
},
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true
+ },
"node_modules/ccount": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
@@ -4765,6 +5094,15 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/check-more-types": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/cheerio": {
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
@@ -4887,6 +5225,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/cli-table3": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
@@ -4919,6 +5269,42 @@
"node": ">=8"
}
},
+ "node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -4994,6 +5380,18 @@
"node": ">=10"
}
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -5016,6 +5414,15 @@
"resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
"integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="
},
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -5565,26 +5972,196 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
- "node_modules/data-uri-to-buffer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
- "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "node_modules/cypress": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.15.0.tgz",
+ "integrity": "sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@cypress/request": "^3.0.4",
+ "@cypress/xvfb": "^1.2.4",
+ "@types/sinonjs__fake-timers": "8.1.1",
+ "@types/sizzle": "^2.3.2",
+ "arch": "^2.2.0",
+ "blob-util": "^2.0.2",
+ "bluebird": "^3.7.2",
+ "buffer": "^5.7.1",
+ "cachedir": "^2.3.0",
+ "chalk": "^4.1.0",
+ "check-more-types": "^2.24.0",
+ "cli-cursor": "^3.1.0",
+ "cli-table3": "~0.6.1",
+ "commander": "^6.2.1",
+ "common-tags": "^1.8.0",
+ "dayjs": "^1.10.4",
+ "debug": "^4.3.4",
+ "enquirer": "^2.3.6",
+ "eventemitter2": "6.4.7",
+ "execa": "4.1.0",
+ "executable": "^4.1.1",
+ "extract-zip": "2.0.1",
+ "figures": "^3.2.0",
+ "fs-extra": "^9.1.0",
+ "getos": "^3.2.1",
+ "is-ci": "^3.0.1",
+ "is-installed-globally": "~0.4.0",
+ "lazy-ass": "^1.6.0",
+ "listr2": "^3.8.3",
+ "lodash": "^4.17.21",
+ "log-symbols": "^4.0.0",
+ "minimist": "^1.2.8",
+ "ospath": "^1.2.2",
+ "pretty-bytes": "^5.6.0",
+ "process": "^0.11.10",
+ "proxy-from-env": "1.0.0",
+ "request-progress": "^3.0.0",
+ "semver": "^7.5.3",
+ "supports-color": "^8.1.1",
+ "tmp": "~0.2.3",
+ "untildify": "^4.0.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "cypress": "bin/cypress"
+ },
+ "engines": {
+ "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/cypress/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cypress/node_modules/execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/cypress/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cypress/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cypress/node_modules/human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.12.0"
+ }
+ },
+ "node_modules/cypress/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/cypress/node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
"dev": true,
"engines": {
"node": ">= 12"
}
},
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+ "dev": true
+ },
"node_modules/debounce": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
"integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
},
"node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -5668,16 +6245,19 @@
}
},
"node_modules/define-data-property": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
- "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/define-lazy-prop": {
@@ -5725,6 +6305,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -5965,6 +6554,16 @@
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
},
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dev": true,
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -6010,6 +6609,15 @@
"node": ">= 0.8"
}
},
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
"node_modules/enhanced-resolve": {
"version": "5.15.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
@@ -6022,6 +6630,19 @@
"node": ">=10.13.0"
}
},
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -6041,6 +6662,25 @@
"is-arrayish": "^0.2.1"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-module-lexer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
@@ -6257,6 +6897,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/eventemitter2": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
+ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+ "dev": true
+ },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -6292,6 +6938,18 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
+ "node_modules/executable": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
@@ -6386,6 +7044,50 @@
"node": ">=0.10.0"
}
},
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/extract-zip/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ]
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -6450,6 +7152,15 @@
"node": ">=0.8.0"
}
},
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
"node_modules/feed": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz",
@@ -6484,6 +7195,30 @@
"node": "^12.20 || >= 14.13"
}
},
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
@@ -6645,9 +7380,9 @@
}
},
"node_modules/follow-redirects": {
- "version": "1.15.5",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
- "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
@@ -6689,6 +7424,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/fork-ts-checker-webpack-plugin": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
@@ -6809,6 +7553,20 @@
"node": ">=6"
}
},
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/form-data-encoder": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
@@ -6918,15 +7676,19 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
- "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dependencies": {
+ "es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -6947,6 +7709,24 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/getos": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
+ "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+ "dev": true,
+ "dependencies": {
+ "async": "^3.2.0"
+ }
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
"node_modules/github-slugger": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz",
@@ -7184,11 +7964,11 @@
}
},
"node_modules/has-property-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
- "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dependencies": {
- "get-intrinsic": "^1.2.2"
+ "es-define-property": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7699,6 +8479,20 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/http-signature": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
+ "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^2.0.2",
+ "sshpk": "^1.18.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/http2-wrapper": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
@@ -7741,6 +8535,26 @@
"postcss": "^8.1.0"
}
},
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/ignore": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
@@ -8116,6 +8930,18 @@
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -8154,6 +8980,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true
+ },
"node_modules/jackspeak": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
@@ -8224,13 +9056,13 @@
}
},
"node_modules/joi": {
- "version": "17.11.1",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.1.tgz",
- "integrity": "sha512-671acnrx+w96PCcQOzvm0VYQVwNL2PVgZmDRaFuSsx8sIUmGzYElPw5lU8F3Cr0jOuPs1oM56p7W2a1cdDOwcw==",
+ "version": "17.13.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
+ "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
"dependencies": {
"@hapi/hoek": "^9.3.0",
"@hapi/topo": "^5.1.0",
- "@sideway/address": "^4.1.4",
+ "@sideway/address": "^4.1.5",
"@sideway/formula": "^3.0.1",
"@sideway/pinpoint": "^2.0.0"
}
@@ -8251,6 +9083,12 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true
+ },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -8272,6 +9110,12 @@
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
},
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -8295,6 +9139,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -8326,6 +9176,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/jsprim": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+ "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -8390,27 +9255,100 @@
"shell-quote": "^1.8.1"
}
},
+ "node_modules/lazy-ass": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+ "dev": true,
+ "engines": {
+ "node": "> 0.8"
+ }
+ },
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
"integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
"engines": {
- "node": ">=6"
+ "node": ">=6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/listr2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+ "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.16",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.1",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/listr2/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/listr2/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "node_modules/listr2/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -8461,11 +9399,102 @@
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
},
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "dev": true
+ },
"node_modules/lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
},
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/longest-streak": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
@@ -10766,9 +11795,9 @@
}
},
"node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/multicast-dns": {
"version": "7.2.5",
@@ -11077,6 +12106,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/ospath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+ "dev": true
+ },
"node_modules/p-cancelable": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
@@ -11442,6 +12477,18 @@
"node": ">=8"
}
},
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true
+ },
"node_modules/periscopic": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
@@ -12273,6 +13320,18 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/pretty-error": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
@@ -12310,6 +13369,15 @@
"node": ">=6"
}
},
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -12371,6 +13439,28 @@
"node": ">= 0.10"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+ "dev": true
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "dev": true
+ },
+ "node_modules/pump": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
"node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
@@ -12404,6 +13494,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true
+ },
"node_modules/queue": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
@@ -13160,6 +14256,15 @@
"entities": "^2.0.0"
}
},
+ "node_modules/request-progress": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+ "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+ "dev": true,
+ "dependencies": {
+ "throttleit": "^1.0.0"
+ }
+ },
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -13259,6 +14364,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
@@ -13276,6 +14394,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -13334,6 +14458,15 @@
"queue-microtask": "^1.2.2"
}
},
+ "node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -13601,11 +14734,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
"node_modules/send/node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -13727,15 +14855,16 @@
}
},
"node_modules/set-function-length": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz",
- "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dependencies": {
- "define-data-property": "^1.1.1",
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.2",
+ "get-intrinsic": "^1.2.4",
"gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -13806,13 +14935,17 @@
}
},
"node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -13883,6 +15016,20 @@
"node": ">=8"
}
},
+ "node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/sockjs": {
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
@@ -13987,6 +15134,31 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/sshpk": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+ "dev": true,
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/stable": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
@@ -14569,6 +15741,21 @@
"node": ">=0.8"
}
},
+ "node_modules/throttleit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
+ "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@@ -14631,6 +15818,39 @@
"node": ">=6"
}
},
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/trim-lines": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
@@ -14659,6 +15879,24 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true
+ },
"node_modules/type-fest": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
@@ -14906,6 +16144,15 @@
"node": ">= 0.8"
}
},
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/update-browserslist-db": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
@@ -15111,6 +16358,16 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -15170,6 +16427,26 @@
"node": ">= 0.8"
}
},
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/verror/node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "dev": true
+ },
"node_modules/vfile": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz",
@@ -15210,6 +16487,25 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/wait-on": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz",
+ "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==",
+ "dev": true,
+ "dependencies": {
+ "axios": "^1.7.7",
+ "joi": "^17.13.3",
+ "lodash": "^4.17.21",
+ "minimist": "^1.2.8",
+ "rxjs": "^7.8.1"
+ },
+ "bin": {
+ "wait-on": "bin/wait-on"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/watchpack": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
@@ -15785,6 +17081,16 @@
"node": ">= 6"
}
},
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
"node_modules/yocto-queue": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
diff --git a/package.json b/package.json
index 5086240804..4600c2e77a 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"clear": "docusaurus clear",
"preserve": "npm run build:plugins",
"serve": "docusaurus serve --dir dist",
+ "test": "npm run cypress run",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
@@ -49,10 +50,12 @@
"@docusaurus/module-type-aliases": "^3.1.1",
"@docusaurus/tsconfig": "3.1.1",
"@prettier/sync": "^0.5.1",
+ "cypress": "^13.15.0",
"node-fetch": "^3.3.2",
"patch-package": "^8.0.0",
"prettier": "^3.2.5",
- "typescript": "^5.3.3"
+ "typescript": "^5.3.3",
+ "wait-on": "^8.0.1"
},
"browserslist": {
"production": [
@@ -66,4 +69,4 @@
"last 1 safari version"
]
}
-}
\ No newline at end of file
+}
diff --git a/src/css/announcement-bar.scss b/src/css/announcement-bar.scss
index d4edb830ef..dcc0012702 100644
--- a/src/css/announcement-bar.scss
+++ b/src/css/announcement-bar.scss
@@ -25,9 +25,10 @@ div [class^='announcementBar'] {
a {
text-decoration: none;
@apply text-indigo-500;
+ border-bottom: 1px dotted var(--ifm-color-gray-500);
&:hover {
- border-bottom: 1px dotted var(--ifm-color-gray-500);
+ border-bottom: 1px solid var(--ifm-color-gray-500);
@apply border-b-indigo-500;
}
}
diff --git a/src/css/markdown.scss b/src/css/markdown.scss
index db96c6dbd6..2c66172681 100644
--- a/src/css/markdown.scss
+++ b/src/css/markdown.scss
@@ -54,9 +54,10 @@ div.markdown {
text-decoration: none;
font-weight: var(--ifm-font-weight-semibold);
color: var(--ifm-link-color);
+ border-bottom: 1px dotted var(--ifm-link-color);
&:hover {
- border-bottom: 1px dotted var(--ifm-link-color);
+ border-bottom: 1px solid var(--ifm-link-color);
}
}
diff --git a/src/css/table-of-contents.scss b/src/css/table-of-contents.scss
index 1a8f6de0eb..e21ad1ca03 100644
--- a/src/css/table-of-contents.scss
+++ b/src/css/table-of-contents.scss
@@ -24,6 +24,10 @@
.table-of-contents > li > .table-of-contents__link {
font-weight: 600;
@apply my-3;
+
+ &.table-of-contents__link--active {
+ font-weight: 800;
+ }
}
.table-of-contents .table-of-contents__link--active {
@@ -31,6 +35,7 @@
html[data-theme='dark'] & {
@apply text-indigo-400;
}
+ font-weight: 700;
}
.table-of-contents__left-border {