diff --git a/blog/cli-and-skill.mdx b/blog/cli-and-skill.mdx new file mode 100644 index 00000000..69be8266 --- /dev/null +++ b/blog/cli-and-skill.mdx @@ -0,0 +1,8 @@ +--- +title: Testplane CLI and Skill +slug: cli-and-skill +hide_table_of_contents: false +date: 2026-05-05T17:00 +--- + +asdf diff --git a/blog/testplane-vs-playwright.mdx b/blog/testplane-vs-playwright.mdx index 4f50a7fc..7e1c5c33 100644 --- a/blog/testplane-vs-playwright.mdx +++ b/blog/testplane-vs-playwright.mdx @@ -12,6 +12,8 @@ import Admonition from "@theme/Admonition"; И **Testplane**, и **Playwright** — это решения для end-to-end тестирования, но они имеют разные подходы и возможности. В этой статье мы проведём детальное сравнение этих инструментов, чтобы помочь вам сделать правильный выбор. + + ## Краткий обзор инструментов **Testplane** — это инструмент для автоматизации тестирования веб-приложений, разработанный командой Яндекса. Он активно используется как в крупных, так и в небольших проектах компании и поддерживает широкий спектр браузеров и устройств. diff --git a/docs/ai/overview.mdx b/docs/ai/overview.mdx new file mode 100644 index 00000000..4e0c8da6 --- /dev/null +++ b/docs/ai/overview.mdx @@ -0,0 +1,163 @@ +--- +sidebar_position: 1 +sidebar_label: Overview +title: Testplane's AI Tools +--- + +import { HelpMark } from "@site/src/components/HelpMark"; + +# Testplane's AI Tools + +Testplane provides a set of AI integration tools that help agents write, inspect, debug, and fix your Testplane tests. + +The goal of these tools is to turn a generic coding agent into Testplane expert that understands how Testplane projects are usually structured, how tests should be written, and how failures should be investigated. + +## Capabilities + +- Let AI agents explore your app and "see" what's happening through token-efficient DOM snapshots +- Generate new tests based on the actual application state +- See how agents follow best practices when writing tests out of the box +- Handle authentication without reading secrets +- Enable agents investigate failures from CI reports +- Let agents debug tests via REPL + +## Available Tools + +[Testplane Skill](../toolkit/testplane-skill) teaches AI agents how to work with Testplane projects end to end, how to use `@testplane/cli`. It's packed with best practices and comprehensive documentation that agents can make use of. + +[Testplane CLI](../toolkit/testplane-cli) is what powers the Testplane Skill and makes browser automation accessible right from the CLI. + +[Testplane MCP](../toolkit/testplane-mcp) matches the capabilities of `@testplane/cli`, but offers another way to interact with the browser: through the MCP protocol. + +## Which tool to use? + +If unsure, prefer Testplane Skill. It works great for most workflows and is the best pick overall: coding agents love CLIs, it's token-efficient and provides enough context about all things Testplane. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SkillCLIMCP
**How it works** + LLM reads a markdown file with instructions, reaches out to `@testplane/cli` for + browser automation + LLM runs shell commands to interact with the browserLLM interacts with the browser via MCP tool calls
**Token efficiency**High, progressive discoveryHigh, concise CLI calls + Lower, depends on the agent harness{" "} + + Some agents harnesses may load all MCP tool schemas at once, polluting the + context and spending tokens. +
+
+ Some tools, however, optimise this step by pre-generating tool schemas and loading + them lazily, in which case token usage is comparable to CLI tools. +
+
**Default browser mode**HeadlessHeadlessHeadful
**Supported scenarios** + Complex workflows + browser automation{" "} + + Besides offering browser automation capabilities, skill teaches agents how to + handle auth, debugging, choose best code style, understand common Testplane + patterns and more. + + Interaction with browser, reports inspectionSame as CLI
+ +## Comparison with other solutions + +Overall, we recommend using Testplane AI toolkit when working with Testplane projects, because it was designed specifically around this use case and provides deep integrations with Testplane ecosystem, allowing agents to: + +- Read what Testplane code that was run on each Testplane CLI/MCP tool call and copy+paste it when writing tests +- Analyze Testplane reports (both local and from CI) and fix failed tests +- Inspect Time Travel snapshots to debug what went wrong and adjust tests as your app evolves +- Debug tests with agents-friendly REPL debugger +- Understand Testplane's capabilities and usage patterns through concise reference in Testplane Skill + +We've studied other tools for agentic browser automation — below is a brief comparison of the most notable projects in the field, hopefully helping you navigate through possible options. + +### Built-in browser in Cursor, CC, Cline, etc. + +[Cursor's Browser](https://cursor.com/docs/agent/tools/browser) and [Cline's Browser Automation](https://docs.cline.bot/tools-reference/browser-automation) are built-in ways to interact with the browser, providing tools for navigation, taking page snapshots, various interactions and reading browser's console logs. + +Cursor's built-in browser has a neat design sidebar that allows you to quickly modify your app's design and point at certain elements when writing prompts. + +However, these tools have major limitations when trying to use them for web apps testing: + +- Cline doesn't have DOM snapshot tool at all — it relies solely on screenshots +- Cursor's snapshot tool returns accessibility tree which lacks CSS classes, almost all HTML attributes and has a flat structure, losing all DOM hierarchy data +- They offer very limited support for browsers: only Chrome with no mobile emulation and no special capabilities +- No way of securely handling auth data + +### Playwright + +[Playwright CLI](https://github.com/microsoft/playwright-cli) is a powerful and popular tool for browser automation. Its notable features include network requests inspection and devtools capabilities. + +The main limitations are: + +- No report analysis, Time Travel snapshot inspection, or REPL debugging +- Tool responses are focused on Playwright code, which may confuse agents working with Testplane +- Snapshots are based on accessibility trees, without CSS classes, precise DOM structure, or many useful HTML attributes + +Playwright CLI is a popular choice, but it lacks several features that unlock powerful workflows and it doesn't have the Testplane-specific context. + +### Chrome DevTools MCP + +[Chrome Devtools MCP](https://github.com/ChromeDevTools/chrome-devtools-mcp) besides regular browser tools provides niche features like taking memory snapshots and browser extension management. + +For Testplane projects, the main limitations are: + +- It is specific to Chrome +- Snapshots are based on the accessibility tree, without CSS classes or precise DOM structure +- It doesn't integrate with Testplane tooling, reports, Time Travel snapshots, or the Testplane REPL + +Overall, it provides deep low-level integration with Chrome's devtools capabilities, but is not focused on web apps testing and doesn't have integrations with testplane tooling. + +### Vercel's agent-browser + +Vercel's [agent-browser](https://github.com/vercel-labs/agent-browser) is a generic browser automation, with a large set of tools, including network inspection and profiling. + +Its strength is flexibility, but it is not tied to any particular test runner or testing workflow. + +For Testplane usage, this means: + +- It is not focused specifically on web app testing +- Snapshots are based on accessibility trees +- It doesn't integrate with Testplane tooling, reports, Time Travel snapshots, or the Testplane REPL + +agent-browser can be useful for general browser automation, but it lacks the Testplane-specific integrations agents need to write, debug, and fix tests effectively. + +## Staying informed + +Stumbled upon a bug, have a question or an idea? Let us now: + +- [Telegram](https://t.me/testplane) +- [GitHub](https://github.com/gemini-testing/testplane) + +You can track new releases [over here](https://github.com/gemini-testing/testplane-mcp/releases). diff --git a/docs/ai/toolkit/_category_.json b/docs/ai/toolkit/_category_.json new file mode 100644 index 00000000..d508b663 --- /dev/null +++ b/docs/ai/toolkit/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Toolkit", + "collapsed": false +} diff --git a/docs/ai/toolkit/testplane-cli.mdx b/docs/ai/toolkit/testplane-cli.mdx new file mode 100644 index 00000000..0ace2122 --- /dev/null +++ b/docs/ai/toolkit/testplane-cli.mdx @@ -0,0 +1,357 @@ +# Testplane CLI + +Testplane CLI lets you control a real browser from the terminal with Testplane APIs. + +You can open pages, click through flows, capture compact DOM snapshots, inspect console logs, save auth state, debug Testplane reports, and replay Time Travel snapshots. It is useful on its own, and it is also the browser/report engine behind Testplane Skill. + +## Installation + +Install it in your project: + +```shell +npm install --save-dev @testplane/cli +``` + +Then run it with: + +```shell +npx @testplane/cli --help +``` + +## Typical flow + +The simplest session starts with `navigate`. If there is no browser yet, the CLI starts one automatically. + +```shell +npx @testplane/cli navigate https://example.com +npx @testplane/cli snapshot +``` + +By default, CLI browsers run headless. If you want to watch the browser while debugging, launch it first: + +```shell +npx @testplane/cli launch --headless false +npx @testplane/cli navigate http://localhost:3000 +``` + +When you are done: + +```shell +npx @testplane/cli close-browser +``` + +If you don't close the browser, it will be closed after 5 minutes of inactivity by default. + +## What the output looks like + +Most browser commands return three useful pieces of information: the action result, equivalent Testplane code, and the current browser state. + +```text +Successfully navigated to https://example.com + +## Testplane Code + +await browser.openAndWait("https://example.com"); + +## Browser Tabs + + 1. Title: Example Domain; URL: https://example.com/ (current) + +## Current Tab Snapshot + +The snapshot was saved to: /tmp/.testplane/snapshots/2026-05-14T21-24-40-811Z.yml +``` + +Snapshots are optimized for humans and agents reading terminal output. They omit noisy tags and attributes by default, truncate very long text, and save large snapshots to a temp file instead of filling your terminal. + +## Navigating and inspecting pages + +Use `navigate` with a custom timeout for slow local apps or CI environments: + +```shell +npx @testplane/cli navigate http://localhost:3000 --timeout 60000 +``` + +Use `snapshot` to understand the page structure: + +```shell +npx @testplane/cli snapshot +``` + +You can tune the snapshot when the default output hides something useful: + +```shell +npx @testplane/cli snapshot --include-attrs data-qa href class --max-text-length 200 +``` + +Use `screenshot` when you need visual evidence: + +```shell +npx @testplane/cli screenshot ./tmp/page.png +``` + +For most test debugging, start with `snapshot`. It is faster to read, easier to search, and usually enough to find the selector or state you need. + +## Interacting with elements + +Commands accept either a selector or semantic Testing Library-style options. + +```shell +npx @testplane/cli click '[data-testid="submit"]' +npx @testplane/cli click --role button --name "Submit" +npx @testplane/cli type --label-text "Email" --value "user@example.com" +npx @testplane/cli wait --text "Saved" --timeout 5000 +``` + +For native `` elements: + +```shell +npx @testplane/cli select "#country" --visible-text "Germany" +npx @testplane/cli select --label-text "Country" --value de +``` + +`console` reads unseen browser console messages from Chromium-based sessions: + +```shell +npx @testplane/cli console +``` + +
+Example console output + +```text +Retrieved 5 unseen browser console messages + +## Testplane Code + +const consoleMessages = await browser.getLogs("browser"); + +## Browser Tabs + + 1. Title: javascript - Load page on selection from dropdown form - Stack Overflow; URL: https://stackoverflow.com/questions/10175445/load-page-on-selection-from-dropdown-form (current) + +## Additional Information + +1. [2026-05-14T22:23:40.793Z] WARNING (security): Error with Feature-Policy header: Unrecognized feature: 'speaker'. +2. [2026-05-14T22:23:42.789Z] WARNING (console-api): "[GPT] PubAdsService.setForceSafeFrame is deprecated..." +3. [2026-05-14T22:23:43.883Z] SEVERE (other): Not signed in with the identity provider. +4. [2026-05-14T22:23:44.059Z] SEVERE (javascript): Access to fetch at 'https://id5-sync.com/api/config/prebid' from origin 'https://stackoverflow.com' has been blocked by CORS policy. +5. [2026-05-14T22:23:44.059Z] SEVERE (network): Failed to load resource: net::ERR_FAILED +``` + +
+ +`navigate` accepts a timeout, which is useful for slow local apps and CI environments: + +```shell +npx @testplane/cli navigate http://localhost:3000 --timeout 60000 +``` + +Post-action navigation is handled more cleanly too. When a click or another action changes the page, the response is based on the resulting browser state, so the next snapshot reflects where the browser actually ended up. + +## Testplane MCP + +All of these features are available through Testplane MCP as well. The MCP server and the CLI both import the same shared `@testplane/tools` package, so their feature sets stay aligned. + +Use the MCP server in an MCP-compatible client with: + +```json +{ + "mcpServers": { + "testplane-mcp": { + "command": "npx", + "args": ["@testplane/mcp@latest"] + } + } +} +``` + +Use the CLI when you want direct terminal control or a scriptable workflow. Use MCP when you want the same tools available inside your editor or assistant. + +In both cases, the important part is the same: agents can now work with real browser state and real Testplane report data, instead of guessing from source code alone. + +## What's next? + +We hope this supercharged toolkit helps you turn the messy parts of browser testing into something more observable, more debuggable, and a little more pleasant to work with. + +Try it on one real task: a failing report, a flaky test, or a page where selectors are hard to guess. Visit our [AI Toolkit Docs](/docs/v8/ai/toolkit/testplane-cli) page for more ideas, practical guidance, and examples of how these tools can fit into your workflow. + +If something still feels awkward — tell us, we are always happy to [hear your feedback](https://github.com/gemini-testing/testplane-mcp/issues). diff --git a/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx b/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx index 683cbfa0..c74f9a65 100644 --- a/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx +++ b/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx @@ -1,5 +1,5 @@ --- -title: Test run selectivity +title: Test Run Selectivity slug: selectivity-intro hide_table_of_contents: false date: 2025-12-03T14:00 diff --git a/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx b/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx index 81d502c6..5e3238dd 100644 --- a/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx +++ b/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx @@ -12,6 +12,8 @@ import Admonition from "@theme/Admonition"; 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. + + ## Brief Tool Overview **Testplane** is a web application test automation tool developed by the Yandex team. It is actively used in both large and small company projects and supports a wide range of browsers and devices. diff --git a/i18n/ru/docusaurus-plugin-content-blog/cli-and-skill.mdx b/i18n/ru/docusaurus-plugin-content-blog/cli-and-skill.mdx new file mode 100644 index 00000000..07ea9eb4 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-blog/cli-and-skill.mdx @@ -0,0 +1,387 @@ +--- +title: Testplane CLI и Skill +slug: cli-and-skill +hide_table_of_contents: false +date: 2026-05-15T17:00 +--- + +Сегодня мы рады представить новый набор инструментов для работы AI-агентов с Testplane: Testplane CLI, Testplane Skill и крупные обновления доступных возможностей. + +![](/img/blog/cli-and-skill/cover.png) + +{/* truncate */} + +## Testplane Skill + +Данный skill рассказывает агентам, как эффективно работать с тестами Testplane, использовать браузер через `@testplane/cli` и работать с отчетами для отладки. + +Добавьте skill в систему командой: + +```shell +npx skills add gemini-testing/testplane-skill +``` + +Skill загружается агентами только когда релевантен запросу, поэтому не засоряет контекст зря. + +При работе с тестами он дает агенту инструкции, например: исследовать приложение перед написанием тестов, использовать реальные селекторы из браузера, переиспользовать project helpers, избегать `browser.pause()`, открывать отчеты через `@testplane/cli` для отладки, использовать CLI для отладки тестов через REPL и многое другое. + +Также он учит агента использовать `@testplane/cli` для исследования браузера: + +```shell +npx @testplane/cli navigate http://localhost:3000 +npx @testplane/cli click --role button --name "Save" +npx @testplane/cli snapshot +``` + +Это превращает размытый запрос вроде "почини этот flaky checkout-тест" в более четкий цикл работы. Агент может воспроизвести состояние страницы, исследовать DOM, обновить тест и перезапустить самый узкий релевантный набор команд. + +Подробнее о Testplane Skill читайте [в документации](/docs/v8/ai/toolkit/testplane-skill) или на странице skill в [skills.sh](https://www.skills.sh/gemini-testing/testplane-skill/testplane-skill). + +## Testplane CLI + +Testplane CLI позволяет пользователям и агентам управлять браузером из терминала. Он также является основой браузерных workflow в Testplane Skill. + +Установите его в проект: + +```shell +npm install --save-dev @testplane/cli +``` + +Или запускайте напрямую: + +```shell +npx @testplane/cli@latest --help +``` + +По умолчанию CLI запускает браузеры в headless-режиме. Если хотите наблюдать браузер во время отладки, сначала запустите видимую сессию: + +```shell +npx @testplane/cli launch --headless false +``` + +Базовая браузерная сессия выглядит так: + +```shell +npx @testplane/cli navigate https://example.com +npx @testplane/cli snapshot +``` + +
+Пример вывода команды navigate + +```text +Successfully navigated to https://example.com + +## Testplane Code + +await browser.openAndWait("https://example.com"); + +## Browser Tabs + + 1. Title: Example Domain; URL: https://example.com/ (current) + +## Current Tab Snapshot + +The snapshot was saved to: /tmp/.testplane/snapshots/2026-05-14T21-24-40-811Z.yml +``` + +
+ +
+Пример вывода команды snapshot + +```text +Page snapshot captured successfully + +## Current Tab Snapshot + +- body: + - div: + - h1 "Example Domain" + - p "This domain is for use in documentation examples without needing permission. Avoid use in operations..." + - p: + - a[href=https://iana.org/domains/example] "Learn more" +``` + +
+ +Snapshots в первую очередь текстовые и оптимизированы для агентов. Они по умолчанию убирают шумные теги и атрибуты, обрезают очень длинный текст и сохраняют большие снимки во временный файл вместо того, чтобы заливать терминал большим объемом вывода. + +## Интеграция с HTML Reporter + +Новая интеграция с HTML Reporter позволяет агентам исследовать [отчеты Testplane](/docs/v8/html-reporter/overview) с помощью CLI. Они работают как с локальными отчетами, так и удаленными — работать с отчетами из CI можно так же удобно, как и с локальными. + +Удаленные отчеты автоматически скачиваются и кэшируются. Агент может запросить упавшие тесты, исследовать конкретный прогон и посмотреть на ошибку, шаги, изображения, метаданные и вложения, которые важны для исправления. + +```shell +npx @testplane/cli test-results ./html-report --status failed --grep checkout +npx @testplane/cli inspect-result ./html-report --name "checkout submits order" --browser chrome +``` + +
+Пример вывода test-results для отчета из CI + +```text +Test results in report: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html +Total tests: 133; total attempts: 133; matched tests: 133 + +Total tests counts: passed: 133, failed: 0, muted: 0, retried: 0, skipped: 0 +Matched tests counts: passed: 133, failed: 0, muted: 0, retried: 0, skipped: 0 + +Showing 1-4 of 133 matched test results. + +1. success | chrome | attempt 0 | 1.5s | common/error-group.testplane.js + testplane Error grouping should group errors +2. success | chrome | attempt 0 | 1.7s | common/test-results-appearance.testplane.js + testplane Test results appearance Passed test should have green retry selector +3. success | chrome | attempt 0 | 1.6s | common/test-results-appearance.testplane.js + testplane Test results appearance Test with diff should have pink retry selector +4. success | chrome | attempt 0 | 1.4s | common/test-results-appearance.testplane.js + testplane Test results appearance Test with diff should display 3 images +``` + +
+ +
+Пример вывода inspect-result + +```json +{ + "status": "success", + "browser": "chrome", + "attempt": 0, + "duration": 1503, + "file": "common/error-group.testplane.js", + "name": "testplane Error grouping should group errors", + "error": null, + "meta": { + "url": "http://host.docker.internal:8061/fixtures/testplane/report/", + "file": "common/error-group.testplane.js", + "sessionId": "c5e07ff0b8fdce82785dba4493f5c7b7" + }, + "steps": [ + { + "name": "setWindowSize", + "args": ["1280", "1024"], + "duration": 31 + }, + { + "name": "$", + "args": ["[data-qa=\"group-by-dropdown\"]"], + "duration": 0 + }, + { + "name": "click", + "args": [], + "duration": 79 + } + ], + "images": [], + "attachments": [ + { + "type": "snapshot", + "path": "snapshots/e632a64/chrome_1778547952338_0.zip", + "maxWidth": 1280, + "maxHeight": 1024 + } + ] +} +``` + +
+ +Полный ответ `inspect-result` включает все шаги, выполненные в ходе теста. + +Также есть команда `time-travel-snapshot` для отчетов с данными Testplane Time Travel. Она воспроизводит снимок в выбранный момент и возвращает DOM-снимок страницы в этом состоянии. + +```shell +npx @testplane/cli time-travel-snapshot ./html-report \ + --name "checkout submits order" \ + --browser chrome \ + --time 250 \ + --diff-from 100 +``` + +Тот же CI-отчет можно исследовать в конкретной точке тестового таймлайна: + +```shell +npx @testplane/cli time-travel-snapshot "$REPORT_URL" \ + --name "testplane Error grouping should group errors" \ + --browser chrome \ + --attempt 0 \ + --time 1400 \ + --include-attrs data-qa href class \ + --max-text-length 80 +``` + +
+Пример вывода time-travel-snapshot + +```text +Time travel snapshot captured + +## Source + +Report: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html +Test: testplane Error grouping should group errors +Browser: chrome +Attempt: 0 +Mode: report +Snapshot source: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/snapshots/e632a64/chrome_1778547952338_0.zip +Events: 34 +Snapshot range: 1778547952408 (2026-05-12T01:05:52.408Z) - 1778547953911 (2026-05-12T01:05:53.911Z); total 1503ms + +## Selected Time + +Reason: provided offset 1400ms from first rrweb event +Absolute timestamp: 1778547953808 (2026-05-12T01:05:53.808Z) +Offset from first rrweb event: 1400ms +Requested time: 1400 (offset) + +## Test Steps + +Times are offsets from the first rrweb event; use them as "time" values. +- +1080ms..+1080ms $("[data-qa=\"group-by-dropdown\"]") +- +1104ms..+1183ms click +- +1184ms..+1184ms $("div=error") +- +1199ms..+1282ms click +- +1282ms..+1282ms $(".grouped-tests") +- +1356ms..+1356ms $("span*=tests: 1") + +## Snapshot + +- body.report.g-root.g-root_theme_light: + - div#app: + - div.sticky-header__content: + - div.main-menu.container: + - div.select.select_type_group: + - div.g-select.group-by-dropdown: + - button[data-qa=group-by-dropdown role=combobox]: + - span.g-select-control__option-text "error" + - main.container: + - div.grouped-tests: + - div.tests-group.tests-group_collapsed: + - span.tests-group__name "image comparison failed" + - span.tests-group__count "( tests: 1, runs: 2 )" +``` + +
+ +Это полезно, когда у вас есть упавшие тесты в CI-отчете и вы хотите, чтобы агент проанализировал падения. Агент может происследовать воспроизведенный DOM и решить, нужно менять тест или сломалось поведение тестируемого сервиса. + +## Интеграция с REPL + +Testplane CLI может подключаться к запущенной REPL-сессии Testplane: + +```shell +npx @testplane/cli attach-repl --port 4444 +``` + +После подключения CLI может снимать снапшоты и выполнять код Testplane через REPL: + +```shell +npx @testplane/cli snapshot +npx @testplane/cli run-code "await browser.getUrl()" +``` + +Это удобный режим отладки, когда тест уже привел браузер в нужное состояние. Агент может подключиться, исследовать страницу, выполнять код Testplane в интерактивном режиме. + +Одна из ключевых сильных сторон REPL-режима в том, что агент остается внутри runtime вашего проекта. Это значит, что он может использовать существующие page object'ы, кастомные команды и хелперы вместо повторной реализации поведения через низкоуровневые вызовы браузера. + +## Работа с auth + +В CLI теперь есть команды для состояния браузера. Запускайте их после открытия или подключения к браузерной сессии: + +```shell +npx @testplane/cli save-state ./tmp/auth-state.json +npx @testplane/cli restore-state ./tmp/auth-state.json +``` + +Сохраненное состояние включает cookies, localStorage и sessionStorage. При сохранении можно отключить любую часть: + +```shell +npx @testplane/cli save-state ./tmp/auth-state.json --cookies false +``` + +Это дает агентам безопасный способ переиспользовать аутентифицированное состояние браузера. + +Сам файл состояния может содержать чувствительные данные, поэтому не добавляйте его в git и работайте с ним с осторожностью. + +Это новый подход к работе с чувствительными данными в дополнение к существующему сценарию, где код теста подготавливает браузер и оставляет браузер агенту через `--keep-browser`. Также для этого сценария можно использовать REPL-интеграцию, описанную выше. + +## Новые инструменты взаимодействия с браузером + +`select` работает с нативными элементами ``: + +```shell +npx @testplane/cli select "#country" --visible-text "Germany" +npx @testplane/cli select --label-text "Country" --value de +npx @testplane/cli select --label-text "Country" --index 2 +``` + +После действия CLI сообщает итоговое состояние браузера. Это полезно, когда клик приводит к навигации или заменяет элемент, с которым вы только что взаимодействовали. + +## Логи консоли + +`console` читает сообщения консоли браузера из сессий на базе Chromium. Он возвращает только сообщения, которые еще не были возвращены предыдущим вызовом `console` в текущей сессии. + +```shell +npx @testplane/cli navigate https://stackoverflow.com/questions/10175445/load-page-on-selection-from-dropdown-form +npx @testplane/cli console +``` + +Пример: + +```text +Retrieved 8 unseen browser console messages + +1. [2026-05-14T22:23:40.793Z] WARNING (security): Error with Feature-Policy header: Unrecognized feature: 'speaker'. +2. [2026-05-14T22:23:43.883Z] SEVERE (other): Not signed in with the identity provider. +3. [2026-05-14T22:23:44.059Z] SEVERE (javascript): Access to fetch at 'https://id5-sync.com/api/config/prebid' from origin 'https://stackoverflow.com' has been blocked by CORS policy. +4. [2026-05-14T22:23:44.059Z] SEVERE (network): Failed to load resource: net::ERR_FAILED +``` + +Это удобно, когда страница в снимке выглядит нормально, но приложение падает в JavaScript, не загружает заблокированный ресурс или пишет полезные runtime-ошибки. + +## Работа с вкладками + +Используйте команды вкладок, когда сценарий открывает новую страницу. + +```shell +npx @testplane/cli list-tabs +npx @testplane/cli new-tab http://localhost:3000/settings +npx @testplane/cli switch-tab 1 +npx @testplane/cli close-tab 2 +``` + +## Состояние аутентификации + +Для сценариев с авторизацией можно сохранять и восстанавливать состояние браузера. + +```shell +npx @testplane/cli save-state ./tmp/auth-state.json +npx @testplane/cli restore-state ./tmp/auth-state.json +``` + +Состояние может включать cookies, localStorage и sessionStorage. Ненужные части можно отключить: + +```shell +npx @testplane/cli save-state ./tmp/auth-state.json --cookies false +``` + +Считайте сохраненный файл чувствительным. Он может содержать реальные auth-данные, даже если в выводе команды печатаются только счетчики. + +По умолчанию `restore-state` обновляет текущую страницу, чтобы код приложения сразу увидел восстановленные cookies и storage. + +## Запуск произвольного кода Testplane + +Когда встроенной команды недостаточно, используйте `run-code`. + +```shell +npx @testplane/cli run-code "await browser.getUrl()" +npx @testplane/cli run-code "(browser) => browser.getTitle()" +npx @testplane/cli run-code --file ./debug-script.js +``` + +Inline-код может быть JavaScript-выражением, небольшим async-телом или функцией, которая принимает `browser`. + +## Подключение к существующим сессиям + +Если вы запускаете тест Testplane с `--keep-browser`, Testplane может напечатать данные браузерной сессии. Подключитесь к этому браузеру и изучите состояние, которое осталось после теста: + +```shell +npx @testplane/cli attach --session '{"sessionId":"...","capabilities":{}}' +npx @testplane/cli snapshot +``` + +Это полезно, когда тест выполняет подготовку, которую трудно воспроизвести вручную, например логин, создание данных или длинный пользовательский сценарий. + +## REPL-режим + +Предположим, вы запустили Testplane с включенным repl и определенным repl-портом: + +``` +npx testplane --grep 'test name' -b chrome-desktop --repl-before-test --repl-port 4444 +``` + +Тогда CLI может подключиться к этой REPL-сессии Testplane: + +```shell +npx @testplane/cli attach-repl --port 4444 +``` + +В REPL-режиме CLI сейчас поддерживает два действия: + +```shell +npx @testplane/cli snapshot +npx @testplane/cli run-code "await browser.getUrl()" +``` + +Главное преимущество — вы остаетесь внутри runtime своего проекта. Это значит, что `run-code` может использовать page objects, кастомные команды, фикстуры и helper-функции, уже доступные в процессе теста. + +## Чтение HTML-отчетов Testplane + +Команды отчетов работают с локальными директориями отчетов, HTML-файлами отчетов, `databaseUrls.json` и удаленными URL отчетов. + +```shell +npx @testplane/cli test-results ./html-report --status failed +npx @testplane/cli inspect-result ./html-report --name "checkout submits order" --browser chrome +``` + +Полезные фильтры: + +```shell +npx @testplane/cli test-results ./html-report --grep checkout +npx @testplane/cli test-results ./html-report --browser chrome --duration '>5s' +npx @testplane/cli test-results ./html-report --grep-error "NoSuchElement" +npx @testplane/cli test-results ./html-report --meta owner=qa --file 'src/**' +``` + +Для больших отчетов или использования в скриптах можно сохранить отфильтрованный набор как JSON: + +```shell +npx @testplane/cli test-results ./html-report --status failed --save-json +``` + +Удаленные отчеты автоматически скачиваются и кэшируются: + +```shell +REPORT_URL="https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html" + +npx @testplane/cli test-results "$REPORT_URL" --limit 10 --fields name,status,browser,duration,file +``` + +Это позволяет разбирать отчеты CI скриптами из терминала, не открывая сначала полный HTML-интерфейс. + +## Time Travel snapshots + +Если отчет содержит данные Testplane Time Travel, вы можете исследовать DOM в конкретный момент записанного прогона. + +```shell +npx @testplane/cli time-travel-snapshot ./html-report \ + --name "checkout submits order" \ + --browser chrome \ + --attempt 0 \ + --time 250 +``` + +Вывод включает выбранное время, соседние шаги теста и DOM-снимок воспроизведенной страницы. + +Используйте `--diff-from`, чтобы сравнить два момента: + +```shell +npx @testplane/cli time-travel-snapshot ./html-report \ + --name "checkout submits order" \ + --browser chrome \ + --time 250 \ + --diff-from 100 +``` + +Также можно напрямую исследовать zip-файл со снимком: + +```shell +npx @testplane/cli time-travel-snapshot --snapshot-file ./snapshot.zip --time 100 +``` + +Time Travel особенно полезен, когда падение произошло в CI, а живой браузер уже закрыт. Вы все равно можете посмотреть, как приложение выглядело в момент выполнения теста. + +## Кастомная конфигурация браузера + +Используйте `launch`, когда нужен видимый браузер, конкретный viewport, mobile emulation или кастомный Selenium grid. + +```shell +npx @testplane/cli launch --headless false --window-size '{"width":1280,"height":720}' +``` + +Пример mobile emulation: + +```shell +npx @testplane/cli launch --desired-capabilities '{ + "browserName": "chrome", + "goog:chromeOptions": { + "mobileEmulation": { + "deviceMetrics": { + "width": 360, + "height": 800, + "pixelRatio": 1 + } + } + } +}' +``` + +По умолчанию `grid-url` равен `local`, что позволяет Testplane автоматически управлять Chrome и Firefox. Для других браузеров запустите драйвер или Selenium grid самостоятельно и передайте его URL: + +```shell +npx @testplane/cli launch --grid-url http://localhost:4444/wd/hub +``` + +## Частые сценарии + +Отладка селектора: + +```shell +npx @testplane/cli navigate http://localhost:3000/profile +npx @testplane/cli snapshot --include-attrs data-qa aria-label +npx @testplane/cli click --role button --name "Edit profile" +npx @testplane/cli snapshot +``` + +Повторное использование login-state: + +```shell +npx @testplane/cli navigate http://localhost:3000/login +# Войдите через команды или вручную в видимой сессии +npx @testplane/cli save-state ./tmp/auth-state.json +npx @testplane/cli close-browser +npx @testplane/cli navigate http://localhost:3000/dashboard +npx @testplane/cli restore-state ./tmp/auth-state.json +``` + +Разбор отчета CI: + +```shell +npx @testplane/cli test-results "$REPORT_URL" --status failed --fields name,browser,error +npx @testplane/cli inspect-result "$REPORT_URL" --name "full test name" --browser chrome +npx @testplane/cli time-travel-snapshot "$REPORT_URL" --name "full test name" --browser chrome --time 1000 +``` + +Подключение после падения теста: + +```shell +npx testplane tests/checkout.testplane.ts --grep "submits order" --keep-browser +npx @testplane/cli attach --session '{"sessionId":"...","capabilities":{}}' +npx @testplane/cli snapshot +``` + +## Если сомневаетесь + +У каждой команды есть подробная справка и примеры использования — вы всегда можете попросить CLI показать больше информации по любой команде: + +```shell +npx @testplane/cli --help +npx @testplane/cli click --help +npx @testplane/cli test-results --help +``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-mcp.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-mcp.mdx new file mode 100644 index 00000000..1914a317 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-mcp.mdx @@ -0,0 +1,179 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import SnapshotExample from "/docs/_partials/mcp-snapshot-example.mdx"; +import investigateVideoUrl from "/video/blog/mcp/investigate.mp4"; +import generateVideoUrl from "/video/blog/mcp/generate.mp4"; + +# Testplane MCP + +**Testplane MCP** — проект, который позволяет AI-агентам в реальном времени взаимодействовать с браузерами, анализировать состояние страниц и генерировать тесты на основе реальной структуры DOM. + +## Возможности + +### Улучшенная генерация тестов + +AI-агенты могут открывать страницы в браузерах, анализировать их структуру и выполнять действия (клики, заполнение форм) во время написания тестов. Это позволяет генерировать тесты с корректными селекторами, которые действительно существуют на странице. + +### Автоматизация браузерных процессов + +Testplane MCP помогает автоматизировать повторяющиеся задачи, например извлекать данные с изображений платежных квитанций, а затем заполнять формы на веб-страницах. + +## Установка + +Добавьте сервер Testplane MCP в конфигурацию вашей IDE. + +### Настройка окружения + + + + Откройте настройки Cursor, в секции `MCP` нажмите `Add new global MCP server` и добавьте конфигурацию: + + ```json + { + "mcpServers": { + "testplane-mcp": { + "command": "npx", + "args": ["@testplane/mcp@latest"] + } + } + } + ``` + + + + 1. Установите [расширение Cline](https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev) + 2. Перейдите на вкладку "MCP" и нажмите "Configure MCP Servers" + 3. Добавьте конфигурацию: + ```json + { + "mcpServers": { + "testplane-mcp": { + "command": "npx", + "args": ["@testplane/mcp@latest"] + } + } + } + ``` + + + + В настройках VS Code найдите `MCP`, нажмите `Edit in settings.json` и добавьте: + + ```json + { + "mcp": { + "inputs": [], + "servers": { + "testplane-mcp": { + "command": "npx", + "args": ["@testplane/mcp@latest"] + } + } + } + } + ``` + + + + Откройте настройки по [официальной документации](https://modelcontextprotocol.io/quickstart/user) и добавьте: + + ```json + { + "mcpServers": { + "testplane-mcp": { + "command": "npx", + "args": ["@testplane/mcp@latest"] + } + } + } + ``` + + + + Следуйте [официальной документации](https://docs.windsurf.com/windsurf/cascade/mcp) и добавьте конфигурацию: + + ```json + { + "mcpServers": { + "testplane-mcp": { + "command": "npx", + "args": ["@testplane/mcp@latest"] + } + } + } + ``` + + + + Согласно [официальной документации](https://www.jetbrains.com/help/ai-assistant/configure-an-mcp-server.html), добавьте: + + ```json + { + "mcpServers": { + "testplane-mcp": { + "command": "npx", + "args": ["@testplane/mcp@latest"] + } + } + } + ``` + + + + +## Использование + +Рассмотрим сценарий разработки онлайн-книжного магазина. Представим, что у нас появилась новая функция — отображение рейтингов книг, и мы хотим сгенерировать для нее тесты. + +Сначала попросим AI-агента проанализировать страницу и составить план тестирования. + + + +
+ +Теперь попробуем сгенерировать тесты и запустить их. + + + +
+ +Как видно, AI-агент с первой попытки сгенерировал тесты, которые проходят и содержат корректные селекторы. + +Вы можете использовать такой промпт для генерации тестов через Testplane MCP: + +> Используй testplane mcp, чтобы открыть страницу `https://ya.ru`, выполнить поиск по запросу "cats" и проверить, что результаты поиска отображаются. +> +> Не пиши лишние комментарии в тестах, кроме сложных edge-case сценариев. Пиши тесты в соответствии со style guide проекта. +> +> Старайся использовать семантические селекторы, например через атрибуты `data-testid` или текст элемента, вместо сложных CSS-селекторов. + +## Детали реализации + +### Компактные снимки + +Testplane MCP создает компактные снимки страницы вместо скриншотов, что значительно экономит токены LLM API. + +**Пример:** полный исходный код `https://ya.ru` содержит примерно 260 000 символов, а компактный снимок — около 9 000. + +
+ Пример снимка + + + +
+ +### Интеграция с экосистемой + +Каждый ответ сервера содержит выполненный код, что позволяет AI-агенту вставлять его в генерируемые тесты и обеспечивает бесшовную интеграцию с экосистемой Testplane. + +## Ссылки + +- [Release Notes](https://github.com/gemini-testing/testplane-mcp/releases) +- [GitHub Issues](https://github.com/gemini-testing/testplane-mcp/issues) +- [Telegram chat](https://t.me/testplane) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-skill.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-skill.mdx new file mode 100644 index 00000000..02e1db3b --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-skill.mdx @@ -0,0 +1,40 @@ +# Testplane Skill + +Testplane Skill дает AI-агентам краткую справочную документацию вместе со скриптами для автоматизации браузера и интеграциями с инструментами Testplane. + +## Быстрый старт + +Мы рекомендуем использовать удобный визард от [skills.sh](https://www.skills.sh/gemini-testing/testplane-skill/testplane-skill), чтобы установить Testplane Skill в вашу систему: + +```shell +npx skills add gemini-testing/testplane-skill +``` + +Это работает с Claude Code, Cursor, GitHub Copilot и любым другим agent harness с поддержкой skills. + +## Возможности + +Testplane Skill основан на нашем [CLI-пакете](./testplane-cli.mdx), поэтому предоставляет все возможности взаимодействия с браузером, которые есть у CLI. +Кроме этого, он обучает агентов эффективно решать различные задачи: + +- Какие команды есть у Testplane и как он устроен в целом +- Как запускать CLI и взаимодействовать с браузером +- Где искать конфигурационные файлы и как запускать тесты +- Каким best practices следовать при генерации тестов +- Как отлаживать тесты локально разными инструментами, включая REPL +- Как расследовать тесты, упавшие в CI, и исправлять их + +## Как это работает + +Testplane Skill — это набор инструкций для AI-агентов + скрипты для автоматизации браузера. Он следует классическому паттерну "progressive discovery", чтобы оптимизировать расход токенов. + +В целом типичный workflow выглядит так: + +1. Пользователь просит агента выполнить задачу, связанную с тестами Testplane +2. На старте агент видит описания всех skills, и запрос пользователя триггерит использование Testplane Skill +3. Агент читает инструкции, упакованные в Testplane Skill +4. При необходимости обращается к `@testplane/cli`, чтобы взаимодействовать с браузером и обогатить контекст состоянием веб-приложения + +## Что дальше + +- [Изучите](./testplane-cli.mdx) возможности Testplane CLI diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx index a4eb70ce..0709f44a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx @@ -119,4 +119,4 @@ declare global { #### Системные ограничения -Для работы с ESM вам понадобится `Node.js` версии v22.0.0, v20.17.0 и выше. Взаимодействие с `ECMAScript` происходит с помощью [функции](https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require) `require()`. +Для работы с ESM вам понадобится `Node.js` версии v22.0.0, v20.17.0 и выше. Взаимодействие ESM и CommonJS кода возможно благодаря возможности `Node.js`, описанной в [статье](https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx index 5e5c789e..641bfe48 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx @@ -211,7 +211,7 @@ npx testplane --keep-browser --grep "Название теста" npx testplane --keep-browser-on-fail # только при падении ``` -Полезно для проверки DOM, cookies или localStorage после выполнения теста, а также в связке с [MCP](../testplane-mcp.mdx), чтобы AI-агент подключился к уже подготовленному браузеру. +Полезно для проверки DOM, cookies или localStorage после выполнения теста, а также в связке с [MCP](../ai/toolkit/testplane-mcp.mdx), чтобы AI-агент подключился к уже подготовленному браузеру. ## Полезные команды diff --git a/package-lock.json b/package-lock.json index fe2f27fb..6a5eaddc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "@storybook/test": "8.0.5", "@svgr/webpack": "8.1.0", "@tailwindcss/postcss": "4.1.13", + "@types/react-dom": "18.2.0", "autoprefixer": "10.4.19", "docusaurus-plugin-sass": "0.2.5", "eslint": "8.57.0", @@ -180,7 +181,6 @@ "version": "4.23.3", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", - "peer": true, "dependencies": { "@algolia/client-common": "4.23.3", "@algolia/requester-common": "4.23.3", @@ -307,7 +307,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -468,6 +467,7 @@ "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" } @@ -746,6 +746,7 @@ "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, + "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", @@ -765,6 +766,7 @@ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -781,6 +783,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz", "integrity": "sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-default-from": "^7.24.1" @@ -798,6 +801,7 @@ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -815,6 +819,7 @@ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -832,6 +837,7 @@ "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "dev": true, + "peer": true, "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", @@ -852,6 +858,7 @@ "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -869,6 +876,7 @@ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -897,6 +905,7 @@ "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" }, @@ -920,6 +929,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz", "integrity": "sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -995,6 +1005,7 @@ "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" }, @@ -1007,6 +1018,7 @@ "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" }, @@ -1019,6 +1031,7 @@ "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" }, @@ -1031,6 +1044,7 @@ "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" }, @@ -1043,6 +1057,7 @@ "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" }, @@ -1784,6 +1799,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -1799,6 +1815,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -2062,7 +2079,6 @@ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", @@ -2502,7 +2518,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", - "peer": true, "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -3685,6 +3700,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, + "peer": true, "engines": { "node": ">=12" } @@ -3694,6 +3710,7 @@ "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.3" }, @@ -3706,6 +3723,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -3721,6 +3739,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -4005,6 +4024,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.6.tgz", "integrity": "sha512-647OSi6xBb8FbwFqX9zsJxOzu685AWtrOUWHfOkbKD+5LOpGORw+GQo0F9rWZnB68rLQyfKUZWJeaD00pGv5fw==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-clean": "12.3.6", "@react-native-community/cli-config": "12.3.6", @@ -4037,6 +4057,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.6.tgz", "integrity": "sha512-gUU29ep8xM0BbnZjwz9MyID74KKwutq9x5iv4BCr2im6nly4UMf1B1D+V225wR7VcDGzbgWjaezsJShLLhC5ig==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-tools": "12.3.6", "chalk": "^4.1.2", @@ -4048,6 +4069,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.6.tgz", "integrity": "sha512-JGWSYQ9EAK6m2v0abXwFLEfsqJ1zkhzZ4CV261QZF9MoUNB6h57a274h1MLQR9mG6Tsh38wBUuNfEPUvS1vYew==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-tools": "12.3.6", "chalk": "^4.1.2", @@ -4062,6 +4084,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -4071,6 +4094,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, + "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -4086,6 +4110,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4106,6 +4131,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, + "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -4119,6 +4145,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4132,6 +4159,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -4145,6 +4173,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -4154,6 +4183,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.6.tgz", "integrity": "sha512-SjUKKsx5FmcK9G6Pb6UBFT0s9JexVStK5WInmANw75Hm7YokVvHEgtprQDz2Uvy5znX5g2ujzrkIU//T15KQzA==", "dev": true, + "peer": true, "dependencies": { "serve-static": "^1.13.1" } @@ -4163,6 +4193,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.6.tgz", "integrity": "sha512-fvBDv2lTthfw4WOQKkdTop2PlE9GtfrlNnpjB818MhcdEnPjfQw5YaTUcnNEGsvGomdCs1MVRMgYXXwPSN6OvQ==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-config": "12.3.6", "@react-native-community/cli-platform-android": "12.3.6", @@ -4187,6 +4218,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -4196,6 +4228,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -4208,6 +4241,7 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true, + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -4220,6 +4254,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.6.tgz", "integrity": "sha512-sNGwfOCl8OAIjWCkwuLpP8NZbuO0dhDI/2W7NeOGDzIBsf4/c4MptTrULWtGIH9okVPLSPX0NnRyGQ+mSwWyuQ==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-platform-android": "12.3.6", "@react-native-community/cli-tools": "12.3.6", @@ -4232,6 +4267,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.6.tgz", "integrity": "sha512-DeDDAB8lHpuGIAPXeeD9Qu2+/wDTFPo99c8uSW49L0hkmZJixzvvvffbGQAYk32H0TmaI7rzvzH+qzu7z3891g==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-tools": "12.3.6", "chalk": "^4.1.2", @@ -4246,6 +4282,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4266,6 +4303,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.6.tgz", "integrity": "sha512-3eZ0jMCkKUO58wzPWlvAPRqezVKm9EPZyaPyHbRPWU8qw7JqkvnRlWIaYDGpjCJgVW4k2hKsEursLtYKb188tg==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-tools": "12.3.6", "chalk": "^4.1.2", @@ -4280,6 +4318,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4299,13 +4338,15 @@ "version": "12.3.6", "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.6.tgz", "integrity": "sha512-3jxSBQt4fkS+KtHCPSyB5auIT+KKIrPCv9Dk14FbvOaEh9erUWEm/5PZWmtboW1z7CYeNbFMeXm9fM2xwtVOpg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@react-native-community/cli-server-api": { "version": "12.3.6", "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.6.tgz", "integrity": "sha512-80NIMzo8b2W+PL0Jd7NjiJW9mgaT8Y8wsIT/lh6mAvYH7mK0ecDJUYUTAAv79Tbo1iCGPAr3T295DlVtS8s4yQ==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-debugger-ui": "12.3.6", "@react-native-community/cli-tools": "12.3.6", @@ -4323,6 +4364,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, + "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -4339,6 +4381,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", "dev": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -4348,6 +4391,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", @@ -4363,6 +4407,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -4384,6 +4429,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.6.tgz", "integrity": "sha512-FPEvZn19UTMMXUp/piwKZSh8cMEfO8G3KDtOwo53O347GTcwNrKjgZGtLSPELBX2gr+YlzEft3CoRv2Qmo83fQ==", "dev": true, + "peer": true, "dependencies": { "appdirsjs": "^1.2.4", "chalk": "^4.1.2", @@ -4402,6 +4448,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -4411,6 +4458,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "dev": true, + "peer": true, "dependencies": { "is-wsl": "^1.1.0" }, @@ -4423,6 +4471,7 @@ "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.6.tgz", "integrity": "sha512-xPqTgcUtZowQ8WKOkI9TLGBwH2bGggOC4d2FFaIRST3gTcjrEeGRNeR5aXCzJFIgItIft8sd7p2oKEdy90+01Q==", "dev": true, + "peer": true, "dependencies": { "joi": "^17.2.1" } @@ -4432,6 +4481,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -4441,6 +4491,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4454,6 +4505,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -4468,6 +4520,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -4477,6 +4530,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -4489,6 +4543,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -4504,6 +4559,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -4516,6 +4572,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "peer": true, "engines": { "node": ">= 4.0.0" } @@ -4525,6 +4582,7 @@ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.73.1.tgz", "integrity": "sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -4534,6 +4592,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", "dev": true, + "peer": true, "dependencies": { "@react-native/codegen": "0.73.3" }, @@ -4546,6 +4605,7 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.20.0", "@babel/plugin-proposal-async-generator-functions": "^7.0.0", @@ -4602,6 +4662,7 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", "dev": true, + "peer": true, "dependencies": { "@babel/parser": "^7.20.0", "flow-parser": "^0.206.0", @@ -4623,6 +4684,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4643,6 +4705,7 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.17.tgz", "integrity": "sha512-F3PXZkcHg+1ARIr6FRQCQiB7ZAA+MQXGmq051metRscoLvgYJwj7dgC8pvgy0kexzUkHu5BNKrZeySzUft3xuQ==", "dev": true, + "peer": true, "dependencies": { "@react-native-community/cli-server-api": "12.3.6", "@react-native-community/cli-tools": "12.3.6", @@ -4665,6 +4728,7 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz", "integrity": "sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -4674,6 +4738,7 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.8.tgz", "integrity": "sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg==", "dev": true, + "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.73.3", @@ -4696,6 +4761,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -4704,13 +4770,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@react-native/dev-middleware/node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -4727,6 +4795,7 @@ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.73.4.tgz", "integrity": "sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -4736,6 +4805,7 @@ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.73.1.tgz", "integrity": "sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -4745,6 +4815,7 @@ "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz", "integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.20.0", "@react-native/babel-preset": "0.73.21", @@ -4762,13 +4833,15 @@ "version": "0.73.2", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.73.2.tgz", "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@react-native/virtualized-lists": { "version": "0.73.4", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.73.4.tgz", "integrity": "sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==", "dev": true, + "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -4918,6 +4991,7 @@ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.2.tgz", "integrity": "sha512-3Z5FW8mxzomBbrw2iF0lNOAlNBr2OK6HR0NM416PzcTs0UcSoPj/nD4eqmrV5Kut6kvCc/TJua5LyeoPE7vSmw==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.17.8", "@types/react-reconciler": "^0.26.7", @@ -4967,6 +5041,7 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -4976,6 +5051,7 @@ "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", "dev": true, + "peer": true, "engines": { "node": ">=12.7.0" }, @@ -5027,6 +5103,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "peer": true, "dependencies": { "type-detect": "4.0.8" } @@ -5036,6 +5113,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -6384,7 +6462,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -6535,7 +6612,6 @@ "integrity": "sha512-Xaf+UBvW6JNuV131uvSNyMXHn+bh6LyKN4tbv7tOUFQpXyz/t9YWRE04emtlUW9Y0qrm/GKFCbY8n3z6BpZbTA==", "dev": true, "hasInstallScript": true, - "peer": true, "dependencies": { "@swc/counter": "^0.1.2", "@swc/types": "^0.1.5" @@ -7124,7 +7200,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", "dev": true, - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -7567,17 +7642,27 @@ "version": "18.2.79", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-reconciler": { "version": "0.26.7", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", "dev": true, + "peer": true, "dependencies": { "@types/react": "*" } @@ -7675,7 +7760,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/unist": { "version": "3.0.2", @@ -7692,7 +7778,8 @@ "version": "0.5.15", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.15.tgz", "integrity": "sha512-nC9116Gd4N+CqTxqo6gvCfhAMAzgRcfS8ZsciNodHq8uwW4JCVKwhagw8yN0XmC7mHrLnWqniJpoVEiR+72Drw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/ws": { "version": "8.5.10", @@ -7879,7 +7966,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz", "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.4.0", "@typescript-eslint/types": "7.4.0", @@ -8628,6 +8714,7 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, + "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -8651,7 +8738,6 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8700,7 +8786,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -8760,7 +8845,6 @@ "version": "4.23.3", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", - "peer": true, "dependencies": { "@algolia/cache-browser-local-storage": "4.23.3", "@algolia/cache-common": "4.23.3", @@ -8794,7 +8878,8 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true + "dev": true, + "peer": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -8846,6 +8931,7 @@ "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", "dev": true, + "peer": true, "dependencies": { "colorette": "^1.0.7", "slice-ansi": "^2.0.0", @@ -8857,6 +8943,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -8866,6 +8953,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -8928,7 +9016,8 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/arg": { "version": "5.0.2", @@ -9105,7 +9194,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/assert": { "version": "2.1.0", @@ -9146,6 +9236,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -9168,7 +9259,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/at-least-node": { "version": "1.0.0", @@ -9421,6 +9513,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "dev": true, + "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } @@ -9688,7 +9781,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -9708,6 +9800,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -9731,6 +9824,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -9838,6 +9932,7 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, + "peer": true, "dependencies": { "callsites": "^2.0.0" }, @@ -9850,6 +9945,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -9859,6 +9955,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, + "peer": true, "dependencies": { "caller-callsite": "^2.0.0" }, @@ -10128,6 +10225,7 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -10154,6 +10252,7 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", "integrity": "sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -10168,6 +10267,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -10322,6 +10422,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -10335,13 +10436,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -10351,6 +10454,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10365,6 +10469,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10377,6 +10482,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10464,7 +10570,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/combine-promises": { "version": "1.2.0", @@ -10487,7 +10594,8 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/commander": { "version": "5.1.0", @@ -10649,6 +10757,7 @@ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, + "peer": true, "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -10672,6 +10781,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -10681,6 +10791,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, + "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -10698,13 +10809,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -10717,6 +10830,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -11262,7 +11376,8 @@ "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/debounce": { "version": "1.2.1", @@ -11291,6 +11406,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -11522,7 +11638,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/depd": { "version": "2.0.0", @@ -11537,6 +11654,7 @@ "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-5.0.0.tgz", "integrity": "sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==", "dev": true, + "peer": true, "dependencies": { "@react-native/normalize-colors": "^0.73.0", "invariant": "^2.2.4", @@ -12064,7 +12182,6 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "peer": true, "dependencies": { "@babel/core": "^7.19.6", "@svgr/babel-preset": "^6.5.1", @@ -13161,6 +13278,7 @@ "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" } @@ -13234,6 +13352,7 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -13243,6 +13362,7 @@ "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", "dev": true, + "peer": true, "dependencies": { "accepts": "~1.3.7", "escape-html": "~1.0.3" @@ -13437,7 +13557,6 @@ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -13560,7 +13679,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "devOptional": true, - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -14004,6 +14122,7 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -14179,6 +14298,7 @@ "url": "https://paypal.me/naturalintelligence" } ], + "peer": true, "dependencies": { "strnum": "^1.0.5" }, @@ -14222,6 +14342,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "peer": true, "dependencies": { "bser": "2.1.1" } @@ -14535,7 +14656,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/flow-parser": { "version": "0.206.0", @@ -14826,6 +14948,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -15560,13 +15683,15 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.15.0.tgz", "integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/hermes-parser": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.15.0.tgz", "integrity": "sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==", "dev": true, + "peer": true, "dependencies": { "hermes-estree": "0.15.0" } @@ -15576,6 +15701,7 @@ "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", "dev": true, + "peer": true, "dependencies": { "source-map": "^0.7.3" }, @@ -16322,6 +16448,7 @@ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -16373,6 +16500,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -16799,6 +16927,7 @@ "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", "dev": true, + "peer": true, "dependencies": { "@types/react-reconciler": "^0.28.0" }, @@ -16811,6 +16940,7 @@ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", "dev": true, + "peer": true, "dependencies": { "@types/react": "*" } @@ -16856,6 +16986,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -16873,6 +17004,7 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -16882,6 +17014,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -16902,6 +17035,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -16914,6 +17048,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -16927,13 +17062,15 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -16964,6 +17101,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -16981,6 +17119,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -16993,6 +17132,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -17006,7 +17146,8 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jest-worker": { "version": "29.7.0", @@ -17076,19 +17217,22 @@ "version": "250231.0.0", "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jsc-safe-url": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jscodeshift": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.13.16", "@babel/parser": "^7.13.16", @@ -17122,6 +17266,7 @@ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", "dev": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -17134,6 +17279,7 @@ "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", "dev": true, + "peer": true, "dependencies": { "ast-types": "0.15.2", "esprima": "~4.0.0", @@ -17149,6 +17295,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -17174,7 +17321,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -17346,6 +17494,7 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "dev": true, + "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -17356,6 +17505,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -17364,7 +17514,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/lightningcss": { "version": "1.30.1", @@ -17684,7 +17835,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -17712,6 +17864,7 @@ "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", "dev": true, + "peer": true, "dependencies": { "ansi-fragments": "^0.2.1", "dayjs": "^1.8.15", @@ -17726,6 +17879,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -17735,6 +17889,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, + "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -17745,13 +17900,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/logkitty/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -17765,6 +17922,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -17774,6 +17932,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -17786,6 +17945,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -17801,6 +17961,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -17813,6 +17974,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17827,6 +17989,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -17839,6 +18002,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -17852,13 +18016,15 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/logkitty/node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, + "peer": true, "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -17881,6 +18047,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, + "peer": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -17993,6 +18160,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -18039,7 +18207,8 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -18457,7 +18626,8 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/memoizerific": { "version": "1.11.3", @@ -18503,6 +18673,7 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.8.tgz", "integrity": "sha512-in7S0W11mg+RNmcXw+2d9S3zBGmCARDxIwoXJAmLUQOQoYsRP3cpGzyJtc7WOw8+FXfpgXvceD0u+PZIHXEL7g==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/core": "^7.20.0", @@ -18560,6 +18731,7 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.8.tgz", "integrity": "sha512-TTzNwRZb2xxyv4J/+yqgtDAP2qVqH3sahsnFu6Xv4SkLqzrivtlnyUbaeTdJ9JjtADJUEjCbgbFgUVafrXdR9Q==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.20.0", "hermes-parser": "0.20.1", @@ -18573,13 +18745,15 @@ "version": "0.20.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz", "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz", "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==", "dev": true, + "peer": true, "dependencies": { "hermes-estree": "0.20.1" } @@ -18589,6 +18763,7 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.8.tgz", "integrity": "sha512-5svz+89wSyLo7BxdiPDlwDTgcB9kwhNMfNhiBZPNQQs1vLFXxOkILwQiV5F2EwYT9DEr6OPZ0hnJkZfRQ8lDYQ==", "dev": true, + "peer": true, "dependencies": { "metro-core": "0.80.8", "rimraf": "^3.0.2" @@ -18602,6 +18777,7 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.8.tgz", "integrity": "sha512-qWKzxrLsRQK5m3oH8ePecqCc+7PEhR03cJE6Z6AxAj0idi99dHOSitTmY0dclXVB9vP2tQIAE8uTd8xkYGk8fA==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -18611,6 +18787,7 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.8.tgz", "integrity": "sha512-VGQJpfJawtwRzGzGXVUoohpIkB0iPom4DmSbAppKfumdhtLA8uVeEPp2GM61kL9hRvdbMhdWA7T+hZFDlo4mJA==", "dev": true, + "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", @@ -18629,6 +18806,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -18638,6 +18816,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, + "peer": true, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -18653,6 +18832,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, + "peer": true, "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -18666,6 +18846,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -18679,6 +18860,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "peer": true, "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -18692,6 +18874,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -18701,6 +18884,7 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.8.tgz", "integrity": "sha512-g6lud55TXeISRTleW6SHuPFZHtYrpwNqbyFIVd9j9Ofrb5IReiHp9Zl8xkAfZQp8v6ZVgyXD7c130QTsCz+vBw==", "dev": true, + "peer": true, "dependencies": { "lodash.throttle": "^4.1.1", "metro-resolver": "0.80.8" @@ -18714,6 +18898,7 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.8.tgz", "integrity": "sha512-eQXMFM9ogTfDs2POq7DT2dnG7rayZcoEgRbHPXvhUWkVwiKkro2ngcBE++ck/7A36Cj5Ljo79SOkYwHaWUDYDw==", "dev": true, + "peer": true, "dependencies": { "anymatch": "^3.0.3", "debug": "^2.2.0", @@ -18738,6 +18923,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -18746,13 +18932,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/metro-minify-terser": { "version": "0.80.8", "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.8.tgz", "integrity": "sha512-y8sUFjVvdeUIINDuW1sejnIjkZfEF+7SmQo0EIpYbWmwh+kq/WMj74yVaBWuqNjirmUp1YNfi3alT67wlbBWBQ==", "dev": true, + "peer": true, "dependencies": { "terser": "^5.15.0" }, @@ -18765,6 +18953,7 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.8.tgz", "integrity": "sha512-JdtoJkP27GGoZ2HJlEsxs+zO7jnDUCRrmwXJozTlIuzLHMRrxgIRRby9fTCbMhaxq+iA9c+wzm3iFb4NhPmLbQ==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -18774,6 +18963,7 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.8.tgz", "integrity": "sha512-2oScjfv6Yb79PelU1+p8SVrCMW9ZjgEiipxq7jMRn8mbbtWzyv3g8Mkwr+KwOoDFI/61hYPUbY8cUnu278+x1g==", "dev": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.0.0" }, @@ -18786,6 +18976,7 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.8.tgz", "integrity": "sha512-+OVISBkPNxjD4eEKhblRpBf463nTMk3KMEeYS8Z4xM/z3qujGJGSsWUGRtH27+c6zElaSGtZFiDMshEb8mMKQg==", "dev": true, + "peer": true, "dependencies": { "@babel/traverse": "^7.20.0", "@babel/types": "^7.20.0", @@ -18805,6 +18996,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -18814,6 +19006,7 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.8.tgz", "integrity": "sha512-nwhYySk79jQhwjL9QmOUo4wS+/0Au9joEryDWw7uj4kz2yvw1uBjwmlql3BprQCBzRdB3fcqOP8kO8Es+vE31g==", "dev": true, + "peer": true, "dependencies": { "invariant": "^2.2.4", "metro-source-map": "0.80.8", @@ -18834,6 +19027,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -18843,6 +19037,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.8.tgz", "integrity": "sha512-sSu8VPL9Od7w98MftCOkQ1UDeySWbsIAS5I54rW22BVpPnI3fQ42srvqMLaJUQPjLehUanq8St6OMBCBgH/UWw==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.0", @@ -18859,6 +19054,7 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.8.tgz", "integrity": "sha512-+4FG3TQk3BTbNqGkFb2uCaxYTfsbuFOCKMMURbwu0ehCP8ZJuTUramkaNZoATS49NSAkRgUltgmBa4YaKZ5mqw==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.0", @@ -18881,13 +19077,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/metro/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -18896,13 +19094,15 @@ "version": "0.20.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz", "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/metro/node_modules/hermes-parser": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz", "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==", "dev": true, + "peer": true, "dependencies": { "hermes-estree": "0.20.1" } @@ -18911,13 +19111,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/metro/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -18927,6 +19129,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -18939,6 +19142,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -20654,6 +20858,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "peer": true, "bin": { "mime": "cli.js" }, @@ -20798,6 +21003,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -20888,6 +21094,7 @@ "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", "dev": true, + "peer": true, "engines": { "node": ">=12.0.0" } @@ -20962,7 +21169,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/node-releases": { "version": "2.0.27", @@ -20975,6 +21183,7 @@ "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", "dev": true, + "peer": true, "engines": { "node": ">=0.12.0" }, @@ -21062,7 +21271,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/nypm": { "version": "0.3.8", @@ -21222,6 +21432,7 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.8.tgz", "integrity": "sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA==", "dev": true, + "peer": true, "engines": { "node": ">=18" } @@ -21945,7 +22156,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -22535,7 +22745,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -22724,6 +22933,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -22952,7 +23162,6 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -23162,6 +23371,7 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz", "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", "dev": true, + "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -23172,6 +23382,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -23228,7 +23439,6 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -23320,6 +23530,7 @@ "url": "https://github.com/sponsors/lavrton" } ], + "peer": true, "dependencies": { "@types/react-reconciler": "^0.28.2", "its-fine": "^1.1.1", @@ -23337,6 +23548,7 @@ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", "dev": true, + "peer": true, "dependencies": { "@types/react": "*" } @@ -23346,6 +23558,7 @@ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz", "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==", "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -23362,7 +23575,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -23446,6 +23658,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, + "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -23462,6 +23675,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", "dev": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -23471,6 +23685,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", @@ -23485,13 +23700,15 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-native/node_modules/scheduler": { "version": "0.24.0-canary-efb381bbf-20230505", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -23501,6 +23718,7 @@ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.21.0" @@ -23517,6 +23735,7 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", "dev": true, + "peer": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -23526,6 +23745,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -23534,7 +23754,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -23602,6 +23821,7 @@ "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", "dev": true, + "peer": true, "dependencies": { "object-assign": "^4.1.1", "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" @@ -23633,6 +23853,7 @@ "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", "dev": true, + "peer": true, "dependencies": { "debounce": "^1.2.1" }, @@ -23788,7 +24009,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/recast": { "version": "0.23.6", @@ -24271,6 +24493,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -24295,7 +24518,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/requireindex": { "version": "1.2.0", @@ -24315,7 +24539,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/resolve": { "version": "1.22.11", @@ -24542,7 +24767,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", "dev": true, - "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -24646,7 +24870,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -24818,6 +25041,7 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -24992,7 +25216,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/set-function-length": { "version": "1.2.2", @@ -25250,6 +25475,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", @@ -25264,6 +25490,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -25276,6 +25503,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -25284,7 +25512,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/snake-case": { "version": "3.0.4", @@ -25451,6 +25680,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -25463,6 +25693,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -25471,13 +25702,15 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -25490,6 +25723,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -25809,7 +26043,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/style-loader": { "version": "3.3.4", @@ -25854,7 +26089,8 @@ "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -25883,6 +26119,7 @@ "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", "dev": true, + "peer": true, "peerDependencies": { "react": ">=17.0" } @@ -26240,7 +26477,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/through2": { "version": "2.0.5", @@ -26316,7 +26554,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -26579,7 +26818,6 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -27298,13 +27536,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -27359,7 +27599,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -27678,7 +27917,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -27771,7 +28009,8 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -27861,7 +28100,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/which-typed-array": { "version": "1.1.15", @@ -28014,6 +28254,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, + "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -28054,6 +28295,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -28076,6 +28318,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "peer": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -28094,6 +28337,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "peer": true, "engines": { "node": ">=12" } @@ -28102,13 +28346,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -28118,6 +28364,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -28132,6 +28379,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, diff --git a/package.json b/package.json index b18c1145..a4157c01 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@storybook/test": "8.0.5", "@svgr/webpack": "8.1.0", "@tailwindcss/postcss": "4.1.13", + "@types/react-dom": "18.2.0", "autoprefixer": "10.4.19", "docusaurus-plugin-sass": "0.2.5", "eslint": "8.57.0", diff --git a/sidebars.ts b/sidebars.ts index a4dab990..4437984d 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -46,11 +46,6 @@ const sidebars: SidebarsConfig = { label: "Advanced Guides", items: [{ type: "autogenerated", dirName: "guides" }], }, - { - type: "doc", - id: "testplane-mcp", - label: "Testplane MCP", - }, { type: "category", label: "Migrations", @@ -85,6 +80,7 @@ const sidebars: SidebarsConfig = { { type: "link", href: "/docs/v8/commands/overview", label: "Testplane Commands" }, { type: "autogenerated", dirName: "reference" }, ], + ai: [{ type: "autogenerated", dirName: "ai" }], }; export default sidebars; diff --git a/src/components/HelpMark/index.tsx b/src/components/HelpMark/index.tsx new file mode 100644 index 00000000..b574a2b8 --- /dev/null +++ b/src/components/HelpMark/index.tsx @@ -0,0 +1,203 @@ +import { CircleQuestion } from "@gravity-ui/icons"; +import React from "react"; +import { createPortal } from "react-dom"; + +interface HelpMarkProps { + children: React.ReactNode; + className?: string; + side?: "top" | "bottom" | "left" | "right"; + maxWidth?: number; +} + +const GAP = 8; +const SCREEN_PADDING = 8; + +const useIsomorphicLayoutEffect = + typeof window === "undefined" ? React.useEffect : React.useLayoutEffect; + +export function HelpMark({ + children, + className, + side = "top", + maxWidth = 280, +}: HelpMarkProps): React.ReactElement { + const id = React.useId(); + + const triggerRef = React.useRef(null); + const tooltipRef = React.useRef(null); + const closeTimerRef = React.useRef(null); + + const [isOpen, setIsOpen] = React.useState(false); + const [position, setPosition] = React.useState<{ + top: number; + left: number; + ready: boolean; + }>({ + top: 0, + left: 0, + ready: false, + }); + + const clearCloseTimer = React.useCallback(() => { + if (closeTimerRef.current !== null) { + window.clearTimeout(closeTimerRef.current); + closeTimerRef.current = null; + } + }, []); + + const open = React.useCallback(() => { + clearCloseTimer(); + setIsOpen(true); + }, [clearCloseTimer]); + + const close = React.useCallback(() => { + clearCloseTimer(); + + closeTimerRef.current = window.setTimeout(() => { + setIsOpen(false); + setPosition(prev => ({ ...prev, ready: false })); + }, 80); + }, [clearCloseTimer]); + + const updatePosition = React.useCallback(() => { + const trigger = triggerRef.current; + const tooltip = tooltipRef.current; + + if (!trigger || !tooltip) { + return; + } + + const triggerRect = trigger.getBoundingClientRect(); + const tooltipRect = tooltip.getBoundingClientRect(); + + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; + + const fitsTop = triggerRect.top >= tooltipRect.height + GAP + SCREEN_PADDING; + const fitsBottom = + viewportHeight - triggerRect.bottom >= tooltipRect.height + GAP + SCREEN_PADDING; + const fitsLeft = triggerRect.left >= tooltipRect.width + GAP + SCREEN_PADDING; + const fitsRight = + viewportWidth - triggerRect.right >= tooltipRect.width + GAP + SCREEN_PADDING; + + let resolvedSide = side; + + if (side === "top" && !fitsTop && fitsBottom) resolvedSide = "bottom"; + if (side === "bottom" && !fitsBottom && fitsTop) resolvedSide = "top"; + if (side === "left" && !fitsLeft && fitsRight) resolvedSide = "right"; + if (side === "right" && !fitsRight && fitsLeft) resolvedSide = "left"; + + let top = 0; + let left = 0; + + switch (resolvedSide) { + case "top": + top = triggerRect.top - tooltipRect.height - GAP; + left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2; + break; + + case "bottom": + top = triggerRect.bottom + GAP; + left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2; + break; + + case "left": + top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2; + left = triggerRect.left - tooltipRect.width - GAP; + break; + + case "right": + top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2; + left = triggerRect.right + GAP; + break; + } + + top = clamp(top, SCREEN_PADDING, viewportHeight - tooltipRect.height - SCREEN_PADDING); + left = clamp(left, SCREEN_PADDING, viewportWidth - tooltipRect.width - SCREEN_PADDING); + + setPosition({ + top, + left, + ready: true, + }); + }, [side]); + + useIsomorphicLayoutEffect(() => { + if (!isOpen) { + return; + } + + updatePosition(); + + let frameId: number | null = null; + + const scheduleUpdate = () => { + if (frameId !== null) { + return; + } + + frameId = window.requestAnimationFrame(() => { + frameId = null; + updatePosition(); + }); + }; + + window.addEventListener("scroll", scheduleUpdate, true); + window.addEventListener("resize", scheduleUpdate); + + return () => { + if (frameId !== null) { + window.cancelAnimationFrame(frameId); + } + + window.removeEventListener("scroll", scheduleUpdate, true); + window.removeEventListener("resize", scheduleUpdate); + }; + }, [isOpen, updatePosition]); + + React.useEffect(() => { + return clearCloseTimer; + }, [clearCloseTimer]); + + return ( + <> + + + {isOpen && + typeof document !== "undefined" && + createPortal( + , + document.body, + )} + + ); +} + +function clamp(value: number, min: number, max: number): number { + return Math.min(Math.max(value, min), max); +} diff --git a/src/theme/MDXComponents/Details.tsx b/src/theme/MDXComponents/Details.tsx index ac2b7411..a37e1c90 100644 --- a/src/theme/MDXComponents/Details.tsx +++ b/src/theme/MDXComponents/Details.tsx @@ -24,7 +24,7 @@ export default function MDXDetails({ children, className, ...rest }: Props): JSX
diff --git a/static/img/blog/cli-and-skill/cover.png b/static/img/blog/cli-and-skill/cover.png new file mode 100644 index 00000000..ae2b7879 Binary files /dev/null and b/static/img/blog/cli-and-skill/cover.png differ