diff --git a/blog/local-browsers.mdx b/blog/local-browsers.mdx index 1e8dcca..184a951 100644 --- a/blog/local-browsers.mdx +++ b/blog/local-browsers.mdx @@ -12,9 +12,9 @@ import localBrowsersExampleUrl from "/video/blog/local-browsers/local-browsers-e -Раньше Testplane с протоколом автоматизации webdriver можно было запустить локально только с вручную запущенным [selenium-standalone](https://github.com/webdriverio/selenium-standalone). Теперь достаточно указать `gridUrl: "local"` в [Конфиге Testplane](/docs/v8/command-line) или запустить тесты с [CLI-опцией](/docs/v8/command-line) `--local`. В таком случае перед запуском тестов при необходимости будут загружены соответствующие браузеры и вебдрайверы к ним, которые также будут запущены для дальнейшего использования в этих тестах. +Раньше Testplane с протоколом автоматизации webdriver можно было запустить локально только с вручную запущенным [selenium-standalone](https://github.com/webdriverio/selenium-standalone). Теперь достаточно указать `gridUrl: "local"` в [Конфиге Testplane](/docs/v8/reference/config/main) или запустить тесты с [CLI-опцией](/docs/v8/reference/cli) `--local`. В таком случае перед запуском тестов при необходимости будут загружены соответствующие браузеры и вебдрайверы к ним, которые также будут запущены для дальнейшего использования в этих тестах. -Загрузить браузеры и вебдрайверы к ним можно и отдельно, с помощью команды [install-deps](/docs/v8/command-line#install-deps). +Загрузить браузеры и вебдрайверы к ним можно и отдельно, с помощью команды [install-deps](/docs/v8/reference/cli#install-deps). Пример запуска тестов на локальном браузере с webdriver протоколом автоматизации: @@ -25,4 +25,4 @@ import localBrowsersExampleUrl from "/video/blog/local-browsers/local-browsers-e ### Как использовать? -Узнайте больше об этом в нашей документации [Как запустить Testplane в локальном браузере](/docs/v8/guides/local-browsers). +Узнайте больше об этом в нашей документации [Как запустить Testplane в локальном браузере](/docs/v8/basic-guides/managing-browsers). diff --git a/blog/storybook-testing.mdx b/blog/storybook-testing.mdx index 213f920..8c19d38 100644 --- a/blog/storybook-testing.mdx +++ b/blog/storybook-testing.mdx @@ -26,5 +26,5 @@ Also you can try it yourself in our [example project][example] on GitHub with cu [storybook]: https://storybook.js.org [testplane-storybook]: https://github.com/gemini-testing/testplane-storybook [play-function]: https://storybook.js.org/docs/writing-stories/play-function -[vt-story]: ../../docs/v8/visual-testing/with-storybook +[vt-story]: ../../docs/v8/basic-guides/visual-testing-with-storybook [example]: https://github.com/gemini-testing/testplane/tree/master/examples/storybook-autoscreenshots diff --git a/blog/testplane-vs-playwright.mdx b/blog/testplane-vs-playwright.mdx index ea2545f..4f50a7f 100644 --- a/blog/testplane-vs-playwright.mdx +++ b/blog/testplane-vs-playwright.mdx @@ -171,14 +171,14 @@ Playwright же связывает обновления инструмента ✅ Необходимо тестирование в широком спектре десктопных браузеров и мобильных устройств\ ✅ Требуется тестирование нативных приложений Android и iOS -[anti-aliasing-tolerance]: https://testplane.io/docs/v8/config/browsers/#antialiasing_tolerance +[anti-aliasing-tolerance]: https://testplane.io/docs/v8/reference/config/browsers/#antialiasing_tolerance [looks-same]: https://github.com/gemini-testing/looks-same [looks-same-benchmarks]: https://github.com/gemini-testing/looks-same/blob/master/benchmark/results.md [mpt]: https://learn.microsoft.com/en-us/azure/playwright-testing/ [report-visual-testing]: https://testplane.io/docs/v8/html-reporter/overview/#superb-visual-testing-capabilities [reporter]: https://testplane.io/docs/v8/html-reporter/overview/ [storybook]: https://storybook.js.org -[storybook-autotests]: https://testplane.io/docs/v8/visual-testing/with-storybook/ +[storybook-autotests]: https://testplane.io/docs/v8/basic-guides/visual-testing-with-storybook/ [testplane-mcp]: https://testplane.io/ru/docs/v8/testplane-mcp/ -[tolerance]: https://testplane.io/docs/v8/config/browsers/#tolerance +[tolerance]: https://testplane.io/docs/v8/reference/config/browsers/#tolerance [time-travel]: https://testplane.io/ru/docs/v8/guides/time-travel/ diff --git a/blog/time-travel-release.mdx b/blog/time-travel-release.mdx index c19bcc5..778573c 100644 --- a/blog/time-travel-release.mdx +++ b/blog/time-travel-release.mdx @@ -65,4 +65,4 @@ Time Travel записывает снапшоты DOM-дерева, что по Следите за новыми релизами в нашем блоге и в разделе [Release Notes на GitHub](https://github.com/gemini-testing/html-reporter/releases), а в случае обнаружения проблем приходите в [issue GitHub][gh-issues] — мы вам обязательно поможем! [gh-issues]: https://github.com/gemini-testing/testplane/issues -[time-travel-guide]: https://testplane.io/ru/docs/v8/guides/time-travel/ +[time-travel-guide]: https://testplane.io/ru/docs/v8/basic-guides/time-travel/ diff --git a/blog/vscode-extension.mdx b/blog/vscode-extension.mdx index fca9043..1716a47 100644 --- a/blog/vscode-extension.mdx +++ b/blog/vscode-extension.mdx @@ -9,7 +9,7 @@ import Admonition from "@theme/Admonition"; import runTestsFromSidebarVideoUrl from "/video/blog/vscode-extension/run-tests-from-sidebar.mp4"; import runTestsFromEditorVideoUrl from "/video/blog/vscode-extension/run-tests-from-editor.mp4"; -Для Testplane реализовали расширение для VS Code, с помощью которого можно настраивать Testplane с нуля, запускать тесты и удобно работать с REPL режимом. +Для Testplane реализовали расширение для VS Code, с помощью которого можно настраивать Testplane с нуля, запускать тесты и удобно работать с REPL режимом. @@ -80,7 +80,7 @@ Install Testplane #### С настройкой `REPL` -При клике в чекбокс `Enable REPL` и последующем запуске теста (в REPL режиме можно одновременно запустить только один тест) он будет запущен в специальном REPL режиме. Подробнее про этот режим можно прочитать здесь. +При клике в чекбокс `Enable REPL` и последующем запуске теста (в REPL режиме можно одновременно запустить только один тест) он будет запущен в специальном REPL режиме. Подробнее про этот режим можно прочитать здесь. ![Включение опции REPL](/img/blog/vscode-extension/enable-repl.png) diff --git a/docs/guides/component-testing.mdx b/docs/basic-guides/component-testing.mdx similarity index 98% rename from docs/guides/component-testing.mdx rename to docs/basic-guides/component-testing.mdx index 59401c8..4783b29 100644 --- a/docs/guides/component-testing.mdx +++ b/docs/basic-guides/component-testing.mdx @@ -184,9 +184,9 @@ Instances of the `browser` and `expect` are available inside of the browser's gl Calling the `log`, `info`, `warn`, `error`, `debug` and `table` commands on the `console` object in the browser causes information to be displayed not only in the browser's DevTools, but also in the terminal from which Testplane was launched. I.e., you can call `console.log` in the test/component and you will be able to see the result of it execution in the terminal. This is especially handy when debugging the test. -[test-run-env-option]: ../config/system.mdx#testrunenv +[test-run-env-option]: ../reference/config/system.mdx#testrunenv [browser-execute]: ../commands/browser/execute.mdx [testplane-examples-component-testing]: https://github.com/gemini-testing/testplane/tree/master/examples/component-testing [testplane-global-hook]: https://github.com/gemini-testing/testplane-global-hook [vite-hmr]: https://vitejs.dev/guide/api-hmr.html -[repl-mode]: ../command-line/index.mdx#testplane-repl +[repl-mode]: ../reference/cli.mdx#testplane-repl diff --git a/docs/guides/custom-commands.mdx b/docs/basic-guides/custom-commands.mdx similarity index 95% rename from docs/guides/custom-commands.mdx rename to docs/basic-guides/custom-commands.mdx index 7b921c8..0714e57 100644 --- a/docs/guides/custom-commands.mdx +++ b/docs/basic-guides/custom-commands.mdx @@ -1,7 +1,7 @@ import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import Admonition from "@theme/Admonition"; -import AddElementCommandExample from "@site/docs/config/_partials/examples/_prepare-browser-add-element-command.mdx"; +import AddElementCommandExample from "@site/docs/reference/config/_partials/examples/_prepare-browser-add-element-command.mdx"; # Custom Commands @@ -20,7 +20,7 @@ Testplane allows you to enhance your test suites by adding custom commands. Thes A good place to add all of your custom commands is - [`prepareBrowser`](../config/prepare-browser.mdx) hook. + [`prepareBrowser`](../reference/config/prepare-browser.mdx) hook. To add a custom command to the `browser` object, use the `addCommand` method. Here's how you can define a command that retrieves both the URL and title of the current page: diff --git a/docs/guides/how-to-debug-test.mdx b/docs/basic-guides/debugging-tests.mdx similarity index 99% rename from docs/guides/how-to-debug-test.mdx rename to docs/basic-guides/debugging-tests.mdx index bde9824..2a26f74 100644 --- a/docs/guides/how-to-debug-test.mdx +++ b/docs/basic-guides/debugging-tests.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to Debug a Test +# Debugging Tests ## Problem {#problem} diff --git a/docs/guides/how-to-manage-network-bandwidth.mdx b/docs/basic-guides/emulation.mdx similarity index 52% rename from docs/guides/how-to-manage-network-bandwidth.mdx rename to docs/basic-guides/emulation.mdx index 0e0ce69..10a3a0c 100644 --- a/docs/guides/how-to-manage-network-bandwidth.mdx +++ b/docs/basic-guides/emulation.mdx @@ -1,13 +1,45 @@ import Admonition from "@theme/Admonition"; -# How to Manage Network Bandwidth +# Emulation -## Overview {#overview} +## CPU Performance -This recipe only works when using _Chrome DevTools Protocol (CDP)_. -Read details in the section “[How to use CDP in Testplane][how-to-use-cdp]”. +This feature only works with browsers supporting _Chrome DevTools Protocol (CDP)_. + + + +The CPU speed on mobile devices is significantly slower than on computers. Therefore, to emulate CPU speed in _puppeteer_, there is a method called [emulateCPUThrottling][emulate-cpu-throttling]. + +### Example: Slowing Down CPU Speed by 8x {#example} + +Let's use this method to slow down CPU speed by 8 times: + +```javascript +it("should open yandex.ru with emulation 8x slower CPU", async function ({ browser }) { + // Get puppeteer instance + const puppeteer = await browser.getPuppeteer(); + + // Get the first open page (considering it to be currently active) + const [page] = await puppeteer.pages(); + + // Slow down the CPU speed by 8 times + await page.emulateCPUThrottling(8); + + await browser.url("https://yandex.ru"); +}); +``` + +[emulate-cpu-throttling]: https://pptr.dev/api/puppeteer.page.emulatecputhrottling +[cdp-session-send]: https://pptr.dev/api/puppeteer.cdpsession.send +[emulation-set-cpu-throttling-rate]: https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setCPUThrottlingRate + +## Network Bandwidth + + + +This feature only works with browsers supporting _Chrome DevTools Protocol (CDP)_. @@ -23,7 +55,7 @@ Besides custom settings, the [throttle][throttle] method supports the following - DSL - WiFi -## Example 1: Emulating a 2G Connection {#example_1} +### Example 1: Emulating a 2G Connection {#example_1} Let's emulate a 2G connection and open yandex.ru in Chrome with phone emulation: @@ -36,7 +68,7 @@ it("should open yandex.ru with emulation of 2G-connection", async function ({ br }); ``` -## Example 2: Emulating a Network with Given Characteristics {#example_2} +### Example 2: Emulating a Network with Given Characteristics {#example_2} We can also emulate a connection with specific characteristics: @@ -54,5 +86,4 @@ it("should open yandex.ru with emulation of custom connection", async function ( }); ``` -[how-to-use-cdp]: ../how-to-use-cdp [throttle]: ../../commands/browser/throttle diff --git a/docs/guides/local-browsers.mdx b/docs/basic-guides/managing-browsers.mdx similarity index 93% rename from docs/guides/local-browsers.mdx rename to docs/basic-guides/managing-browsers.mdx index 0a2c9dc..bf85f82 100644 --- a/docs/guides/local-browsers.mdx +++ b/docs/basic-guides/managing-browsers.mdx @@ -1,10 +1,10 @@ import Admonition from "@theme/Admonition"; -# How to Run Testplane in a Local Browser +# Managing Browsers ## Introduction -Testplane can automatically download browsers in accordance with your [Testplane Config](/docs/v8/config/main). +Testplane can automatically download browsers in accordance with your [Testplane Config](/docs/v8/reference/config/main). Additionally, if Testplane is used on a supported version of Ubuntu, the necessary deb packages for running browsers will also be downloaded in a similar manner. @@ -16,11 +16,11 @@ In a project with Testplane, you can execute the command `npx testplane install- You can also download only the necessary browsers described in the config. For example, if the browser `chrome-dark` is described, you can download only this one with the command `npm testplane install-deps chrome-dark'. -You can read more about this command on the respective page: [install-deps](/docs/v8/command-line#install-deps) +You can read more about this command on the respective page: [install-deps](/docs/v8/reference/cli#install-deps) ## Running tests -You can run tests on local browsers using the [CLI option](/docs/v8/command-line) `--local`, or with [gridUrl](/docs/v8/config/browsers/#grid_url): "local" in the [Testplane config](/docs/v8/config/main). For example: +You can run tests on local browsers using the [CLI option](/docs/v8/reference/cli) `--local`, or with [gridUrl](/docs/v8/reference/config/browsers/#grid_url): "local" in the [Testplane config](/docs/v8/reference/config/main). For example: ```bash npx testplane --local diff --git a/docs/guides/how-to-get-report.mdx b/docs/basic-guides/reporters.mdx similarity index 65% rename from docs/guides/how-to-get-report.mdx rename to docs/basic-guides/reporters.mdx index f9f8fd0..8f8b0a6 100644 --- a/docs/guides/how-to-get-report.mdx +++ b/docs/basic-guides/reporters.mdx @@ -1,49 +1,14 @@ -# How to Get a Test Run Report +# Reporters -## Testplane Report {#testplane_report} +## Simple Reporter {#testplane_report} -After completing all test runs, Testplane writes the result to the console in the form of a string like this: +Out of the box, Testplane writes the following summary to the console: ```bash Total: 1812 Passed: 1792 Failed: 0 Skipped: 20 Retries: 47 ``` -Where: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
StatusDescription
TotalTotal number of tests that Testplane read from the file system during launch.
PassedNumber of tests that passed successfully.
FailedNumber of tests that failed.
SkippedNumber of tests that were skipped during the run.
RetriesTotal number of test retries that occurred during the run.
- -However, this information may not be sufficient, so you can add the [stat-reporter][stat-reporter] plugin to your project. - -## stat-reporter Plugin Report {#stat_reporter_report} +## Stats Reporter {#stat_reporter_report} If you add the [stat-reporter][stat-reporter] plugin to your project, you will get a more detailed report of the run results in the console after completing all the tests. For example: @@ -79,7 +44,7 @@ If you add the [stat-reporter][stat-reporter] plugin to your project, you will g └──────────────────────┴────────┴───────┴────────┴────────┴─────────┴─────────┴──────────┘ ``` -Unlike the simple Testplane report, the `stat-reporter` plugin report breaks down the results by browser. It also displays the maximum execution time _(Duration)_ in minutes and seconds and the test run result _(Status)_ in each browser. +Unlike the simple reporter, the `stat-reporter` plugin report breaks down the results by browser. It also displays the maximum execution time _(Duration)_ in minutes and seconds and the test run result _(Status)_ in each browser. Such a report allows for a better understanding of which browsers encountered problems, specifically: where the most tests failed or the execution time sharply increased. @@ -87,22 +52,114 @@ The `stat-reporter` plugin also allows generating reports in HTML or JSON format However, in terms of capabilities, the [stat-reporter][stat-reporter] plugin is significantly inferior to the [html-reporter][html-reporter] plugin, which provides much more advanced ways to work with tests and their run results. -## html-reporter Plugin Report {#html_reporter_report} +## JSON Reporter {#json_reporter_report} + +Install the [json-reporter][json-reporter] plugin to get a JSON report with test results in the following format: + +```json +{ + "Main Page should send correct headers.chrome-138": { + "suitePath": ["Main Page", "should send correct headers"], + "fullName": "Main Page should send correct headers", + "browserId": "chrome-138", + "file": "tests/main-page/headers.testplane.js", + "duration": 2539, + "meta": { + "pid": 32410, + "browserVersion": "138.0", + "testXReqId": "e96e1911-db41-44a2-9980-fe78f16bb6b4", + "url": "https://ya.ru/" + }, + "startTime": 1766063685666, + "url": "/", + "status": "fail", + "errorReason": { + "message": "Cannot read properties of undefined (reading 'headers')", + "stack": "TypeError: Cannot read properties of undefined (reading 'headers')\n at Object. (/dev/hermione-playground/tests/main-page/headers.testplane.js:69:26)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)" + }, + "retries": [] + } +} +``` + +## HTML Reporter {#html_reporter_report} -Add the [html-reporter][html-reporter] plugin to your project to get a graphical HTML report with the results of all test runs. Additionally, in the generated report, you will be able to: +Testplane's HTML Reporter is an ever-evolving, sleek and feature-packed UI for analyzing test results. It allows you to: - filter tests by completion status; - group tests by errors or any parameter from the test metadata; - view screenshot differences in 6 different ways; - view all retries or errors in tests separately. -![html-reporter](/img/docs/guides/how-to-get-report.html-reporter.png) +![](/img/docs/html-reporter/html-reporter-demo.png) + +Besides static reports, HTML Reporter has an interactive GUI mode, letting you run your tests, work with visual checks and much more. Learn more about Testplane UI in the [dedicated docs section](../../html-reporter/overview). + +## Building Your Own + +Testplane is highly customizable by design, allowing you to build your own plugins and reporters for your specific needs. + +Here's what a basic reporter might look like: + +```typescript title="reporter.ts" +import fs from "fs"; +import type Testplane from "testplane"; +import type { TestResult } from "testplane"; + +interface ReporterConfig { + enabled?: boolean; + path?: string; +} + +interface TestInfo { + name: string; + status: string; +} -Moreover, the [html-reporter][html-reporter] allows running Testplane in a special GUI mode. In this mode, you can run and rerun tests, reshoot screenshots, use special debugging modes, and much more. +export = (testplane: Testplane, opts: ReporterConfig = {}): void => { + if (testplane.isWorker()) return; + + const config = { + enabled: opts.enabled !== false, + path: opts.path || "test-results.json", + }; + + if (!config.enabled) return; + + const results: TestInfo[] = []; + + testplane.on(testplane.events.TEST_PASS, (test: TestResult) => { + results.push({ name: test.fullTitle(), status: "passed" }); + }); + + testplane.on(testplane.events.TEST_FAIL, (test: TestResult) => { + results.push({ name: test.fullTitle(), status: "failed" }); + }); + + testplane.on(testplane.events.RUNNER_END, () => { + fs.writeFileSync(config.path, JSON.stringify(results, null, 2)); + console.log(`✓ Saved ${results.length} test results to ${config.path}`); + }); +}; +``` + +To use your custom reporter, you need to add it to the `testplane.config.ts` file: + +```typescript title="testplane.config.ts" +export default { + plugins: { + "./my-reporter": { + enabled: true, + path: "./reports/my-results.json", + }, + }, +}; +``` ## Keywords {#keywords} - stat-reporter +- json-reporter - html-reporter - gui @@ -112,4 +169,5 @@ Moreover, the [html-reporter][html-reporter] allows running Testplane in a speci - [html-reporter Plugin][html-reporter] [stat-reporter]: ../../plugins/stat-reporter +[json-reporter]: https://github.com/gemini-testing/json-reporter [html-reporter]: ../../html-reporter/html-reporter-setup diff --git a/docs/basic-guides/setup-and-teardown.mdx b/docs/basic-guides/setup-and-teardown.mdx new file mode 100644 index 0000000..7f55d16 --- /dev/null +++ b/docs/basic-guides/setup-and-teardown.mdx @@ -0,0 +1,122 @@ +# Setup and Teardown + +Testplane provides a way to run code before and after each test as well as once before/after the whole test run. You can use these hooks to prepare the environment, reduce repetition in your tests and more. + +## Before/After Each Test + +Use the [@testplane/global-hook][testplane-global-hook] plugin to perform actions before/after each test. Install the plugin: + +```shell +npm install -D @testplane/global-hook +``` + +Add the plugin to the plugins section of the testplane config and define hooks you need. + +In the example below, we're restoring browser state before each test — this is useful if your app requires auth. + +```typescript +export default { + // ... + plugins: { + "@testplane/global-hook": { + beforeEach: async ({ browser }) => { + await browser.restoreState(); + }, + afterEach: async ({ browser }) => { + await browser.execute(() => { + try { + localStorage.clear(); + } catch (e) {} + }); + }, + }, + }, +}; +``` + +Note: browser instance is available in the hooks as `browser` property of the context object. + +Learn more about the [`saveState`](../commands/browser/saveState.mdx) and [`restoreState`](../commands/browser/restoreState.mdx) browser commands in corresponding articles. + +[testplane-global-hook]: https://github.com/gemini-testing/testplane-global-hook + +## Before/After the Whole Testplane Run + +Use the `beforeAll` and `afterAll` hooks to perform actions before/after the whole testplane run. You can define these hooks in your Testplane config, as shown in example below. + +A neat use case for these is authenticating and saving auth state for use in subsequent tests: + +```typescript +import fs from "fs"; +import { launchBrowser } from "testplane/unstable"; + +const COOKIE_PATH = "./cookies.json"; + +export default { + browsers: { + "chrome-desktop": { + desiredCapabilities: { browserName: "chrome" }, + }, + }, + + beforeAll: async ({ config }) => { + const browser = await launchBrowser(config.browsers["chrome-desktop"]); + await browser.url("https://example.com/login"); + + await browser.setValue("#username", "user"); + await browser.setValue("#password", "pass"); + await browser.click("#submit"); + + const cookies = await browser.getCookies(); + fs.writeFileSync(COOKIE_PATH, JSON.stringify(cookies)); + + await browser.deleteSession(); + }, + + afterAll: async () => { + if (fs.existsSync(COOKIE_PATH)) { + fs.rmSync(COOKIE_PATH); + } + }, +}; +``` + +Note: there's no browser instance readily available in the `beforeAll` and `afterAll` hooks, you may use the [Standalone API](../reference/testplane-standalone-api.mdx) to launch a browser and perform actions with it. + +## The `prepareBrowser` hook + +The `prepareBrowser` hook is called once per browser session, after browser initialization, but before running any tests in it. + +A common use case for this hook is adding custom commands for use in tests: + +```typescript +export default { + // ... + prepareBrowser: function (browser) { + browser.addCommand("waitForCustomCondition", async function (selector) { + await this.waitForExist(selector); + await this.waitForDisplayed(selector); + }); + + require("./commands/auth-helpers")(browser); + require("./commands/api-helpers")(browser); + }, +}; +``` + +## The `prepareEnvironment` hook + +The `prepareEnvironment` hook is called once per process: in the main process and in each worker during config loading. This hook has config object available as `this`. + +This hook is useful only for very specific cases, prefer to use options above, unless you are sure what you are doing. + +```typescript +import { pick } from "lodash"; + +export default { + // ... + prepareEnvironment: function () { + this.sets = pick(this.sets, ["touch-phone"]); + }, +}; +``` diff --git a/docs/guides/time-travel.mdx b/docs/basic-guides/time-travel.mdx similarity index 97% rename from docs/guides/time-travel.mdx rename to docs/basic-guides/time-travel.mdx index 4ff70f5..0903a42 100644 --- a/docs/guides/time-travel.mdx +++ b/docs/basic-guides/time-travel.mdx @@ -1,7 +1,3 @@ ---- -sidebar_position: 1 ---- - import Admonition from "@theme/Admonition"; # Time Travel @@ -69,4 +65,4 @@ If for some reason this doesn't work for you, it can be disabled in the settings future, such as network request debugging and full-screen mode. -[config-reference]: ../../config/browsers#time_travel +[config-reference]: ../../reference/config/browsers#time_travel diff --git a/docs/visual-testing/with-storybook.mdx b/docs/basic-guides/visual-testing-with-storybook.mdx similarity index 97% rename from docs/visual-testing/with-storybook.mdx rename to docs/basic-guides/visual-testing-with-storybook.mdx index 352b192..6e42cda 100644 --- a/docs/visual-testing/with-storybook.mdx +++ b/docs/basic-guides/visual-testing-with-storybook.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Screenshot testing with Storybook +# Visual Testing with Storybook [Storybook][storybook] is a tool for developing user interfaces based on components. It allows developers to independently visualize components in various states in an isolated environment, separate from other components. This "showroom" is perfect for screenshot testing your components, as this isolated environment makes such tests significantly more stable and faster compared to e2e testing. @@ -195,10 +195,10 @@ Also, for storybook tests, the [isolation][isolation] option will be ignored, so [build-stories]: https://storybook.js.org/docs/6.4/configure/overview#feature-flags [html-reporter]: ../../html-reporter/html-reporter-setup/ -[isolation]: ../../config/browsers/#isolation +[isolation]: ../../reference/config/browsers/#isolation [play-function]: https://storybook.js.org/docs/writing-stories/play-function [plugin-link]: ../plugins/testplane-storybook.mdx [quickstart]: ../../quickstart [storybook]: https://storybook.js.org [testplane-storybook]: https://github.com/gemini-testing/testplane-storybook -[tests-per-session]: ../../config/browsers/#tests_per_session +[tests-per-session]: ../../reference/config/browsers/#tests_per_session diff --git a/docs/visual-testing/visual-testing-intro.mdx b/docs/basic-guides/visual-testing.mdx similarity index 99% rename from docs/visual-testing/visual-testing-intro.mdx rename to docs/basic-guides/visual-testing.mdx index 92e02c5..a94b8ac 100644 --- a/docs/visual-testing/visual-testing-intro.mdx +++ b/docs/basic-guides/visual-testing.mdx @@ -1,4 +1,4 @@ -# Visual testing +# Visual Testing Visual testing is implemented in testplane, with which the user can check the visual changes of an individual component, a viewport or the entire page. We recommend using the [html-reporter][html-reporter] plugin, which provides a user-friendly UI for analyzing tests, saving/updating modified images and running tests. diff --git a/docs/commands/browser/assertView.mdx b/docs/commands/browser/assertView.mdx index 4c9d85a..ef36fee 100644 --- a/docs/commands/browser/assertView.mdx +++ b/docs/commands/browser/assertView.mdx @@ -116,6 +116,6 @@ it("should assert view with given options", async ({ browser }) => { - [element.saveScreenshot](../../element/saveScreenshot) [webdriverio-api]: https://webdriver.io/docs/api -[browsers-tolerance]: ../../../config/browsers#tolerance -[browsers-antialiasing-tolerance]: ../../../config/browsers#antialiasing_tolerance +[browsers-tolerance]: ../../../reference/config/browsers#tolerance +[browsers-antialiasing-tolerance]: ../../../reference/config/browsers#antialiasing_tolerance [wait-for-static-to-load]: ../waitForStaticToLoad diff --git a/docs/commands/browser/getConfig.mdx b/docs/commands/browser/getConfig.mdx index be96867..6519368 100644 --- a/docs/commands/browser/getConfig.mdx +++ b/docs/commands/browser/getConfig.mdx @@ -24,4 +24,4 @@ it("some test", async ({ browser }) => { }); ``` -[browser-config]: ../../../config/browsers#browser_main_settings +[browser-config]: ../../../reference/config/browsers#browser_main_settings diff --git a/docs/commands/browser/restoreState.mdx b/docs/commands/browser/restoreState.mdx index 2e7f048..06f2b9d 100644 --- a/docs/commands/browser/restoreState.mdx +++ b/docs/commands/browser/restoreState.mdx @@ -150,5 +150,5 @@ export default { ## Related Commands {#related} - [saveState](../saveState) -- [afterAll](../../../config/after-all) -- [beforeAll](../../../config/before-all) +- [afterAll](../../../reference/config/after-all) +- [beforeAll](../../../reference/config/before-all) diff --git a/docs/commands/browser/saveState.mdx b/docs/commands/browser/saveState.mdx index 6d3116a..15cedd2 100644 --- a/docs/commands/browser/saveState.mdx +++ b/docs/commands/browser/saveState.mdx @@ -92,5 +92,5 @@ it("test", async ({ browser }) => { ## Related Commands {#related} - [restoreState](../restoreState) -- [afterAll](../../../config/after-all) -- [beforeAll](../../../config/before-all) +- [afterAll](../../../reference/config/after-all) +- [beforeAll](../../../reference/config/before-all) diff --git a/docs/commands/browser/throttle.mdx b/docs/commands/browser/throttle.mdx index e512387..f363e8c 100644 --- a/docs/commands/browser/throttle.mdx +++ b/docs/commands/browser/throttle.mdx @@ -70,4 +70,4 @@ it("should throttle the network", async ({ browser }) => { We'd like to give credit to the original WebdriverIO docs [article](https://webdriver.io/docs/api/browser/throttle), from which we drew some information while writing our version. [how-to-use-cdp]: ../../../guides/how-to-use-cdp -[how-to-manage-network-bandwidth]: ../../../guides/how-to-manage-network-bandwidth +[how-to-manage-network-bandwidth]: ../../../basic-guides/emulation diff --git a/docs/commands/browser/url.mdx b/docs/commands/browser/url.mdx index 7d07423..25bd964 100644 --- a/docs/commands/browser/url.mdx +++ b/docs/commands/browser/url.mdx @@ -59,5 +59,5 @@ await browser.url("/rootRelative"); We'd like to give credit to the original WebdriverIO docs [article](https://webdriver.io/docs/api/browser/url), from which we drew some information while writing our version. -[base-url]: ../../../config/browsers#base_url +[base-url]: ../../../reference/config/browsers#base_url [url-resolve]: https://nodejs.org/api/url.html#urlresolvefrom-to diff --git a/docs/commands/element/assertView.mdx b/docs/commands/element/assertView.mdx index 5f5a523..f88495a 100644 --- a/docs/commands/element/assertView.mdx +++ b/docs/commands/element/assertView.mdx @@ -71,7 +71,7 @@ it("should assert view", async ({ browser }) => { [webdriverio-api]: https://webdriver.io/docs/api [wait-for-exist]: ../waitForExist -[wait-timeout]: ../../../config/browsers#wait_timeout -[wait-interval]: ../../../config/browsers#wait_interval -[browsers-tolerance]: ../../../config/browsers#tolerance -[browsers-antialiasing-tolerance]: ../../../config/browsers#antialiasing_tolerance +[wait-timeout]: ../../../reference/config/browsers#wait_timeout +[wait-interval]: ../../../reference/config/browsers#wait_interval +[browsers-tolerance]: ../../../reference/config/browsers#tolerance +[browsers-antialiasing-tolerance]: ../../../reference/config/browsers#antialiasing_tolerance diff --git a/docs/commands/element/waitForClickable.mdx b/docs/commands/element/waitForClickable.mdx index 26275da..65e16ba 100644 --- a/docs/commands/element/waitForClickable.mdx +++ b/docs/commands/element/waitForClickable.mdx @@ -50,4 +50,4 @@ it("should detect when element is no longer clickable", async ({ browser }) => { We'd like to give credit to the original WebdriverIO docs [article](https://webdriver.io/docs/api/element/waitForClickable), from which we drew some information while writing our version. -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/docs/commands/element/waitForDisplayed.mdx b/docs/commands/element/waitForDisplayed.mdx index b398053..06131f2 100644 --- a/docs/commands/element/waitForDisplayed.mdx +++ b/docs/commands/element/waitForDisplayed.mdx @@ -63,4 +63,4 @@ it("should detect when element is no longer visible", async ({ browser }) => { We'd like to give credit to the original WebdriverIO docs [article](https://webdriver.io/docs/api/element/waitForDisplayed), from which we drew some information while writing our version. -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/docs/commands/element/waitForEnabled.mdx b/docs/commands/element/waitForEnabled.mdx index 2376413..92bcf57 100644 --- a/docs/commands/element/waitForEnabled.mdx +++ b/docs/commands/element/waitForEnabled.mdx @@ -63,4 +63,4 @@ it("should detect when element is no longer visible", async ({ browser }) => { We'd like to give credit to the original WebdriverIO docs [article](https://webdriver.io/docs/api/element/waitForEnabled), from which we drew some information while writing our version. -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/docs/commands/element/waitForExist.mdx b/docs/commands/element/waitForExist.mdx index 0075120..d158a48 100644 --- a/docs/commands/element/waitForExist.mdx +++ b/docs/commands/element/waitForExist.mdx @@ -60,4 +60,4 @@ it("should remove a message after successful form submit", async ({ browser }) = We'd like to give credit to the original WebdriverIO docs [article](https://webdriver.io/docs/api/element/waitForExist), from which we drew some information while writing our version. -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/docs/commands/expect/overview.mdx b/docs/commands/expect/overview.mdx index 26add71..28badd9 100644 --- a/docs/commands/expect/overview.mdx +++ b/docs/commands/expect/overview.mdx @@ -45,4 +45,4 @@ By default, the timeout for executing asserts is 2000ms with a check interval of } ``` -[system_config]: ../../../config/system#expect_opts +[system_config]: ../../../reference/config/system#expect_opts diff --git a/docs/comparison/compare-with-playwright.mdx b/docs/comparison/compare-with-playwright.mdx index 767fdf9..b6e9d98 100644 --- a/docs/comparison/compare-with-playwright.mdx +++ b/docs/comparison/compare-with-playwright.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Compare Testplane with Playwright +# Testplane vs Playwright Both **Testplane** and **Playwright** are end-to-end testing solutions, but they have different approaches and capabilities. In this article, we'll conduct a detailed comparison of these tools to help you make the right choice. @@ -157,7 +157,7 @@ Playwright links tool updates with browser updates, which can lead to unexpected ✅ Testing across a wide range of desktop browsers and mobile devices is necessary\ ✅ Testing of native Android and iOS applications is required -[anti-aliasing-tolerance]: https://testplane.io/docs/v8/config/browsers/#antialiasing_tolerance +[anti-aliasing-tolerance]: https://testplane.io/docs/v8/reference/config/browsers/#antialiasing_tolerance [looks-same]: https://github.com/gemini-testing/looks-same [looks-same-benchmarks]: https://github.com/gemini-testing/looks-same/blob/master/benchmark/results.md [mpt]: https://learn.microsoft.com/en-us/azure/playwright-testing/ @@ -166,5 +166,5 @@ Playwright links tool updates with browser updates, which can lead to unexpected [storybook]: https://storybook.js.org [storybook-autotests]: https://testplane.io/docs/v8/visual-testing/with-storybook/ [testplane-mcp]: https://testplane.io/docs/v8/testplane-mcp/ -[tolerance]: https://testplane.io/docs/v8/config/browsers/#tolerance +[tolerance]: https://testplane.io/docs/v8/reference/config/browsers/#tolerance [time-travel]: https://testplane.io/docs/v8/guides/time-travel/ diff --git a/docs/guides/android-testing.mdx b/docs/guides/android-testing.mdx index 1f3db5e..d18ada3 100644 --- a/docs/guides/android-testing.mdx +++ b/docs/guides/android-testing.mdx @@ -1,9 +1,9 @@ import Admonition from "@theme/Admonition"; -# Testing Android Applications +# Android Apps Testing - The article currently contains basic information and will be improved in [testplane#1002](https://github.com/gemini-testing/testplane/issues/1002). + The article is a work in progress and will be improved in [testplane#1002](https://github.com/gemini-testing/testplane/issues/1002). If you have any questions, please refer to the [discussions](https://github.com/gemini-testing/testplane/discussions) on GitHub. diff --git a/docs/guides/how-to-add-testing-library.mdx b/docs/guides/how-to-add-testing-library.mdx index d682805..3029f24 100644 --- a/docs/guides/how-to-add-testing-library.mdx +++ b/docs/guides/how-to-add-testing-library.mdx @@ -1,10 +1,10 @@ -# How to Connect testing-library in testplane +# Installing Testing Library ## Introduction {#preface} [Testing-library][testing-library] is a collection of tools for testing web application user interfaces, focused on creating reliable and maintainable tests by emphasizing user behavior. The main advantage of `testing-library` is its focus on interaction with interface elements. And in testplane, you can use the element search methods provided by the `testing-library` itself. -## Connection +## Installation To be able to use [queries][queries] from `testing-library` in Testplane tests, you only need to follow a few steps. @@ -29,7 +29,7 @@ export default { }; ``` -If you have problems with types, add types obviously to `tsconfig.json` +If you have problems with types, add types explicitly to `tsconfig.json` ```json { @@ -41,7 +41,7 @@ If you have problems with types, add types obviously to `tsconfig.json` ## Usage -After configuring, you will be able to use the search by selectors from `testing-library`, as described in the [official documentation](https://testing-library.com/docs/queries/about/). For example, searching for an element by its text: +You can search by selectors from `testing-library` as described in the [official docs](https://testing-library.com/docs/queries/about/). For example, here's how to search for an element by its text: ```javascript it("example", async ({ browser }) => { @@ -53,7 +53,7 @@ it("example", async ({ browser }) => { }); ``` -This feature will also be available in the context of found elements: +You can also use testing-library queries on elements: ```javascript it("example", async ({ browser }) => { diff --git a/docs/guides/how-to-check-accessibility.mdx b/docs/guides/how-to-check-accessibility.mdx index 6aad5c0..dd57ca9 100644 --- a/docs/guides/how-to-check-accessibility.mdx +++ b/docs/guides/how-to-check-accessibility.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to Test Page Accessibility +# Accessibility Testing ## Overview {#overview} diff --git a/docs/guides/how-to-check-test-stability.mdx b/docs/guides/how-to-check-test-stability.mdx deleted file mode 100644 index 3883c9f..0000000 --- a/docs/guides/how-to-check-test-stability.mdx +++ /dev/null @@ -1,51 +0,0 @@ -# How to Check Test Stability - -## Problem {#problem} - -There are many reasons why tests can fail: - -- infrastructure issues – browser unavailability, network malfunctions, expired access, etc. -- problems with external services the test interacts with; -- races within the test itself, where an element does not render in time and the wait period expires; -- unexpected popups during the test execution that obscure the necessary element, cause differences in screenshots, or prevent clicking the needed element; -- and so on. - -Often these failures do not reproduce on the first attempt. Therefore, to ensure a newly written test is stable, it needs to be run multiple times. But there is one problem: if you run your test in Testplane _as is,_ after the first successful run, Testplane will stop running your test. The test passed – everything is OK. But for stability verification, this is not enough. The test might have passed accidentally, and if you rerun it, it might fail. Ideally, you want to run it not just once or twice, but for example, 20 times and see how many times it passes out of 20. Or 30 times. Or... and so on. - -## Solution: @testplane/test-repeater {#solution} - -To solve this problem, the [@testplane/test-repeater][testplane-test-repeater] plugin was developed. - -The plugin allows you to run the same test (or group of tests) the required number of times. - -The plugin ensures that the tests will be run as many times as you specify, regardless of the results of each run. Moreover, the plugin allows you to start the tests each time in a new browser session. This eliminates browser degradation or other side effects that might occur with repeated runs in the same browser session. - -Read more about how to add this plugin to a project, configure, and use it in the [plugin documentation][testplane-test-repeater]. - -## Usage Examples {#usage} - -Below are examples of test runs, in which they were run 21 times (1 primary + 20 retries) to check their stability. - -### Example of Broken Tests - -As seen in the screenshot, the tests were run 21 times and never completed successfully: - -![Broken Test](/img/docs/guides/how-to-check-test-stability.total-failure.png) - -### Example of Stable Test - -Here, on the contrary, all runs were successful: - -![Stable Test](/img/docs/guides/how-to-check-test-stability.total-success.png) - -### Example of Unstable Tests - -In the next screenshot, the first test is almost non-functional – out of 21 attempts, the test passed only once. The second test is quite stable, although 2 failures out of 21 is still not 100% stability. The developer may try to understand why the test fails occasionally. - -![Unstable Test](/img/docs/guides/how-to-check-test-stability.unstable-test.png) - -## Keywords {#keywords} - -- @testplane/test-repeater - -[testplane-test-repeater]: ../../plugins/testplane-test-repeater diff --git a/docs/guides/how-to-hide-scrollbars-by-cdp.mdx b/docs/guides/how-to-hide-scrollbars-by-cdp.mdx deleted file mode 100644 index b1fd997..0000000 --- a/docs/guides/how-to-hide-scrollbars-by-cdp.mdx +++ /dev/null @@ -1,48 +0,0 @@ -import Admonition from "@theme/Admonition"; - -# How to Hide Scrollbars Using Chrome DevTools Protocol - -## Overview {#overview} - - -This recipe only works when using _Chrome DevTools Protocol (CDP)_. - -Read details in the section “[How to use CDP in Testplane][how-to-use-cdp]” - - - -One of the reasons for test failures when testing layouts using screenshots is the presence of scrollbars in the browser at the moment the screenshot is taken. You can read more about this problem and some ways to solve it [here](../how-to-hide-scrollbars). This problem arises particularly often in tests with mobile emulation. - -CDP has a special method [Emulation.setScrollbarsHidden][set-scrollbars-hidden] that allows hiding the scrollbar. However, _puppeteer_ lacks a wrapper for this method. Therefore, we will use the [CDPSession.send][cdp-session-send] method to execute the [Emulation.setScrollbarsHidden][set-scrollbars-hidden] command. - -## Example: How to Hide Scrollbars Using CDP {#example} - -Here's how it looks: - -```javascript -it("should hide scrollbar", async function ({ browser }) { - // Get puppeteer instance - const puppeteer = await browser.getPuppeteer(); - - // Get the first open page (considering it to be currently active) - const [page] = await puppeteer.pages(); - - // Create a CDP session - const client = await page.target().createCDPSession(); - - // Hide the scrollbar - await client.send("Emulation.setScrollbarsHidden", { hidden: true }); - - await browser.url("https://yandex.ru"); -}); -``` - -## Useful Links {#useful_links} - -Also, read our recipe “[How to Hide Scrollbars from Screenshots](../how-to-hide-scrollbars)”. - -There you will also learn about the [hermione-hide-scrollbars](../../plugins/hermione-hide-scrollbars) plugin, which is implemented based on the [Emulation.setScrollbarsHidden][set-scrollbars-hidden] method and which you can use to disable scrollbars in CI for all tests in specific browsers. - -[how-to-use-cdp]: ../how-to-use-cdp -[set-scrollbars-hidden]: https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setScrollbarsHidden -[cdp-session-send]: https://pptr.dev/next/api/puppeteer.cdpsession.send diff --git a/docs/guides/how-to-intercept-requests-and-responses.mdx b/docs/guides/how-to-intercept-requests-and-responses.mdx index 1ee405a..f795690 100644 --- a/docs/guides/how-to-intercept-requests-and-responses.mdx +++ b/docs/guides/how-to-intercept-requests-and-responses.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to Track and Intercept Network Requests and Responses +# Mocking Network Requests ## Overview {#overview} diff --git a/docs/guides/how-to-manage-cpu-performance.mdx b/docs/guides/how-to-manage-cpu-performance.mdx deleted file mode 100644 index f6db9d6..0000000 --- a/docs/guides/how-to-manage-cpu-performance.mdx +++ /dev/null @@ -1,64 +0,0 @@ -import Admonition from "@theme/Admonition"; - -# How to Manage CPU Performance - -## Overview {#overview} - - -This recipe only works when using _Chrome DevTools Protocol (CDP)_. - -Read details in the section “[How to Use CDP in Testplane][how-to-use-cdp]” - - - -The CPU speed on mobile devices is significantly slower than on computers. Therefore, to emulate CPU speed in _puppeteer_, there is a method called [emulateCPUThrottling][emulate-cpu-throttling]. - -## Example: Slowing Down CPU Speed by 8x {#example} - -Let's use this method to slow down CPU speed by 8 times: - -```javascript -it("should open yandex.ru with emulation 8x slower CPU", async function ({ browser }) { - // Get puppeteer instance - const puppeteer = await browser.getPuppeteer(); - - // Get the first open page (considering it to be currently active) - const [page] = await puppeteer.pages(); - - // Slow down the CPU speed by 8 times - await page.emulateCPUThrottling(8); - - await browser.url("https://yandex.ru"); -}); -``` - -## A Small Story About a Workaround {#workaround_in_the_past} - -Initially, _webdriverio_ did not support the `page.emulateCPUThrottling` method because _webdriverio_ used _puppeteer-core@9.1.0,_ not _puppeteer-core@10.1.0_, which supports this method. - -However, this limitation could be bypassed using puppeteer's [CDPSession.send()][cdp-session-send] method by sending the browser the [Emulation.setCPUThrottlingRate][emulation-set-cpu-throttling-rate] command via CDP: - -```javascript -it("should open yandex.ru with emulation 8x slower CPU", async function ({ browser }) { - // Get puppeteer instance - const puppeteer = await browser.getPuppeteer(); - - // Get the first open page (considering it to be currently active) - const [page] = await puppeteer.pages(); - - // Create a CDP session - const client = await page.target().createCDPSession(); - - // Slow down the CPU speed by 8 times - await client.send("Emulation.setCPUThrottlingRate", { rate: 8 }); - - await browser.url("https://yandex.ru"); -}); -``` - -Later, we submitted a requisite [pull request](https://github.com/webdriverio/webdriverio/pull/7135) to _webdriverio_ to update the version of _puppeteer-core_. Now, the [emulateCPUThrottling][emulate-cpu-throttling] method is available in Testplane right out of the box. - -[how-to-use-cdp]: ../how-to-use-cdp -[emulate-cpu-throttling]: https://pptr.dev/api/puppeteer.page.emulatecputhrottling -[cdp-session-send]: https://pptr.dev/api/puppeteer.cdpsession.send -[emulation-set-cpu-throttling-rate]: https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setCPUThrottlingRate diff --git a/docs/guides/how-to-optimize-test-code.mdx b/docs/guides/how-to-optimize-test-code.mdx deleted file mode 100644 index 7f7514f..0000000 --- a/docs/guides/how-to-optimize-test-code.mdx +++ /dev/null @@ -1,23 +0,0 @@ -# How to Eliminate Duplication in Tests - -## Problem {#problem} - -Often, before running the next Testplane test, certain preparatory work needs to be done, such as: - -- clearing all cookies; -- cleaning localStorage; -- initializing some test variable. - -Similarly, after completing the main checks in a Testplane test, you may always want to check for errors in the client code, the triggering of required metrics, etc. - -## Solution: testplane-global-hook {#solution} - -To avoid repeating these actions each time in your tests, add the [testplane-global-hook][testplane-global-hook] plugin and describe them in the plugin settings as functions for the `beforeEach` and `afterEach` hooks. - -Learn more about how to add and configure the plugin in the [plugin documentation][testplane-global-hook]. - -## Keywords {#keywords} - -- testplane-global-hook - -[testplane-global-hook]: ../../plugins/testplane-global-hook diff --git a/docs/guides/how-to-run-on-github.mdx b/docs/guides/how-to-run-on-github.mdx index 53e3acc..15a43af 100644 --- a/docs/guides/how-to-run-on-github.mdx +++ b/docs/guides/how-to-run-on-github.mdx @@ -1,10 +1,10 @@ -# How to Run Testplane in GitHub CI +# Testplane in GitHub Actions ## Introduction To run Testplane in GitHub CI, there's a [dedicated GitHub Action][gh-actions-testplane] that: -- Handles caching of [local browsers](/docs/v8/guides/local-browsers) (if used); +- Handles caching of [local browsers](/docs/v8/basic-guides/managing-browsers) (if used); - Writes statistics about failed tests to [Job Summary](https://github.blog/news-insights/product-news/supercharging-github-actions-with-job-summaries/); - Helps display [HTML reports](../../html-reporter/html-reporter-setup) with test results in the browser. diff --git a/docs/guides/how-to-run-specified-test.mdx b/docs/guides/how-to-run-specified-test.mdx deleted file mode 100644 index 950e1f8..0000000 --- a/docs/guides/how-to-run-specified-test.mdx +++ /dev/null @@ -1,51 +0,0 @@ -# How to Run Specific Tests - -## Problem {#problem} - -Sometimes you may need to run specific tests rather than the entire set of tests in your project. - -For example, you developed a feature and covered it with functional tests. You might want to first check the correctness of the new tests. - -Or you are fixing a flaky test, found bugs, fixed them, and want to verify that the test now passes correctly. - -## Solution 1: Running a Specific File {#solution_1} - -If you want to run a whole group of tests located in a specific file, specify the path to this file as an input parameter for testplane: - -```bash -testplane src/features/Reviews/Reviews.test/MyReview/MyReview.a11y@touch-phone.testplane.js -``` - -## Solution 2: --grep Option {#solution_2} - -If you want to run a specific test, use the `--grep` option by providing the full name of the test as its value: - -```bash -testplane --grep "Accessibility Leaving a review" -``` - -## Solution 3: .only Directive {#solution_3} - -You can also use the `.only` directive for a suite of tests (`describe`) or a specific test (`it`), similar to what is implemented in `mocha` (see the [exclusive tests](https://mochajs.org/#exclusive-tests) section): - -For example: - -```javascript -describe.only("Accessibility", function () { - // Test suite... -}); -``` - -or - -```javascript -it.only("Leaving a review", async function () { - // Test code... -}); -``` - -## Keywords {#keywords} - -- grep -- describe.only -- it.only diff --git a/docs/guides/how-to-skip-test-in-browsers.mdx b/docs/guides/how-to-skip-test-in-browsers.mdx deleted file mode 100644 index 8a755cc..0000000 --- a/docs/guides/how-to-skip-test-in-browsers.mdx +++ /dev/null @@ -1,81 +0,0 @@ -# How to Skip a Test in a Specific Browser - -## Problem {#problem} - -Sometimes you need to skip running a test in a specific browser, rather than in all browsers. That is, you don't want to disable or delete the entire test, but only want to limit the number of browsers in which it will run. - -For example, this could be due to the limited functionality of the respective browser: the absence of necessary features that are used on the web page and checked by the test. - -Another reason could be the unstable behavior of the test in a particular browser due to certain implementation nuances in the browser. - -In testplane, you can do this using special helpers (directives) `skip` and `only`. - -## Solution 1: .skip.in Directive {#solution_1} - -For example, if you don't want to run the test in `IE8`: - -```javascript -describe("feature", function () { - testplane.skip.in("ie8", "it cannot work in this browser"); - it("nowaday functionality", function () { - // ... - }); -}); -``` - -When using the `testplane.skip.in` directive, you will see a message in the report indicating that the run was skipped in the respective browser. - -To skip the test runs without notifications in the report, you can pass a special flag `silent` to the helper as the third argument: - -```javascript -testplane.skip.in("ie8", "skipReason", { silent: true }); -``` - -## Solution 2: .skip.notIn Directive {#solution_2} - -You might also want to run the test only in a specific browser, for example, in `Chrome`: - -```javascript -describe("feature", function () { - testplane.skip.notIn("chrome", "it should work only in Chrome"); - it("specific functionality", function () { - // ... - }); -}); -``` - -Similarly, to avoid notifications in the report, you can pass a special flag `silent` to the helper as the third argument: - -```javascript -testplane.skip.notIn("chrome", "skipReason", { silent: true }); -``` - -## Solution 3: .only.in and .only.notIn Directives {#solution_3} - -You can also use the helpers `only.in` and `only.notIn`, whose logic is the opposite of the helpers `skip.in` and `.skip.notIn`. Additionally, these helpers do not, by default, produce any notifications in the report: - -```javascript -testplane.only.in("chrome"); // run the test only in Chrome -``` - -```javascript -testplane.only.notIn("ie8"); // run the test in all browsers except IE8 -``` - -## Solution 4: .also.in Directive and Passive Browser Option {#solution_4} - -If you are introducing a new browser and need to run it only in a few tests while having thousands of them, using the `.skip.in` helper may be inconvenient. To solve this problem, you can use the [passive][passive-option] browser option and the helper `.also.in`: - -```javascript -testplane.also.in("ie8"); // run the test in the passive browser IE8 -``` - -## Keywords {#keywords} - -- testplane.skip.in -- testplane.skip.notIn -- testplane.only.in -- testplane.only.notIn -- testplane.also.in - -[passive-option]: ../../config/browsers#passive diff --git a/docs/guides/how-to-update-browsers.mdx b/docs/guides/how-to-update-browsers.mdx index 0fc15d8..662a5f0 100644 --- a/docs/guides/how-to-update-browsers.mdx +++ b/docs/guides/how-to-update-browsers.mdx @@ -3,7 +3,7 @@ import TabItem from "@theme/TabItem"; import Admonition from "@theme/Admonition"; -# How to Update Browsers in Large Projects +# Updating Browsers at Scale ## Problem @@ -41,14 +41,14 @@ The drawback of this approach is that you need to manually change the test files ## Solution 2: Browser Version Changer -You can use the [hermione-browser-version-changer][hermione-browser-version-changer] plugin, which allows you to define the browser version for a specific test based on a special dictionary _(store)_ and predicates for all available browser versions in the project. +You can use the [@testplane/browser-version-changer][hermione-browser-version-changer] plugin, which allows you to define the browser version for a specific test based on a special dictionary _(store)_ and predicates for all available browser versions in the project. Example usage of the plugin: ```javascript module.exports = { plugins: { - "hermione-browser-version-changer": { + "@testplane/browser-version-changer": { enabled: true, initStore: async () => { // Prepare a dictionary with arbitrary tags for labeling @@ -86,7 +86,7 @@ module.exports = { The provided example is very conditional, and it is possible that in your project you won’t even need to use a _store_, and checking the test against a given regex pattern will be sufficient. -[hermione-browser-version-changer]: ../../plugins/hermione-browser-version-changer +[@testplane/browser-version-changer]: ../../plugins/hermione-browser-version-changer [testplane]: https://github.com/gemini-testing/testplane [html-reporter]: ../../html-reporter/html-reporter-setup [gh-issues]: https://github.com/gemini-testing/testplane/issues/ diff --git a/docs/guides/how-to-use-cdp.mdx b/docs/guides/how-to-use-cdp.mdx index 07463cd..85d0d3b 100644 --- a/docs/guides/how-to-use-cdp.mdx +++ b/docs/guides/how-to-use-cdp.mdx @@ -1,3 +1,10 @@ +--- +unlisted: true +sidebar_class_name: hidden +--- + + + import Admonition from "@theme/Admonition"; # How to Use Chrome DevTools Protocol in Testplane @@ -112,7 +119,7 @@ With CDP, you can: [puppeteer]: https://pptr.dev/ [how-to-intercept-requests-and-responses]: ../how-to-intercept-requests-and-responses [how-to-check-accessibility]: ../how-to-check-accessibility -[how-to-manage-network-bandwidth]: ../how-to-manage-network-bandwidth -[how-to-manage-cpu-performance]: ../how-to-manage-cpu-performance -[how-to-hide-scrollbars-by-cdp]: ../how-to-hide-scrollbars-by-cdp +[how-to-manage-network-bandwidth]: ../../basic-guides/emulation +[how-to-manage-cpu-performance]: ../../basic-guides/emulation +[how-to-hide-scrollbars-by-cdp]: ../visual-checks-best-practices/hiding-scrollbars [webdriver-vs-cdp]: ../../reference/webdriver-vs-cdp diff --git a/docs/guides/selectivity.mdx b/docs/guides/selectivity.mdx index 8760e67..14c8215 100644 --- a/docs/guides/selectivity.mdx +++ b/docs/guides/selectivity.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to configure selectivity when running tests +# Selectivity ## Introduction @@ -22,7 +22,7 @@ After a file changes, on the next run only those tests that depend on the change ## Setup -To enable selectivity, just add a [`selectivity`](/docs/v8/config/browsers#selectivity) section with `enabled: true` to your Testplane configuration: +To enable selectivity, just add a [`selectivity`](/docs/v8/reference/config/browsers#selectivity) section with `enabled: true` to your Testplane configuration: ```typescript // testplane.config.ts @@ -224,5 +224,5 @@ testplane_selectivity_enabled=false # disable Additional information about selectivity configuration is provided in the [browsers-selectivity][selectivity-config] section of the documentation. -[dev-server]: ../../config/dev-server -[selectivity-config]: ../../config/browsers#selectivity +[dev-server]: ../../reference/config/dev-server +[selectivity-config]: ../../reference/config/browsers#selectivity diff --git a/docs/guides/visual-checks-best-practices/_category_.json b/docs/guides/visual-checks-best-practices/_category_.json new file mode 100644 index 0000000..1954484 --- /dev/null +++ b/docs/guides/visual-checks-best-practices/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Visual Testing Best Practices", + "collapsed": false +} diff --git a/docs/guides/how-to-hide-scrollbars.mdx b/docs/guides/visual-checks-best-practices/hiding-scrollbars.mdx similarity index 50% rename from docs/guides/how-to-hide-scrollbars.mdx rename to docs/guides/visual-checks-best-practices/hiding-scrollbars.mdx index dea9864..44acc43 100644 --- a/docs/guides/how-to-hide-scrollbars.mdx +++ b/docs/guides/visual-checks-best-practices/hiding-scrollbars.mdx @@ -1,20 +1,36 @@ import Admonition from "@theme/Admonition"; -# How to Hide Scrollbars from Screenshots +# Hiding Scrollbars -## Problem {#problem} +Scrollbars can be a source of flakiness in visual tests — they can randomly appear, disappear and change their position. We strongly recommend hiding them if you perform visual checks. -One of the reasons for test failures when testing layouts using screenshots is the presence of scrollbars in the browser at the moment the screenshot is taken. There can be 3 scenarios where a diff occurs between the reference screenshot and the current one taken during the test run: +Example of a diff due to scrollbar: -1. There was no scrollbar when the reference screenshot was taken, but it appeared when taking the current screenshot. -2. There was a scrollbar when the reference screenshot was taken, but it did not appear in time when taking the current screenshot. -3. There is a scrollbar on both the reference and current screenshots, but the positions, sizes, or transparency of the scrollbars differ due to the timing of when the screenshots were taken relative to the appearance of the scrollbar. +![diff due to scrollbar](/img/docs/guides/how-to-hide-scrollbars.diff-in-screenshot.png) -The screenshot below shows an example corresponding to the first scenario: +## Solution 1: Using the `--hide-scrollbars` flag (recommended) {#solution_1} -![diff due to scrollbar](/img/docs/guides/how-to-hide-scrollbars.diff-in-screenshot.png) +Chrome, starting from around version 50 (and likely other Chromium-based browsers) supports the `--hide-scrollbars` flag. You can specify it in the browser settings like this: + +```diff +module.exports = { + browsers: { + chrome: { + desiredCapabilities: { + browserName: "chrome", + browserVersion: "125.0", + "goog:chromeOptions": { + args: ["--hide-scrollbars"], + }, + }, + }, + }, +}; +``` + +## Solution 2: screenshotDelay {#solution_2} -## Solution 1: screenshotDelay {#solution_1} +If the browser you are using doesn't support the `--hide-scrollbars` flag, you can use the `screenshotDelay` option to wait until the scrollbar disappears or becomes stable. In Testplane settings, there is a mandatory option `browsers` that specifies the set of browsers available in the project and their properties. Select the browser where you are experiencing diffs due to scrollbars and add the `screenshotDelay` option for it: @@ -42,7 +58,9 @@ Often screenshots generate diffs because the test needs to scroll the page to th However, this method does not always work as it depends on the implementation and behavior of the browsers. -## Solution 2: Disabling Scrollbars {#solution_2} +## Solution 3: Disabling Scrollbars using CDP {#solution_3} + +This solution is useful for very old Chrome versions or browsers that do not support the `--hide-scrollbars` flag, but do support the `Emulation.setScrollbarsHidden` CDP method. If scrollbars appear in screenshots in the Chrome browser, they can be disabled using the [DevTools protocol][CDP]. @@ -54,10 +72,30 @@ To do this, add the [hermione-hide-scrollbars][hermione-hide-scrollbars] plugin which is used to disable the scrollbars. +The `hermione-hide-scrollbars` plugin is based on the `Emulation.setScrollbarsHidden` CDP method, so alternatively you can do it yourself: + +```javascript +it("should hide scrollbar", async function ({ browser }) { + // Get puppeteer instance + const puppeteer = await browser.getPuppeteer(); + + // Get the first open page (considering it to be currently active) + const [page] = await puppeteer.pages(); + + // Create a CDP session + const client = await page.target().createCDPSession(); + + // Hide the scrollbar + await client.send("Emulation.setScrollbarsHidden", { hidden: true }); + + await browser.url("https://yandex.ru"); +}); +``` + ## Keywords {#keywords} - screenshotDelay - hermione-hide-scrollbars -[hermione-hide-scrollbars]: ../../plugins/hermione-hide-scrollbars +[hermione-hide-scrollbars]: ../../../plugins/hermione-hide-scrollbars [CDP]: https://chromedevtools.github.io/devtools-protocol/ diff --git a/docs/index.mdx b/docs/index.mdx index 8474a68..e261294 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -39,7 +39,7 @@ And that’s not all. ### Fast Test Execution {#fast} - thanks to [parallelism within Testplane][testplane-workers]; -- scale using [testplane-chunks][testplane-chunks]; +- scale using [@testplane/chunks][testplane-chunks]; - [reusing sessions][sessions-reuse]; - session caching with browsers; - 20,000 tests in 10 minutes. @@ -91,15 +91,15 @@ And that’s not all. - available [extension points][html-reporter-extension-points] in the Testplane report; - [extend the Testplane CLI from your plugin][testplane-cli], adding new commands and options. -[assert-view-opts]: ./config/browsers#assert_view_opts +[assert-view-opts]: ./reference/config/browsers#assert_view_opts [assert-view]: ./commands/browser/assertView [commands]: ./commands/overview [create-testplane]: https://github.com/gemini-testing/create-testplane -[defaults]: ./config/browsers#timeouts -[how-to-check-test-stability]: ./guides/how-to-check-test-stability +[defaults]: ./reference/config/browsers#timeouts +[how-to-check-test-stability]: ./plugins/testplane-test-repeater [how-to-read-browser-logs]: ./guides/how-to-read-browser-logs -[how-to-run-test-in-file]: ./guides/how-to-run-specified-test#solution_1 -[how-to-skip-tests]: ./guides/how-to-skip-test-in-browsers +[how-to-run-test-in-file]: ./quickstart/running-tests#running_a_specific_file +[how-to-skip-tests]: ./reference/testplane-helper [how-to-test-layout-under-login]: ./guides/how-to-test-layout-under-login [how-to-use-cdp]: ./guides/how-to-use-cdp [html-reporter-diff]: ./html-reporter/html-reporter-setup#diffmode @@ -108,19 +108,19 @@ And that’s not all. [html-reporter-plugins]: ./html-reporter/html-reporter-plugins [html-reporter]: ./html-reporter/html-reporter-setup [mocha]: https://mochajs.org -[patterns-on-reject]: ./config/system#patterns_on_reject +[patterns-on-reject]: ./reference/config/system#patterns_on_reject [plugins]: https://github.com/gemini-testing/ -[prepare-browser]: ./config/prepare-browser +[prepare-browser]: ./reference/config/prepare-browser [retry-limiter]: ./plugins/retry-limiter [retry-progressive]: ./plugins/testplane-retry-progressive -[sessions-reuse]: ./config/browsers#tests_per_session +[sessions-reuse]: ./reference/config/browsers#tests_per_session [sharp]: https://github.com/lovell/sharp [testplane-chunks]: ./plugins/testplane-chunks [testplane-cli]: ./reference/testplane-events#cli [testplane-events]: ./reference/testplane-events -[testplane-option-grep]: ./guides/how-to-run-specified-test#solution_2 +[testplane-option-grep]: ./quickstart/running-tests#the_grep_option [testplane-plugins-profiler]: https://github.com/gemini-testing/testplane-plugins-profiler [testplane-profiler]: https://github.com/gemini-testing/testplane-profiler -[testplane-sets]: ./config/sets -[testplane-workers]: ./config/system#workers +[testplane-sets]: ./reference/config/sets +[testplane-workers]: ./reference/config/system#workers [webdriverio-api]: https://webdriver.io/docs/api diff --git a/docs/migrations/how-to-upgrade-hermione-to-4.mdx b/docs/migrations/how-to-upgrade-hermione-to-4.mdx index d4f9357..82a2c78 100644 --- a/docs/migrations/how-to-upgrade-hermione-to-4.mdx +++ b/docs/migrations/how-to-upgrade-hermione-to-4.mdx @@ -3,7 +3,7 @@ import TabItem from "@theme/TabItem"; import Admonition from "@theme/Admonition"; -# How to Upgrade hermione to Version 4.x +# Hermione v3 → v4 This guide is relevant only for projects using hermione versions older than 4.x. diff --git a/docs/migrations/how-to-upgrade-hermione-to-5.mdx b/docs/migrations/how-to-upgrade-hermione-to-5.mdx index bf05c3b..e9ce358 100644 --- a/docs/migrations/how-to-upgrade-hermione-to-5.mdx +++ b/docs/migrations/how-to-upgrade-hermione-to-5.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to Upgrade hermione to Version 5.x +# Hermione v4 → v5 If your project uses hermione version earlier than 4.x, please read “How to Upgrade hermione to Version 4.x” before upgrading to version 5.x. @@ -58,20 +58,20 @@ To be fair, this initially did not work correctly, and no one used it. Therefore If you encounter any issues during the migration to the new version or have any questions, visit [github issues][gh-issues] — we will definitely help you! [how-to-upgrade-hermione-to-4]: ../../migrations/how-to-upgrade-hermione-to-4 -[config-browsers]: ../../config/browsers +[config-browsers]: ../../reference/config/browsers [hermione-teamcity-reporter]: https://github.com/gemini-testing/hermione-teamcity-reporter [before-file-read]: ../../reference/testplane-events#before_file_read [event-suite-begin]: ../../reference/testplane-events#suite_begin [event-test-begin]: ../../reference/testplane-events#test_begin [test-parser]: ../../reference/testplane-events#test_parser [hermione-events]: ../../reference/testplane-events -[antialiasing-tolerance]: ../../config/browsers#antialiasing_tolerance -[composite-image]: ../../config/browsers#composite_image -[take-screenshot-on-fails-assert-view-fail]: ../../config/browsers#take_screenshot_on_fails -[take-screenshot-on-fails-mode]: ../../config/browsers#take_screenshot_on_fails_mode -[take-screenshot-on-fails-timeout]: ../../config/browsers#take_screenshot_on_fails_timeout -[http-timeout]: ../../config/browsers#http_timeout -[page-load-timeout]: ../../config/browsers#page_load_timeout -[session-quit-timeout]: ../../config/browsers#session_quit_timeout +[antialiasing-tolerance]: ../../reference/config/browsers#antialiasing_tolerance +[composite-image]: ../../reference/config/browsers#composite_image +[take-screenshot-on-fails-assert-view-fail]: ../../reference/config/browsers#take_screenshot_on_fails +[take-screenshot-on-fails-mode]: ../../reference/config/browsers#take_screenshot_on_fails_mode +[take-screenshot-on-fails-timeout]: ../../reference/config/browsers#take_screenshot_on_fails_timeout +[http-timeout]: ../../reference/config/browsers#http_timeout +[page-load-timeout]: ../../reference/config/browsers#page_load_timeout +[session-quit-timeout]: ../../reference/config/browsers#session_quit_timeout [save-history]: https://www.npmjs.com/package/hermione/v/5.6.4#savehistory [gh-issues]: https://github.com/gemini-testing/testplane/issues diff --git a/docs/migrations/how-to-upgrade-hermione-to-6.mdx b/docs/migrations/how-to-upgrade-hermione-to-6.mdx index d5a86a7..b94c36d 100644 --- a/docs/migrations/how-to-upgrade-hermione-to-6.mdx +++ b/docs/migrations/how-to-upgrade-hermione-to-6.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to Upgrade hermione to Version 6.x +# Hermione v5 → v6 If your project is using a hermione version earlier than 4.x, please first read "How to Upgrade hermione to Version 4.x" and "How to Upgrade hermione to Version 5.x". @@ -46,6 +46,6 @@ If you encounter issues during the migration to the new version or have any ques [how-to-upgrade-hermione-to-4]: ../../migrations/how-to-upgrade-hermione-to-4 [how-to-upgrade-hermione-to-5]: ../../migrations/how-to-upgrade-hermione-to-5 -[browser-ws-endpoint]: ../../config/browsers#browser_ws_endpoint +[browser-ws-endpoint]: ../../reference/config/browsers#browser_ws_endpoint [how-to-use-cdp]: ../../guides/how-to-use-cdp [gh-issues]: https://github.com/gemini-testing/testplane/issues diff --git a/docs/migrations/how-to-upgrade-hermione-to-7.mdx b/docs/migrations/how-to-upgrade-hermione-to-7.mdx index 8add1eb..20c02a6 100644 --- a/docs/migrations/how-to-upgrade-hermione-to-7.mdx +++ b/docs/migrations/how-to-upgrade-hermione-to-7.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to Upgrade hermione to Version 7.x +# Hermione v6 → v7 If your project is using a hermione version earlier than 4.x, first read "How to Upgrade hermione to Version 4.x," "How to Upgrade hermione to Version 5.x," and "How to Upgrade hermione to Version 6.x." @@ -122,9 +122,9 @@ If you encounter issues during the migration to the new version or have any ques [how-to-upgrade-hermione-to-4]: ../../migrations/how-to-upgrade-hermione-to-4 [how-to-upgrade-hermione-to-5]: ../../migrations/how-to-upgrade-hermione-to-5 [how-to-upgrade-hermione-to-6]: ../../migrations/how-to-upgrade-hermione-to-6 -[screenshots-dir]: ../../config/browsers#screenshots_dir +[screenshots-dir]: ../../reference/config/browsers#screenshots_dir [save_history]: https://www.npmjs.com/package/hermione/v/6.1.4#savehistory -[save_history_mode]: ../../config/browsers#save_history_mode +[save_history_mode]: ../../reference/config/browsers#save_history_mode [webdriverio@7]: https://webdriver.io/ [webdriverio@8]: https://webdriver.io/ [gh-issues]: https://github.com/gemini-testing/testplane/issues/ diff --git a/docs/migrations/how-to-upgrade-hermione-to-8.mdx b/docs/migrations/how-to-upgrade-hermione-to-8.mdx index f23efe2..0f7e79d 100644 --- a/docs/migrations/how-to-upgrade-hermione-to-8.mdx +++ b/docs/migrations/how-to-upgrade-hermione-to-8.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to Upgrade hermione to Version 8.x +# Hermione v7 → v8 If your project is using a hermione version earlier than 4.x, first read: diff --git a/docs/migrations/how-to-upgrade-hermione-to-testplane.mdx b/docs/migrations/how-to-upgrade-hermione-to-testplane.mdx index 2a593f8..bfe6051 100644 --- a/docs/migrations/how-to-upgrade-hermione-to-testplane.mdx +++ b/docs/migrations/how-to-upgrade-hermione-to-testplane.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# How to migrate from Hermione to Testplane +# Hermione → Testplane If in your project Hermione is younger than the v8.x version, then read first: @@ -18,7 +18,7 @@ We recommend updating Hermione step by step, ensuring at each stage that all pro This project was formerly known as "Hermione", but eventually some copyright and trademark issues surfaced, leading to the decision to rebrand. After some discussion, we settled on "Testplane" as the official new title. Considering this change as merely a rebranding, we've proceeded with the existing version count instead of starting anew. Thus, Testplane `v8.x` is a drop-in replacement for Hermione `v8.x`. -## How to move? {#how_to_move} +## Migration Guide {#how_to_move} ### 1. Replace hermione deps with tesplane in `package.json` {#uninstall_hermione} diff --git a/docs/plugins/hermione-browser-version-changer.mdx b/docs/plugins/hermione-browser-version-changer.mdx index ddd8d55..4a252c0 100644 --- a/docs/plugins/hermione-browser-version-changer.mdx +++ b/docs/plugins/hermione-browser-version-changer.mdx @@ -1,13 +1,13 @@ -# hermione-browser-version-changer +# @testplane/browser-version-changer ## Overview {#overview} -Use the `hermione-browser-version-changer` plugin to manage the definition of the browser version for tests. +Use the `@testplane/browser-version-changer` plugin to manage the definition of the browser version for tests. ## Install {#install} ```bash -npm install -D hermione-browser-version-changer +npm install -D @testplane/browser-version-changer ``` ## Setup {#setup} @@ -17,7 +17,7 @@ Add the plugin to the `plugins` section of the `testplane` config: ```javascript module.exports = { plugins: { - 'hermione-browser-version-changer': { + '@testplane/browser-version-changer': { enabled: true, initStore: async () => { return { @@ -97,8 +97,8 @@ testplane_browser_version_changer_enabled=false npx testplane ## Useful links {#useful_links} -- [hermione-browser-version-changer plugin sources][hermione-browser-version-changer] +- [@testplane/browser-version-changer plugin sources][hermione-browser-version-changer] -[hermione-browser-version-changer]: https://github.com/gemini-testing/hermione-browser-version-changer +[@testplane/browser-version-changer]: https://github.com/gemini-testing/hermione-browser-version-changer [noop]: https://lodash.com/docs/4.17.15#noop [lodash]: https://lodash.com/ diff --git a/docs/plugins/retry-limiter.mdx b/docs/plugins/retry-limiter.mdx index f1cdf92..a021a50 100644 --- a/docs/plugins/retry-limiter.mdx +++ b/docs/plugins/retry-limiter.mdx @@ -1,21 +1,21 @@ import Admonition from "@theme/Admonition"; -# retry-limiter +# @testplane/retry-limiter ## Overview {#overview} -Use the `retry-limiter` plugin to limit the number of retries of failed tests, as well as the time during which retries are allowed. +Use the `@testplane/retry-limiter` plugin to limit the number of retries of failed tests, as well as the time during which retries are allowed. Use this plugin when running tests in CI.—Since in CI, as a rule, either all the tests of the project are run, or a significant part of them. -Using the _retry-limiter_ plugin for local launches of a few tests is most often impractical, due to their small number and, accordingly, the lack of a significant effect from saving hardware or time for running tests. +Using the _@testplane/retry-limiter_ plugin for local launches of a few tests is most often impractical, due to their small number and, accordingly, the lack of a significant effect from saving hardware or time for running tests. Retries of failed tests is one of the ways to deal with unstable tests. However, there are cases when a lot of tests fail due to infrastructure problems or because the project code was broken (for example, in a pull-request). In such cases, the retries only waste the resources of the servers on which the tests are run, and the developer's time, forcing the developer to wait for the end of the test run, which will obviously fail. -To avoid such scenarios, the `retry-limiter` plugin allows: +To avoid such scenarios, the `@testplane/retry-limiter` plugin allows: - set the maximum share of retries from the total number of tests; - limit the time during which retries can be used; @@ -25,7 +25,7 @@ For example, if 1000 tests are run in the project and the `limit` parameter in t If the value _600 seconds (10 minutes)_ is still set in the plugin config for the `timeLimit` parameter, then regardless of how many times you can still retry the failed tests, the plugin will disable the retry mechanism after _10 minutes_ after the start of the test run. The latter protects against unreasonable waste of hardware resources for too long test runs. -If Testplane is launched with the `--retry` option, for example, with the value _7_, and at the same time, in the config of the `retry-limiter` plugin, the `setRetriesOnTestFail` parameter is set to _4_, this means the following: if at least one test fails in any of the browsers after _7_ retries, the plugin will consider that some kind of system problem has arisen and it is necessary to reduce the maximum allowed number of retries to the value specified in the `setRetriesOnTestFail` parameter, that is, to _4_. It also allows you to protect yourself from the unreasonable consumption of resources for running tests in case of system problems. +If Testplane is launched with the `--retry` option, for example, with the value _7_, and at the same time, in the config of the `@testplane/retry-limiter` plugin, the `setRetriesOnTestFail` parameter is set to _4_, this means the following: if at least one test fails in any of the browsers after _7_ retries, the plugin will consider that some kind of system problem has arisen and it is necessary to reduce the maximum allowed number of retries to the value specified in the `setRetriesOnTestFail` parameter, that is, to _4_. It also allows you to protect yourself from the unreasonable consumption of resources for running tests in case of system problems. If you are faced with a situation in your project when the retry mechanism starts to turn off @@ -37,7 +37,7 @@ If Testplane is launched with the `--retry` option, for example, with the value ## Install {#install} ```bash -npm install -D retry-limiter +npm install -D @testplane/retry-limiter ``` ## Setup {#setup} @@ -47,7 +47,7 @@ Add the plugin to the `plugins` section of the Testplane config: ```javascript module.exports = { plugins: { - "retry-limiter": { + "@testplane/retry-limiter": { limit: 0.3, // allow no more than 30% of retries from the total number of tests setRetriesOnTestFail: 4, // descrease number of retries to 4, after the first test fails despite all retries made timeLimit: 600, // after 10 minutes the retries should be turned off @@ -104,6 +104,6 @@ In the second message—about limiting the total number of retries. ## Useful links {#useful_links} -- [retry-limiter plugin sources][retry-limiter] +- [@testplane/retry-limiter plugin sources][retry-limiter] [retry-limiter]: https://github.com/gemini-testing/retry-limiter diff --git a/docs/plugins/testplane-chunks.mdx b/docs/plugins/testplane-chunks.mdx index 9258b50..93d4fd3 100644 --- a/docs/plugins/testplane-chunks.mdx +++ b/docs/plugins/testplane-chunks.mdx @@ -1,10 +1,10 @@ import Admonition from "@theme/Admonition"; -# testplane-chunks +# @testplane/chunks ## Overview {#overview} -Use the [testplane-chunks][testplane-chunks] plugin to run tests in parallel. +Use the [@testplane/chunks][testplane-chunks] plugin to run tests in parallel. If your project has a large number of tests and at the same time there is not enough performance of concrete CI servers to perform all these tests on one server in an acceptable time, then this plugin is for you. @@ -12,13 +12,13 @@ The plugin allows you to run tests in parallel on multiple servers. Thereby spee ### What does this plugin do then? {#what_does_plugin_do} -The `testplane-chunks` plugin splits **always in the same way** your tests into a given number of chunks and gives Testplane to run only the chunk that you specified. The key here is _"always in the same way"_. That is, the operation of splitting into chunks is [idempotent][idempotence]. +The `@testplane/chunks` plugin splits **always in the same way** your tests into a given number of chunks and gives Testplane to run only the chunk that you specified. The key here is _"always in the same way"_. That is, the operation of splitting into chunks is [idempotent][idempotence]. ### What gives idempotence? {#what_does_idempotence_give} You can setup your CI so as to reuse the results of test runs from separate chunks during a general restart. This will allow you to save time when restarting all tests, since only those chunks that have failed tests will be run. -For example, your project has 1 thousand tests. You have split these tests into 10 chunks of 100 tests each. This means that when you run tests in your pull request, you will have 10 testplanes running simultaneously on 10 servers. Each Testplane will perform 100 tests. In some of these runs, the tests may fail. For example, 2 out of 10 chunks have failed. You decide to restart the test run, hoping that this time the tests will pass. So, when you restart Testplane with the number of the failed chunk, you can be absolutely sure that the `testplane-chunks` plugin will generate exactly the same batch of tests for Testplane as in its last launch. +For example, your project has 1 thousand tests. You have split these tests into 10 chunks of 100 tests each. This means that when you run tests in your pull request, you will have 10 testplanes running simultaneously on 10 servers. Each Testplane will perform 100 tests. In some of these runs, the tests may fail. For example, 2 out of 10 chunks have failed. You decide to restart the test run, hoping that this time the tests will pass. So, when you restart Testplane with the number of the failed chunk, you can be absolutely sure that the `@testplane/chunks` plugin will generate exactly the same batch of tests for Testplane as in its last launch. When organizing the restart of tests in your CI, remember that in order to **re-use** runs of @@ -45,7 +45,7 @@ Use the [merge-reports][merge-reports] command, which [html-reporter][html-repor ## Install {#install} ```bash -npm install -D testplane-chunks +npm install -D @testplane/chunks ``` ## Setup {#setup} @@ -55,7 +55,7 @@ Add the plugin to the `plugins` section of the `testplane` config: ```javascript module.exports = { plugins: { - "testplane-chunks": { + "@testplane/chunks": { count: 7, // Split tests to 7 chunks run: 1, // Run 1st chunk }, @@ -102,7 +102,7 @@ testplane_chunks_count=10 testplane_chunks_run=1 npx testplane ... ## Useful links {#useful_links} -- [testplane-chunks plugin sources][testplane-chunks] +- [@testplane/chunks plugin sources][testplane-chunks] - [What is idempotence?][idempotence] [html-reporter]: ../../html-reporter/html-reporter-setup diff --git a/docs/plugins/testplane-retry-command.mdx b/docs/plugins/testplane-retry-command.mdx index 3b2d57c..0ddbb17 100644 --- a/docs/plugins/testplane-retry-command.mdx +++ b/docs/plugins/testplane-retry-command.mdx @@ -1,15 +1,15 @@ import Admonition from "@theme/Admonition"; -# testplane-retry-command +# @testplane/retry-command ## Overview {#overview} -Use the `testplane-retry-command` plugin to retry commands at low level. +Use the [`@testplane/retry-command`][testplane-retry-command] plugin to retry commands at low level. ## Install {#install} ```bash -npm install -D testplane-retry-command +npm install -D @testplane/retry-command ``` ## Setup {#setup} @@ -19,7 +19,7 @@ Add the plugin to the `plugins` section of the `testplane` config: ```javascript module.exports = { plugins: { - "testplane-retry-command": { + "@testplane/retry-command": { enabled: true, rules: [ { diff --git a/docs/plugins/testplane-storybook.mdx b/docs/plugins/testplane-storybook.mdx index 394078e..90160df 100644 --- a/docs/plugins/testplane-storybook.mdx +++ b/docs/plugins/testplane-storybook.mdx @@ -305,7 +305,7 @@ In this example, screenshot references would be stored in `screens// diff --git a/docs/command-line/index.mdx b/docs/reference/cli.mdx similarity index 97% rename from docs/command-line/index.mdx rename to docs/reference/cli.mdx index 51f5c24..bb76d1b 100644 --- a/docs/command-line/index.mdx +++ b/docs/reference/cli.mdx @@ -578,7 +578,7 @@ testplane list-browsers --format json #### Example {#list-browsers-example} -If you have the following "browsers" section in your [Testplane config](/docs/v8/config/main): +If you have the following "browsers" section in your [Testplane config](/docs/v8/reference/config/main): ```json { @@ -647,9 +647,9 @@ testplane config --help ## `install-deps` command {#install-deps} -This command is a part of the guide [How to launch Testplane in the local browser](/docs/v8/guides/local-browsers). +This command is a part of the guide [How to launch Testplane in the local browser](/docs/v8/basic-guides/managing-browsers). -Use the `install-deps` command to download all browsers, specified in [Testplane config](/docs/v8/config/main). +Use the `install-deps` command to download all browsers, specified in [Testplane config](/docs/v8/reference/config/main). If this command is launched on supported ubuntu version, all missing necessary ubuntu packages would be downloaded too. @@ -663,7 +663,7 @@ npx testplane install-deps You can also specify, which browsers are need to be downloaded. -For example, if you have browsers "chrome-dark", "firefox-dark" described in Testplane config, you can use the following command to only download these two browsers: +For example, if you have browsers "chrome-dark", "firefox-dark" described in Testplane config, you can use the following command to only download these two browsers: ```bash npx testplane install-deps chrome-dark firefox-dark @@ -744,8 +744,8 @@ Runs only specified sets (CLI option `--set` alternative). TESTPLANE_SETS=desktop,touch testplane ``` -[html-reporter]: ../html-reporter/html-reporter-setup -[assert-view]: ../commands/browser/assertView -[add-tag]: ../commands/browser/addTag -[switch-to-repl]: ../commands/browser/switchToRepl -[webdriver-vs-cdp]: ../reference/webdriver-vs-cdp +[html-reporter]: ../../html-reporter/html-reporter-setup +[assert-view]: ../../commands/browser/assertView +[add-tag]: ../../commands/browser/addTag +[switch-to-repl]: ../../commands/browser/switchToRepl +[webdriver-vs-cdp]: ../webdriver-vs-cdp diff --git a/docs/reference/config/_category_.json b/docs/reference/config/_category_.json new file mode 100644 index 0000000..b872d98 --- /dev/null +++ b/docs/reference/config/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Config", + "link": { + "type": "doc", + "id": "reference/config/main" + } +} diff --git a/docs/config/_partials/examples/_browsers-basic-format.mdx b/docs/reference/config/_partials/examples/_browsers-basic-format.mdx similarity index 100% rename from docs/config/_partials/examples/_browsers-basic-format.mdx rename to docs/reference/config/_partials/examples/_browsers-basic-format.mdx diff --git a/docs/config/_partials/examples/_browsers-desired-capabilities.mdx b/docs/reference/config/_partials/examples/_browsers-desired-capabilities.mdx similarity index 100% rename from docs/config/_partials/examples/_browsers-desired-capabilities.mdx rename to docs/reference/config/_partials/examples/_browsers-desired-capabilities.mdx diff --git a/docs/config/_partials/examples/_browsers-example.mdx b/docs/reference/config/_partials/examples/_browsers-example.mdx similarity index 100% rename from docs/config/_partials/examples/_browsers-example.mdx rename to docs/reference/config/_partials/examples/_browsers-example.mdx diff --git a/docs/config/_partials/examples/_browsers-session-env-flags.mdx b/docs/reference/config/_partials/examples/_browsers-session-env-flags.mdx similarity index 100% rename from docs/config/_partials/examples/_browsers-session-env-flags.mdx rename to docs/reference/config/_partials/examples/_browsers-session-env-flags.mdx diff --git a/docs/config/_partials/examples/_config-example.mdx b/docs/reference/config/_partials/examples/_config-example.mdx similarity index 100% rename from docs/config/_partials/examples/_config-example.mdx rename to docs/reference/config/_partials/examples/_config-example.mdx diff --git a/docs/config/_partials/examples/_dev-server-example.mdx b/docs/reference/config/_partials/examples/_dev-server-example.mdx similarity index 100% rename from docs/config/_partials/examples/_dev-server-example.mdx rename to docs/reference/config/_partials/examples/_dev-server-example.mdx diff --git a/docs/config/_partials/examples/_last-failed-example.mdx b/docs/reference/config/_partials/examples/_last-failed-example.mdx similarity index 100% rename from docs/config/_partials/examples/_last-failed-example.mdx rename to docs/reference/config/_partials/examples/_last-failed-example.mdx diff --git a/docs/config/_partials/examples/_minimal-config.mdx b/docs/reference/config/_partials/examples/_minimal-config.mdx similarity index 100% rename from docs/config/_partials/examples/_minimal-config.mdx rename to docs/reference/config/_partials/examples/_minimal-config.mdx diff --git a/docs/config/_partials/examples/_plugins-example.mdx b/docs/reference/config/_partials/examples/_plugins-example.mdx similarity index 100% rename from docs/config/_partials/examples/_plugins-example.mdx rename to docs/reference/config/_partials/examples/_plugins-example.mdx diff --git a/docs/config/_partials/examples/_plugins-register-workers.mdx b/docs/reference/config/_partials/examples/_plugins-register-workers.mdx similarity index 100% rename from docs/config/_partials/examples/_plugins-register-workers.mdx rename to docs/reference/config/_partials/examples/_plugins-register-workers.mdx diff --git a/docs/config/_partials/examples/_prepare-browser-add-element-command.mdx b/docs/reference/config/_partials/examples/_prepare-browser-add-element-command.mdx similarity index 100% rename from docs/config/_partials/examples/_prepare-browser-add-element-command.mdx rename to docs/reference/config/_partials/examples/_prepare-browser-add-element-command.mdx diff --git a/docs/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx b/docs/reference/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx similarity index 100% rename from docs/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx rename to docs/reference/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx diff --git a/docs/config/_partials/examples/_prepare-environment.mdx b/docs/reference/config/_partials/examples/_prepare-environment.mdx similarity index 100% rename from docs/config/_partials/examples/_prepare-environment.mdx rename to docs/reference/config/_partials/examples/_prepare-environment.mdx diff --git a/docs/config/_partials/examples/_sets-basic-format.mdx b/docs/reference/config/_partials/examples/_sets-basic-format.mdx similarity index 100% rename from docs/config/_partials/examples/_sets-basic-format.mdx rename to docs/reference/config/_partials/examples/_sets-basic-format.mdx diff --git a/docs/config/_partials/examples/_sets-example.mdx b/docs/reference/config/_partials/examples/_sets-example.mdx similarity index 100% rename from docs/config/_partials/examples/_sets-example.mdx rename to docs/reference/config/_partials/examples/_sets-example.mdx diff --git a/docs/config/_partials/examples/_system-example.mdx b/docs/reference/config/_partials/examples/_system-example.mdx similarity index 100% rename from docs/config/_partials/examples/_system-example.mdx rename to docs/reference/config/_partials/examples/_system-example.mdx diff --git a/docs/config/_partials/examples/_system-test-run-env.mdx b/docs/reference/config/_partials/examples/_system-test-run-env.mdx similarity index 100% rename from docs/config/_partials/examples/_system-test-run-env.mdx rename to docs/reference/config/_partials/examples/_system-test-run-env.mdx diff --git a/docs/config/after-all.mdx b/docs/reference/config/after-all.mdx similarity index 91% rename from docs/config/after-all.mdx rename to docs/reference/config/after-all.mdx index 9457ed1..b78ea2d 100644 --- a/docs/config/after-all.mdx +++ b/docs/reference/config/after-all.mdx @@ -1,4 +1,4 @@ -import Version from "../_partials/specs/version.mdx"; +import Version from "../../_partials/specs/version.mdx"; # afterAll diff --git a/docs/config/before-all.mdx b/docs/reference/config/before-all.mdx similarity index 96% rename from docs/config/before-all.mdx rename to docs/reference/config/before-all.mdx index 28065bc..dcc0758 100644 --- a/docs/config/before-all.mdx +++ b/docs/reference/config/before-all.mdx @@ -1,4 +1,4 @@ -import Version from "../_partials/specs/version.mdx"; +import Version from "../../_partials/specs/version.mdx"; # beforeAll diff --git a/docs/config/browsers.mdx b/docs/reference/config/browsers.mdx similarity index 97% rename from docs/config/browsers.mdx rename to docs/reference/config/browsers.mdx index 078acf0..6fa769a 100644 --- a/docs/config/browsers.mdx +++ b/docs/reference/config/browsers.mdx @@ -1,9 +1,9 @@ import Admonition from "@theme/Admonition"; -import BrowsersBasicFormat from "@site/docs/config/_partials/examples/_browsers-basic-format.mdx"; -import BrowsersExample from "@site/docs/config/_partials/examples/_browsers-example.mdx"; -import DesiredCapabilitiesExample from "@site/docs/config/_partials/examples/_browsers-desired-capabilities.mdx"; -import SessionEnvFlags from "@site/docs/config/_partials/examples/_browsers-session-env-flags.mdx"; -import AssertViewOptions from "../_partials/specs/assert-view-options.mdx"; +import BrowsersBasicFormat from "@site/docs/reference/config/_partials/examples/_browsers-basic-format.mdx"; +import BrowsersExample from "@site/docs/reference/config/_partials/examples/_browsers-example.mdx"; +import DesiredCapabilitiesExample from "@site/docs/reference/config/_partials/examples/_browsers-desired-capabilities.mdx"; +import SessionEnvFlags from "@site/docs/reference/config/_partials/examples/_browsers-session-env-flags.mdx"; +import AssertViewOptions from "../../_partials/specs/assert-view-options.mdx"; # browsers @@ -77,7 +77,7 @@ In this example, the value `10` will be used for the `sessionsPerBrowser` option `"webdriver"` Protocol for communication with the browser. See [WebDriver vs - CDP](../../reference/webdriver-vs-cdp). + CDP](../../webdriver-vs-cdp). @@ -140,7 +140,8 @@ Default: `http://localhost:4444/wd/hub`. You can also use value `"local"` in order to use local browsers, managed by Testplane. Read more - in guide [How to launch Testplane in the local browser](/docs/v8/guides/local-browsers). + in guide [How to launch Testplane in the local + browser](/docs/v8/basic-guides/managing-browsers). ### baseUrl {#base_url} @@ -160,7 +161,7 @@ Default value: `null`. It means that Testplane will try to determine the websock ### automationProtocol {#automation_protocol} -Protocol for communication with the browser. Available values: `webdriver` and `devtools`. See also [WebDriver vs CDP](../../reference/webdriver-vs-cdp). Default: `webdriver`. +Protocol for communication with the browser. Available values: `webdriver` and `devtools`. See also [WebDriver vs CDP](../../webdriver-vs-cdp). Default: `webdriver`. ### sessionEnvFlags {#session_env_flags} @@ -489,7 +490,7 @@ Default: `false`. ### openAndWaitOpts {#open-and-wait-opts} -Allows setting options to be used when calling the [`browser.openAndWait`](../../commands/browser/openAndWait) command. +Allows setting options to be used when calling the [`browser.openAndWait`](../../../commands/browser/openAndWait) command. Default: @@ -1076,7 +1077,7 @@ The section has the following parameters: [desired-caps]: https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities -[html-reporter]: ../../html-reporter/html-reporter-setup +[html-reporter]: ../../../html-reporter/html-reporter-setup [got]: https://github.com/sindresorhus/got/ [got-agent]: https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#agent [got-headers]: https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers @@ -1086,7 +1087,7 @@ The section has the following parameters: [read-tests]: ../browsers [sauce-labs]: https://saucelabs.com [system-mocha-opts]: ../system#mocha_opts -[element-wait-until]: ../../commands/element/waitUntil -[how-to-use-cdp]: ../../guides/how-to-use-cdp -[testplane-also-in-helper]: ../../guides/how-to-skip-test-in-browsers#solution_4 -[time-travel]: ../../guides/time-travel +[element-wait-until]: ../../../commands/element/waitUntil +[how-to-use-cdp]: ../../../guides/how-to-use-cdp +[testplane-also-in-helper]: ../../testplane-helper +[time-travel]: ../../../basic-guides/time-travel diff --git a/docs/config/dev-server.mdx b/docs/reference/config/dev-server.mdx similarity index 98% rename from docs/config/dev-server.mdx rename to docs/reference/config/dev-server.mdx index 73ba8ab..1a3a681 100644 --- a/docs/config/dev-server.mdx +++ b/docs/reference/config/dev-server.mdx @@ -1,5 +1,5 @@ import Admonition from "@theme/Admonition"; -import DevServerExample from "@site/docs/config/_partials/examples/_dev-server-example.mdx"; +import DevServerExample from "@site/docs/reference/config/_partials/examples/_dev-server-example.mdx"; # devServer diff --git a/docs/config/last-failed.mdx b/docs/reference/config/last-failed.mdx similarity index 94% rename from docs/config/last-failed.mdx rename to docs/reference/config/last-failed.mdx index e6911ae..a0b25de 100644 --- a/docs/config/last-failed.mdx +++ b/docs/reference/config/last-failed.mdx @@ -1,4 +1,4 @@ -import LastFailedExample from "@site/docs/config/_partials/examples/_last-failed-example.mdx"; +import LastFailedExample from "@site/docs/reference/config/_partials/examples/_last-failed-example.mdx"; # lastFailed diff --git a/docs/config/main.mdx b/docs/reference/config/main.mdx similarity index 94% rename from docs/config/main.mdx rename to docs/reference/config/main.mdx index dea0208..daa0526 100644 --- a/docs/config/main.mdx +++ b/docs/reference/config/main.mdx @@ -1,9 +1,5 @@ ---- -sidebar_class_name: hidden ---- - -import MinimalConfig from "@site/docs/config/_partials/examples/_minimal-config.mdx"; -import ConfigExample from "@site/docs/config/_partials/examples/_config-example.mdx"; +import MinimalConfig from "@site/docs/reference/config/_partials/examples/_minimal-config.mdx"; +import ConfigExample from "@site/docs/reference/config/_partials/examples/_config-example.mdx"; # Testplane Config diff --git a/docs/config/plugins.mdx b/docs/reference/config/plugins.mdx similarity index 88% rename from docs/config/plugins.mdx rename to docs/reference/config/plugins.mdx index 61ebc5f..291c041 100644 --- a/docs/config/plugins.mdx +++ b/docs/reference/config/plugins.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -import PluginsExample from "@site/docs/config/_partials/examples/_plugins-example.mdx"; -import RegisterWorkersExample from "@site/docs/config/_partials/examples/_plugins-register-workers.mdx"; +import PluginsExample from "@site/docs/reference/config/_partials/examples/_plugins-example.mdx"; +import RegisterWorkersExample from "@site/docs/reference/config/_partials/examples/_plugins-register-workers.mdx"; # plugins @@ -45,7 +45,7 @@ If the plugin name starts with the prefix `testplane-`, this prefix can be omitt -You can learn more about events on the [corresponding page](../../reference/testplane-events). +You can learn more about events on the [corresponding page](../../testplane-events). ## Parallel Execution of Plugins @@ -73,5 +73,5 @@ The Testplane ecosystem includes dozens of plugins. Here are some of them: - [@testplane/headless-chrome](https://github.com/gemini-testing/testplane-headless-chrome) - ...and many others that can be found in [gemini-testing](https://github.com/search?q=topic%3Atestplane-plugin+org%3Agemini-testing&type=Repositories). -[html-reporter]: ../../html-reporter/html-reporter-setup -[testplane-test-repeater]: ../../plugins/testplane-test-repeater +[html-reporter]: ../../../html-reporter/html-reporter-setup +[testplane-test-repeater]: ../../../plugins/testplane-test-repeater diff --git a/docs/config/prepare-browser.mdx b/docs/reference/config/prepare-browser.mdx similarity index 86% rename from docs/config/prepare-browser.mdx rename to docs/reference/config/prepare-browser.mdx index 4f30fea..76bb5cb 100644 --- a/docs/config/prepare-browser.mdx +++ b/docs/reference/config/prepare-browser.mdx @@ -1,5 +1,5 @@ import Admonition from "@theme/Admonition"; -import AddMultipleCommandsExample from "@site/docs/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx"; +import AddMultipleCommandsExample from "@site/docs/reference/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx"; # prepareBrowser @@ -10,7 +10,7 @@ This parameter is a hook. The function specified for this parameter will be auto The `prepareBrowser` hook is a perfect place to set up all of your custom commands or overwrite existing ones. - Read more about custom commands in [our guide](../guides/custom-commands.mdx). + Read more about custom commands in [our guide](../../basic-guides/custom-commands.mdx). ## Usage Examples {#example} @@ -48,6 +48,6 @@ Here, the [browser.getCookies][get-cookies] command is used. [url]: ../../commands/browser/url [add-command]: ../../commands/browser/addCommand [overwrite-command]: ../../commands/browser/overwriteCommand -[get-cookies]: ../../commands/browser/getCookies +[get-cookies]: ../../../commands/browser/getCookies [get-location]: ../../commands/element/getLocation [get-size]: ../../commands/element/getSize diff --git a/docs/config/prepare-environment.mdx b/docs/reference/config/prepare-environment.mdx similarity index 77% rename from docs/config/prepare-environment.mdx rename to docs/reference/config/prepare-environment.mdx index 6052ff4..3de6895 100644 --- a/docs/config/prepare-environment.mdx +++ b/docs/reference/config/prepare-environment.mdx @@ -1,4 +1,4 @@ -import PrepareEnvironmentExample from "@site/docs/config/_partials/examples/_prepare-environment.mdx"; +import PrepareEnvironmentExample from "@site/docs/reference/config/_partials/examples/_prepare-environment.mdx"; # prepareEnvironment diff --git a/docs/config/sets.mdx b/docs/reference/config/sets.mdx similarity index 94% rename from docs/config/sets.mdx rename to docs/reference/config/sets.mdx index 9dbcf33..fa62033 100644 --- a/docs/config/sets.mdx +++ b/docs/reference/config/sets.mdx @@ -1,5 +1,5 @@ -import SetsBasicFormat from "@site/docs/config/_partials/examples/_sets-basic-format.mdx"; -import SetsExample from "@site/docs/config/_partials/examples/_sets-example.mdx"; +import SetsBasicFormat from "@site/docs/reference/config/_partials/examples/_sets-basic-format.mdx"; +import SetsExample from "@site/docs/reference/config/_partials/examples/_sets-example.mdx"; # sets diff --git a/docs/config/system.mdx b/docs/reference/config/system.mdx similarity index 96% rename from docs/config/system.mdx rename to docs/reference/config/system.mdx index 0356b5a..14a432d 100644 --- a/docs/config/system.mdx +++ b/docs/reference/config/system.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -import SystemExample from "@site/docs/config/_partials/examples/_system-example.mdx"; -import TestRunEnvExample from "@site/docs/config/_partials/examples/_system-test-run-env.mdx"; +import SystemExample from "@site/docs/reference/config/_partials/examples/_system-example.mdx"; +import TestRunEnvExample from "@site/docs/reference/config/_partials/examples/_system-test-run-env.mdx"; # system @@ -194,7 +194,7 @@ Maximum number of tests that will be run in one subprocess before the subprocess ### diffColor {#diff_color} -Color for displaying the diff in visual checks using the [`browser.assertView`](../../commands/browser/assertView) command. +Color for displaying the diff in visual checks using the [`browser.assertView`](../../../commands/browser/assertView) command. Default: `"#ff00ff"`. diff --git a/docs/reference/test-api.mdx b/docs/reference/test-api.mdx new file mode 100644 index 0000000..0ed5234 --- /dev/null +++ b/docs/reference/test-api.mdx @@ -0,0 +1 @@ +# Test API Reference diff --git a/docs/reference/testplane-api.mdx b/docs/reference/testplane-api.mdx index 81cd2e5..68d97d3 100644 --- a/docs/reference/testplane-api.mdx +++ b/docs/reference/testplane-api.mdx @@ -1,8 +1,8 @@ -# API testplane +# Testplane Class -With the Testplane API, you can use it in your scripts or build tools. +With this API, you can use Testplane programmatically. -To do this, you must include the testplane module and create its instance: +Try importing the testplane module and creating a new instance: ```javascript const Testplane = require("testplane"); @@ -12,7 +12,7 @@ const config = require("./testplane.conf.js"); const testplane = new Testplane(config); ``` -Then you will have access to the following parameters and methods: +A `Testplane` class instance has the following properties and methods: diff --git a/docs/reference/testplane-events.mdx b/docs/reference/testplane-events.mdx index ea1ee97..385854f 100644 --- a/docs/reference/testplane-events.mdx +++ b/docs/reference/testplane-events.mdx @@ -1553,7 +1553,7 @@ module.exports = (testplane, opts) => { ```javascript module.exports = { // tests will be run in a local browser, - // see https://testplane.io/docs/v8/guides/local-browsers/ + // see https://testplane.io/docs/v8/basic-guides/managing-browsers/ gridUrl: "local", // specify the path to the dev server baseUrl: "http://localhost:3000", @@ -1799,12 +1799,12 @@ A more detailed [implementation][testplane-profiler-index] can be found in the [ [commander-options]: https://github.com/tj/commander.js#options [cli-wiki]: https://en.wikipedia.org/wiki/Command-line_interface [testplane-run]: ../testplane-api#testplane_run -[system]: ../../config/system -[system-workers]: ../../config/system#workers -[system-tests-per-worker]: ../../config/system#tests_per_worker -[browser-tests-per-session]: ../../config/browsers#tests_per_session -[browser-sessions-per-browser]: ../../config/browsers#sessions_per_browser -[skip-in]: ../../guides/how-to-skip-test-in-browsers +[system]: ../config/system +[system-workers]: ../config/system#workers +[system-tests-per-worker]: ../config/system#tests_per_worker +[browser-tests-per-session]: ../config/browsers#tests_per_session +[browser-sessions-per-browser]: ../config/browsers#sessions_per_browser +[skip-in]: ../testplane-helper [sigterm]: https://en.wikipedia.org/wiki/Signal_(Unix) [testplane-test-repeater-index]: https://github.com/gemini-testing/testplane-test-repeater/blob/master/lib/index.js [testplane-test-repeater]: https://github.com/gemini-testing/testplane-test-repeater @@ -1818,8 +1818,8 @@ A more detailed [implementation][testplane-profiler-index] can be found in the [ [hermione-hide-scrollbars]: https://github.com/gemini-testing/hermione-hide-scrollbars [hermione-hide-scrollbars-index]: https://github.com/gemini-testing/hermione-hide-scrollbars/blob/master/index.js [vnc]: https://en.wikipedia.org/wiki/Virtual_Network_Computing -[browsers-retry]: ../../config/browsers#retry -[browsers-should-retry]: ../../config/browsers#should_retry +[browsers-retry]: ../config/browsers#retry +[browsers-should-retry]: ../config/browsers#should_retry [retry-limiter]: ../../plugins/retry-limiter [testplane-retry-progressive]: ../../plugins/testplane-retry-progressive [error-object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error diff --git a/docs/reference/testplane-helper.mdx b/docs/reference/testplane-helper.mdx new file mode 100644 index 0000000..7f62f85 --- /dev/null +++ b/docs/reference/testplane-helper.mdx @@ -0,0 +1,63 @@ +# Global Testplane Helper + +## testplane.skip.in + +This directive allows you to skip the test in a specific browser. For example, if you don't want to run the test in `IE8`: + +```javascript +describe("feature", function () { + testplane.skip.in("ie8", "it cannot work in this browser"); + it("nowaday functionality", function () { + // ... + }); +}); +``` + +When using the `testplane.skip.in` directive, you will see a message in the report indicating that the run was skipped in the respective browser. + +To skip the test runs without notifications in the report, you can pass a special flag `silent` to the helper as the third argument: + +```javascript +testplane.skip.in("ie8", "skipReason", { silent: true }); +``` + +## testplane.skip.notIn + +This directive allows you to run the test only in a specific browser, for example, in `Chrome`: + +```javascript +describe("feature", function () { + testplane.skip.notIn("chrome", "it should work only in Chrome"); + it("specific functionality", function () { + // ... + }); +}); +``` + +Similarly, to avoid notifications in the report, you can pass a special flag `silent` to the helper as the third argument: + +```javascript +testplane.skip.notIn("chrome", "skipReason", { silent: true }); +``` + +## testplane.only.in / testplane.only.notIn + +These directives allow you to run the test only in a specific browser, whose logic is the opposite of the `testplane.skip.in` and `testplane.skip.notIn` directives. Additionally, these helpers do not, by default, produce any notifications in the report: + +```javascript +testplane.only.in("chrome"); // run the test only in Chrome +``` + +```javascript +testplane.only.notIn("ie8"); // run the test in all browsers except IE8 +``` + +## testplane.also.in + +If you are introducing a new browser and need to run it only in a few tests while having thousands of them, using the `.skip.in` helper may be inconvenient. You can use the [passive][passive-option] browser option and the helper `.also.in`: + +```javascript +testplane.also.in("ie8"); // run the test in the passive browser IE8 +``` + +[passive-option]: ../config/browsers#passive diff --git a/docs/reference/testplane-standalone-api.mdx b/docs/reference/testplane-standalone-api.mdx index 2c56fa6..211100b 100644 --- a/docs/reference/testplane-standalone-api.mdx +++ b/docs/reference/testplane-standalone-api.mdx @@ -1,4 +1,4 @@ -# Testplane standalone api +# Standalone API ## Overview @@ -35,7 +35,7 @@ More info about [launchBrowser](https://github.com/gemini-testing/testplane/blob ### Attach to browser Attach to the existing browser with session params. -You can get session params if run testplane with `--keep-browser` option, see [more](../command-line/index.mdx#testplane-keep-browser) +You can get session params if run testplane with `--keep-browser` option, see [more](../reference/cli.mdx#testplane-keep-browser) ```typescript import { attachToBrowser } from "testplane/unstable"; diff --git a/docs/reference/webdriver-vs-cdp.mdx b/docs/reference/webdriver-vs-cdp.mdx index a3f7e48..2f4a716 100644 --- a/docs/reference/webdriver-vs-cdp.mdx +++ b/docs/reference/webdriver-vs-cdp.mdx @@ -1,4 +1,4 @@ -# Communication Protocols with the Browser: WebDriver vs Chrome DevTools Protocol +# Automation Protocols ## Overview @@ -82,7 +82,7 @@ For example, the [Runtime][cdp-runtime] domain allows inspecting the state of Ja [debugger]: https://chromedevtools.github.io/devtools-protocol/tot/Debugger/ [how-to-intercept-requests-and-responses]: ../../guides/how-to-intercept-requests-and-responses [how-to-check-accessibility]: ../../guides/how-to-check-accessibility -[how-to-manage-network-bandwidth]: ../../guides/how-to-manage-network-bandwidth -[how-to-manage-cpu-performance]: ../../guides/how-to-manage-cpu-performance -[how-to-hide-scrollbars-by-cdp]: ../../guides/how-to-hide-scrollbars-by-cdp +[how-to-manage-network-bandwidth]: ../../basic-guides/emulation +[how-to-manage-cpu-performance]: ../../basic-guides/emulation +[how-to-hide-scrollbars-by-cdp]: ../../guides/visual-checks-best-practices/hiding-scrollbars [how-to-use-cdp]: ../../guides/how-to-use-cdp diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 4dbb713..bc8325d 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -87,6 +87,12 @@ const config: Config = { position: "left", label: "Docs", }, + { + type: "docSidebar", + sidebarId: "api", + position: "left", + label: "API", + }, { type: "docSidebar", sidebarId: "ui", @@ -140,7 +146,7 @@ const config: Config = { }, { label: "Testplane config", - href: "/docs/v8/config/main", + href: "/docs/v8/reference/config/main", }, { label: "Testplane UI", @@ -207,6 +213,136 @@ const config: Config = { trackHash: true, }, ], + [ + "@docusaurus/plugin-client-redirects", + { + redirects: [ + // Guides moved to Basic Guides + { + from: "/docs/v8/guides/component-testing", + to: "/docs/v8/basic-guides/component-testing", + }, + { + from: "/docs/v8/guides/custom-commands", + to: "/docs/v8/basic-guides/custom-commands", + }, + { + from: "/docs/v8/guides/how-to-debug-test", + to: "/docs/v8/basic-guides/debugging-tests", + }, + { + from: "/docs/v8/guides/local-browsers", + to: "/docs/v8/basic-guides/managing-browsers", + }, + { + from: "/docs/v8/guides/how-to-get-report", + to: "/docs/v8/basic-guides/reporters", + }, + { + from: "/docs/v8/guides/time-travel", + to: "/docs/v8/basic-guides/time-travel", + }, + + // Visual Testing moved to Basic Guides + { + from: "/docs/v8/visual-testing/with-storybook", + to: "/docs/v8/basic-guides/visual-testing-with-storybook", + }, + { + from: "/docs/v8/visual-testing/visual-testing-intro", + to: "/docs/v8/basic-guides/visual-testing", + }, + + // Guides restructured + { + from: "/docs/v8/guides/how-to-hide-scrollbars", + to: "/docs/v8/guides/visual-checks-best-practices/hiding-scrollbars", + }, + + // Command Line moved to Reference + { + from: "/docs/v8/command-line", + to: "/docs/v8/reference/cli", + }, + + // Config moved to Reference/Config + { + from: "/docs/v8/config/after-all", + to: "/docs/v8/reference/config/after-all", + }, + { + from: "/docs/v8/config/before-all", + to: "/docs/v8/reference/config/before-all", + }, + { + from: "/docs/v8/config/browsers", + to: "/docs/v8/reference/config/browsers", + }, + { + from: "/docs/v8/config/dev-server", + to: "/docs/v8/reference/config/dev-server", + }, + { + from: "/docs/v8/config/last-failed", + to: "/docs/v8/reference/config/last-failed", + }, + { + from: "/docs/v8/config/main", + to: "/docs/v8/reference/config/main", + }, + { + from: "/docs/v8/config/plugins", + to: "/docs/v8/reference/config/plugins", + }, + { + from: "/docs/v8/config/prepare-browser", + to: "/docs/v8/reference/config/prepare-browser", + }, + { + from: "/docs/v8/config/prepare-environment", + to: "/docs/v8/reference/config/prepare-environment", + }, + { + from: "/docs/v8/config/sets", + to: "/docs/v8/reference/config/sets", + }, + { + from: "/docs/v8/config/system", + to: "/docs/v8/reference/config/system", + }, + + // Removed pages redirects + { + from: "/docs/v8/guides/how-to-check-test-stability", + to: "/docs/v8/plugins/testplane-test-repeater", + }, + { + from: "/docs/v8/guides/how-to-hide-scrollbars-by-cdp", + to: "/docs/v8/guides/visual-checks-best-practices/hiding-scrollbars", + }, + { + from: "/docs/v8/guides/how-to-manage-cpu-performance", + to: "/docs/v8/basic-guides/emulation", + }, + { + from: "/docs/v8/guides/how-to-manage-network-bandwidth", + to: "/docs/v8/basic-guides/emulation", + }, + { + from: "/docs/v8/guides/how-to-optimize-test-code", + to: "/docs/v8/basic-guides/setup-and-teardown", + }, + { + from: "/docs/v8/guides/how-to-run-specified-test", + to: "/docs/v8/quickstart/running-tests", + }, + { + from: "/docs/v8/guides/how-to-skip-test-in-browsers", + to: "/docs/v8/reference/testplane-helper", + }, + ], + }, + ], ], }; diff --git a/i18n/en/docusaurus-plugin-content-blog/local-browsers.mdx b/i18n/en/docusaurus-plugin-content-blog/local-browsers.mdx index 196db15..6bf836a 100644 --- a/i18n/en/docusaurus-plugin-content-blog/local-browsers.mdx +++ b/i18n/en/docusaurus-plugin-content-blog/local-browsers.mdx @@ -12,9 +12,9 @@ Testplane is now able to automatically download browsers for running tests local -Previously, Testplane with the webdriver automation protocol could only be launched locally with a manually started [selenium-standalone](https://github.com/webdriverio/selenium-standalone). Now, it is enough to specify `gridUrl: "local"` in the [Testplane Config](/docs/v8/config/main) or run tests with the [CLI option](/docs/v8/command-line) `--local`. In this case, if necessary, the corresponding browsers and web drivers will be downloaded before running the tests, and they will also be launched for further use in these tests. +Previously, Testplane with the webdriver automation protocol could only be launched locally with a manually started [selenium-standalone](https://github.com/webdriverio/selenium-standalone). Now, it is enough to specify `gridUrl: "local"` in the [Testplane Config](/docs/v8/reference/config/main) or run tests with the [CLI option](/docs/v8/reference/cli) `--local`. In this case, if necessary, the corresponding browsers and web drivers will be downloaded before running the tests, and they will also be launched for further use in these tests. -You can also download the browsers and their web drivers separately using the [install-deps](/docs/v8/command-line#install-deps) command. +You can also download the browsers and their web drivers separately using the [install-deps](/docs/v8/reference/cli#install-deps) command. Example of running tests on local browser with webdriver automation protocol: @@ -25,4 +25,4 @@ Example of running tests on local browser with webdriver automation protocol: ### How to use? -Learn more about this in our documentation [How to Run Testplane in a Local Browser](/docs/v8/guides/local-browsers). +Learn more about this in our documentation [How to Run Testplane in a Local Browser](/docs/v8/basic-guides/managing-browsers). diff --git a/i18n/en/docusaurus-plugin-content-blog/time-travel-release.mdx b/i18n/en/docusaurus-plugin-content-blog/time-travel-release.mdx index f833f4d..4f4a99b 100644 --- a/i18n/en/docusaurus-plugin-content-blog/time-travel-release.mdx +++ b/i18n/en/docusaurus-plugin-content-blog/time-travel-release.mdx @@ -65,4 +65,4 @@ The interface remembers your preferences, and even after reloading the page, eve Stay tuned for new releases on our blog and in the [Release Notes on GitHub](https://github.com/gemini-testing/html-reporter/releases), and if you encounter any issues, please visit our [GitHub issues][gh-issues] — we'll be happy to help! [gh-issues]: https://github.com/gemini-testing/testplane/issues -[time-travel-guide]: /docs/v8/guides/time-travel/ +[time-travel-guide]: /docs/v8/basic-guides/time-travel/ diff --git a/i18n/en/docusaurus-plugin-content-blog/vscode-extension.mdx b/i18n/en/docusaurus-plugin-content-blog/vscode-extension.mdx index 164b550..0d3e55e 100644 --- a/i18n/en/docusaurus-plugin-content-blog/vscode-extension.mdx +++ b/i18n/en/docusaurus-plugin-content-blog/vscode-extension.mdx @@ -9,7 +9,7 @@ import Admonition from "@theme/Admonition"; import runTestsFromSidebarVideoUrl from "/video/blog/vscode-extension/run-tests-from-sidebar.mp4"; import runTestsFromEditorVideoUrl from "/video/blog/vscode-extension/run-tests-from-editor.mp4"; -We have implemented an extension for [VS Code][vscode] for Testplane, which allows you to configure Testplane from scratch, run tests, and conveniently work with the REPL mode. +We have implemented an extension for [VS Code][vscode] for Testplane, which allows you to configure Testplane from scratch, run tests, and conveniently work with the REPL mode. @@ -80,7 +80,7 @@ In the sidebar of the testing panel, there is also a section titled Testplane. H #### With the `REPL` settings -When you click the checkbox `Enable REPL` and subsequently run a test (only one test can be run simultaneously in REPL mode), it will be launched in a special REPL mode. You can read more about this mode here. +When you click the checkbox `Enable REPL` and subsequently run a test (only one test can be run simultaneously in REPL mode), it will be launched in a special REPL mode. You can read more about this mode here. ![Enabling the REPL option](/img/blog/vscode-extension/enable-repl.png) diff --git a/i18n/ru/docusaurus-plugin-content-blog/storybook-testing.mdx b/i18n/ru/docusaurus-plugin-content-blog/storybook-testing.mdx index cdf2a6c..03b4c21 100644 --- a/i18n/ru/docusaurus-plugin-content-blog/storybook-testing.mdx +++ b/i18n/ru/docusaurus-plugin-content-blog/storybook-testing.mdx @@ -20,7 +20,7 @@ date: 2024-09-26T13:00 Как это использовать? -Узнайте больше об этом в нашей документации Скриншотное тестирование со Storybook. +Узнайте больше об этом в нашей документации Скриншотное тестирование со Storybook. [Пример проекта][example] с настроенным скриншотным тестированием со Storybook можно посмотреть в нашем репозитории на GitHub. [storybook]: https://storybook.js.org diff --git a/i18n/ru/docusaurus-plugin-content-docs/current.json b/i18n/ru/docusaurus-plugin-content-docs/current.json index 56ad4a6..5b7bcdf 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current.json +++ b/i18n/ru/docusaurus-plugin-content-docs/current.json @@ -40,11 +40,11 @@ "description": "The label for category mock in sidebar mainSidebar" }, "sidebar.mainSidebar.category.Guides": { - "message": "Рецепты", + "message": "Руководства", "description": "The label for category Guides in sidebar mainSidebar" }, "sidebar.mainSidebar.category.Migrations": { - "message": "Руководства по миграции", + "message": "Миграции", "description": "The label for category Migrations in sidebar mainSidebar" }, "sidebar.mainSidebar.category.Reference": { @@ -62,5 +62,37 @@ "sidebar.mainSidebar.category.Сomparison": { "message": "Сравнение", "description": "The label for category Comparison in sidebar mainSidebar" + }, + "sidebar.api.link.Testplane Commands": { + "message": "Команды Testplane", + "description": "The label for the link Testplane Commands in sidebar api" + }, + "sidebar.api.category.Config": { + "message": "Конфигурация", + "description": "The label for the link Testplane Commands in sidebar api" + }, + "sidebar.mainSidebar.category.Getting Started": { + "message": "Начало работы", + "description": "The label for category Getting Started in sidebar mainSidebar" + }, + "sidebar.mainSidebar.category.Advanced Guides": { + "message": "Продвинутые руководства", + "description": "The label for category Advanced Guides in sidebar mainSidebar" + }, + "sidebar.mainSidebar.doc.Testplane MCP": { + "message": "Testplane MCP", + "description": "The label for the doc item Testplane MCP in sidebar mainSidebar" + }, + "sidebar.mainSidebar.category.Plugins Reference": { + "message": "Плагины", + "description": "The label for category Plugins Reference in sidebar mainSidebar" + }, + "sidebar.ui.category.API": { + "message": "API", + "description": "The label for category API in sidebar ui" + }, + "sidebar.mainSidebar.category.Visual Testing Best Practices": { + "message": "Лучшие практики визуальных проверок", + "description": "The label for category Visual Testing Best Practices in sidebar mainSidebar" } } diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/_partials/mcp-snapshot-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/_partials/mcp-snapshot-example.mdx new file mode 100644 index 0000000..a6ef9f5 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/_partials/mcp-snapshot-example.mdx @@ -0,0 +1,115 @@ +```yaml +- body: + - main.body__wrapper: + - div.headline: + - div.headline__personal: + - a.home-link2.alice.headline__personal-item.home-link2_color_quaternary[aria-label=Алиса href="https://alice.yandex.ru/?utm_source=yandex&utm_campaign=morda_header_oknyx&utm_medium=interface"]: + - svg.alice__icon + - div: + - div: + - a.home-link2.headline__personal-item.headline__personal-item_services[aria-label=Сервисы href=https://yandex.ru/all title=Сервисы role=button]: + - div.headline__personal-icon: + - svg + - a.home-link2.headline__personal-enter.home-link2_color_black[href="https://passport.yandex.ru/auth?retpath=https%3A%2F%2Fsso.passport.yandex.ru%2Fpush%3Fretpath%3Dhttp..."] "Войти" + - div: + - div.usermenu-portal: + - div: + - a.home-link2.headline__personal-menu.headline__personal-item[aria-label="Профиль, вход не выполнен" role=button tabindex=0 href="https://passport.yandex.ru/auth?origin=morda&retpath=https%3A%2F%2Fya.ru%2F%3Fnr%3D1%26redirect_ts%3..."]: + - div.headline__personal-icon: + - svg + - div[@hidden]: + - div.alerts[role=complementary aria-label=Уведомления]: + - h1.a11y-hidden[@hidden] "Уведомления" + - div.alert: + - a.home-link2.alert__content.home-link2_color_inherit[href="https://yandex.ru/pogoda/146?lat=44.948237&lon=34.100318&utm_content=GroupedTomorrow&utm_medium=aler..."]: + - "div.alert__left-content-wrapper[aria-label=\"Завтра: дождь, грозы · +15⁠…⁠+19⁠° · слабый ветер 3⁠–⁠5 м⁠/⁠с, порывы до 11 м⁠/⁠с\"]": + - span.alert__text "Завтра: дождь, грозы · +15⁠…⁠+19⁠° · слабый ветер 3⁠–⁠5 м⁠/⁠с, порывы до 11 м⁠/⁠с" + - button.alert__close[aria-label=Закрыть @hidden] + - div.body__content: + - form.mini-suggest.i-mini-bem.mini-suggest_search_yes.mini-suggest_personal_yes.mini-suggest_request_xhr.mini-suggest_favicon_yes.mini-suggest_hide-on-scroll_yes.mini-suggest_direct_yes.mini-suggest_re-request_yes.mini-suggest_direct-disclaimer_yes.mini-suggest_autofocus_yes.mini-suggest_delete-on-hover_yes.mini-suggest_grouping_yes.mini-suggest_theme_tile.mini-suggest_prevent-empty_yes.mini-suggest_entity-suggest_yes.mini-suggest_overlay_yaru.mini-suggest_type-icon_yes.mini-suggest_redesigned-navs_yes.mini-suggest_redesign-type_block.mini-suggest_expanding_yes.mini-suggest_reasoning_yes.mini-suggest_redesign-serp_yes.search3.search3_redesign-type_block.search3_keyboard_yes.search3_voice_yes.search3_camera_yes.mini-suggest_js_inited[action=https://ya.ru/search/ role=search aria-label="Поиск в интернете"]: + - div.search3__inner-wrapper: + - div: + - section.reasoning-section.reasoning-section_on-top_yes.reasoning-section_justify_center: + - ul.reasoning-section__list: + - li.reasoning-section__item.reasoning-section__item_type_rect: + - a.home-link2.reasoning-section__item-link.home-link2_color_inherit[href="https://yandex.ru/finance?utm_source=subclasses_product&utm_content=fin_5&utm_campaign=morda_web&per..."]: + - span.reasoning-section__item-title "Финансы" + - li.reasoning-section__item.reasoning-section__item_type_rect: + - a.home-link2.reasoning-section__item-link.home-link2_color_inherit[href="https://yandex.ru/products?utm_source=subclasses_product&utm_content=ecom&utm_campaign=morda_web&per..."]: + - span.reasoning-section__item-title "Товары" + - li.reasoning-section__item.reasoning-section__item_type_rect: + - a.home-link2.reasoning-section__item-link.home-link2_color_inherit[href="https://yandex.ru/realty?utm_source=subclasses_realty&utm_content=realty&utm_campaign=morda_web&pers..."]: + - span.reasoning-section__item-title "Квартиры" + - div.search3__inner: + - label.search3__input-wrapper-wrapper[for=text]: + - div.search3__input-wrapper: + - div.search3__input-outer-container: + - div.search3__input-inner-container: + - input.search3__input.mini-suggest__control[aria-label=Запрос name placeholder="Подробно опишите сложную задачу или вопрос" @hidden] + - textarea.search3__input.mini-suggest__input#text[placeholder="Подробно опишите сложную задачу или вопрос" name=text role=combobox] + - svg.search3__magnifier + - div.search3__action-buttons.search3__action-buttons_submit-button-icon_yes: + - div.search3__reasoning-root: + - div.search3__reasoning: + - div.reasoning-dropdown__root: + - div.reasoning-dropdown: + - button.reasoning-dropwdown__button[type=button aria-label=Подробнее title=Подробнее]: + - svg.search3__reasoning-qmark + - div: + - button.search3__keyboard.search3__action[title=Клавиатура type=button @hidden]: + - svg.search3__svg_keyboard + - div.search3__voice-wrapper: + - button.Button.VoiceInput.search3__voice.search3__voice_type_depot.VoiceInput_futuris[aria-label="Голосовой поиск" type=button title="Голосовой поиск"]: + - span.Button-Text: + - svg.VoiceInput-Icon + - div: + - button.search3__action.search3__camera#image-search[title="Поиск по картинке" type=button]: + - svg.search3__svg_camera + - button.search3__button.search3__button_icon_yes.mini-suggest__button[type=submit tabindex=-1 aria-label=Найти @hidden]: + - svg + - input[type=hidden name=lr value=146 @value=146 @hidden] + - input[type=hidden name=msid value=1749915681851623-7074561989186018597-balancer-l7leveler-kubr-yp-vla-119-BAL @value=1749915681851623-7074561989186018597-balancer-l7leveler-kubr-yp-vla-119-BAL @hidden] + - input[type=hidden name=search_source value=yaru_desktop_common @value=yaru_desktop_common @hidden] + - input[type=hidden name=search_domain value=yaru @value=yaru @hidden] + - aside.informers3[aria-label=Информеры]: + - a.home-link2.informers3__item.informers3-weather.home-link2_color_quaternary.home-link2_hover_tertiary[aria-label="Погода в Симферополе 21°, Облачно с прояснениями" href="https://yandex.ru/pogoda/146?lat=44.948237&lon=34.100318&utm_campaign=informer&utm_content=main_info..."]: + - div.informers3-weather__text "+21°" + - div: + - a.home-link2.informers3__pollen.informers3__item.informers3__pollen_level_yellow.informers3__pollen_animate_yes[aria-label="Низкая активность злаков" href="https://yandex.ru/pogoda/allergies?allergen=cereals&lat=44.948237&lon=34.100318&utm_campaign=informe..."]: + - div.simple-tooltip.force-dark.informers-tooltip.simple-tooltip_hidden_yes.simple-tooltip_direction_right[@hidden] "Низкая активность злаков" + - section.informers3__stocks: + - h2.a11y-hidden "Курсы ЦБ РФ" + - div.informers3__stocks-item-wrapper: + - a.home-link2.informers3__stocks-item.home-link2_color_quaternary.home-link2_hover_tertiary[aria-label="USD ЦБ 79,00" href="https://ya.ru/search/?lr=146&search_source=ya_morda_stocks&text=USD+%D0%A6%D0%91&wiz=finance"]: + - span "USD 79,00" + - div.informers3__stocks-item-wrapper: + - a.home-link2.informers3__stocks-item.home-link2_color_quaternary.home-link2_hover_tertiary[aria-label="EUR ЦБ 90,01" href="https://ya.ru/search/?lr=146&search_source=ya_morda_stocks&text=EUR+%D0%A6%D0%91&wiz=finance"]: + - span "EUR 90,01" + - div.informers3__stocks-item-wrapper: + - a.home-link2.informers3__stocks-item.home-link2_color_quaternary.home-link2_hover_tertiary[aria-label="YDEX 3998,50" href="https://ya.ru/search/?lr=146&search_source=ya_morda_stocks&text=YDEX&wiz=finance"]: + - span "YDEX 3998,50" + - a.home-link2.informers3__geo.home-link2_color_quaternary.home-link2_hover_tertiary[aria-label="Ваш город определён как Симферополь" href="https://ya.ru/tune/geo?retpath=https%3A%2F%2Fya.ru%2F%3Fnr%3D1%26redirect_ts%3D1749915681.00000&nosy..."] "Симферополь" + - div.main-home-banner: + - div[@hidden]: + - div.main-home-banner__content.banner-tgo.banner-tgo_title_m: + - div.banner-tgo__content: + - div.banner-tgo__title "Простой переход на Яндекс Браузер" + - div.banner-tgo__subtitle: + - div.banner-tgo__domain "yandex.ru" + - span.home-link2.banner-tgo__mark "Реклама • 0+" + - a.home-link2.banner-tgo__link[aria-label="Простой переход на Яндекс Браузер" href=https://yandex.ru/an/count/WgyejI_zOoVX2Lci0WqL00Eca4kmIQS4p0bKyOO9wCsxD-yN0juA2EWchcZT7ALIUK0NwFEvt...] + - div.direct-close-block.direct-close-block_state_idle.direct-close-block_tgo: + - button.direct-close-block__close-button.direct-close-block__close-button_idle[aria-label="Действия с рекламой"]: + - div.direct-close-block__close-icon: + - svg + - div.ladybug: + - span.home-link2.ladybug__item.ladybug__butterfly#butterfly: + - div#butterfly-button: + - div: + - div.YndxBug.Bug__container1k5BDO.Bug__container_position_left35lf2v: + - div.YndxBug-Icon.Bug__icon3lvpsr: + - svg[@hidden] + - div[@hidden]: + - div.page-info[@hidden] "{\"static\":\"2025-06-11-855\",\"content\":\"big\",\"domain\":\"ru\",\"nodeVersion\":\"v22.10.0\"}" + - span#requestId[@hidden] "1749915681851623-7074561989186018597-balancer-l7leveler-kubr-yp-vla-119-BAL" +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/component-testing.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/component-testing.mdx similarity index 98% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/component-testing.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/component-testing.mdx index eded2e7..b4c10e5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/component-testing.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/component-testing.mdx @@ -180,9 +180,9 @@ export default Component; Вызов команд `log`, `info`, `warn`, `error`, `debug` и `table` на объекте `console` в браузере приводит к отображению информации не только в средствах разработчика браузера, но также в терминале, из которого был запущен Testplane. То есть, вы можете вызывать `console.log` в тесте/компоненте и увидеть результат его выполнения в терминале. Это особенно удобно при отладке тестов. -[test-run-env-option]: ../config/system.mdx#testrunenv +[test-run-env-option]: ../reference/config/system.mdx#testrunenv [browser-execute]: ../commands/browser/execute.mdx [testplane-examples-component-testing]: https://github.com/gemini-testing/testplane/tree/master/examples/component-testing [testplane-global-hook]: https://github.com/gemini-testing/testplane-global-hook [vite-hmr]: https://vitejs.dev/guide/api-hmr.html -[repl-mode]: ../command-line/index.mdx#testplane-repl +[repl-mode]: ../reference/cli.mdx#testplane-repl diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/custom-commands.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/custom-commands.mdx similarity index 96% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/custom-commands.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/custom-commands.mdx index e3de96f..be817cd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/custom-commands.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/custom-commands.mdx @@ -1,7 +1,7 @@ import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import Admonition from "@theme/Admonition"; -import AddElementCommandExample from "@site/docs/config/_partials/examples/_prepare-browser-add-element-command.mdx"; +import AddElementCommandExample from "@site/docs/reference/config/_partials/examples/_prepare-browser-add-element-command.mdx"; # Кастомные команды @@ -20,7 +20,7 @@ import AddElementCommandExample from "@site/docs/config/_partials/examples/_prep Отличное место для добавления всех ваших пользовательских команд — хук - [`prepareBrowser`](../config/prepare-browser.mdx). + [`prepareBrowser`](../reference/config/prepare-browser.mdx). Чтобы добавить пользовательскую команду в объект `browser`, используйте метод `addCommand`. Так можно определить команду, которая получает URL и заголовок текущей страницы: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-debug-test.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/debugging-tests.mdx similarity index 98% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-debug-test.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/debugging-tests.mdx index 346dbdb..3eef1cd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-debug-test.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/debugging-tests.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как отладить работу теста +# Отладка тестов ## Проблема {#problem} @@ -15,6 +15,7 @@ import Admonition from "@theme/Admonition";
+ Про интеграцию V8 инспектора с Node.js diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-manage-network-bandwidth.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/emulation.mdx similarity index 58% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-manage-network-bandwidth.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/emulation.mdx index 4fdbabe..0e718d2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-manage-network-bandwidth.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/emulation.mdx @@ -1,13 +1,39 @@ import Admonition from "@theme/Admonition"; -# Как управлять пропускной способностью сети +# Эмуляция -## Обзор {#overview} +## Производительность CPU -Данный рецепт работает только при использовании _Chrome DevTools Protocol (CDP)_. -Читайте подробности в разделе «[Как использовать CDP в Testplane][how-to-use-cdp]». +Данная функция работает только браузерами, поддерживающими _Chrome DevTools Protocol (CDP)_. + + + +Скорость работы процессора на мобильных устройствах сильно уступает скорости на компьютерах. Поэтому для эмуляции скорости CPU в Testplane существует метод [emulateCPUThrottling][emulate-cpu-throttling]. + +### Пример: замедляем скорость процессора в 8 раз + +```javascript +it("should open yandex.ru with emulation 8x slower CPU", async function ({ browser }) { + // Получаем инстанс puppeteer'а + const puppeteer = await browser.getPuppeteer(); + + // Получаем первую открытую страницу (считаем, что она активная в данный момент) + const [page] = await puppeteer.pages(); + + // Замедляем скорость процессора в 8 раз + await page.emulateCPUThrottling(8); + + await browser.url("https://yandex.ru"); +}); +``` + +## Пропускная способность сети + + + +Данная функция работает только браузерами, поддерживающими _Chrome DevTools Protocol (CDP)_. @@ -23,7 +49,7 @@ import Admonition from "@theme/Admonition"; - DSL - WiFi -## Пример 1: эмуляция 2G-соединения {#example_1} +### Пример 1: эмуляция 2G-соединения Сэмулируем 2G-соединение и откроем yandex.ru в Хроме с эмуляцией телефона: @@ -36,7 +62,7 @@ it("should open yandex.ru with emulation of 2G-connection", async function ({ br }); ``` -## Пример 2: эмуляция сети с заданными характеристиками {#example_2} +### Пример 2: эмуляция сети с заданными характеристиками Также мы можем сэмулировать соединение с конкретными характеристиками: @@ -54,5 +80,5 @@ it("should open yandex.ru with emulation of custom connection", async function ( }); ``` -[how-to-use-cdp]: ../how-to-use-cdp +[emulate-cpu-throttling]: https://pptr.dev/api/puppeteer.page.emulatecputhrottling [throttle]: ../../commands/browser/throttle diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/local-browsers.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/managing-browsers.mdx similarity index 94% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/local-browsers.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/managing-browsers.mdx index 7006717..a1e8e1d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/local-browsers.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/managing-browsers.mdx @@ -1,10 +1,10 @@ import Admonition from "@theme/Admonition"; -# Как запустить Testplane в локальном браузере +# Браузеры ## Введение -Testplane позволяет автоматически загружать браузеры, описанные в [Конфиге Testplane](/docs/v8/config/main). +Testplane позволяет автоматически загружать браузеры, описанные в [Конфиге Testplane](/docs/v8/reference/config/main). Также, если Testplane используется на поддерживаемой версии Ubuntu, аналогичным образом загрузятся и необходимые для запуска браузеров deb пакеты. @@ -16,11 +16,11 @@ Testplane позволяет автоматически загружать бр Также можно загрузить лишь необходимые бразуеры, описанные в конфиге. Например, если описан браузер `chrome-dark`, то загрузить только его можно командой `npx testplane install-deps chrome-dark`. -Больше об этой команде можно прочитать на соответствующей странице: [install-deps](/docs/v8/command-line#install-deps) +Больше об этой команде можно прочитать на соответствующей странице: [install-deps](/docs/v8/reference/cli#install-deps) ## Запуск тестов -Запускать тесты на локальных браузерах можно с [CLI опцией](/docs/v8/command-line) `--local`, либо с [gridUrl](/docs/v8/config/browsers/#grid_url): "local" в [конфиге Testplane](/docs/v8/config/main). Например: +Запускать тесты на локальных браузерах можно с [CLI опцией](/docs/v8/reference/cli) `--local`, либо с [gridUrl](/docs/v8/reference/config/browsers/#grid_url): "local" в [конфиге Testplane](/docs/v8/reference/config/main). Например: ```bash npx testplane --local diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-get-report.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/reporters.mdx similarity index 52% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-get-report.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/reporters.mdx index 2c8abe6..03eca02 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-get-report.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/reporters.mdx @@ -1,34 +1,16 @@ -# Как получить отчет о прогоне тестов +# Репортеры -## Отчет testplane {#testplane_report} +## Простой отчет {#testplane_report} -После завершения прогона всех тестов testplane пишет в консоль результат прогона в виде строки следующего вида: +По умолчанию Testplane выводит в консоль следующую сводку: ```bash Total: 1812 Passed: 1792 Failed: 0 Skipped: 20 Retries: 47 ``` -Где: +## Stat Reporter {#stat_reporter_report} -
- - - - - - - - - - - -
СтатусОписание
TotalОбщее количество тестов, которые testplane прочитала с файловой системы при запуске.
PassedЧисло тестов, которые успешно прошли.
FailedЧисло тестов, которые упали.
SkippedКоличество тестов, которые были пропущены (заскипаны) при запуске.
RetriesСуммарное количество ретраев тестов, которые произошли во время прогона.
- -Однако этой информации может быть недостаточно, поэтому вы можете добавить в свой проект плагин [stat-reporter][stat-reporter]. - -## Отчет плагина stat-reporter {#stat_reporter_report} - -Если вы добавите в свой проект плагин [stat-reporter][stat-reporter], то тогда после завершения прогона всех тестов вы получите в консоли более подробный отчет о результатах прогона. Например: +Если вы добавите в свой проект плагин [stat-reporter][stat-reporter], то получите более подробный отчет о результатах прогона в консоли после завершения всех тестов. Например: ```bash ┌──────────────────────┬────────┬───────┬────────┬────────┬─────────┬─────────┬──────────┐ @@ -62,30 +44,122 @@ Total: 1812 Passed: 1792 Failed: 0 Skipped: 20 Retries: 47 └──────────────────────┴────────┴───────┴────────┴────────┴─────────┴─────────┴──────────┘ ``` -В отличие от простого отчета testplane, в отчете плагина `stat-reporter` результаты прогонов разбиты по браузерам. Также выводятся максимальное время выполнения _(Duration)_ в минутах и секундах и результат прогона тестов _(Status)_ в каждом браузере. +В отличие от простого репортера, отчет плагина `stat-reporter` разбивает результаты по браузерам. Он также отображает максимальное время выполнения _(Duration)_ в минутах и секундах и результат прогона тестов _(Status)_ в каждом браузере. + +Такой отчет позволяет лучше понять, в каких браузерах возникли проблемы, а именно: где больше всего упало тестов или резко возросло время выполнения. + +Плагин `stat-reporter` также позволяет генерировать отчеты в форматах HTML или JSON. Подробности см. в [описании плагина][stat-reporter]. + +Однако по своим возможностям плагин [stat-reporter][stat-reporter] значительно уступает плагину [html-reporter][html-reporter], который предоставляет гораздо более продвинутые способы работы с тестами и результатами их прогона. + +## JSON Reporter {#json_reporter_report} + +Установите плагин [json-reporter][json-reporter], чтобы получить JSON-отчет с результатами тестов в следующем формате: + +```json +{ + "Main Page should send correct headers.chrome-138": { + "suitePath": ["Main Page", "should send correct headers"], + "fullName": "Main Page should send correct headers", + "browserId": "chrome-138", + "file": "tests/main-page/headers.testplane.js", + "duration": 2539, + "meta": { + "pid": 32410, + "browserVersion": "138.0", + "testXReqId": "e96e1911-db41-44a2-9980-fe78f16bb6b4", + "url": "https://ya.ru/" + }, + "startTime": 1766063685666, + "url": "/", + "status": "fail", + "errorReason": { + "message": "Cannot read properties of undefined (reading 'headers')", + "stack": "TypeError: Cannot read properties of undefined (reading 'headers')\n at Object. (/dev/hermione-playground/tests/main-page/headers.testplane.js:69:26)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)" + }, + "retries": [] + } +} +``` + +## HTML Reporter {#html_reporter_report} + +Testplane HTML Reporter — постоянно развивающийся многофункциональный интерфейс для работы с тестами. Он позволяет: + +- фильтровать тесты по статусу завершения; +- группировать тесты по ошибкам или любому параметру из метаданных теста; +- просматривать различия в скриншотах 6 различными способами; +- просматривать все повторы или ошибки в тестах отдельно. + +![](/img/docs/html-reporter/html-reporter-demo.png) -Такой отчет позволяет лучше понять в каких браузерах возникли проблемы, а именно: не проходит больше всего тестов или время выполнения резко возросло. +Помимо статических отчетов, HTML Reporter имеет интерактивный GUI-режим, позволяющий запускать тесты, работать с визуальными проверками и многое другое. Узнайте больше о Testplane UI в [специальном разделе документации](../../html-reporter/overview). -Плагин `stat-reporter` также позволяет формировать отчеты в виде html- или json-файлов. См. подробности в [описании плагина][stat-reporter]. +## Создание собственного отчета -Однако по своим возможностям плагин [stat-reporter][stat-reporter] значительно уступает плагину [html-reporter][html-reporter], который предоставляет разработчику гораздо более продвинутые способы работы с тестами и результатами их прогона. +Testplane легко кастомизируется — вы можете создавать собственные плагины и отчеты для своих нужд. -## Отчет плагина html-reporter {#html_reporter_report} +Так может выглядеть базовый отчет: -Добавьте в свой проект плагин [html-reporter][html-reporter], чтобы получить графический html-отчет с результатами прогонов всех тестов. Также в полученном отчете вы сможете: +```typescript title="reporter.ts" +import fs from "fs"; +import type Testplane from "testplane"; +import type { TestResult } from "testplane"; -- отфильтровать тесты по статусам завершения; -- сгруппировать тесты по ошибкам или любому параметру из мета-информации теста; -- посмотреть диффы в скриншотах 6 разными способами; -- посмотреть отдельно все ретраи или ошибки в тестах. +interface ReporterConfig { + enabled?: boolean; + path?: string; +} -![html-reporter](/img/docs/guides/how-to-get-report.html-reporter.png) +interface TestInfo { + name: string; + status: string; +} -Кроме того, [html-reporter][html-reporter] позволяет запускать testplane в специальном GUI-режиме. В этом режиме вы можете запускать и перезапускать тесты, переснимать скриншоты, использовать специальные режимы отладки и многое другое. +export = (testplane: Testplane, opts: ReporterConfig = {}): void => { + if (testplane.isWorker()) return; + + const config = { + enabled: opts.enabled !== false, + path: opts.path || "test-results.json", + }; + + if (!config.enabled) return; + + const results: TestInfo[] = []; + + testplane.on(testplane.events.TEST_PASS, (test: TestResult) => { + results.push({ name: test.fullTitle(), status: "passed" }); + }); + + testplane.on(testplane.events.TEST_FAIL, (test: TestResult) => { + results.push({ name: test.fullTitle(), status: "failed" }); + }); + + testplane.on(testplane.events.RUNNER_END, () => { + fs.writeFileSync(config.path, JSON.stringify(results, null, 2)); + console.log(`✓ Сохранено ${results.length} результатов тестов в ${config.path}`); + }); +}; +``` + +Чтобы использовать только что созданный отчет, вам нужно добавить его в файл `testplane.config.ts`: + +```typescript title="testplane.config.ts" +export default { + plugins: { + "./my-reporter": { + enabled: true, + path: "./reports/my-results.json", + }, + }, +}; +``` ## Ключевые слова {#keywords} - stat-reporter +- json-reporter - html-reporter - gui @@ -95,4 +169,5 @@ Total: 1812 Passed: 1792 Failed: 0 Skipped: 20 Retries: 47 - [Плагин html-reporter][html-reporter] [stat-reporter]: ../../plugins/stat-reporter +[json-reporter]: https://github.com/gemini-testing/json-reporter [html-reporter]: ../../html-reporter/html-reporter-setup diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/setup-and-teardown.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/setup-and-teardown.mdx new file mode 100644 index 0000000..073128f --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/setup-and-teardown.mdx @@ -0,0 +1,122 @@ +# Хуки жизненного цикла + +Testplane предоставляет способ выполнять код как до и после каждого теста, так и единоразово до/после всего запуска. Вы можете использовать эти хуки для подготовки окружения, уменьшения дублирования в тестах и многого другого. + +## До/после каждого теста + +Используйте плагин [@testplane/global-hook][testplane-global-hook] для выполнения действий до/после каждого теста. Установите плагин: + +```shell +npm install -D @testplane/global-hook +``` + +Добавьте плагин в секцию plugins конфигурации testplane и определите необходимые хуки. + +В примере ниже мы восстанавливаем состояние браузера перед каждым тестом — это полезно, если ваше приложение требует аутентификации. + +```typescript +export default { + // ... + plugins: { + "@testplane/global-hook": { + beforeEach: async ({ browser }) => { + await browser.restoreState(); + }, + afterEach: async ({ browser }) => { + await browser.execute(() => { + try { + localStorage.clear(); + } catch (e) {} + }); + }, + }, + }, +}; +``` + +Примечание: инстанс браузера доступен в хуках как свойство `browser` объекта контекста. + +Узнайте больше о командах [`saveState`](../commands/browser/saveState.mdx) и [`restoreState`](../commands/browser/restoreState.mdx) в соответствующих статьях. + +[testplane-global-hook]: https://github.com/gemini-testing/testplane-global-hook + +## До/после всего запуска Testplane + +Используйте хуки `beforeAll` и `afterAll` для выполнения действий до/после всего запуска Testplane. Вы можете определить эти хуки в конфигурации Testplane, как показано в примере ниже. + +Частый случай использования — аутентификация и сохранение состояния аутентификации для использования в последующих тестах: + +```typescript +import fs from "fs"; +import { launchBrowser } from "testplane/unstable"; + +const COOKIE_PATH = "./cookies.json"; + +export default { + browsers: { + "chrome-desktop": { + desiredCapabilities: { browserName: "chrome" }, + }, + }, + + beforeAll: async ({ config }) => { + const browser = await launchBrowser(config.browsers["chrome-desktop"]); + await browser.url("https://example.com/login"); + + await browser.setValue("#username", "user"); + await browser.setValue("#password", "pass"); + await browser.click("#submit"); + + const cookies = await browser.getCookies(); + fs.writeFileSync(COOKIE_PATH, JSON.stringify(cookies)); + + await browser.deleteSession(); + }, + + afterAll: async () => { + if (fs.existsSync(COOKIE_PATH)) { + fs.rmSync(COOKIE_PATH); + } + }, +}; +``` + +Примечание: в хуках `beforeAll` и `afterAll` нет готового экземпляра браузера, вы можете использовать [Standalone API](../reference/testplane-standalone-api.mdx) для запуска браузера и выполнения действий в нём. + +## Хук `prepareBrowser` + +Хук `prepareBrowser` вызывается один раз на сессию браузера, после инициализации браузера, но до запуска любых тестов в нём. + +Частый случай использования этого хука — добавление пользовательских команд для использования в тестах: + +```typescript +export default { + // ... + prepareBrowser: function (browser) { + browser.addCommand("waitForCustomCondition", async function (selector) { + await this.waitForExist(selector); + await this.waitForDisplayed(selector); + }); + + require("./commands/auth-helpers")(browser); + require("./commands/api-helpers")(browser); + }, +}; +``` + +## Хук `prepareEnvironment` + +Хук `prepareEnvironment` вызывается один раз на процесс: в главном процессе и в каждом воркере во время загрузки конфигурации. В этом хуке объект конфигурации доступен как `this`. + +Этот хук полезен только для очень специфических случаев, если вы не уверены в том, что делаете — используйте варианты, описанные выше. + +```typescript +import { pick } from "lodash"; + +export default { + // ... + prepareEnvironment: function () { + this.sets = pick(this.sets, ["touch-phone"]); + }, +}; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/time-travel.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/time-travel.mdx similarity index 98% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/time-travel.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/time-travel.mdx index 153a0a5..cad7a90 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/time-travel.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/time-travel.mdx @@ -1,7 +1,3 @@ ---- -sidebar_position: 1 ---- - import Admonition from "@theme/Admonition"; # Time Travel @@ -69,4 +65,4 @@ export = { например, отладка сетевых запросов и полноэкранный режим.
-[config-reference]: ../../config/browsers#time_travel +[config-reference]: ../../reference/config/browsers#time_travel diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/visual-testing/with-storybook.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/visual-testing-with-storybook.mdx similarity index 95% rename from i18n/ru/docusaurus-plugin-content-docs/current/visual-testing/with-storybook.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/visual-testing-with-storybook.mdx index b7afe20..cf0a02e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/visual-testing/with-storybook.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/visual-testing-with-storybook.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Скриншотное тестирование со Storybook +# Визуальное тестирование со Storybook [Storybook][storybook] — это инструмент для разработки пользовательских интерфейсов на основе компонентов. Он позволяет разработчикам независимо визуализировать компоненты в различных состояниях в изолированной от остальных компонентов среде. Такой "шоурум" идеально подходит для скриншотного тестирования ваших компонентов, т.к. за счет этой изолированной среды такие тесты получаются в разы стабильнее и быстрее, чем вариант с e2e. @@ -12,7 +12,7 @@ import Admonition from "@theme/Admonition"; ### Шаг 1: Установка необходимых зависимостей -Если в Вашем проекте еще нет `Testplane`, то рекомендуем ознакомиться с разделом [quickstart][quickstart] или выполнить в директории Вашего проекта команду ниже: +Если в Вашем проекте еще нет Testplane, рекомендуем ознакомиться с разделом [быстрого старта][quickstart] или выполнить в директории Вашего проекта команду ниже: ```bash npm init testplane@latest @@ -192,10 +192,10 @@ export default { [build-stories]: https://storybook.js.org/docs/6.4/configure/overview#feature-flags [html-reporter]: ../../html-reporter/html-reporter-setup/ -[isolation]: ../../config/browsers/#isolation +[isolation]: ../../reference/config/browsers/#isolation [play-function]: https://storybook.js.org/docs/writing-stories/play-function [plugin-link]: ../plugins/testplane-storybook.mdx [quickstart]: ../../quickstart [storybook]: https://storybook.js.org [testplane-storybook]: https://github.com/gemini-testing/testplane-storybook -[tests-per-session]: ../../config/browsers/#tests_per_session +[tests-per-session]: ../../reference/config/browsers/#tests_per_session diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/visual-testing/visual-testing-intro.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/visual-testing.mdx similarity index 98% rename from i18n/ru/docusaurus-plugin-content-docs/current/visual-testing/visual-testing-intro.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/visual-testing.mdx index 096e4ea..0670b2d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/visual-testing/visual-testing-intro.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/visual-testing.mdx @@ -3,7 +3,7 @@ В testplane реализовано визуальное тестирование, с помощью которого пользователь может проверить визуальные изменения отдельного компонента, вьюпорта или всей страницы целиком. Для анализа тестов, сохранения/обновления измененных изображений и запуска тестов рекомендуется использовать плагин [html-reporter][html-reporter], который предоставляет удобный UI для всех действий. -![Html-report](/img/docs/html-reporter/html-reporter.overview.png) +![](/gif/docs/ui/visual-checks.gif) ### Особенности сравнения скриншотов diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/assertView.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/assertView.mdx index d6ffffb..3d1265c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/assertView.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/assertView.mdx @@ -114,6 +114,6 @@ it("should assert view with given options", async ({ browser }) => { - [element.saveScreenshot](../../element/saveScreenshot) [webdriverio-api]: https://webdriver.io/docs/api -[browsers-tolerance]: ../../../config/browsers#tolerance -[browsers-antialiasing-tolerance]: ../../../config/browsers#antialiasing_tolerance +[browsers-tolerance]: ../../../reference/config/browsers#tolerance +[browsers-antialiasing-tolerance]: ../../../reference/config/browsers#antialiasing_tolerance [wait-for-static-to-load]: ../waitForStaticToLoad diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/getConfig.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/getConfig.mdx index 898aed7..c60c4c2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/getConfig.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/getConfig.mdx @@ -24,4 +24,4 @@ it("some test", async ({ browser }) => { }); ``` -[browser-config]: ../../../config/browsers#browser_main_settings +[browser-config]: ../../../reference/config/browsers#browser_main_settings diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/restoreState.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/restoreState.mdx index af37c0f..b7c02cd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/restoreState.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/restoreState.mdx @@ -148,5 +148,5 @@ export default { ## Связанные команды {#related} - [saveState](../saveState) -- [afterAll](../../../config/after-all) -- [beforeAll](../../../config/before-all) +- [afterAll](../../../reference/config/after-all) +- [beforeAll](../../../reference/config/before-all) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/saveState.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/saveState.mdx index 17ee7f6..a9501ea 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/saveState.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/saveState.mdx @@ -90,5 +90,5 @@ it("test", async ({ browser }) => { ## Связанные команды {#related} - [restoreState](../restoreState) -- [afterAll](../../../config/after-all) -- [beforeAll](../../../config/before-all) +- [afterAll](../../../reference/config/after-all) +- [beforeAll](../../../reference/config/before-all) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/throttle.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/throttle.mdx index 3487fc1..473ff02 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/throttle.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/throttle.mdx @@ -66,4 +66,4 @@ it("should throttle the network", async ({ browser }) => { ``` [how-to-use-cdp]: ../../../guides/how-to-use-cdp -[how-to-manage-network-bandwidth]: ../../../guides/how-to-manage-network-bandwidth +[how-to-manage-network-bandwidth]: ../../../basic-guides/emulation diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/url.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/url.mdx index 520b0fe..27a77b4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/url.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/browser/url.mdx @@ -55,5 +55,5 @@ await browser.url("relative"); await browser.url("/rootRelative"); ``` -[base-url]: ../../../config/browsers#base_url +[base-url]: ../../../reference/config/browsers#base_url [url-resolve]: https://nodejs.org/api/url.html#urlresolvefrom-to diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/assertView.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/assertView.mdx index caa8610..d6f5e6f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/assertView.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/assertView.mdx @@ -70,7 +70,7 @@ it("should assert view", async ({ browser }) => { [webdriverio-api]: https://webdriver.io/docs/api [wait-for-exist]: ../waitForExist -[wait-timeout]: ../../../config/browsers#wait_timeout -[wait-interval]: ../../../config/browsers#wait_interval -[browsers-tolerance]: ../../../config/browsers#tolerance -[browsers-antialiasing-tolerance]: ../../../config/browsers#antialiasing_tolerance +[wait-timeout]: ../../../reference/config/browsers#wait_timeout +[wait-interval]: ../../../reference/config/browsers#wait_interval +[browsers-tolerance]: ../../../reference/config/browsers#tolerance +[browsers-antialiasing-tolerance]: ../../../reference/config/browsers#antialiasing_tolerance diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForClickable.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForClickable.mdx index 70729b0..2e26ded 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForClickable.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForClickable.mdx @@ -46,4 +46,4 @@ it("should detect when element is no longer clickable", async ({ browser }) => { }); ``` -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForDisplayed.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForDisplayed.mdx index 6982597..2887aaa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForDisplayed.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForDisplayed.mdx @@ -59,4 +59,4 @@ it("should detect when element is no longer visible", async ({ browser }) => { }); ``` -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForEnabled.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForEnabled.mdx index 43095b9..03e7550 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForEnabled.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForEnabled.mdx @@ -59,4 +59,4 @@ it("should detect when element is no longer visible", async ({ browser }) => { }); ``` -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForExist.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForExist.mdx index cb50623..4887240 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForExist.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/element/waitForExist.mdx @@ -56,4 +56,4 @@ it("should remove a message after successful form submit", async ({ browser }) = }); ``` -[wait-for-interval]: ../../../config/browsers#wait_interval +[wait-for-interval]: ../../../reference/config/browsers#wait_interval diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/commands/expect/overview.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/commands/expect/overview.mdx index cb32da2..0bceb1f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/commands/expect/overview.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/commands/expect/overview.mdx @@ -45,4 +45,4 @@ await expect(mock).toBeRequested(); } ``` -[system_config]: ../../../config/system#expect_opts +[system_config]: ../../../reference/config/system#expect_opts diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/comparison/compare-with-playwright.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/comparison/compare-with-playwright.mdx index 5321ea3..eeb69fa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/comparison/compare-with-playwright.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/comparison/compare-with-playwright.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Сравнение Testplane с Playwright +# Testplane vs Playwright И **Testplane**, и **Playwright** — это решения для end-to-end тестирования, но они имеют разные подходы и возможности. В этой статье мы проведём детальное сравнение этих инструментов, чтобы помочь вам сделать правильный выбор. @@ -114,11 +114,11 @@ Testplane имеет графический интерфейс, который ### Взаимодействие с ИИ - Testplane MPC помогает ИИ-агентам писать стабильные новые тесты и чинить существующие + Testplane MCP помогает ИИ-агентам писать стабильные новые тесты и чинить существующие [Testplane MCP][testplane-mcp] — это инструмент, который позволяет ИИ-агентам погрузиться в контекст того, что происходит в браузере, выполнять действия и создавать или чинить тесты, основываясь на реальном состоянии страницы. -С помощью Testplane MCP пользователи могут не только создавать рабочие и стабильные тесты, но и быстро исправлять уже существующие. Testplane MPC позволяет подключиться к браузеру в ходе выполнения вашего теста, чтобы отладить или изменить его. Это значительно сокращает время, затрачиваемое на исправление нестабильных тестов. +С помощью Testplane MCP пользователи могут не только создавать рабочие и стабильные тесты, но и быстро исправлять уже существующие. Testplane MCP позволяет подключиться к браузеру в ходе выполнения вашего теста, чтобы отладить или изменить его. Это значительно сокращает время, затрачиваемое на исправление нестабильных тестов. Кроме того, Testplane MCP предоставляет возможность запускать браузер в режиме эмуляции мобильных устройств. Например, можно сказать "Открой страницу example.com с помощью Testplane MCP на iPhone 15" или указать явно какой User Agent нужно указать при создании браузерной сессии. ### Расширяемость и интеграции diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/android-testing.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/android-testing.mdx index f77c6db..7ba4533 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/android-testing.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/android-testing.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Тестирование Android Приложений +# Тесты Android-приложений Статья на данный момент содержит базовые сведения и будет улучшена в [testplane#1002](https://github.com/gemini-testing/testplane/issues/1002). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-add-testing-library.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-add-testing-library.mdx index 8ea43e4..5b8c106 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-add-testing-library.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-add-testing-library.mdx @@ -1,4 +1,4 @@ -# Как подключить testing-library в testplane +# Подключение Testing Library ## Введение {#preface} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-check-accessibility.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-check-accessibility.mdx index bd7b655..c0a6fa5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-check-accessibility.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-check-accessibility.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как протестировать доступность (accessibility) страницы +# Тестирование доступности ## Обзор {#overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-check-test-stability.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-check-test-stability.mdx deleted file mode 100644 index 6dffab1..0000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-check-test-stability.mdx +++ /dev/null @@ -1,51 +0,0 @@ -# Как проверить стабильность теста - -## Проблема {#problem} - -Существует масса причин, из-за которых тесты могут падать: - -- проблемы с инфраструктурой — недоступность браузеров, некорректная работа сети, протухание доступов и т. п. -- проблемы с внешними сервисами, к которым обращается тест — -- гонки в самом тесте, когда какой-либо элемент не успел прорисоваться, а контрольное время его ожидания истекло; -- внезапно возникающие попапы при выполнении теста, которые перекрывают нужный элемент, вносят дифф в отснятый скриншот, не дают кликнуть по нужному элементу; -- и т. д. и т. п. - -Часто такие падения не воспроизводятся с первого раза. Поэтому, чтобы убедиться, что свеженаписанный тест стабилен, нужно запустить его много раз. Но есть одна проблема: если вы запустите свой тест в testplane _as is,_ то после первого же успешного прогона testplane прекратит запускать ваш тест. Тест прошел — всё ОК. Но для проверки стабильности этого недостаточно. Может быть, тест прошел случайно, и если запустить его повторно, то он упадет. Хотелось бы запустить его не 1 раз, и не 2, а например, 20 раз и посмотреть сколько раз он успешно пройдет при 20 повторах. Или 30. Или... и т. д. - -## Решение: @testplane/test-repeater {#solution} - -Для решения данной проблемы был разработан плагин [@testplane/test-repeater][testplane-test-repeater]. - -Плагин позволяет запустить один и тот же тест (или группу тестов) требуемое количество раз. - -Плагин гарантирует, что тесты будут запущены столько раз, сколько вы задали, независимо от результатов их прогона в каждой попытке. Кроме того, плагин позволяет запускать тесты каждый раз в новой сессии браузера. Это исключает влияние деградации браузера или еще какие-либо побочные эффекты, которые могли бы возникнуть при повторных прогонах в одной и той же сессии браузера. - -Подробнее о том, как добавить этот плагин в проект, настроить и использовать его, читайте в [документации плагина][testplane-test-repeater]. - -## Примеры использования {#usage} - -Ниже приведены примеры прогонов тестов, в которых их прогнали 21 раз (1 основной + 20 ретраев), чтобы проверить их на стабильность. - -### Пример сломанных тестов - -Как видно из скриншота тесты были запущены 21 раз и ни разу не завершились успешно: - -![Неработающий тест](/img/docs/guides/how-to-check-test-stability.total-failure.png) - -### Пример стабильного теста - -А здесь наоборот — все запуски прошли успешно: - -![Стабильный тест](/img/docs/guides/how-to-check-test-stability.total-success.png) - -### Пример нестабильных тестов - -На следующем скриншоте первый тест практически не рабочий — из 21 попытки только 1 раз тест прошел. А второй тест — достаточно стабильный, хотя 2 падения из 21 — это все равно не 100%-ная стабильность. И разработчик может попытаться разобраться, почему все-таки тест иногда падает. - -![Нестабильный тест](/img/docs/guides/how-to-check-test-stability.unstable-test.png) - -## Ключевые слова {#keywords} - -- @testplane/test-repeater - -[testplane-test-repeater]: ../../plugins/testplane-test-repeater diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-hide-scrollbars-by-cdp.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-hide-scrollbars-by-cdp.mdx deleted file mode 100644 index 125dc1d..0000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-hide-scrollbars-by-cdp.mdx +++ /dev/null @@ -1,48 +0,0 @@ -import Admonition from "@theme/Admonition"; - -# Как скрывать скроллбары с помощью Chrome DevTools Protocol - -## Обзор {#overview} - - -Данный рецепт работает только при использовании _Chrome DevTools Protocol (CDP)_. - -Читайте подробности в разделе «[Как использовать CDP в Testplane][how-to-use-cdp]» - - - -Одна из причин падений тестов при тестировании верстки с помощью скриншотов — это появление скроллбара в браузере в момент снятия скриншота. Подробнее об этой проблеме и некоторых способах её решения, вы можете прочитать [здесь](../how-to-hide-scrollbars). Особенно часто эта проблема возникает в тестах с мобильной эмуляцией. - -В CDP есть специальный метод [Emulation.setScrollbarsHidden][set-scrollbars-hidden], который позволяет скрыть скроллбар. Однако в _puppeteer_ отсутствует обертка над этим методом. Поэтому мы воспользуемся методом [CDPSession.send][cdp-session-send], чтобы выполнить команду [Emulation.setScrollbarsHidden][set-scrollbars-hidden]. - -## Пример: как отключить скроллбар с помощью CDP {#example} - -Вот как это будет выглядеть: - -```javascript -it("should hide scrollbar", async function ({ browser }) { - // Получаем инстанс puppeteer'а - const puppeteer = await browser.getPuppeteer(); - - // Получаем первую открытую страницу (считаем, что она активная в данный момент) - const [page] = await puppeteer.pages(); - - // Создаем CDP-сессию - const client = await page.target().createCDPSession(); - - // Скрываем скроллбар - await client.send("Emulation.setScrollbarsHidden", { hidden: true }); - - await browser.url("https://yandex.ru"); -}); -``` - -## Полезные ссылки {#useful_links} - -Читайте также наш рецепт «[Как убрать скроллбары из скриншотов](../how-to-hide-scrollbars)». - -Там же вы узнаете про плагин [hermione-hide-scrollbars](../../plugins/hermione-hide-scrollbars), который реализован на основе метода [Emulation.setScrollbarsHidden][set-scrollbars-hidden] и который вы можете использовать, чтобы отключить скроллбары в CI для всех тестов в конкретных браузерах. - -[how-to-use-cdp]: ../how-to-use-cdp -[set-scrollbars-hidden]: https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setScrollbarsHidden -[cdp-session-send]: https://pptr.dev/next/api/puppeteer.cdpsession.send diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-hide-scrollbars.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-hide-scrollbars.mdx deleted file mode 100644 index 07469c1..0000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-hide-scrollbars.mdx +++ /dev/null @@ -1,63 +0,0 @@ -import Admonition from "@theme/Admonition"; - -# Как убрать скроллбары из скриншотов - -## Проблема {#problem} - -Одна из причин падений тестов при тестировании верстки с помощью скриншотов — это появление скроллбара в браузере в момент снятия скриншота. При этом возможны 3 варианта, когда при прогоне теста возникает дифф между эталонным скриншотом и текущим, который был заснят в тесте в момент прогона: - -1. В момент снятия эталонного скриншота скроллбара не было, но он появился при снятии текущего скриншота. -2. В момент снятия эталонного скриншота скроллбар был, однако при снятии текущего скриншота скроллбар появиться не успел. -3. Скроллбар есть и на эталонном скриншоте и на текущем, но положения скроллбаров, или их размеры, или прозрачность отличаются из-за разницы во времени, когда были сделаны скриншоты относительно появления скроллбара. - -На скриншоте ниже приведен пример, который соответствует первому варианту: - -![дифф из-за скроллбара](/img/docs/guides/how-to-hide-scrollbars.diff-in-screenshot.png) - -## Решение 1: screenshotDelay {#solution_1} - -В настройках testplane есть обязательная опция `browsers`, которая задает набор браузеров, доступных в проекте, и их свойства. Выберите браузер, в котором у вас возникают диффы из-за скроллбаров, и добавьте для него опцию `screenshotDelay`: - -```javascript -module.exports = { - browsers: { - iphone: { - screenshotDelay: 600, // Задержка перед снятием скриншота в мс - - // другие настройки браузера... - }, - - // другие браузеры... - }, - - // другие настройки testplane... -}; -``` - -Опция `screenshotDelay` задает паузу в миллисекундах, которую testplane должна выдержать перед снятием скриншота (прежде чем выполнять команду `assertView`). - -### Как это может помочь? {#how_can_it_help} - -Часто скриншоты возникают из-за того, что тест должен подскроллить страницу к требуемому элементу, прежде чем сделать скриншот. После того как подскролл выполнен, скроллбар может еще какое-то время «висеть» на экране и соответственно, попасть на скриншот, если тот будет выполнен немедленно. Задержка `screenshotDelay` дает скроллбару время на то, чтобы исчезнуть. - -Однако, данный способ помогает далеко не всегда, так как зависит от реализации браузеров и их поведения. - -## Решение 2: отключение скроллбаров {#solution_2} - -Если скроллбары возникают на скриншотах в Chrome-браузере, то их можно отключить с помощью [DevTools протокола][CDP]. - -Для этого добавьте в свой проект плагин [hermione-hide-scrollbars][hermione-hide-scrollbars] и укажите в его настройках список браузеров, для которых необходимо отключать скроллбары в тестах. - - - Обновите Chrome-браузер до версии 72.1 и выше, чтобы данная функциональность работала в ваших - тестах. Так как более ранние версии Chrome-браузеров не поддерживают команду - _Emulation.setScrollbarsHidden_, с помощью которой отключаются скроллбары. - - -## Ключевые слова {#keywords} - -- screenshotDelay -- hermione-hide-scrollbars - -[hermione-hide-scrollbars]: ../../plugins/hermione-hide-scrollbars -[CDP]: https://chromedevtools.github.io/devtools-protocol/ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-intercept-requests-and-responses.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-intercept-requests-and-responses.mdx index 017b2f6..59b7404 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-intercept-requests-and-responses.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-intercept-requests-and-responses.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как отслеживать и перехватывать сетевые запросы и ответы +# Моки сетевых запросов ## Обзор {#overview} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-manage-cpu-performance.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-manage-cpu-performance.mdx deleted file mode 100644 index 339e2fb..0000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-manage-cpu-performance.mdx +++ /dev/null @@ -1,64 +0,0 @@ -import Admonition from "@theme/Admonition"; - -# Как управлять быстродействием процессора - -## Обзор {#overview} - - -Данный рецепт работает только при использовании _Chrome DevTools Protocol (CDP)_. - -Читайте подробности в разделе «[Как использовать CDP в Testplane][how-to-use-cdp]» - - - -Скорость работы процессора на мобильных устройствах сильно уступает скорости на компьютерах. Поэтому для эмуляции скорости CPU в _puppeteer_ существует метод [emulateCPUThrottling][emulate-cpu-throttling]. - -## Пример: замедляем скорость процессора в 8 раз {#example} - -Воспользуемся этим методом, чтобы замедлить скорость процессора в 8 раз: - -```javascript -it("should open yandex.ru with emulation 8x slower CPU", async function ({ browser }) { - // Получаем инстанс puppeteer'а - const puppeteer = await browser.getPuppeteer(); - - // Получаем первую открытую страницу (считаем, что она активная в данный момент) - const [page] = await puppeteer.pages(); - - // Замедляем скорость процессора в 8 раз - await page.emulateCPUThrottling(8); - - await browser.url("https://yandex.ru"); -}); -``` - -## Небольшая история об одном обходном пути {#workaround_in_the_past} - -Изначально в _webdriverio_ не было поддержки метода `page.emulateCPUThrottling`, так как в _webdriverio_ использовалась версия _puppeteer-core@9.1.0,_ а не _puppeteer-core@10.1.0_, в которой этот метод был поддержан. - -Однако это ограничение можно было обойти с помощью метода _puppeteer_ [CDPSession.send()][cdp-session-send], отправив браузеру команду [Emulation.setCPUThrottlingRate][emulation-set-cpu-throttling-rate] по CDP: - -```javascript -it("should open yandex.ru with emulation 8x slower CPU", async function ({ browser }) { - // Получаем инстанс puppeteer'а - const puppeteer = await browser.getPuppeteer(); - - // Получаем первую открытую страницу (считаем, что она активная в данный момент) - const [page] = await puppeteer.pages(); - - // Создаем CDP-сессию - const client = await page.target().createCDPSession(); - - // Замедляем скорость процессора в 8 раз - await client.send("Emulation.setCPUThrottlingRate", { rate: 8 }); - - await browser.url("https://yandex.ru"); -}); -``` - -Позже мы донесли в _webdriverio_ необходимый [пулл-реквест](https://github.com/webdriverio/webdriverio/pull/7135) с апдейтом версии _puppeteer-core_ и теперь метод [emulateCPUThrottling][emulate-cpu-throttling] доступен в testplane прямо из коробки. - -[how-to-use-cdp]: ../how-to-use-cdp -[emulate-cpu-throttling]: https://pptr.dev/api/puppeteer.page.emulatecputhrottling -[cdp-session-send]: https://pptr.dev/api/puppeteer.cdpsession.send -[emulation-set-cpu-throttling-rate]: https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setCPUThrottlingRate diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-optimize-test-code.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-optimize-test-code.mdx deleted file mode 100644 index 1185dcc..0000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-optimize-test-code.mdx +++ /dev/null @@ -1,23 +0,0 @@ -# Как избавиться от дублирования в тестах - -## Проблема {#problem} - -Часто, перед тем как запустить очередной testplane-тест, нужно выполнить определенную подготовительную работу, например: - -- очистить все cookies; -- почистить localStorage; -- инициализировать какую-либо переменную теста. - -Аналогично, после завершения основных проверок в testplane-тесте, вы можете захотеть всегда проверять наличие ошибок в клиентском коде, срабатывание нужных метрик и т. п. - -## Решение: testplane-global-hook {#solution} - -Чтобы не повторять эти действия каждый раз в своих тестах, подключите плагин [testplane-global-hook][testplane-global-hook] и опишите их в настройках плагина в виде функций для хуков `beforeEach` и `afterEach`. - -Подробнее о том, как подключить и настроить плагин, читайте в [документации][testplane-global-hook] плагина. - -## Ключевые слова {#keywords} - -- testplane-global-hook - -[testplane-global-hook]: ../../plugins/testplane-global-hook diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-run-on-github.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-run-on-github.mdx index 3f9533f..1dee166 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-run-on-github.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-run-on-github.mdx @@ -1,10 +1,10 @@ -# Как запустить Testplane в GitHub CI +# Testplane в GitHub CI ## Введение Для запуска Testplane в GitHub CI имеется [специальный Github Action][gh-actions-testplane], который: -- Занимается кэшированием [локальных браузеров](/docs/v8/guides/local-browsers) (при использовании); +- Занимается кэшированием [локальных браузеров](/docs/v8/basic-guides/managing-browsers) (при использовании); - Пишет статистику упавших тестов в [Job summary](https://github.blog/news-insights/product-news/supercharging-github-actions-with-job-summaries/); - Помогает с отображением [html-отчета](../../html-reporter/html-reporter-setup) с результатами прогона тестов в браузере. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-skip-test-in-browsers.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-skip-test-in-browsers.mdx deleted file mode 100644 index e7b8988..0000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-skip-test-in-browsers.mdx +++ /dev/null @@ -1,81 +0,0 @@ -# Как пропустить тест в заданном браузере - -## Проблема {#problem} - -Иногда вам нужно пропустить запуск теста только в определенном браузере, а не во всех браузерах. То есть вы не хотели бы отключать или удалять весь тест, а хотели бы только ограничить количество браузеров, на которых он будет запускаться. - -Например, это может быть связано с ограниченной функциональностью соответствующего браузера: отсутствием в нем необходимых возможностей, которые используются на веб-странице и проверяются тестом. - -Ещё такая необходимость может возникнуть при нестабильной работе теста в каком-либо браузере, из-за неучета каких-то особенностей реализации в браузере. - -В testplane вы можете сделать это с помощью специальных хелперов (директив) `skip` и `only`. - -## Решение 1: директива .skip.in {#solution_1} - -Например, если вы не хотите запускать тест в браузере `IE8`: - -```javascript -describe("feature", function () { - testplane.skip.in("ie8", "it cannot work in this browser"); - it("nowaday functionality", function () { - // ... - }); -}); -``` - -При использовании директивы `testplane.skip.in` вы увидите в отчете сообщение о том, что запуск в соответствующем браузере был пропущен. - -Чтобы пропустить запуск тестов без уведомлений в отчете, вы можете передать хелперу специальный флаг `silent` в качестве третьего аргумента: - -```javascript -testplane.skip.in("ie8", "skipReason", { silent: true }); -``` - -## Решение 2: директива .skip.notIn {#solution_2} - -Также вы можете захотеть запускать тест только в конкретном браузере, например, в `Chrome`: - -```javascript -describe("feature", function () { - testplane.skip.notIn("chrome", "it should work only in Chrome"); - it("specific functionality", function () { - // ... - }); -}); -``` - -Аналогично, чтобы избавиться от уведомлений в отчете, вы можете передать хелперу специальный флаг `silent` в качестве третьего аргумента: - -```javascript -testplane.skip.notIn("chrome", "skipReason", { silent: true }); -``` - -## Решение 3: директивы .only.in и .only.notIn {#solution_3} - -Ещё вы можете воспользоваться хелперами `only.in` и `only.notIn`, логика которых противоположна хелперам `skip.in` и `.skip.notIn`. Плюс эти хелперы по умолчанию не выводят никаких уведомлений в отчете: - -```javascript -testplane.only.in("chrome"); // запустить тест только в chrome -``` - -```javascript -testplane.only.notIn("ie8"); // запустить тест во всех браузерах, кроме ie8 -``` - -## Решение 4: директива .also.in и браузерная опция passive {#solution_4} - -В случае если вы внедряете новый браузер и вам необходимо его запускать только в нескольких тестах, а у вас их тысячи, то использовать хелпер `.skip.in` неудобно. Для решения этой проблемы можно воспользоваться браузерной опцией [passive][passive-option] и хелпером `.also.in`: - -```javascript -testplane.also.in("ie8"); // запустить тест в пассивном браузере ie8 -``` - -## Ключевые слова {#keywords} - -- testplane.skip.in -- testplane.skip.notIn -- testplane.only.in -- testplane.only.notIn -- testplane.also.in - -[passive-option]: ../../config/browsers#passive diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-update-browsers.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-update-browsers.mdx index f7438ec..5331493 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-update-browsers.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-update-browsers.mdx @@ -3,7 +3,7 @@ import TabItem from "@theme/TabItem"; import Admonition from "@theme/Admonition"; -# Как обновлять браузеры в больших проектах +# Обновление браузеров в больших проектах ## Проблема @@ -41,14 +41,14 @@ describe("suite", function () { ## Решение 2: Browser Version Changer -Можно воспользоваться плагином [hermione-browser-version-changer][hermione-browser-version-changer], который позволяет определять версию браузера для конкретного теста на основе специального словаря _(store)_ и предикатов для всех доступных в проекте версий браузеров. +Можно воспользоваться плагином [@testplane/browser-version-changer][hermione-browser-version-changer], который позволяет определять версию браузера для конкретного теста на основе специального словаря _(store)_ и предикатов для всех доступных в проекте версий браузеров. Пример использования плагина: ```javascript module.exports = { plugins: { - "hermione-browser-version-changer": { + "@testplane/browser-version-changer": { enabled: true, initStore: async () => { // Подготавливаем словарь с произвольными признаками для разметки diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-use-cdp.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-use-cdp.mdx index a93a571..5bf26b2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-use-cdp.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-use-cdp.mdx @@ -1,3 +1,8 @@ +--- +unlisted: true +sidebar_class_name: hidden +--- + import Admonition from "@theme/Admonition"; # Как использовать Chrome DevTools Protocol в testplane @@ -106,7 +111,7 @@ module.exports = { [puppeteer]: https://pptr.dev/ [how-to-intercept-requests-and-responses]: ../how-to-intercept-requests-and-responses [how-to-check-accessibility]: ../how-to-check-accessibility -[how-to-manage-network-bandwidth]: ../how-to-manage-network-bandwidth -[how-to-manage-cpu-performance]: ../how-to-manage-cpu-performance -[how-to-hide-scrollbars-by-cdp]: ../how-to-hide-scrollbars-by-cdp +[how-to-manage-network-bandwidth]: ../../basic-guides/emulation +[how-to-manage-cpu-performance]: ../../basic-guides/emulation +[how-to-hide-scrollbars-by-cdp]: ../visual-checks-best-practices/hiding-scrollbars [webdriver-vs-cdp]: ../../reference/webdriver-vs-cdp diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/selectivity.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/selectivity.mdx index 6d224b8..4dd933a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/selectivity.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/selectivity.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как настроить селективность при запуске тестов +# Селективность ## Введение @@ -22,7 +22,7 @@ import Admonition from "@theme/Admonition"; ## Настройка -Для включения селективности достаточно добавить в конфигурацию Testplane секцию [`selectivity`](/docs/v8/config/browsers#selectivity) с параметром `enabled: true`: +Для включения селективности достаточно добавить в конфигурацию Testplane секцию [`selectivity`](/docs/v8/reference/config/browsers#selectivity) с параметром `enabled: true`: ```typescript // testplane.config.ts @@ -224,5 +224,5 @@ testplane_selectivity_enabled=false # отключить Дополнительная информация о конфигурации селективности описана в разделе [browsers-selectivity][selectivity-config] документации. -[dev-server]: ../../config/dev-server -[selectivity-config]: ../../config/browsers#selectivity +[dev-server]: ../../reference/config/dev-server +[selectivity-config]: ../../reference/config/browsers#selectivity diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/visual-checks-best-practices/hiding-scrollbars.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/guides/visual-checks-best-practices/hiding-scrollbars.mdx new file mode 100644 index 0000000..af527bc --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/visual-checks-best-practices/hiding-scrollbars.mdx @@ -0,0 +1,103 @@ +import Admonition from "@theme/Admonition"; + +# Скроллбары на скриншотах + +Скроллбары могут быть источником нестабильности в визуальных тестах — они могут случайно появляться, исчезать и менять свое положение. Мы настоятельно рекомендуем скрывать их при выполнении визуальных проверок. + +Пример диффа из-за скроллбара: + +![](/img/docs/guides/how-to-hide-scrollbars.diff-in-screenshot.png) + +## Решение 1: использование флага `--hide-scrollbars` (рекомендуется) {#solution_1} + +Chrome, начиная примерно с версии 50, поддерживает флаг `--hide-scrollbars` (другие браузеры на основе Chromium также имеют этот флаг). Вы можете указать его в настройках браузера так: + +```diff +module.exports = { + browsers: { + chrome: { + desiredCapabilities: { + browserName: "chrome", + browserVersion: "125.0", + "goog:chromeOptions": { + args: ["--hide-scrollbars"], + }, + }, + }, + }, +}; +``` + +## Решение 2: screenshotDelay {#solution_2} + +Это решение актуально только для браузеров, в которых скроллбары исчезают при отсутствии взаимодействия. + +Вы можете использовать опцию `screenshotDelay`, чтобы дождаться исчезновения скроллбара. + +В настройках Testplane есть обязательная опция `browsers`, которая задает набор браузеров, доступных в проекте, и их свойства. Выберите браузер, в котором у вас возникают диффы из-за скроллбаров, и добавьте для него опцию `screenshotDelay`: + +```javascript +module.exports = { + browsers: { + iphone: { + screenshotDelay: 600, // Задержка перед снятием скриншота в мс + + // другие настройки браузера... + }, + + // другие браузеры... + }, + + // другие настройки Testplane... +}; +``` + +Опция `screenshotDelay` задает паузу в миллисекундах, которую Testplane должна выдержать перед снятием скриншота (прежде чем выполнять команду `assertView`). + +### Как это может помочь? {#how_can_it_help} + +Часто скриншоты генерируют диффы из-за того, что тест должен подскроллить страницу к требуемому элементу непосредственно перед снятием скриншота. После того как подскролл выполнен, скроллбар может еще какое-то время оставаться видимым на экране и, соответственно, попасть на скриншот, если тот будет выполнен немедленно. Задержка `screenshotDelay` дает скроллбару время на то, чтобы исчезнуть. + +Однако этот метод работает не всегда, так как зависит от реализации и поведения браузеров. + +## Решение 3: отключение скроллбаров с помощью CDP {#solution_3} + +Это решение полезно для очень старых версий Chrome или браузеров, которые не поддерживают флаг `--hide-scrollbars`, но поддерживают метод CDP `Emulation.setScrollbarsHidden`. + +Если скроллбары появляются на скриншотах в браузере Chrome, их можно отключить с помощью [протокола DevTools][CDP]. + +Для этого добавьте в свой проект плагин [hermione-hide-scrollbars][hermione-hide-scrollbars] и укажите в его настройках список браузеров, для которых необходимо отключать скроллбары в тестах. + + + Обновите Chrome-браузер до версии 72.1 и выше, чтобы данная функциональность работала в ваших + тестах. Более ранние версии Chrome не поддерживают команду _Emulation.setScrollbarsHidden_, + которая используется для отключения скроллбаров. + + +Плагин `hermione-hide-scrollbars` основан на методе CDP `Emulation.setScrollbarsHidden`, поэтому в качестве альтернативы вы можете сделать это самостоятельно: + +```javascript +it("should hide scrollbar", async function ({ browser }) { + // Получаем экземпляр puppeteer + const puppeteer = await browser.getPuppeteer(); + + // Получаем первую открытую страницу (считая её активной) + const [page] = await puppeteer.pages(); + + // Создаем CDP-сессию + const client = await page.target().createCDPSession(); + + // Скрываем скроллбар + await client.send("Emulation.setScrollbarsHidden", { hidden: true }); + + await browser.url("https://yandex.ru"); +}); +``` + +## Ключевые слова {#keywords} + +- screenshotDelay +- hermione-hide-scrollbars + +[hermione-hide-scrollbars]: ../../../plugins/hermione-hide-scrollbars +[CDP]: https://chromedevtools.github.io/devtools-protocol/ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/index.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/index.mdx index 5604d6e..7a12ffb 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/index.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/index.mdx @@ -4,7 +4,7 @@ **Testplane** — это инструмент для автоматизации тестирования пользовательских сценариев в web-интерфейсах. -С помощью неё вы можете протестировать функциональность своего сайта или проекта, а также проверить, что ваша верстка при любых обстоятельствах соответствует эталонной. В вашем распоряжении — весь [спектр команд][commands], которые предоставляет [WebDriverIO v9][webdriverio-api] и [все возможности протокола Chrome DevTools][how-to-use-cdp]. А ещё — привычный синтаксис [Mocha][mocha]. +С помощью Testplane вы можете протестировать функциональность своего сайта или проекта, а также проверить, что ваша верстка при любых обстоятельствах соответствует эталонной. В вашем распоряжении — весь [спектр команд][commands], которые предоставляет [WebDriverIO v9][webdriverio-api] и [все возможности протокола Chrome DevTools][how-to-use-cdp]. А ещё — привычный синтаксис [Mocha][mocha]. В вашем проекте становится всё больше и больше тестов? — Testplane позволит вам легко масштабировать их прогон, не теряя в юзабилити. Она умеет не только запускать тесты параллельно, в разных браузерах, на разных платформах, но и собирать все результаты прогонов в единый html-отчет, с возможностями гибкого просмотра, группировки и фильтрации тестов. @@ -28,7 +28,7 @@ - быстрое создание проекта с помощью [create-testplane][create-testplane]; - все ключевые параметры имеют [оптимальные дефолты][defaults]; - легко писать тесты, так как в основе [Mocha][mocha]; -- большой [спектр команд][commands], «под капотом» — [WebdriverIO v8][webdriverio-api]; +- большой [спектр команд][commands], «под капотом» — [WebdriverIO v9][webdriverio-api]; - своя мощная команда [assertView][assert-view] для снятия и сравнения скриншотов; - при сравнении скриншотов [можно гибко управлять параметрами][assert-view-opts] для отдельных тестов; - при снятии скриншотов можно указать какие области игнорировать; @@ -37,7 +37,7 @@ ### Быстрое выполнение тестов {#fast} - за счет [параллельности внутри Testplane][testplane-workers]; -- масштабирование с помощью [testplane-chunks][testplane-chunks]; +- масштабирование с помощью [@testplane/chunks][testplane-chunks]; - [повторное реиспользование сессий][sessions-reuse]; - кэширование сессий с браузерами; - 20000 тестов за 10 минут — легко! @@ -89,15 +89,15 @@ - доступны [точки расширения][html-reporter-extension-points] в отчете testplane; - можно [расширять CLI Testplane из своего плагина][testplane-cli], добавляя новые команды и опции. -[assert-view-opts]: ./config/browsers#assert_view_opts +[assert-view-opts]: ./reference/config/browsers#assert_view_opts [assert-view]: ./commands/browser/assertView [commands]: ./commands/overview [create-testplane]: https://github.com/gemini-testing/create-testplane -[defaults]: ./config/browsers#timeouts -[how-to-check-test-stability]: ./guides/how-to-check-test-stability +[defaults]: ./reference/config/browsers#timeouts +[how-to-check-test-stability]: ./plugins/testplane-test-repeater [how-to-read-browser-logs]: ./guides/how-to-read-browser-logs -[how-to-run-test-in-file]: ./guides/how-to-run-specified-test#solution_1 -[how-to-skip-tests]: ./guides/how-to-skip-test-in-browsers +[how-to-run-test-in-file]: ./quickstart/running-tests#running_a_specific_file +[how-to-skip-tests]: ./reference/testplane-helper [how-to-test-layout-under-login]: ./guides/how-to-test-layout-under-login [how-to-use-cdp]: ./guides/how-to-use-cdp [html-reporter-diff]: ./html-reporter/html-reporter-setup#diffmode @@ -106,19 +106,19 @@ [html-reporter-plugins]: ./html-reporter/html-reporter-plugins [html-reporter]: ./html-reporter/html-reporter-setup [mocha]: https://mochajs.org -[patterns-on-reject]: ./config/system#patterns_on_reject +[patterns-on-reject]: ./reference/config/system#patterns_on_reject [plugins]: https://github.com/gemini-testing/ -[prepare-browser]: ./config/prepare-browser +[prepare-browser]: ./reference/config/prepare-browser [retry-limiter]: ./plugins/retry-limiter [retry-progressive]: ./plugins/testplane-retry-progressive -[sessions-reuse]: ./config/browsers#tests_per_session +[sessions-reuse]: ./reference/config/browsers#tests_per_session [sharp]: https://github.com/lovell/sharp [testplane-chunks]: ./plugins/testplane-chunks [testplane-cli]: ./reference/testplane-events#cli [testplane-events]: ./reference/testplane-events -[testplane-option-grep]: ./guides/how-to-run-specified-test#solution_2 +[testplane-option-grep]: ./quickstart/running-tests#the_grep_option [testplane-plugins-profiler]: https://github.com/gemini-testing/testplane-plugins-profiler [testplane-profiler]: https://github.com/gemini-testing/testplane-profiler -[testplane-sets]: ./config/sets -[testplane-workers]: ./config/system#workers +[testplane-sets]: ./reference/config/sets +[testplane-workers]: ./reference/config/system#workers [webdriverio-api]: https://webdriver.io/docs/api diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-4.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-4.mdx index 013ccc2..fb625a9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-4.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-4.mdx @@ -3,7 +3,7 @@ import TabItem from "@theme/TabItem"; import Admonition from "@theme/Admonition"; -# Как обновить hermione до версии 4.x +# Hermione v3 → v4 Данный рецепт актуален только для тех проектов, которые используют hermione младше 4-й версии. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-5.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-5.mdx index 3f99f6b..0b30f82 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-5.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-5.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как обновить hermione до версии 5.x +# Hermione v4 → v5 Если в вашем проекте hermione младше 4-й версии, то прочтите «[Как обновить hermione до версии 4.x][how-to-upgrade-hermione-to-4]», прежде чем обновлять hermione до 5-й версии. @@ -121,20 +121,20 @@ import Admonition from "@theme/Admonition"; Если при переезде на новую версию вы столкнетесь с проблемами, или у вас возникнут какие-либо вопросы, то приходите в [github issues][gh-issues] — и мы обязательно вам поможем! [how-to-upgrade-hermione-to-4]: ../../migrations/how-to-upgrade-hermione-to-4 -[config-browsers]: ../../config/browsers +[config-browsers]: ../../reference/config/browsers [hermione-teamcity-reporter]: https://github.com/gemini-testing/hermione-teamcity-reporter [before-file-read]: ../../reference/testplane-events#before_file_read [event-suite-begin]: ../../reference/testplane-events#suite_begin [event-test-begin]: ../../reference/testplane-events#test_begin [test-parser]: ../../reference/testplane-events#test_parser [hermione-events]: ../../reference/testplane-events -[antialiasing-tolerance]: ../../config/browsers#antialiasing_tolerance -[composite-image]: ../../config/browsers#composite_image -[take-screenshot-on-fails-assert-view-fail]: ../../config/browsers#take_screenshot_on_fails -[take-screenshot-on-fails-mode]: ../../config/browsers#take_screenshot_on_fails_mode -[take-screenshot-on-fails-timeout]: ../../config/browsers#take_screenshot_on_fails_timeout -[http-timeout]: ../../config/browsers#http_timeout -[page-load-timeout]: ../../config/browsers#page_load_timeout -[session-quit-timeout]: ../../config/browsers#session_quit_timeout +[antialiasing-tolerance]: ../../reference/config/browsers#antialiasing_tolerance +[composite-image]: ../../reference/config/browsers#composite_image +[take-screenshot-on-fails-assert-view-fail]: ../../reference/config/browsers#take_screenshot_on_fails +[take-screenshot-on-fails-mode]: ../../reference/config/browsers#take_screenshot_on_fails_mode +[take-screenshot-on-fails-timeout]: ../../reference/config/browsers#take_screenshot_on_fails_timeout +[http-timeout]: ../../reference/config/browsers#http_timeout +[page-load-timeout]: ../../reference/config/browsers#page_load_timeout +[session-quit-timeout]: ../../reference/config/browsers#session_quit_timeout [save-history]: https://www.npmjs.com/package/hermione/v/5.6.4#savehistory [gh-issues]: https://github.com/gemini-testing/testplane/issues/ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-6.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-6.mdx index f2a95b8..eaa1563 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-6.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-6.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как обновить hermione до версии 6.x +# Hermione v5 → v6 Если в вашем проекте hermione младше 4-й версии, то прочтите сначала «[Как обновить hermione до версии 4.x][how-to-upgrade-hermione-to-4]» и «[Как обновить hermione до версии 5.x][how-to-upgrade-hermione-to-5]». @@ -46,6 +46,6 @@ module.exports = { [how-to-upgrade-hermione-to-4]: ../../migrations/how-to-upgrade-hermione-to-4 [how-to-upgrade-hermione-to-5]: ../../migrations/how-to-upgrade-hermione-to-5 -[browser-ws-endpoint]: ../../config/browsers#browser_ws_endpoint +[browser-ws-endpoint]: ../../reference/config/browsers#browser_ws_endpoint [how-to-use-cdp]: ../../guides/how-to-use-cdp [gh-issues]: https://github.com/gemini-testing/testplane/issues diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-7.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-7.mdx index a3fb729..73575f3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-7.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-7.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как обновить hermione до версии 7.x +# Hermione v6 → v7 Если в вашем проекте hermione младше 4-й версии, то прочтите сначала «[Как обновить hermione до версии 4.x][how-to-upgrade-hermione-to-4]», «[Как обновить hermione до версии 5.x][how-to-upgrade-hermione-to-5]» и «[Как обновить hermione до версии 6.x][how-to-upgrade-hermione-to-6]». @@ -122,9 +122,9 @@ Reason: Something goes wrong [how-to-upgrade-hermione-to-4]: ../../migrations/how-to-upgrade-hermione-to-4 [how-to-upgrade-hermione-to-5]: ../../migrations/how-to-upgrade-hermione-to-5 [how-to-upgrade-hermione-to-6]: ../../migrations/how-to-upgrade-hermione-to-6 -[screenshots-dir]: ../../config/browsers#screenshots_dir +[screenshots-dir]: ../../reference/config/browsers#screenshots_dir [save_history]: https://www.npmjs.com/package/hermione/v/6.1.4#savehistory -[save_history_mode]: ../../config/browsers#save_history_mode +[save_history_mode]: ../../reference/config/browsers#save_history_mode [webdriverio@7]: https://webdriver.io/ [webdriverio@8]: https://webdriver.io/ [gh-issues]: https://github.com/gemini-testing/testplane/issues/ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-8.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-8.mdx index 49b6410..d915745 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-8.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-8.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как обновить hermione до версии 8.x +# Hermione v7 → v8 Если в вашем проекте hermione младше 4-й версии, то прочтите сначала: @@ -91,7 +91,7 @@ import hermione from "hermione"; [how-to-upgrade-hermione-to-5]: ../../migrations/how-to-upgrade-hermione-to-5 [how-to-upgrade-hermione-to-6]: ../../migrations/how-to-upgrade-hermione-to-6 [how-to-upgrade-hermione-to-7]: ../../migrations/how-to-upgrade-hermione-to-7 -[prepare-browser]: ../../config/prepare-browser +[prepare-browser]: ../../reference/config/prepare-browser [hermione-clear-session]: https://github.com/gemini-testing/hermione?tab=readme-ov-file#clearsession [hermione-isolation]: https://github.com/gemini-testing/hermione?tab=readme-ov-file#isolation [hermione-assert-view]: https://github.com/gemini-testing/hermione?tab=readme-ov-file#assertview diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-testplane.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-testplane.mdx index b5c1a96..98b039f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-testplane.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/migrations/how-to-upgrade-hermione-to-testplane.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# Как обновить Hermione до Testplane +# Hermione → Testplane Если в вашем проекте Hermione младше 8-й версии, то прочтите сначала: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/hermione-browser-version-changer.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/hermione-browser-version-changer.mdx index 8f654d3..ae15467 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/hermione-browser-version-changer.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/hermione-browser-version-changer.mdx @@ -1,13 +1,13 @@ -# hermione-browser-version-changer +# @testplane/browser-version-changer ## Обзор {#overview} -Используйте плагин [hermione-browser-version-changer][hermione-browser-version-changer], чтобы управлять определением версии браузера для тестов. +Используйте плагин [@testplane/browser-version-changer][testplane-browser-version-changer], чтобы управлять определением версии браузера для тестов. ## Установка {#install} ```bash -npm install -D hermione-browser-version-changer +npm install -D @testplane/browser-version-changer ``` ## Настройка {#setup} @@ -17,7 +17,7 @@ npm install -D hermione-browser-version-changer ```javascript module.exports = { plugins: { - "hermione-browser-version-changer": { + "@testplane/browser-version-changer": { enabled: true, initStore: async () => { return { @@ -97,7 +97,7 @@ testplane_browser_version_changer_enabled=false npx testplane ... ## Полезные ссылки {#useful_links} -- [Исходники плагина hermione-browser-version-changer][hermione-browser-version-changer] +- [Исходники плагина @testplane/browser-version-changer][testplane-browser-version-changer] -[hermione-browser-version-changer]: https://github.com/gemini-testing/hermione-browser-version-changer +[testplane-browser-version-changer]: https://github.com/gemini-testing/testplane-browser-version-changer [noop]: https://lodash.com/docs/4.17.15#noop diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/retry-limiter.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/retry-limiter.mdx index 94166a3..55e9de6 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/retry-limiter.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/retry-limiter.mdx @@ -1,21 +1,21 @@ import Admonition from "@theme/Admonition"; -# retry-limiter +# @testplane/retry-limiter ## Обзор {#overview} -Используйте плагин [retry-limiter][retry-limiter], чтобы ограничивать количество ретраев упавших тестов, а также время, в течение которого ретраи разрешены. +Используйте плагин [@testplane/retry-limiter][retry-limiter], чтобы ограничивать количество ретраев упавших тестов, а также время, в течение которого ретраи разрешены. Используйте данный плагин при прогоне тестов в CI. — Так как в CI, как правило, прогоняются либо все тесты проекта, либо их значительная часть. -Использовать плагин _retry-limiter_ при локальных запусках отдельных тестов чаще всего нецелесообразно, ввиду их малого количества и, соответственно, отсутствия значимого эффекта от экономии «железа» или времени на прогон тестов. +Использовать плагин _@testplane/retry-limiter_ при локальных запусках отдельных тестов чаще всего нецелесообразно, ввиду их малого количества и, соответственно, отсутствия значимого эффекта от экономии «железа» или времени на прогон тестов. Ретраи упавших тестов — один из способов борьбы с нестабильными тестами. Однако, бывают случаи, когда тесты падают массово из-за проблем с инфраструктурой или из-за того, что код проекта был сломан (например, в пулл-реквесте). В таких случаях ретраи только зря тратят ресурсы серверов, на которых прогоняются тесты, и время разработчика, заставляя разработчика ждать окончания прогона тестов, которые заведомо упадут. -Чтобы избежать подобных сценариев, плагин `retry-limiter` позволяет: +Чтобы избежать подобных сценариев, плагин `@testplane/retry-limiter` позволяет: - задать максимальную долю ретраев от общего количества тестов; - ограничить время, в течение которого ретраи могут использоваться; @@ -25,7 +25,7 @@ import Admonition from "@theme/Admonition"; Если в конфиге плагина ещё установлено значение _600 секунд (10 минут)_ для параметра `timeLimit`, то независимо от того, сколько раз ещё можно ретраить упавшие тесты, плагин отключит механизм ретраев через _10 минут_ после начала прогона тестов. Последнее защищает от нерациональной траты ресурсов «железа» на слишком долгие прогоны тестов. -Если testplane запущена с опцией `--retry`, например, со значением _7_, и при этом в конфиге плагина `retry-limiter` параметр `setRetriesOnTestFail` установлен в значение _4_, то это означает следующее: в случае падения хотя бы одного теста в любом из браузеров после _7_ ретраев, плагин посчитает, что возникла какая-то системная проблема и нужно снизить максимально разрешенное число ретраев до значения, заданного в параметре `setRetriesOnTestFail`, то есть до _4_. Это также позволяет защититься от нерационального расхода ресурсов на прогон тестов в случае системных проблем. +Если testplane запущена с опцией `--retry`, например, со значением _7_, и при этом в конфиге плагина `@testplane/retry-limiter` параметр `setRetriesOnTestFail` установлен в значение _4_, то это означает следующее: в случае падения хотя бы одного теста в любом из браузеров после _7_ ретраев, плагин посчитает, что возникла какая-то системная проблема и нужно снизить максимально разрешенное число ретраев до значения, заданного в параметре `setRetriesOnTestFail`, то есть до _4_. Это также позволяет защититься от нерационального расхода ресурсов на прогон тестов в случае системных проблем. Если вы столкнулись в своем проекте с ситуацией, когда механизм ретраев начинает отключаться @@ -37,7 +37,7 @@ import Admonition from "@theme/Admonition"; ## Установка {#install} ```bash -npm install -D retry-limiter +npm install -D @testplane/retry-limiter ``` ## Настройка {#setup} @@ -47,7 +47,7 @@ npm install -D retry-limiter ```javascript module.exports = { plugins: { - "retry-limiter": { + "@testplane/retry-limiter": { limit: 0.3, // разрешаем не больше 30% ретраев от общего числа тестов setRetriesOnTestFail: 4, // снижаем число ретраев до 4 после падения первого теста timeLimit: 600, // через 10 минут ретраи должны быть отключены @@ -104,6 +104,6 @@ retry-limiter: with limit 0.3 will stop retrying tests after 1189 retries ## Полезные ссылки {#useful_links} -- [Исходники плагина retry-limiter][retry-limiter] +- [Исходники плагина @testplane/retry-limiter][retry-limiter] [retry-limiter]: https://github.com/gemini-testing/retry-limiter diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-chunks.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-chunks.mdx index 32ed890..8a78b19 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-chunks.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-chunks.mdx @@ -1,10 +1,10 @@ import Admonition from "@theme/Admonition"; -# testplane-chunks +# @testplane/chunks ## Обзор {#overview} -Используйте плагин [testplane-chunks][testplane-chunks], чтобы распараллелить запуск тестов. +Используйте плагин [@testplane/chunks][testplane-chunks], чтобы распараллелить запуск тестов. Если в вашем проекте большое количество тестов и при этом не хватает мощности отдельных CI-серверов, чтобы выполнить все эти тесты на одном сервере за приемлемое время, то этот плагин — для вас. @@ -12,13 +12,13 @@ import Admonition from "@theme/Admonition"; ### Что же тогда делает данный плагин? {#what_does_plugin_do} -Плагин `testplane-chunks` разбивает **всегда одним и тем же способом** ваш набор тестов на заданное количество порций _(chunks)_ и отдает testplane на запуск только ту порцию, которую вы указали. Здесь ключевое — _«всегда одним и тем же способом»_. То есть операция разбиения на порции (чанки) является [идемпотентной][idempotence]. +Плагин `@testplane/chunks` разбивает **всегда одним и тем же способом** ваш набор тестов на заданное количество порций _(chunks)_ и отдает testplane на запуск только ту порцию, которую вы указали. Здесь ключевое — _«всегда одним и тем же способом»_. То есть операция разбиения на порции (чанки) является [идемпотентной][idempotence]. ### Что дает идемпотентность? {#what_does_idempotence_give} Вы можете организовать в своем CI переиспользование результатов запусков тестов из отдельных чанков при общем перезапуске. Это позволит вам сэкономить время при перезапуске всех тестов, так как прогоняться будут только те чанки, в которых есть упавшие тесты. -Например, в вашем проекте есть 1 тысяча тестов. Вы разбили эти тесты на 10 чанков по 100 тестов в каждом. Это означает, что при запуске тестов в вашем пулл-реквесте, у вас будет 10 инстансов testplane, запущенных одновременно на 10 серверах. Каждый инстанс выполнит по 100 тестов. В каких-то из этих запусков тесты могут упасть. Например, 2 из 10 чанков у вас упали. Вы решаете перезапустить прогон тестов, рассчитывая, что на этот раз тесты пройдут. Так вот, при перезапуске testplane с указанием номера упавшего чанка, вы можете быть абсолютно уверены, что плагин `testplane-chunks` сформирует для testplane точно такую же порцию тестов как и в прошлый свой запуск. +Например, в вашем проекте есть 1 тысяча тестов. Вы разбили эти тесты на 10 чанков по 100 тестов в каждом. Это означает, что при запуске тестов в вашем пулл-реквесте, у вас будет 10 инстансов testplane, запущенных одновременно на 10 серверах. Каждый инстанс выполнит по 100 тестов. В каких-то из этих запусков тесты могут упасть. Например, 2 из 10 чанков у вас упали. Вы решаете перезапустить прогон тестов, рассчитывая, что на этот раз тесты пройдут. Так вот, при перезапуске testplane с указанием номера упавшего чанка, вы можете быть абсолютно уверены, что плагин `@testplane/chunks` сформирует для testplane точно такую же порцию тестов как и в прошлый свой запуск. Организуя перезапуск тестов в своем CI, помните, что для **переиспользования** запусков @@ -46,7 +46,7 @@ import Admonition from "@theme/Admonition"; ## Установка {#install} ```bash -npm install -D testplane-chunks +npm install -D @testplane/chunks ``` ## Настройка {#setup} @@ -56,7 +56,7 @@ npm install -D testplane-chunks ```javascript module.exports = { plugins: { - "testplane-chunks": { + "@testplane/chunks": { count: 7, // Разбить тесты на 7 порций (чанков) run: 1, // Запустить первую порцию }, @@ -103,7 +103,7 @@ testplane_chunks_count=10 testplane_chunks_run=1 npx testplane ... ## Полезные ссылки {#useful_links} -- [Исходники плагина testplane-chunks][testplane-chunks] +- [Исходники плагина @testplane/chunks][testplane-chunks] - [Что такое идемпотентность?][idempotence] [html-reporter]: ../../html-reporter/html-reporter-setup diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-retry-command.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-retry-command.mdx index 6918f48..3d0ce44 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-retry-command.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-retry-command.mdx @@ -1,15 +1,15 @@ import Admonition from "@theme/Admonition"; -# testplane-retry-command +# @testplane/retry-command ## Обзор {#overview} -Используйте плагин [testplane-retry-command][testplane-retry-command], чтобы ретраить отдельные команды на низком уровне. +Используйте плагин [@testplane/retry-command][testplane-retry-command], чтобы ретраить отдельные команды на низком уровне. ## Установка {#install} ```bash -npm install -D testplane-retry-command +npm install -D @testplane/retry-command ``` ## Настройка {#setup} @@ -19,7 +19,7 @@ npm install -D testplane-retry-command ```javascript module.exports = { plugins: { - "testplane-retry-command": { + "@testplane/retry-command": { enabled: true, rules: [ { diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-storybook.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-storybook.mdx index 3585d15..5da3a0b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-storybook.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/testplane-storybook.mdx @@ -309,7 +309,7 @@ export default { [assert-view]: ../commands/browser/assertView.mdx [build-stories]: https://storybook.js.org/docs/6.4/configure/overview#feature-flags -[isolation]: ../config/browsers.mdx#isolation +[isolation]: ../reference/config/browsers.mdx#isolation [testplane-storybook]: https://github.com/gemini-testing/testplane-storybook [testplane]: https://github.com/gemini-testing/testplane -[testsPerSession]: ../config/browsers.mdx#tests_per_session +[testsPerSession]: ../reference/config/browsers.mdx#tests_per_session diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/url-decorator.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/url-decorator.mdx index 855c56c..c117a5f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/plugins/url-decorator.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/plugins/url-decorator.mdx @@ -3,16 +3,16 @@ import TabItem from "@theme/TabItem"; import Admonition from "@theme/Admonition"; -# url-decorator +# @testplane/url-decorator ## Обзор {#overview} -Используйте плагин [url-decorator][url-decorator], чтобы автоматически дополнять урлы в testplane-тестах нужными query-параметрами. +Используйте плагин [@testplane/url-decorator][url-decorator], чтобы автоматически дополнять урлы в testplane-тестах нужными query-параметрами. ## Установка {#install} ```bash -npm install -D url-decorator +npm install -D @testplane/url-decorator ``` ## Настройка {#setup} @@ -22,7 +22,7 @@ npm install -D url-decorator ```javascript module.exports = { plugins: { - "url-decorator": { + "@testplane/url-decorator": { enabled: true, url: { query: [ @@ -69,7 +69,7 @@ module.exports = { ```javascript module.exports = { plugins: { - 'url-decorator': { + '@testplane/url-decorator': { enabled: true, url: { query: [ @@ -104,7 +104,7 @@ module.exports = { ```javascript module.exports = { plugins: { - 'url-decorator': { + '@testplane/url-decorator': { enabled: true, url: { query: { @@ -323,7 +323,6 @@ HERMIONE_URL_CUSTOM_QUERIES='foo-bar=baz;qux=1' testplane ... ## Полезные ссылки {#useful_links} -- [Исходники плагина url-decorator][url-decorator] +- [Исходники плагина @testplane/url-decorator][url-decorator] [url-decorator]: https://github.com/gemini-testing/url-decorator -[internal-url-decorator]: ../../plugins/internal-url-decorator diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/index.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/index.mdx index 120b16f..de25099 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/index.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/index.mdx @@ -1,9 +1,11 @@ +--- +sidebar_position: 1 +--- + import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -# Быстрый старт - -## Установка {#install} +# Установка {#install} Запустите установщик testplane с помощью `npm`. @@ -19,7 +21,7 @@ npm init testplane@latest YOUR_PROJECT_PATH ```typescript export default { - // https://testplane.io/ru/docs/v8/guides/local-browsers/ + // https://testplane.io/ru/docs/v8/basic-guides/managing-browsers/ gridUrl: "local", baseUrl: "http://localhost", pageLoadTimeout: 0, diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-run-specified-test.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx similarity index 54% rename from i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-run-specified-test.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx index 5cfba56..2461ca2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/how-to-run-specified-test.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx @@ -1,14 +1,12 @@ -# Как запустить конкретные тесты +--- +sidebar_position: 3 +--- -## Проблема {#problem} +# Запуск тестов -Иногда вам может потребоваться запустить конкретные тесты, а не весь набор тестов, которые есть в вашем проекте. +Используйте команду `npx testplane` для запуска всех тестов в вашем проекте. -Например, вы разработали какую-либу фичу и покрыли ее функциональными тестами. И хотите в первую очередь проверить корректность выполнения новых тестов. - -Или вы чините плавающий тест, нашли в нем баги, исправили их и хотите проверить, что теперь тест корректно проходит. - -## Решение 1: запуск конкретного файла {#solution_1} +## Запуск конкретного файла Если вы хотите запустить всю группу тестов, которые находятся в конкретном файле, то укажите путь к этому файлу в качестве входного параметра для testplane: @@ -16,7 +14,7 @@ testplane src/features/Reviews/Reviews.test/MyReview/MyReview.a11y@touch-phone.testplane.js ``` -## Решение 2: опция --grep {#solution_2} +## Опция `--grep` Если же вы хотите запустить конкретный тест, то воспользуйтесь опцией `--grep`, указав в качестве ее значения полное имя теста: @@ -24,7 +22,7 @@ testplane src/features/Reviews/Reviews.test/MyReview/MyReview.a11y@touch-phone.t testplane --grep "Доступность Оставление отзыва" ``` -## Решение 3: директива .only {#solution_3} +## Директива `.only` Ещё вы можете воспользоваться директивой `.only` для набора тестов `describe` и конкретного теста `it`, аналогично тому как это реализовано в `mocha` (см. раздел [exlusive tests](https://mochajs.org/#exclusive-tests)): @@ -44,8 +42,14 @@ it.only("Оставление отзыва", async function () { }); ``` -## Ключевые слова {#keywords} +## Запуск тестов несколько раз {#running_tests_multiple_times} + +Иногда может быть полезным запустить один и тот же тест несколько раз — например, для проверки стабильности. Плагин [@testplane/test-repeater][testplane-test-repeater] позволяет запустить тесты заданное количество раз. + +После установки и включения плагина вы можете запустить тесты нужное количество раз, используя следующую команду: + +```bash +npx testplane --test-repeater-repeat 5 --grep 'Имя теста' +``` -- grep -- describe.only -- it.only +[testplane-test-repeater]: ../../plugins/testplane-test-repeater diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/usage-in-ci.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/usage-in-ci.mdx new file mode 100644 index 0000000..8e8caa3 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/usage-in-ci.mdx @@ -0,0 +1,6 @@ +--- +sidebar_position: 4 +draft: true +--- + +# Использование в CI diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/writing-tests.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/writing-tests.mdx new file mode 100644 index 0000000..9b4bed9 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/writing-tests.mdx @@ -0,0 +1,8 @@ +--- +sidebar_position: 2 +draft: true +--- + +# Написание тестов + + diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/command-line/index.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx similarity index 97% rename from i18n/ru/docusaurus-plugin-content-docs/current/command-line/index.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx index 8438350..b72fa9b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/command-line/index.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/cli.mdx @@ -579,7 +579,7 @@ testplane list-browsers --format json #### Пример {#list-browsers-example} -Если у вас имеется следующий раздел "browsers" в вашей конфигурации [Testplane](/docs/v8/config/main): +Если у вас имеется следующий раздел "browsers" в вашей конфигурации [Testplane](/docs/v8/reference/config/main): ```json { @@ -649,9 +649,9 @@ testplane config --help ## Команда `install-deps` {#install-deps} -Эта команда является частью рецепта [Как запустить Testplane в локальном браузере](/docs/v8/guides/local-browsers). +Эта команда является частью рецепта [Как запустить Testplane в локальном браузере](/docs/v8/basic-guides/managing-browsers). -Используйте команду `install-deps`, чтобы загрузить все браузеры, указанные в [конфиге Testplane](/docs/v8/config/main). +Используйте команду `install-deps`, чтобы загрузить все браузеры, указанные в [конфиге Testplane](/docs/v8/reference/config/main). Если эта команда запущена на поддерживаемой версии Ubuntu, также будут загружены все отсутствующие необходимые пакеты Ubuntu. @@ -665,7 +665,7 @@ npx testplane install-deps Вы можете также указать, какие браузеры нужно загрузить. -Например, если у вас описаны браузеры "chrome-dark", "firefox-dark" в конфигурации Testplane, вы можете использовать следующую команду для загрузки только этих двух браузеров: +Например, если у вас описаны браузеры "chrome-dark", "firefox-dark" в конфигурации Testplane, вы можете использовать следующую команду для загрузки только этих двух браузеров: ```bash npx testplane install-deps chrome-dark firefox-dark @@ -745,8 +745,8 @@ TESTPLANE_SKIP_BROWSERS=ie10,ie11 testplane TESTPLANE_SETS=desktop,touch testplane ``` -[html-reporter]: ../html-reporter/html-reporter-setup -[assert-view]: ../commands/browser/assertView -[add-tag]: ../commands/browser/addTag -[switch-to-repl]: ../commands/browser/switchToRepl -[webdriver-vs-cdp]: ../reference/webdriver-vs-cdp +[html-reporter]: ../../html-reporter/html-reporter-setup +[assert-view]: ../../commands/browser/assertView +[add-tag]: ../../commands/browser/addTag +[switch-to-repl]: ../../commands/browser/switchToRepl +[webdriver-vs-cdp]: ../webdriver-vs-cdp diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-basic-format.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-basic-format.mdx new file mode 100644 index 0000000..66481c8 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-basic-format.mdx @@ -0,0 +1,15 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + browsers: { + "": { + desiredCapabilities: { + browserName: "", + // ... + }, + // ... + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-desired-capabilities.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-desired-capabilities.mdx new file mode 100644 index 0000000..34ab60f --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-desired-capabilities.mdx @@ -0,0 +1,17 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + browsers: { + chrome: { + desiredCapabilities: { + browserName: "chrome", + browserVersion: "125.0", + "goog:chromeOptions": { + args: ["--hide-scrollbars", "--headless=new"], + }, + }, + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-example.mdx new file mode 100644 index 0000000..063be4f --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-example.mdx @@ -0,0 +1,16 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + sessionsPerBrowser: 10, + browsers: { + chrome: { + /* ... */ + }, + firefox: { + // ... + sessionsPerBrowser: 5, + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-session-env-flags.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-session-env-flags.mdx new file mode 100644 index 0000000..0d64a4f --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_browsers-session-env-flags.mdx @@ -0,0 +1,14 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + browsers: { + "chrome-phone": { + // ... + sessionEnvFlags: { + isMobile: true, + }, + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_config-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_config-example.mdx new file mode 100644 index 0000000..cfec5da --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_config-example.mdx @@ -0,0 +1,32 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + retry: process.env.IS_CI ? 5 : 0, + + httpTimeout: 60_000, + sessionsPerBrowser: 5, + testsPerSession: 20, + + browsers: { + chrome: { + desiredCapabilities: { + browserName: "chrome", + automationProtocol: "devtools", + headless: true, + }, + }, + }, + sets: { + desktop: { + files: ["testplane-tests/**/*.testplane.(t|j)s"], + browsers: ["chrome"], + }, + }, + plugins: { + "html-reporter/testplane": { + enabled: true, + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_dev-server-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_dev-server-example.mdx new file mode 100644 index 0000000..f094a9c --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_dev-server-example.mdx @@ -0,0 +1,21 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +const SERVER_PORT = 3000; + +export default { + // ... + devServer: { + command: "npm run server:dev", + env: { PORT: SERVER_PORT }, + reuseExisting: true, + readinessProbe: { + url: `http://localhost:${SERVER_PORT}/health`, + timeouts: { + // optional + waitServerTimeout: 60_000, // default value + }, + }, + }, +}; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_last-failed-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_last-failed-example.mdx new file mode 100644 index 0000000..a3424a9 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_last-failed-example.mdx @@ -0,0 +1,12 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + // ... + lastFailed: { + only: false, + input: [".testplane/failed.json"], + output: ".testplane/failed.json", + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_minimal-config.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_minimal-config.mdx new file mode 100644 index 0000000..20ea1af --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_minimal-config.mdx @@ -0,0 +1,13 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + browsers: { + chrome: { + desiredCapabilities: { + browserName: "chrome", + }, + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_plugins-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_plugins-example.mdx new file mode 100644 index 0000000..76f0134 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_plugins-example.mdx @@ -0,0 +1,26 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + // ... + plugins: { + "my-cool-plugin": { + param: "some-value", + }, + }, +} satisfies ConfigInput; +``` + +```typescript title="testplane-my-cool-plugin/index.ts" +exports = function (testplane, opts) { + testplane.on(testplane.events.RUNNER_START, function (runner) { + console.info(opts.param); // some-value + + return setUp(testplane.config, opts.param); + }); + + testplane.on(testplane.events.RUNNER_END, function () { + return tearDown(); + }); +}; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_plugins-register-workers.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_plugins-register-workers.mdx new file mode 100644 index 0000000..efde60d --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_plugins-register-workers.mdx @@ -0,0 +1,27 @@ +```typescript title="my-plugin.ts" +let workers; + +exports = testplane => { + testplane.on(testplane.events.RUNNER_START, async runner => { + const workerFilepath = require.resolve("./worker"); + const exportedMethods = ["foo"]; + workers = runner.registerWorkers(workerFilepath, exportedMethods); + + // outputs `FOO_RUNNER_START` + console.log(await workers.foo("RUNNER_START")); + }); + + testplane.on(testplane.events.RUNNER_END, async () => { + // outputs `FOO_RUNNER_END` + console.log(await workers.foo("RUNNER_END")); + }); +}; +``` + +```typescript title="worker.ts" +exports = { + foo: async function (event) { + return "FOO_" + event; + }, +}; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-browser-add-element-command.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-browser-add-element-command.mdx new file mode 100644 index 0000000..cec3544 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-browser-add-element-command.mdx @@ -0,0 +1,24 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + // ... + prepareBrowser: function (browser) { + browser.addCommand( + "getCoords", + async function () { + const { x, y } = await this.getLocation(); + const { width, height } = await this.getSize(); + + return { + left: x, + top: y, + right: x + width, + bottom: y + height, + }; + }, + true, // true = element command, false = browser command + ); + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx new file mode 100644 index 0000000..7e24b1a --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx @@ -0,0 +1,27 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; +import path from "path"; +import glob from "fast-glob"; + +export default { + // ... + prepareBrowser: function (browser) { + const files = glob.sync(["tests/testplane/commands/*.(js|ts)", "!**/*.d.ts"]); + + files.forEach(file => { + const module = require(path.resolve(process.cwd(), file)); + const name = path.basename(file, path.extname(file)); + + browser.addCommand(name, typeof module === "object" ? module[name] : module); + }); + }, +}; +``` + +```typescript title="tests/testplane/commands/myCheckCookie.js" +export default async function (cookieName) { + const cookies = await this.getCookies(cookieName); + + assert.isTrue(cookies[0], `cookie named ${cookieName} is not set`); +} +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-environment.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-environment.mdx new file mode 100644 index 0000000..f19002c --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_prepare-environment.mdx @@ -0,0 +1,11 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; +import { pick } from "lodash"; + +export default { + // ... + prepareEnvironment: function () { + this.sets = pick(this.sets, ["touch-phone"]); + }, +}; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_sets-basic-format.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_sets-basic-format.mdx new file mode 100644 index 0000000..08959cd --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_sets-basic-format.mdx @@ -0,0 +1,16 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + browsers: { + /* ... */ + }, + sets: { + "": { + files: ["path-1", "some/folder/**/*.some-ext"], + ignoreFiles: ["ignorePath-1", "some/ignore/folder/**/"], + browsers: ["browser-1", "browser-2"], + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_sets-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_sets-example.mdx new file mode 100644 index 0000000..9ac7c6c --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_sets-example.mdx @@ -0,0 +1,27 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + browsers: { + chrome: { + /*...*/ + }, + firefox: { + /*...*/ + }, + iphone: { + /*...*/ + }, + }, + sets: { + common: { + files: "tests/common/*.testplane.ts", + }, + desktop: { + files: ["tests/desktop/*.testplane.ts", "tests/common/*.testplane.ts"], + ignoreFiles: ["**/screens/**"], + browsers: ["chrome", "firefox"], + }, + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_system-example.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_system-example.mdx new file mode 100644 index 0000000..4067947 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_system-example.mdx @@ -0,0 +1,25 @@ +```typescript title="testplane.config.ts" +import type { ConfigInput } from "testplane"; + +export default { + // ... + system: { + debug: false, + mochaOpts: { + timeout: 60000, + }, + expectOpts: { + wait: 3000, + interval: 100, + }, + ctx: { + /* ... */ + }, + patternsOnReject: [/timeout/i, /timedout/i, /timed out/i], + workers: 1, + testsPerWorker: Infinity, + parallelLimit: 15, + fileExtensions: [".js", ".ts"], + }, +} satisfies ConfigInput; +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_system-test-run-env.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_system-test-run-env.mdx new file mode 100644 index 0000000..d24f30a --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/_partials/examples/_system-test-run-env.mdx @@ -0,0 +1,49 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + + + + ```typescript title="testplane.config.ts" + import type { ConfigInput } from "testplane"; + + export default { + // ... + system: { + testRunEnv: ['browser', { viteConfig: './vite.config.ts' }] + }, + } + ``` + + + + ```typescript title="testplane.config.ts" + import type { ConfigInput } from "testplane"; + import viteConfig from './vite.config.ts'; + + export default { + // ... + system: { + testRunEnv: ['browser', { viteConfig }] + }, + } + ``` + + + + ```typescript title="testplane.config.ts" + import type { ConfigInput } from "testplane"; + + export default { + // ... + system: { + testRunEnv: ['browser', { + viteConfig: (configEnv) => ({ + // ... + }), + }], + }, + } + ``` + + + diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/after-all.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/after-all.mdx similarity index 94% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/after-all.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/after-all.mdx index addb975..4a633be 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/after-all.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/after-all.mdx @@ -1,4 +1,4 @@ -import Version from "../_partials/specs/version.mdx"; +import Version from "../../_partials/specs/version.mdx"; # afterAll diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/before-all.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/before-all.mdx similarity index 96% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/before-all.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/before-all.mdx index 0ca8097..96b9eb9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/before-all.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/before-all.mdx @@ -1,4 +1,4 @@ -import Version from "../_partials/specs/version.mdx"; +import Version from "../../_partials/specs/version.mdx"; # beforeAll diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/browsers.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/browsers.mdx similarity index 98% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/browsers.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/browsers.mdx index bcfacee..ab50e50 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/browsers.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/browsers.mdx @@ -1,8 +1,8 @@ import Admonition from "@theme/Admonition"; -import BrowsersBasicFormat from "@site/docs/config/_partials/examples/_browsers-basic-format.mdx"; -import BrowsersExample from "@site/docs/config/_partials/examples/_browsers-example.mdx"; -import DesiredCapabilitiesExample from "@site/docs/config/_partials/examples/_browsers-desired-capabilities.mdx"; -import SessionEnvFlags from "@site/docs/config/_partials/examples/_browsers-session-env-flags.mdx"; +import BrowsersBasicFormat from "@site/docs/reference/config/_partials/examples/_browsers-basic-format.mdx"; +import BrowsersExample from "@site/docs/reference/config/_partials/examples/_browsers-example.mdx"; +import DesiredCapabilitiesExample from "@site/docs/reference/config/_partials/examples/_browsers-desired-capabilities.mdx"; +import SessionEnvFlags from "@site/docs/reference/config/_partials/examples/_browsers-session-env-flags.mdx"; import AssertViewOptions from "@site/docs/_partials/specs/assert-view-options.mdx"; # browsers @@ -75,10 +75,7 @@ import AssertViewOptions from "@site/docs/_partials/specs/assert-view-options.md [`automationProtocol`](#automation_protocol) `string` `"webdriver"` - - Протокол общения с браузером. См. [WebDriver vs - CDP](../../reference/webdriver-vs-cdp). - + Протокол общения с браузером. См. [WebDriver vs CDP](../../webdriver-vs-cdp). [`sessionEnvFlags`](#session_env_flags) @@ -142,7 +139,7 @@ URL грида (адрес, на котором слушает ChromeDriver/Sele Также можно использовать значение `"local"`, чтобы запускать тесты на локальных браузерах, управляемых Testplane. Читайте больше в рецепте [Как запустить Testplane в локальном - браузере](/docs/v8/guides/local-browsers). + браузере](/docs/v8/basic-guides/managing-browsers). ### baseUrl {#base_url} @@ -162,7 +159,7 @@ URL грида (адрес, на котором слушает ChromeDriver/Sele ### automationProtocol {#automation_protocol} -Протокол общения с браузером. Доступные значения: `webdriver` и `devtools`. См. также [WebDriver vs CDP](../../reference/webdriver-vs-cdp). По умолчанию: `webdriver`. +Протокол общения с браузером. Доступные значения: `webdriver` и `devtools`. См. также [WebDriver vs CDP](../../webdriver-vs-cdp). По умолчанию: `webdriver`. ### sessionEnvFlags {#session_env_flags} @@ -492,7 +489,7 @@ interface FailedTestData { ### openAndWaitOpts {#open-and-wait-opts} -Позволяет задать опции, которые нужно использовать при вызове команды [`browser.openAndWait`](../../commands/browser/openAndWait). +Позволяет задать опции, которые нужно использовать при вызове команды [`browser.openAndWait`](../../../commands/browser/openAndWait). По умолчанию: @@ -1083,7 +1080,7 @@ export = { [desired-caps]: https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities -[html-reporter]: ../../html-reporter/html-reporter-setup +[html-reporter]: ../../../html-reporter/html-reporter-setup [got]: https://github.com/sindresorhus/got/ [got-agent]: https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#agent [got-headers]: https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers @@ -1093,7 +1090,7 @@ export = { [read-tests]: ../browsers [sauce-labs]: https://saucelabs.com [system-mocha-opts]: ../system#mocha_opts -[element-wait-until]: ../../commands/element/waitUntil -[how-to-use-cdp]: ../../guides/how-to-use-cdp -[testplane-also-in-helper]: ../../guides/how-to-skip-test-in-browsers#solution_4 -[time-travel]: ../../guides/time-travel +[element-wait-until]: ../../../commands/element/waitUntil +[how-to-use-cdp]: ../../../guides/how-to-use-cdp +[testplane-also-in-helper]: ../../testplane-helper +[time-travel]: ../../../basic-guides/time-travel diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/dev-server.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/dev-server.mdx similarity index 98% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/dev-server.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/dev-server.mdx index 26c0802..d56e902 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/dev-server.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/dev-server.mdx @@ -1,5 +1,5 @@ import Admonition from "@theme/Admonition"; -import DevServerExample from "@site/docs/config/_partials/examples/_dev-server-example.mdx"; +import DevServerExample from "@site/docs/reference/config/_partials/examples/_dev-server-example.mdx"; # devServer diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/last-failed.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/last-failed.mdx similarity index 96% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/last-failed.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/last-failed.mdx index 737007a..795171d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/last-failed.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/last-failed.mdx @@ -1,4 +1,4 @@ -import LastFailedExample from "@site/docs/config/_partials/examples/_last-failed-example.mdx"; +import LastFailedExample from "@site/docs/reference/config/_partials/examples/_last-failed-example.mdx"; # lastFailed diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/main.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/main.mdx similarity index 95% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/main.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/main.mdx index d01ca93..1de2d0f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/main.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/main.mdx @@ -1,9 +1,5 @@ ---- -sidebar_class_name: hidden ---- - -import MinimalConfig from "@site/docs/config/_partials/examples/_minimal-config.mdx"; -import ConfigExample from "@site/docs/config/_partials/examples/_config-example.mdx"; +import MinimalConfig from "@site/docs/reference/config/_partials/examples/_minimal-config.mdx"; +import ConfigExample from "@site/docs/reference/config/_partials/examples/_config-example.mdx"; # Конфиг Testplane diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/plugins.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/plugins.mdx similarity index 91% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/plugins.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/plugins.mdx index fa804bd..e053677 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/plugins.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/plugins.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -import PluginsExample from "@site/docs/config/_partials/examples/_plugins-example.mdx"; -import RegisterWorkersExample from "@site/docs/config/_partials/examples/_plugins-register-workers.mdx"; +import PluginsExample from "@site/docs/reference/config/_partials/examples/_plugins-example.mdx"; +import RegisterWorkersExample from "@site/docs/reference/config/_partials/examples/_plugins-register-workers.mdx"; # plugins @@ -45,7 +45,7 @@ import RegisterWorkersExample from "@site/docs/config/_partials/examples/_plugin -Детальнее о событиях можно узнать на [соответствующей странице](../../reference/testplane-events). +Детальнее о событиях можно узнать на [соответствующей странице](../../testplane-events). ## Параллельное исполнение плагинов @@ -73,5 +73,5 @@ import RegisterWorkersExample from "@site/docs/config/_partials/examples/_plugin - [@testplane/headless-chrome](https://github.com/gemini-testing/testplane-headless-chrome) - ...и многие другие, которые можно найти в [gemini-testing](https://github.com/search?q=topic%3Atestplane-plugin+org%3Agemini-testing&type=Repositories). -[html-reporter]: ../../html-reporter/html-reporter-setup +[html-reporter]: ../../../html-reporter/html-reporter-setup [testplane-test-repeater]: ../../plugins/testplane-test-repeater diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/prepare-browser.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/prepare-browser.mdx similarity index 80% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/prepare-browser.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/prepare-browser.mdx index 270d36c..ee3f423 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/prepare-browser.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/prepare-browser.mdx @@ -1,5 +1,5 @@ import Admonition from "@theme/Admonition"; -import AddMultipleCommandsExample from "@site/docs/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx"; +import AddMultipleCommandsExample from "@site/docs/reference/config/_partials/examples/_prepare-browser-add-multiple-commands.mdx"; # prepareBrowser @@ -10,7 +10,7 @@ import AddMultipleCommandsExample from "@site/docs/config/_partials/examples/_pr Обычно внутри данной функции к браузеру добавляют новые команды, или расширяют поведение уже существующих команд. - Узнайте больше о кастомных командах в [нашем рецепте](../guides/custom-commands.mdx). + Узнайте больше о кастомных командах в [нашем рецепте](../../basic-guides/custom-commands.mdx). ## Примеры использования {#example} @@ -45,9 +45,9 @@ export default { Здесь используется команда [browser.getCookies][get-cookies]. -[url]: ../../commands/browser/url -[add-command]: ../../commands/browser/addCommand -[overwrite-command]: ../../commands/browser/overwriteCommand -[get-cookies]: ../../commands/browser/getCookies -[get-location]: ../../commands/element/getLocation -[get-size]: ../../commands/element/getSize +[url]: ../../../commands/browser/url +[add-command]: ../../../commands/browser/addCommand +[overwrite-command]: ../../../commands/browser/overwriteCommand +[get-cookies]: ../../../commands/browser/getCookies +[get-location]: ../../../commands/element/getLocation +[get-size]: ../../../commands/element/getSize diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/prepare-environment.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/prepare-environment.mdx similarity index 84% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/prepare-environment.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/prepare-environment.mdx index a6bf4cf..7c8daf1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/prepare-environment.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/prepare-environment.mdx @@ -1,4 +1,4 @@ -import PrepareEnvironmentExample from "@site/docs/config/_partials/examples/_prepare-environment.mdx"; +import PrepareEnvironmentExample from "@site/docs/reference/config/_partials/examples/_prepare-environment.mdx"; # prepareEnvironment diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/sets.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/sets.mdx similarity index 96% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/sets.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/sets.mdx index 967b1cc..f088acd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/sets.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/sets.mdx @@ -1,5 +1,5 @@ -import SetsBasicFormat from "@site/docs/config/_partials/examples/_sets-basic-format.mdx"; -import SetsExample from "@site/docs/config/_partials/examples/_sets-example.mdx"; +import SetsBasicFormat from "@site/docs/reference/config/_partials/examples/_sets-basic-format.mdx"; +import SetsExample from "@site/docs/reference/config/_partials/examples/_sets-example.mdx"; # sets diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/config/system.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/system.mdx similarity index 97% rename from i18n/ru/docusaurus-plugin-content-docs/current/config/system.mdx rename to i18n/ru/docusaurus-plugin-content-docs/current/reference/config/system.mdx index f13a000..d0c362e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/config/system.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/config/system.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -import SystemExample from "@site/docs/config/_partials/examples/_system-example.mdx"; -import TestRunEnvExample from "@site/docs/config/_partials/examples/_system-test-run-env.mdx"; +import SystemExample from "@site/docs/reference/config/_partials/examples/_system-example.mdx"; +import TestRunEnvExample from "@site/docs/reference/config/_partials/examples/_system-test-run-env.mdx"; # system @@ -196,7 +196,7 @@ Testplane запускает все тесты в подпроцессах, чт ### diffColor {#diff_color} -Цвет для отображения диффа при визуальных проверках с помощью команды [`browser.assertView`](../../commands/browser/assertView). +Цвет для отображения диффа при визуальных проверках с помощью команды [`browser.assertView`](../../../commands/browser/assertView). По умолчанию: `"#ff00ff"`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/test-api.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/test-api.mdx new file mode 100644 index 0000000..389e941 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/test-api.mdx @@ -0,0 +1 @@ +# Test API diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-api.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-api.mdx index e102ea6..293f535 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-api.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-api.mdx @@ -1,8 +1,8 @@ -# API testplane +# Класс Testplane -С помощью API testplane вы можете использовать её в своих скриптах или сборочных инструментах. +Данное API позволяет вам использовать Testplane программно, без запуска через CLI. -Для этого вы должны подключить модуль testplane и создать её инстанс: +Для этого вы должны подключить модуль testplane и создать его инстанс: ```javascript const Testplane = require("testplane"); @@ -12,7 +12,7 @@ const config = require("./testplane.conf.js"); const testplane = new Testplane(config); ``` -Далее вам будут доступны следующие параметры и методы: +Доступны следующие свойства и методы: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-events.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-events.mdx index 103ba10..3abe279 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-events.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-events.mdx @@ -1,6 +1,6 @@ import Admonition from "@theme/Admonition"; -# События testplane +# События Testplane ## Обзор {#overview} @@ -1158,7 +1158,7 @@ testplane.on(testplane.events.TEST_PENDING, test => { **sync | master | can be intercepted** -Событие `RETRY` триггерится, если тест упал, но ушел на повторный прогон, так называемый «ретрай». Возможности повторного прогона теста определяются настройками [retry][browsers-retry] и [shouldRetry][browsers-should-retry] в конфиге testplane. Также на это могут влиять плагины testplane, если они модифицируют «на лету» указанные выше настройки. Смотрите для примера плагины [retry-limiter][retry-limiter] и [testplane-retry-progressive][testplane-retry-progressive]. +Событие `RETRY` триггерится, если тест упал, но ушел на повторный прогон, так называемый «ретрай». Возможности повторного прогона теста определяются настройками [retry][browsers-retry] и [shouldRetry][browsers-should-retry] в конфиге testplane. Также на это могут влиять плагины testplane, если они модифицируют «на лету» указанные выше настройки. Смотрите для примера плагины [@testplane/retry-limiter][retry-limiter] и [testplane-retry-progressive][testplane-retry-progressive]. Обработчик события выполняется синхронно. Также событие можно перехватить и изменить в специальном обработчике. @@ -1552,7 +1552,7 @@ module.exports = (testplane, opts) => { ```javascript module.exports = { // тесты будут запускаться в локальном браузере, - // см. https://testplane.io/ru/docs/v8/guides/local-browsers/ + // см. https://testplane.io/ru/docs/v8/basic-guides/managing-browsers/ gridUrl: "http://localhost:4444/wd/hub", // указываем путь к dev-серверу baseUrl: "http://localhost:3000", @@ -1798,12 +1798,12 @@ module.exports = (testplane, opts) => { [commander-options]: https://github.com/tj/commander.js#options [cli-wiki]: https://ru.wikipedia.org/wiki/Интерфейс_командной_строки [testplane-run]: ../testplane-api#testplane_run -[system]: ../../config/system -[system-workers]: ../../config/system#workers -[system-tests-per-worker]: ../../config/system#tests_per_worker -[browser-tests-per-session]: ../../config/browsers#tests_per_session -[browser-sessions-per-browser]: ../../config/browsers#sessions_per_browser -[skip-in]: ../../guides/how-to-skip-test-in-browsers +[system]: ../config/system +[system-workers]: ../config/system#workers +[system-tests-per-worker]: ../config/system#tests_per_worker +[browser-tests-per-session]: ../config/browsers#tests_per_session +[browser-sessions-per-browser]: ../config/browsers#sessions_per_browser +[skip-in]: ../testplane-helper [sigterm]: https://ru.wikipedia.org/wiki/Сигнал_(Unix) [testplane-test-repeater-index]: https://github.com/gemini-testing/testplane-test-repeater/blob/master/lib/index.js [testplane-test-repeater]: https://github.com/gemini-testing/testplane-test-repeater @@ -1817,8 +1817,8 @@ module.exports = (testplane, opts) => { [hermione-hide-scrollbars]: https://github.com/gemini-testing/hermione-hide-scrollbars [hermione-hide-scrollbars-index]: https://github.com/gemini-testing/hermione-hide-scrollbars/blob/master/index.js [vnc]: https://ru.wikipedia.org/wiki/Virtual_Network_Computing -[browsers-retry]: ../../config/browsers#retry -[browsers-should-retry]: ../../config/browsers#should_retry +[browsers-retry]: ../config/browsers#retry +[browsers-should-retry]: ../config/browsers#should_retry [retry-limiter]: ../../plugins/retry-limiter [testplane-retry-progressive]: ../../plugins/testplane-retry-progressive [error-object]: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Error diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-helper.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-helper.mdx new file mode 100644 index 0000000..3c1ca4e --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-helper.mdx @@ -0,0 +1,63 @@ +# Глобальный объект testplane + +## testplane.skip.in + +Эта директива позволяет пропустить тест в определённом браузере. Например, чтобы пропустить тест в `IE8`, можно сделать так: + +```javascript +describe("feature", function () { + testplane.skip.in("ie8", "it cannot work in this browser"); + it("nowaday functionality", function () { + // ... + }); +}); +``` + +При использовании директивы `testplane.skip.in` вы увидите в отчете сообщение о том, что запуск в соответствующем браузере был пропущен. + +Чтобы пропустить запуск тестов без уведомлений в отчете, вы можете передать хелперу специальный флаг `silent` в качестве третьего аргумента: + +```javascript +testplane.skip.in("ie8", "skipReason", { silent: true }); +``` + +## testplane.skip.notIn + +Эта директива позволяет запускать тест только в определённом браузере, например, в `Chrome`: + +```javascript +describe("feature", function () { + testplane.skip.notIn("chrome", "it should work only in Chrome"); + it("specific functionality", function () { + // ... + }); +}); +``` + +Аналогично, чтобы избавиться от уведомлений в отчете, вы можете передать хелперу специальный флаг `silent` в качестве третьего аргумента: + +```javascript +testplane.skip.notIn("chrome", "skipReason", { silent: true }); +``` + +## testplane.only.in / testplane.only.notIn + +Эти директивы позволяют запускать тест только в определённом браузере, логика которых противоположна директивам `testplane.skip.in` и `testplane.skip.notIn`. Кроме того, эти директивы по умолчанию не создают никаких уведомлений в отчёте: + +```javascript +testplane.only.in("chrome"); // запустить тест только в Chrome +``` + +```javascript +testplane.only.notIn("ie8"); // запустить тест во всех браузерах кроме IE8 +``` + +## testplane.also.in + +Если вы внедряете новый браузер и вам нужно запустить его только в нескольких тестах из тысяч, использование директивы `.skip.in` может быть неудобным. Вы можете использовать опцию браузера [passive][passive-option] и директиву `.also.in`: + +```javascript +testplane.also.in("ie8"); // запустить тест в пассивном браузере IE8 +``` + +[passive-option]: ../config/browsers#passive diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-standalone-api.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-standalone-api.mdx index 0797435..a03ac05 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-standalone-api.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/testplane-standalone-api.mdx @@ -1,4 +1,4 @@ -# Testplane standalone api +# Standalone API ## Обзор @@ -35,7 +35,7 @@ await browser.deleteSession(); ### Подключение к браузеру Подключение к уже запущенному браузеру с помощью параметров сессии. -Получить параметры сессии можно, запустив testplane с опцией `--keep-browser`, смотрите [подробнее](../command-line/index.mdx#testplane-keep-browser) +Получить параметры сессии можно, запустив testplane с опцией `--keep-browser`, смотрите [подробнее](../reference/cli.mdx#testplane-keep-browser) ```typescript import { attachToBrowser } from "testplane/unstable"; diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/reference/webdriver-vs-cdp.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/reference/webdriver-vs-cdp.mdx index 9c84199..85f86d3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/reference/webdriver-vs-cdp.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/reference/webdriver-vs-cdp.mdx @@ -1,4 +1,4 @@ -# Протоколы общения с браузером: Webdriver vs Chrome DevTools Protocol +# Протоколы взаимодействия с браузером ## Обзор @@ -82,7 +82,7 @@ API протокола поделено логическим образом на [debugger]: https://chromedevtools.github.io/devtools-protocol/tot/Debugger/ [how-to-intercept-requests-and-responses]: ../../guides/how-to-intercept-requests-and-responses [how-to-check-accessibility]: ../../guides/how-to-check-accessibility -[how-to-manage-network-bandwidth]: ../../guides/how-to-manage-network-bandwidth -[how-to-manage-cpu-performance]: ../../guides/how-to-manage-cpu-performance -[how-to-hide-scrollbars-by-cdp]: ../../guides/how-to-hide-scrollbars-by-cdp +[how-to-manage-network-bandwidth]: ../../basic-guides/emulation +[how-to-manage-cpu-performance]: ../../basic-guides/emulation +[how-to-hide-scrollbars-by-cdp]: ../../guides/visual-checks-best-practices/hiding-scrollbars [how-to-use-cdp]: ../../guides/how-to-use-cdp diff --git a/i18n/ru/docusaurus-theme-classic/footer.json b/i18n/ru/docusaurus-theme-classic/footer.json index 3af6625..a501960 100644 --- a/i18n/ru/docusaurus-theme-classic/footer.json +++ b/i18n/ru/docusaurus-theme-classic/footer.json @@ -29,7 +29,7 @@ }, "link.item.label.Testplane config": { "message": "Конфиг Testplane", - "description": "The label of footer link with label=Testplane config linking to /docs/v8/config/main" + "description": "The label of footer link with label=Testplane config linking to /docs/v8/reference/config/main" }, "link.item.label.Testplane UI": { "message": "Testplane UI", diff --git a/package-lock.json b/package-lock.json index 8829159..3b0f0c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-client-redirects": "3.4.0", "@docusaurus/preset-classic": "3.4.0", "@gravity-ui/icons": "2.16.0", "@mdx-js/react": "3.0.1", @@ -265,18 +266,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@aw-web-design/x-default-browser": { "version": "1.4.126", "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", @@ -290,40 +279,44 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -347,49 +340,42 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -406,18 +392,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -436,12 +421,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -460,15 +446,16 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -478,65 +465,56 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -546,32 +524,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -581,13 +562,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -596,185 +578,111 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/types": "^7.28.5" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "bin": { - "parser": "bin/babel-parser.js" + "node": ">=6.9.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -784,11 +692,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -798,13 +707,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -814,12 +724,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -992,6 +903,8 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -999,31 +912,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1051,17 +939,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", @@ -1078,11 +955,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1092,11 +970,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1105,34 +984,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1141,21 +999,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1167,6 +1016,8 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1178,6 +1029,8 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1189,6 +1042,8 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1200,6 +1055,8 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1207,40 +1064,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1265,11 +1095,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1279,14 +1110,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1296,13 +1127,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1312,11 +1144,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1326,11 +1159,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1340,12 +1174,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1355,13 +1190,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1371,18 +1206,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1392,12 +1226,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1407,11 +1242,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1421,12 +1258,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1436,11 +1274,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1449,13 +1288,45 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1465,12 +1336,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1480,12 +1351,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1511,12 +1382,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1526,13 +1398,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1542,12 +1415,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1557,11 +1430,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1571,12 +1445,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1586,11 +1460,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1600,12 +1475,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1615,13 +1491,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1631,14 +1507,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1648,12 +1525,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1663,12 +1541,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1678,11 +1557,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1692,12 +1572,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1707,12 +1587,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1722,14 +1602,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1739,12 +1621,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1754,12 +1637,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1769,13 +1652,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1785,11 +1668,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1799,12 +1683,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1814,14 +1699,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1831,11 +1716,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1859,11 +1745,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1873,15 +1760,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1891,11 +1779,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1937,12 +1826,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1952,12 +1842,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1966,12 +1856,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1981,15 +1888,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -2008,11 +1916,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2022,12 +1931,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2037,11 +1947,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2051,11 +1962,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2065,11 +1977,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2079,14 +1992,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", - "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2096,11 +2011,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2110,12 +2026,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2125,12 +2042,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2140,12 +2058,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2155,90 +2074,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -2287,16 +2196,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2306,15 +2216,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2460,11 +2371,6 @@ "semver": "bin/semver" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, "node_modules/@babel/runtime": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", @@ -2475,58 +2381,57 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", - "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "license": "MIT", "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" + "core-js-pure": "^3.43.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2775,6 +2680,30 @@ "react-dom": "*" } }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.4.0.tgz", + "integrity": "sha512-Pr8kyh/+OsmYCvdZhc60jy/FnrY6flD2TEAhl4rJxeVFxnvvRgEhoaIVX8q9MuJmaQoh6frPk94pjs7/6YgBDQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-content-blog": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz", @@ -3850,23 +3779,19 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -3881,14 +3806,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", @@ -3905,9 +3822,10 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -7535,9 +7453,10 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", @@ -8569,145 +8488,162 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/@yarnpkg/esbuild-plugin-pnp": { "version": "3.0.0-rc.15", @@ -9384,9 +9320,10 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -9513,12 +9450,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -9529,28 +9467,31 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -9600,6 +9541,15 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -9681,22 +9631,23 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -9707,6 +9658,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -9714,21 +9666,8 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.2.1", @@ -9813,9 +9752,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -9830,11 +9769,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -9887,6 +9828,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9945,6 +9887,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -10021,9 +9992,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001611", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz", - "integrity": "sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==", + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", "funding": [ { "type": "opencollective", @@ -10037,7 +10008,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -10882,6 +10854,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10892,9 +10865,10 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10989,11 +10963,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", @@ -11001,10 +10976,11 @@ } }, "node_modules/core-js-pure": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.0.tgz", - "integrity": "sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", + "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -11398,11 +11374,12 @@ "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.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -13160,6 +13137,20 @@ "node": ">=12" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -13239,9 +13230,10 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.744", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.744.tgz", - "integrity": "sha512-nAGcF0yeKKfrP13LMFr5U1eghfFSvFLg302VUFzWlcjPOnUYd52yU5x6PBYrujhNbc4jYmZFrGZFK+xasaEzVA==" + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -13274,6 +13266,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "peer": true, "engines": { "node": ">= 0.8" } @@ -13427,12 +13421,10 @@ } }, "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" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -13493,13 +13485,14 @@ "node_modules/es-module-lexer": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "dev": true }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -13604,9 +13597,10 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -14158,44 +14152,49 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -14206,25 +14205,20 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -14278,14 +14272,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "devOptional": true }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, "node_modules/fast-xml-parser": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", @@ -14490,16 +14476,17 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -14510,14 +14497,25 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -14954,15 +14952,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -14985,6 +14989,19 @@ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -15156,14 +15173,6 @@ "which": "bin/which" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", @@ -15199,11 +15208,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15387,6 +15397,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -15395,9 +15406,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -15917,18 +15929,23 @@ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { @@ -15950,9 +15967,10 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -16007,6 +16025,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -16354,11 +16373,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17267,14 +17290,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -17735,11 +17759,16 @@ "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", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -17777,7 +17806,8 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -18169,6 +18199,15 @@ "dev": true, "peer": true }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-directive": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", @@ -18556,6 +18595,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -18588,9 +18628,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -20859,9 +20903,10 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -20970,9 +21015,10 @@ } }, "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==", + "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -21116,9 +21162,10 @@ "peer": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" }, "node_modules/node-stream-zip": { "version": "1.15.0", @@ -21388,9 +21435,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -21901,9 +21952,10 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -22962,7 +23014,8 @@ "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/pupa": { "version": "3.1.0", @@ -22979,12 +23032,12 @@ } }, "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", - "dev": true, + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -23058,14 +23111,15 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -24043,12 +24097,14 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -24056,19 +24112,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -24088,16 +24131,17 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -24128,25 +24172,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/rehype-external-links": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", @@ -24489,17 +24532,21 @@ "peer": true }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -24701,7 +24748,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sass": { "version": "1.72.0", @@ -24789,9 +24837,10 @@ } }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -24799,7 +24848,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -24917,23 +24966,24 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -24943,6 +24993,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -24950,12 +25001,23 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -24963,11 +25025,6 @@ "node": ">=4" } }, - "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/serialize-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", @@ -24987,17 +25044,17 @@ } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, @@ -25037,9 +25094,10 @@ } }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" }, "node_modules/serve-handler/node_modules/range-parser": { "version": "1.2.0", @@ -25120,19 +25178,29 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -25255,14 +25323,69 @@ } }, "node_modules/side-channel": { - "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -25595,9 +25718,10 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -26047,11 +26171,16 @@ "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar": { @@ -26226,12 +26355,13 @@ } }, "node_modules/terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -26243,15 +26373,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -26288,23 +26419,6 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -26320,9 +26434,10 @@ } }, "node_modules/terser/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -26431,14 +26546,6 @@ "dev": true, "peer": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -26600,6 +26707,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -26897,9 +27005,10 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", "engines": { "node": ">=4" } @@ -26916,6 +27025,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -26925,17 +27035,19 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -27117,9 +27229,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -27134,9 +27246,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -27426,9 +27539,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -27470,34 +27584,36 @@ "dev": true }, "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -27771,9 +27887,10 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -27785,9 +27902,10 @@ "dev": true }, "node_modules/webpack/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -27795,14 +27913,24 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/webpack/node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "license": "MIT" + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -27823,23 +27951,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpackbar": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", diff --git a/package.json b/package.json index 16a9810..b18c114 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "dependencies": { "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-client-redirects": "3.4.0", "@docusaurus/preset-classic": "3.4.0", "@gravity-ui/icons": "2.16.0", "@mdx-js/react": "3.0.1", diff --git a/sidebars.ts b/sidebars.ts index 979f257..a4dab99 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -4,19 +4,9 @@ const sidebars: SidebarsConfig = { mainSidebar: [ "index", { - type: "doc", - id: "quickstart/index", - label: "Quickstart", - }, - { - type: "doc", - id: "command-line/index", - label: "CLI", - }, - { - type: "doc", - id: "testplane-mcp", - label: "Testplane MCP", + type: "category", + label: "Getting Started", + items: [{ type: "autogenerated", dirName: "quickstart" }], }, { type: "category", @@ -48,20 +38,18 @@ const sidebars: SidebarsConfig = { }, { type: "category", - label: "Config", - items: [{ type: "autogenerated", dirName: "config" }], - link: { type: "doc", id: "config/main" }, + label: "Guides", + items: [{ type: "autogenerated", dirName: "basic-guides" }], }, { type: "category", - label: "Visual testing", - items: [{ type: "autogenerated", dirName: "visual-testing" }], - link: { type: "doc", id: "visual-testing/visual-testing-intro" }, + label: "Advanced Guides", + items: [{ type: "autogenerated", dirName: "guides" }], }, { - type: "category", - label: "Guides", - items: [{ type: "autogenerated", dirName: "guides" }], + type: "doc", + id: "testplane-mcp", + label: "Testplane MCP", }, { type: "category", @@ -73,11 +61,6 @@ const sidebars: SidebarsConfig = { label: "Plugins", items: [{ type: "autogenerated", dirName: "plugins" }], }, - { - type: "category", - label: "Reference", - items: [{ type: "autogenerated", dirName: "reference" }], - }, { type: "category", label: "Сomparison", @@ -98,6 +81,10 @@ const sidebars: SidebarsConfig = { ], }, ], + api: [ + { type: "link", href: "/docs/v8/commands/overview", label: "Testplane Commands" }, + { type: "autogenerated", dirName: "reference" }, + ], }; export default sidebars; diff --git a/src/scss/custom.scss b/src/scss/custom.scss index 752e37e..26e6015 100644 --- a/src/scss/custom.scss +++ b/src/scss/custom.scss @@ -200,7 +200,7 @@ html[data-theme-override="light"] { } .DocSearch-Button { - @apply mr-6 h-8 scale-110 rounded-lg bg-transparent font-normal text-neutral-500 hover:bg-neutral-200 hover:text-neutral-500 hover:shadow-none md:scale-100 md:bg-neutral-100 md:text-neutral-500 lg:mr-0 lg:w-80 dark:bg-transparent dark:text-neutral-400 dark:hover:bg-neutral-800/80 dark:md:bg-neutral-800/50; + @apply mr-6 h-8 w-40 scale-110 rounded-lg bg-transparent font-normal text-neutral-500 hover:bg-neutral-200 hover:text-neutral-500 hover:shadow-none md:scale-100 md:bg-neutral-100 md:text-neutral-500 lg:mr-0 xl:w-80 dark:bg-transparent dark:text-neutral-400 dark:hover:bg-neutral-800/80 dark:md:bg-neutral-800/50; font-family: Jost; svg {