diff --git a/docs/basic-guides/selectors.mdx b/docs/basic-guides/selectors.mdx new file mode 100644 index 0000000..8ecb839 --- /dev/null +++ b/docs/basic-guides/selectors.mdx @@ -0,0 +1,602 @@ +# Селекторы + +Testplane предоставляет множество способов для поиска элементов на странице браузера с помощью селекторов. Для этого используются библиотеки `WebDriverIO` и `testing-library`. Селекторы позволяют точно идентифицировать элементы интерфейса, что необходимо для автоматизации тестирования. + +## WebDriverIO + +WebDriverIO — это Node.js-библиотека для автоматизации браузеров, которая реализует протокол WebDriver (W3C стандарт) В Testplane она используется для управления браузерами и взаимодействия с веб-элементами. + +### CSS селекторы + +#### По классу + +Чтобы найти элемент на странице по классу, используйте селектор `".class-name"`. + +```javascript +// Поиск кнопки с классом "btn-primary" +const button = await browser.$(".btn-primary"); +await button.click(); + +// Поиск нескольких элементов +const menuItems = await browser.$$(".nav-item"); +console.log("Количество пунктов меню: ${menuItems.length}"); +``` +Стоит использовать, если: + +- класс является стабильным и не генерируется динамически; +- нужен быстрый и простой способ найти элемент; +- класс семантически описывает элемент (например, `.error-message`, `.success-banner`); +- вы работаете с компонентными библиотеками, где классы являются частью API. + +#### По id + +Чтобы найти элемент по `id`, используйте селектор вида `"#id"`. + +```javascript +// Поиск формы id +const loginForm = await browser.$("#login-form"); +const isDisplayed = await loginForm.isDisplayed(); +``` +Стоит использовать, если: + +- вы работаете с критически важными элементами (формы, модальные окна, главные контейнеры); +- `id` является частью публичного API компонента; +- нужна максимальная производительность селектора (`id` — самый быстрый селектор). + +#### По типу атрибута + +Для поиска элемента по атрибуту, используйте селектор вида `input[type="name"]`. + +```javascript +// Поиск всех чекбоксов +const checkboxes = await browser.$$("input[type="checkbox"]"); +for (const checkbox of checkboxes) { + await checkbox.click(); +} + +// Поиск email input +const emailInput = await browser.$("input[type="email"]"); +await emailInput.setValue("test@example.com"); + +// Поиск скрытых полей +const hiddenField = await browser.$("input[type="hidden"][name="csrf_token"]"); +const csrfValue = await hiddenField.getValue(); +``` + +Стоит использовать, если: + +- нужно найти все элементы определённого типа (все чекбоксы, все радиокнопки); +- вы тестируете формы и валидацию; +- нужно работать с семантическими HTML5 типами (`email`, `tel`, `url`, `date`); +- вам нужно убедиться, что используется правильный тип поля для `accessibility`; +- вы тестируете различное поведение для разных типов полей. + +#### CSS-селекторы по атрибуту data-testid + +Для поиска элементов, которые помечены дял тестирования, используйте селекторы по атрибуту `data-testid`. + +```javascript +// Поиск элемента по data-testid +const userAvatar = await browser.$("[data-testid="user-avatar"]"); +await userAvatar.waitForDisplayed({ timeout: 5000 }); + +// Клик по кнопке с data-testid +const deleteButton = await browser.$("[data-testid="delete-user-btn"]"); +await deleteButton.click(); + +// Получение текста из элемента +const errorMessage = await browser.$("[data-testid="error-notification"]"); +const text = await errorMessage.getText(); +expect(text).toContain("Ошибка валидации"); +``` +Стоит использовать, если: + +- создаёте селекторы специально для тестирования; +- нужна стабильность селекторов независимо от изменений UI/стилей; +- работаете в команде, где дизайнеры часто меняют классы и структуру; +- хотите явно пометить элементы, доступные для тестирования; + +#### CSS-комбинированные селекторы + +Комбинированные селекторы позволяют находить элементы в определённом контексте. + +```javascript +// Потомок: кнопка внутри модального окна +const modalButton = await browser.$(".modal .close-button"); +await modalButton.click(); + +// Прямой потомок: первый уровень вложенности +const navItem = await browser.$(".navigation > .nav-item"); + +// Соседний элемент +const errorLabel = await browser.$("input.invalid + .error-message"); +const errorText = await errorLabel.getText(); + +// Сложная комбинация +const activeTab = await browser.$("ul.tabs > li.active > a[href^="#"]"); +``` + +Стоит использовать, если: + +- нужно найти элемент в определённом контексте; +- работаете с повторяющейся структурой; +- нужно убедиться в правильной вложенности элементов; +- простые селекторы слишком неспецифичны; +- тестируете связанные элементы. + +#### CSS-псевдоселекторы + +Псевдоселекторы позволяют выбирать элементы на основе их положения или состояния. + +```javascript +// Первый элемент списка +const firstItem = await browser.$("ul.menu > li:first-child"); +await firstItem.click(); + +// Последний элемент +const lastItem = await browser.$(".breadcrumb > li:last-child"); +const currentPage = await lastItem.getText(); + +// N-ый элемент (третий пункт меню) +const thirdItem = await browser.$(".menu-item:nth-child(3)"); + +// Каждый второй элемент (чётные) +const evenRows = await browser.$$("table tr:nth-child(even)"); + +// Отключённые элементы +const disabledButtons = await browser.$$("button:disabled"); +expect(disabledButtons.length).toBe(2); + +// Проверенные чекбоксы +const checkedBoxes = await browser.$$("input[type="checkbox"]:checked"); +``` + +Стоит использовать, если: + +- тестируете позиционирование элементов; +- проверяете состояния элементов (`disabled`, `checked`, `focus`); +- работаете с таблицами и нужно выбрать определённую строку или столбец; +- тестируете паттерны (чётные/нечётные строки для `zebra-striping`); +- нужно найти элемент по его позиции, когда нет других идентификаторов. + +### XPath селекторы + +#### По тексту элемента + +Чтобы найти элемент по содержащемуся в нем тексту, используйте селектор `//element[text()="text"]`. + +```javascript +// Точное совпадение текста +const loginButton = await browser.$("//button[text()="Войти в систему"]"); +await loginButton.click(); + +// Частичное совпадение +const successMessage = await browser.$("//div[contains(text(), "успешно")]"); +await successMessage.waitForDisplayed(); + +// Текст с пробелами и переносами +const heading = await browser.$("//h1[normalize-space()="Добро пожаловать"]"); + +// Поиск по тексту в дочернем элементе +const card = await browser.$("//div[@class="card"][.//h3[text()="Premium план"]]"); + +// Case-insensitive поиск (XPath 2.0) +const link = await browser.$("//a[contains(translate(text(), "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"), "поиск")]"); +``` + +Стоит использовать, если: + +- текст элемента уникален и стабилен (названия кнопок, заголовки); +- нет других идентификаторов (нет `data-testid`, `id`, классов); +- тестируете, что правильный текст отображается в правильном месте; +- работаете с динамически генерируемым контентом, где единственный стабильный элемент — текст; +- нужно найти элемент, содержащий определённый текст внутри себя или в дочерних элементах. + +#### По атрибутам + +Для поиска элемента по атрибуту, используйте селектор вида `//element[@type="atribute"]`. + +```javascript +// Поиск по одному атрибуту +const nameInput = await browser.$("//input[@name="username"]"); +await nameInput.setValue("john_doe"); + +// Множественные условия (AND) +const activeModal = await browser.$("//div[@class="modal" and @data-visible="true"]"); + +// Условие OR +const submitBtn = await browser.$("//button[@type="submit" or @class="btn-submit"]"); + +// Поиск по началу значения атрибута +const imageJpg = await browser.$("//img[starts-with(@src, "/images/")]"); + +// Поиск по концу значения атрибута +const pdfLink = await browser.$("//a[substring(@href, string-length(@href) - 3) = ".pdf"]"); + +// Поиск по частичному совпадению атрибута +const dataElement = await browser.$("//div[contains(@data-component, "user-profile")]"); + +// NOT условие +const notDisabledButton = await browser.$("//button[not(@disabled)]"); +``` + +Стоит использовать, если: + +- нужны сложные условия поиска (комбинации атрибутов); +- работаете с динамическими атрибутами (`data`-атрибуты с переменными значениями); +- нужна гибкость в поиске (частичные совпадения, начало/конец строки); +- CSS-селекторы не могут выразить нужную логику; +- нужно найти элемент по отсутствию атрибута. + +#### Навигация по DOM + +Исползуя XPath, вы можете навигировать по DOM-дереву. + +```javascript +// Прямой родитель +const parentDiv = await browser.$("//input[@name="email"]/.."); + +// Предок с условием +const formContainer = await browser.$("//input[@name="email"]/ancestor::form[@id="registration"]"); + +// Следующий сиблинг +const errorLabel = await browser.$("//input[@class="invalid"]/following-sibling::span[@class="error"][1]"); + +// Предыдущий сиблинг +const label = await browser.$("//input[@name="password"]/preceding-sibling::label[1]"); + +// Все потомки +const allInputs = await browser.$$("//form[@id="checkout"]//input"); + +// Прямые дети +const directChildren = await browser.$$("//ul[@class="menu"]/li"); + +// Поиск «дяди» элемента (родитель -> сиблинг родителя) +const siblingSection = await browser.$("//h2[text()="Контакты"]/../following-sibling::section[1]"); +``` + +Стоит использовать, если: + +- нужно найти элемент относительно другого известного элемента; +- структура DOM сложна, но относительные позиции стабильны; +- тестируете связанные элементы (label и input, ошибка рядом с полем); +- нужно подняться вверх по DOM-дереву от найденного элемента; +- работаете с семантической структурой HTML (заголовок и следующая за ним секция). + +#### XPath: индексы и позиции + +XPath позволяет выбирать элементы по их позиции в наборе результатов. + +```javascript +// Первый элемент в результатах XPath +const firstButton = await browser.$("(//button[@class="action"])[1]"); +await firstButton.click(); + +// Последний элемент +const lastItem = await browser.$("(//li[@class="menu-item"])[last()]"); + +// Второй элемент +const secondRow = await browser.$("(//table[@id="results"]//tr)[2]"); + +// Предпоследний +const secondToLast = await browser.$("(//div[@class="card"])[last()-1]"); + +// Диапазон элементов (все кроме первого) +const allButFirst = await browser.$$("(//li[@class="item"])[position() > 1]"); + +// Каждый третий элемент +const everyThird = await browser.$$("//div[@class="grid-item"][position() mod 3 = 0]"); +``` + +Стоит использовать, если: + +- нужен доступ к элементу по его позиции в наборе результатов; +- тестируете пагинацию или списки с определённым порядком; +- работаете с таблицами и нужна конкретная строка; +- нужен первый или последний элемент среди нескольких одинаковых; +- тестируете сортировку (проверка, что элемент на правильной позиции). + +### Селекторы по Link Text + +Селекторы по содержащемуся внутри тексту позволяют находить ссылки `()` по их тексту. Используйте `="text"`, чтобы найти элемент с точным текстом и `*="text"` для поиска по частичному совпадению текста. + +```javascript +// Полное совпадение текста ссылки +const loginLink = await browser.$("=Войти в систему"); +await loginLink.click(); + +// Частичное совпадение +const docsLink = await browser.$("*=Документация"); +await docsLink.click(); +``` +Стоит использовать, если: + +- работаете с навигационными ссылками с уникальным текстом; +- тестируете меню и навигацию сайта; +- текст ссылки является частью требований и не должен меняться; +- нужна простота и читаемость теста; +- тестируете наличие ссылок с правильным текстом на странице. + +### Селекторы по имени тега + +Чтобы найти элемент по их HTML-тегу, используйте селектор по имени тега. + +```javascript +// Поиск первой кнопки на странице +const button = await browser.$("button"); +await button.click(); + +// Все параграфы +const paragraphs = await browser.$$("p"); +const textsArray = await Promise.all( + paragraphs.map(p => p.getText()) +); + +// Все изображения +const images = await browser.$$("img"); +for (const img of images) { + const alt = await img.getAttribute("alt"); + expect(alt).not.toBe(""); // проверка accessibility +} + +// Форма +const form = await browser.$("form"); +await form.waitForDisplayed(); + +// Таблица +const table = await browser.$("table"); +const rows = await table.$$("tr"); +``` + +Стоит использовать, если: + +- на странице один элемент данного типа (например, единственная форма); +- нужно получить все элементы определённого типа для массовой проверки; +- тестируете семантичность HTML (наличие правильных тегов); +- работаете с базовой HTML-структурой (`form`, `table`, `ul`); +- проводите accessibility-аудит (проверка всех `img` на наличие `alt`). + +### React селекторы + +Для поиска экомпонентов в React-приложении по их имени, используйте react-селекторы, например `react$("MyButton")` найдет компонент `MyButton`, а `react$("Button" { props: { variant: "primary", size: "large"}})` найдет кнопку с определенными параметрами. + +```javascript +// Поиск React-компонента по имени +const myButton = await browser.react$("MyButton"); +await myButton.click(); + +// С фильтрацией по параметрами +const primaryButton = await browser.react$("Button", { + props: { variant: "primary", size: "large" } +}); + +// С фильтрацией по state +const openModal = await browser.react$("Modal", { + state: { isOpen: true, activeTab: 'settings' } +}); + +// Все экземпляры компонента +const allCards = await browser.react$$("ProductCard"); +console.log("Найдено карточек: ${allCards.length}"); + +// Вложенный поиск +const form = await browser.react$("CheckoutForm"); +const submitButton = await form.react$("SubmitButton"); + +// С комплексными параметрами +const userProfile = await browser.react$("UserProfile", { + props: { + user: { id: 123, role: "admin" }, + editable: true + } +}); +``` + +Стоит использовать, если: + +- работаете с React-приложением и имеете доступ к исходному коду; +- нужно найти компонент по его параметрам или `state`; +- тестируете, что компонент рендерится с правильными данными; +- структура `DOM` может меняться, но API компонента стабилен; +- нужна глубокая интеграция с React DevTools. + +### Shadow DOM селекторы + +Shadow DOM селекторы позволяют работать с элементами внутри Shadow DOM — инкапсулированной части DOM-дерева. Например, если у вас есть кастомный элемент `my-custom-element`, вы можете найти кнопку внутри его Shadow DOM с помощью `shadow$("button")`. + +```javascript +// Простой доступ в Shadow DOM +const customElement = await browser.$("my-custom-element"); +const button = await customElement.shadow$("button"); +await button.click(); + +// Множественные элементы в Shadow DOM +const slotElements = await customElement.shadow$$(".slot-item"); +``` + +Стоит использовать, если: + +- работаете с Web Components и Custom Elements; +- приложение использует Shadow DOM для инкапсуляции стилей; +- тестируете компоненты из сторонних библиотек (Lit, Stencil, native Web Components); +- нужен доступ к элементам внутри shadow root; +- работаете с дизайн-системой на базе Web Components. + +## Testing-library + +Testing Library — это адаптер популярной философии Testing Library для Testplane. Она предоставляет селекторы, ориентированные на пользовательский опыт (как пользователи находят элементы). + +### ByRole + +`getByRole` — основной метод в Testing Library, который позволяет находить элементы по их ARIA-ролям. Например, если вы используете метод `screen.getByRole("button", { name: /submit/i })`, то найдете кнопку с текстом, содержащим `submit`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск кнопки +const submitButton = screen.getByRole("button", { name: /submit/i }); +await userEvent.click(submitButton); + +// Поиск текстового поля +const emailInput = screen.getByRole('textbox', { name: /email/i }); +await userEvent.type(emailInput, "test@example.com"); + +// Поиск чекбокса +const agreeCheckbox = screen.getByRole("checkbox", { name: /agree to terms/i }); +await userEvent.click(agreeCheckbox); +``` + +Стоит использовать, если: + +- для любых интерактивных элементов (кнопки, ссылки, поля ввода); +- для структурных элементов (`navigation`, `main`, `header`, `footer`); +- для форм и их элементов (`radio`, `checkbox`, `combobox`); +- для заголовков и важных текстовых элементов; +- для списков и таблиц. + + +### ByLabelText + +Для поиска элементов форм по тексту их меток (`label`), используйте метод `getByLabelText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск по тексту label (полное совпадение) +const emailInput = screen.getByLabelText("Email Address"); +await userEvent.type(emailInput, "user@example.com"); + +// Поиск с регулярным выражением (частичное совпадение, case-insensitive) +const passwordInput = screen.getByLabelText(/password/i); +await userEvent.type(passwordInput, "secure123"); +``` + +Стоит использовать, если: + +- работаете с формами; +- нужно найти input, select, textarea по связанной метке; +- занимаетесь тестированием доступности (наличие `label` обязательно для доступности); +- метка уникальна и описательна. + +### ByPlaceholderText + +Чтобы найти поле ввода по тексту `placeholder`, используйте селектор `getByPlaceholderText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск по placeholder +const searchInput = screen.getByPlaceholderText("Search..."); +await userEvent.type(searchInput, "testing library"); + +// С регулярным выражением +const emailInput = screen.getByPlaceholderText(/enter.*email/i); +await userEvent.type(emailInput, "test@example.com"); +``` + +Стоит использовать, если: + +- у поля нет `label`, но есть `placeholder`; +- занимаетесь тестированием legacy-кода, где `placeholder` используется вместо `label`; +- `placeholder` достаточно описателен и уникален. + +### ByText + +Чтобы найти текстовый элемент по его содержимому, используйте метод `getByText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск по точному тексту +const heading = screen.getByText("Welcome to our application"); +expect(heading).toBeInTheDocument(); + +// С регулярным выражением (частичное совпадение) +const errorMessage = screen.getByText(/error.*occurred/i); +expect(errorMessage).toHaveClass("error"); +``` + +Стоит использовать, если: + +- необходимо найти неинтерактивные текстовые элементов (параграфы, заголовки, уведомления); +- занимаетесь проверкой отображения текста на странице; +- текст уникален и является частью требований. + +### ByDisplayValue + +Для поиска элемента по их текущему значению, используйте метод `getByDisplayValue`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск input с конкретным значением +const emailInput = screen.getByDisplayValue("user@example.com"); +expect(emailInput).toBeInTheDocument(); + +// Поиск с регулярным выражением +const searchInput = screen.getByDisplayValue(/search query/i); +``` + +Стоит использовать, если: + +- необходимо протестировать предзаполненных форм (edit forms, profile pages); +- нужно проверить установку корректного значения после действия; +- необходимо найти элемент по его текущему значению, а не по label. + +### ByAltText + +Для поиска изображений по тексту `alt`, используйте метод `getByAltText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск изображения по alt тексту +const logo = screen.getByAltText("Company Logo"); +expect(logo).toBeInTheDocument(); +expect(logo).toHaveAttribute("src", "/images/logo.png"); +``` + +Стоит использовать, если: + +- нужно работать с изображениями (``, ``, ``); +- необходимо проверить доступность изображений (наличие `alt` обязательно); +- `alt`-текст достаточно описателен и уникален. + +### ByTitle + +Чтобы найти элемент по атрибуту title, используйте метод getByTitle. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск элемента по title атрибуту +const closeButton = screen.getByTitle("Close dialog"); +await userEvent.click(closeButton); +``` + +Стоит использовать, если: + +- необходимо работать с элементами, которые используют `title` для `tooltips`; +- нужно протестировать `iframe`-элементы (`title` обязателен для доступности); +- нужно взаимодействовать с `SVG`-элементами (`title` внутри `SVG` для описания). + +### ByTestId + +`getByTestId` используется как последний вариант, когда другие методы не подходят. Например, если вы используете `screen.getByTestId("submit-button")`, то найдте элемент с атрибутом `data-testid="submit-button"` + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Базовое использование +const submitButton = screen.getByTestId("submit-button"); +await userEvent.click(submitButton); +``` + diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/selectors.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/selectors.mdx new file mode 100644 index 0000000..8ecb839 --- /dev/null +++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/selectors.mdx @@ -0,0 +1,602 @@ +# Селекторы + +Testplane предоставляет множество способов для поиска элементов на странице браузера с помощью селекторов. Для этого используются библиотеки `WebDriverIO` и `testing-library`. Селекторы позволяют точно идентифицировать элементы интерфейса, что необходимо для автоматизации тестирования. + +## WebDriverIO + +WebDriverIO — это Node.js-библиотека для автоматизации браузеров, которая реализует протокол WebDriver (W3C стандарт) В Testplane она используется для управления браузерами и взаимодействия с веб-элементами. + +### CSS селекторы + +#### По классу + +Чтобы найти элемент на странице по классу, используйте селектор `".class-name"`. + +```javascript +// Поиск кнопки с классом "btn-primary" +const button = await browser.$(".btn-primary"); +await button.click(); + +// Поиск нескольких элементов +const menuItems = await browser.$$(".nav-item"); +console.log("Количество пунктов меню: ${menuItems.length}"); +``` +Стоит использовать, если: + +- класс является стабильным и не генерируется динамически; +- нужен быстрый и простой способ найти элемент; +- класс семантически описывает элемент (например, `.error-message`, `.success-banner`); +- вы работаете с компонентными библиотеками, где классы являются частью API. + +#### По id + +Чтобы найти элемент по `id`, используйте селектор вида `"#id"`. + +```javascript +// Поиск формы id +const loginForm = await browser.$("#login-form"); +const isDisplayed = await loginForm.isDisplayed(); +``` +Стоит использовать, если: + +- вы работаете с критически важными элементами (формы, модальные окна, главные контейнеры); +- `id` является частью публичного API компонента; +- нужна максимальная производительность селектора (`id` — самый быстрый селектор). + +#### По типу атрибута + +Для поиска элемента по атрибуту, используйте селектор вида `input[type="name"]`. + +```javascript +// Поиск всех чекбоксов +const checkboxes = await browser.$$("input[type="checkbox"]"); +for (const checkbox of checkboxes) { + await checkbox.click(); +} + +// Поиск email input +const emailInput = await browser.$("input[type="email"]"); +await emailInput.setValue("test@example.com"); + +// Поиск скрытых полей +const hiddenField = await browser.$("input[type="hidden"][name="csrf_token"]"); +const csrfValue = await hiddenField.getValue(); +``` + +Стоит использовать, если: + +- нужно найти все элементы определённого типа (все чекбоксы, все радиокнопки); +- вы тестируете формы и валидацию; +- нужно работать с семантическими HTML5 типами (`email`, `tel`, `url`, `date`); +- вам нужно убедиться, что используется правильный тип поля для `accessibility`; +- вы тестируете различное поведение для разных типов полей. + +#### CSS-селекторы по атрибуту data-testid + +Для поиска элементов, которые помечены дял тестирования, используйте селекторы по атрибуту `data-testid`. + +```javascript +// Поиск элемента по data-testid +const userAvatar = await browser.$("[data-testid="user-avatar"]"); +await userAvatar.waitForDisplayed({ timeout: 5000 }); + +// Клик по кнопке с data-testid +const deleteButton = await browser.$("[data-testid="delete-user-btn"]"); +await deleteButton.click(); + +// Получение текста из элемента +const errorMessage = await browser.$("[data-testid="error-notification"]"); +const text = await errorMessage.getText(); +expect(text).toContain("Ошибка валидации"); +``` +Стоит использовать, если: + +- создаёте селекторы специально для тестирования; +- нужна стабильность селекторов независимо от изменений UI/стилей; +- работаете в команде, где дизайнеры часто меняют классы и структуру; +- хотите явно пометить элементы, доступные для тестирования; + +#### CSS-комбинированные селекторы + +Комбинированные селекторы позволяют находить элементы в определённом контексте. + +```javascript +// Потомок: кнопка внутри модального окна +const modalButton = await browser.$(".modal .close-button"); +await modalButton.click(); + +// Прямой потомок: первый уровень вложенности +const navItem = await browser.$(".navigation > .nav-item"); + +// Соседний элемент +const errorLabel = await browser.$("input.invalid + .error-message"); +const errorText = await errorLabel.getText(); + +// Сложная комбинация +const activeTab = await browser.$("ul.tabs > li.active > a[href^="#"]"); +``` + +Стоит использовать, если: + +- нужно найти элемент в определённом контексте; +- работаете с повторяющейся структурой; +- нужно убедиться в правильной вложенности элементов; +- простые селекторы слишком неспецифичны; +- тестируете связанные элементы. + +#### CSS-псевдоселекторы + +Псевдоселекторы позволяют выбирать элементы на основе их положения или состояния. + +```javascript +// Первый элемент списка +const firstItem = await browser.$("ul.menu > li:first-child"); +await firstItem.click(); + +// Последний элемент +const lastItem = await browser.$(".breadcrumb > li:last-child"); +const currentPage = await lastItem.getText(); + +// N-ый элемент (третий пункт меню) +const thirdItem = await browser.$(".menu-item:nth-child(3)"); + +// Каждый второй элемент (чётные) +const evenRows = await browser.$$("table tr:nth-child(even)"); + +// Отключённые элементы +const disabledButtons = await browser.$$("button:disabled"); +expect(disabledButtons.length).toBe(2); + +// Проверенные чекбоксы +const checkedBoxes = await browser.$$("input[type="checkbox"]:checked"); +``` + +Стоит использовать, если: + +- тестируете позиционирование элементов; +- проверяете состояния элементов (`disabled`, `checked`, `focus`); +- работаете с таблицами и нужно выбрать определённую строку или столбец; +- тестируете паттерны (чётные/нечётные строки для `zebra-striping`); +- нужно найти элемент по его позиции, когда нет других идентификаторов. + +### XPath селекторы + +#### По тексту элемента + +Чтобы найти элемент по содержащемуся в нем тексту, используйте селектор `//element[text()="text"]`. + +```javascript +// Точное совпадение текста +const loginButton = await browser.$("//button[text()="Войти в систему"]"); +await loginButton.click(); + +// Частичное совпадение +const successMessage = await browser.$("//div[contains(text(), "успешно")]"); +await successMessage.waitForDisplayed(); + +// Текст с пробелами и переносами +const heading = await browser.$("//h1[normalize-space()="Добро пожаловать"]"); + +// Поиск по тексту в дочернем элементе +const card = await browser.$("//div[@class="card"][.//h3[text()="Premium план"]]"); + +// Case-insensitive поиск (XPath 2.0) +const link = await browser.$("//a[contains(translate(text(), "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"), "поиск")]"); +``` + +Стоит использовать, если: + +- текст элемента уникален и стабилен (названия кнопок, заголовки); +- нет других идентификаторов (нет `data-testid`, `id`, классов); +- тестируете, что правильный текст отображается в правильном месте; +- работаете с динамически генерируемым контентом, где единственный стабильный элемент — текст; +- нужно найти элемент, содержащий определённый текст внутри себя или в дочерних элементах. + +#### По атрибутам + +Для поиска элемента по атрибуту, используйте селектор вида `//element[@type="atribute"]`. + +```javascript +// Поиск по одному атрибуту +const nameInput = await browser.$("//input[@name="username"]"); +await nameInput.setValue("john_doe"); + +// Множественные условия (AND) +const activeModal = await browser.$("//div[@class="modal" and @data-visible="true"]"); + +// Условие OR +const submitBtn = await browser.$("//button[@type="submit" or @class="btn-submit"]"); + +// Поиск по началу значения атрибута +const imageJpg = await browser.$("//img[starts-with(@src, "/images/")]"); + +// Поиск по концу значения атрибута +const pdfLink = await browser.$("//a[substring(@href, string-length(@href) - 3) = ".pdf"]"); + +// Поиск по частичному совпадению атрибута +const dataElement = await browser.$("//div[contains(@data-component, "user-profile")]"); + +// NOT условие +const notDisabledButton = await browser.$("//button[not(@disabled)]"); +``` + +Стоит использовать, если: + +- нужны сложные условия поиска (комбинации атрибутов); +- работаете с динамическими атрибутами (`data`-атрибуты с переменными значениями); +- нужна гибкость в поиске (частичные совпадения, начало/конец строки); +- CSS-селекторы не могут выразить нужную логику; +- нужно найти элемент по отсутствию атрибута. + +#### Навигация по DOM + +Исползуя XPath, вы можете навигировать по DOM-дереву. + +```javascript +// Прямой родитель +const parentDiv = await browser.$("//input[@name="email"]/.."); + +// Предок с условием +const formContainer = await browser.$("//input[@name="email"]/ancestor::form[@id="registration"]"); + +// Следующий сиблинг +const errorLabel = await browser.$("//input[@class="invalid"]/following-sibling::span[@class="error"][1]"); + +// Предыдущий сиблинг +const label = await browser.$("//input[@name="password"]/preceding-sibling::label[1]"); + +// Все потомки +const allInputs = await browser.$$("//form[@id="checkout"]//input"); + +// Прямые дети +const directChildren = await browser.$$("//ul[@class="menu"]/li"); + +// Поиск «дяди» элемента (родитель -> сиблинг родителя) +const siblingSection = await browser.$("//h2[text()="Контакты"]/../following-sibling::section[1]"); +``` + +Стоит использовать, если: + +- нужно найти элемент относительно другого известного элемента; +- структура DOM сложна, но относительные позиции стабильны; +- тестируете связанные элементы (label и input, ошибка рядом с полем); +- нужно подняться вверх по DOM-дереву от найденного элемента; +- работаете с семантической структурой HTML (заголовок и следующая за ним секция). + +#### XPath: индексы и позиции + +XPath позволяет выбирать элементы по их позиции в наборе результатов. + +```javascript +// Первый элемент в результатах XPath +const firstButton = await browser.$("(//button[@class="action"])[1]"); +await firstButton.click(); + +// Последний элемент +const lastItem = await browser.$("(//li[@class="menu-item"])[last()]"); + +// Второй элемент +const secondRow = await browser.$("(//table[@id="results"]//tr)[2]"); + +// Предпоследний +const secondToLast = await browser.$("(//div[@class="card"])[last()-1]"); + +// Диапазон элементов (все кроме первого) +const allButFirst = await browser.$$("(//li[@class="item"])[position() > 1]"); + +// Каждый третий элемент +const everyThird = await browser.$$("//div[@class="grid-item"][position() mod 3 = 0]"); +``` + +Стоит использовать, если: + +- нужен доступ к элементу по его позиции в наборе результатов; +- тестируете пагинацию или списки с определённым порядком; +- работаете с таблицами и нужна конкретная строка; +- нужен первый или последний элемент среди нескольких одинаковых; +- тестируете сортировку (проверка, что элемент на правильной позиции). + +### Селекторы по Link Text + +Селекторы по содержащемуся внутри тексту позволяют находить ссылки `()` по их тексту. Используйте `="text"`, чтобы найти элемент с точным текстом и `*="text"` для поиска по частичному совпадению текста. + +```javascript +// Полное совпадение текста ссылки +const loginLink = await browser.$("=Войти в систему"); +await loginLink.click(); + +// Частичное совпадение +const docsLink = await browser.$("*=Документация"); +await docsLink.click(); +``` +Стоит использовать, если: + +- работаете с навигационными ссылками с уникальным текстом; +- тестируете меню и навигацию сайта; +- текст ссылки является частью требований и не должен меняться; +- нужна простота и читаемость теста; +- тестируете наличие ссылок с правильным текстом на странице. + +### Селекторы по имени тега + +Чтобы найти элемент по их HTML-тегу, используйте селектор по имени тега. + +```javascript +// Поиск первой кнопки на странице +const button = await browser.$("button"); +await button.click(); + +// Все параграфы +const paragraphs = await browser.$$("p"); +const textsArray = await Promise.all( + paragraphs.map(p => p.getText()) +); + +// Все изображения +const images = await browser.$$("img"); +for (const img of images) { + const alt = await img.getAttribute("alt"); + expect(alt).not.toBe(""); // проверка accessibility +} + +// Форма +const form = await browser.$("form"); +await form.waitForDisplayed(); + +// Таблица +const table = await browser.$("table"); +const rows = await table.$$("tr"); +``` + +Стоит использовать, если: + +- на странице один элемент данного типа (например, единственная форма); +- нужно получить все элементы определённого типа для массовой проверки; +- тестируете семантичность HTML (наличие правильных тегов); +- работаете с базовой HTML-структурой (`form`, `table`, `ul`); +- проводите accessibility-аудит (проверка всех `img` на наличие `alt`). + +### React селекторы + +Для поиска экомпонентов в React-приложении по их имени, используйте react-селекторы, например `react$("MyButton")` найдет компонент `MyButton`, а `react$("Button" { props: { variant: "primary", size: "large"}})` найдет кнопку с определенными параметрами. + +```javascript +// Поиск React-компонента по имени +const myButton = await browser.react$("MyButton"); +await myButton.click(); + +// С фильтрацией по параметрами +const primaryButton = await browser.react$("Button", { + props: { variant: "primary", size: "large" } +}); + +// С фильтрацией по state +const openModal = await browser.react$("Modal", { + state: { isOpen: true, activeTab: 'settings' } +}); + +// Все экземпляры компонента +const allCards = await browser.react$$("ProductCard"); +console.log("Найдено карточек: ${allCards.length}"); + +// Вложенный поиск +const form = await browser.react$("CheckoutForm"); +const submitButton = await form.react$("SubmitButton"); + +// С комплексными параметрами +const userProfile = await browser.react$("UserProfile", { + props: { + user: { id: 123, role: "admin" }, + editable: true + } +}); +``` + +Стоит использовать, если: + +- работаете с React-приложением и имеете доступ к исходному коду; +- нужно найти компонент по его параметрам или `state`; +- тестируете, что компонент рендерится с правильными данными; +- структура `DOM` может меняться, но API компонента стабилен; +- нужна глубокая интеграция с React DevTools. + +### Shadow DOM селекторы + +Shadow DOM селекторы позволяют работать с элементами внутри Shadow DOM — инкапсулированной части DOM-дерева. Например, если у вас есть кастомный элемент `my-custom-element`, вы можете найти кнопку внутри его Shadow DOM с помощью `shadow$("button")`. + +```javascript +// Простой доступ в Shadow DOM +const customElement = await browser.$("my-custom-element"); +const button = await customElement.shadow$("button"); +await button.click(); + +// Множественные элементы в Shadow DOM +const slotElements = await customElement.shadow$$(".slot-item"); +``` + +Стоит использовать, если: + +- работаете с Web Components и Custom Elements; +- приложение использует Shadow DOM для инкапсуляции стилей; +- тестируете компоненты из сторонних библиотек (Lit, Stencil, native Web Components); +- нужен доступ к элементам внутри shadow root; +- работаете с дизайн-системой на базе Web Components. + +## Testing-library + +Testing Library — это адаптер популярной философии Testing Library для Testplane. Она предоставляет селекторы, ориентированные на пользовательский опыт (как пользователи находят элементы). + +### ByRole + +`getByRole` — основной метод в Testing Library, который позволяет находить элементы по их ARIA-ролям. Например, если вы используете метод `screen.getByRole("button", { name: /submit/i })`, то найдете кнопку с текстом, содержащим `submit`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск кнопки +const submitButton = screen.getByRole("button", { name: /submit/i }); +await userEvent.click(submitButton); + +// Поиск текстового поля +const emailInput = screen.getByRole('textbox', { name: /email/i }); +await userEvent.type(emailInput, "test@example.com"); + +// Поиск чекбокса +const agreeCheckbox = screen.getByRole("checkbox", { name: /agree to terms/i }); +await userEvent.click(agreeCheckbox); +``` + +Стоит использовать, если: + +- для любых интерактивных элементов (кнопки, ссылки, поля ввода); +- для структурных элементов (`navigation`, `main`, `header`, `footer`); +- для форм и их элементов (`radio`, `checkbox`, `combobox`); +- для заголовков и важных текстовых элементов; +- для списков и таблиц. + + +### ByLabelText + +Для поиска элементов форм по тексту их меток (`label`), используйте метод `getByLabelText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск по тексту label (полное совпадение) +const emailInput = screen.getByLabelText("Email Address"); +await userEvent.type(emailInput, "user@example.com"); + +// Поиск с регулярным выражением (частичное совпадение, case-insensitive) +const passwordInput = screen.getByLabelText(/password/i); +await userEvent.type(passwordInput, "secure123"); +``` + +Стоит использовать, если: + +- работаете с формами; +- нужно найти input, select, textarea по связанной метке; +- занимаетесь тестированием доступности (наличие `label` обязательно для доступности); +- метка уникальна и описательна. + +### ByPlaceholderText + +Чтобы найти поле ввода по тексту `placeholder`, используйте селектор `getByPlaceholderText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск по placeholder +const searchInput = screen.getByPlaceholderText("Search..."); +await userEvent.type(searchInput, "testing library"); + +// С регулярным выражением +const emailInput = screen.getByPlaceholderText(/enter.*email/i); +await userEvent.type(emailInput, "test@example.com"); +``` + +Стоит использовать, если: + +- у поля нет `label`, но есть `placeholder`; +- занимаетесь тестированием legacy-кода, где `placeholder` используется вместо `label`; +- `placeholder` достаточно описателен и уникален. + +### ByText + +Чтобы найти текстовый элемент по его содержимому, используйте метод `getByText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск по точному тексту +const heading = screen.getByText("Welcome to our application"); +expect(heading).toBeInTheDocument(); + +// С регулярным выражением (частичное совпадение) +const errorMessage = screen.getByText(/error.*occurred/i); +expect(errorMessage).toHaveClass("error"); +``` + +Стоит использовать, если: + +- необходимо найти неинтерактивные текстовые элементов (параграфы, заголовки, уведомления); +- занимаетесь проверкой отображения текста на странице; +- текст уникален и является частью требований. + +### ByDisplayValue + +Для поиска элемента по их текущему значению, используйте метод `getByDisplayValue`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск input с конкретным значением +const emailInput = screen.getByDisplayValue("user@example.com"); +expect(emailInput).toBeInTheDocument(); + +// Поиск с регулярным выражением +const searchInput = screen.getByDisplayValue(/search query/i); +``` + +Стоит использовать, если: + +- необходимо протестировать предзаполненных форм (edit forms, profile pages); +- нужно проверить установку корректного значения после действия; +- необходимо найти элемент по его текущему значению, а не по label. + +### ByAltText + +Для поиска изображений по тексту `alt`, используйте метод `getByAltText`. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск изображения по alt тексту +const logo = screen.getByAltText("Company Logo"); +expect(logo).toBeInTheDocument(); +expect(logo).toHaveAttribute("src", "/images/logo.png"); +``` + +Стоит использовать, если: + +- нужно работать с изображениями (``, ``, ``); +- необходимо проверить доступность изображений (наличие `alt` обязательно); +- `alt`-текст достаточно описателен и уникален. + +### ByTitle + +Чтобы найти элемент по атрибуту title, используйте метод getByTitle. + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Поиск элемента по title атрибуту +const closeButton = screen.getByTitle("Close dialog"); +await userEvent.click(closeButton); +``` + +Стоит использовать, если: + +- необходимо работать с элементами, которые используют `title` для `tooltips`; +- нужно протестировать `iframe`-элементы (`title` обязателен для доступности); +- нужно взаимодействовать с `SVG`-элементами (`title` внутри `SVG` для описания). + +### ByTestId + +`getByTestId` используется как последний вариант, когда другие методы не подходят. Например, если вы используете `screen.getByTestId("submit-button")`, то найдте элемент с атрибутом `data-testid="submit-button"` + +```javascript +import { screen } from "@testing-library/dom"; +import userEvent from "@testing-library/user-event"; + +// Базовое использование +const submitButton = screen.getByTestId("submit-button"); +await userEvent.click(submitButton); +``` + diff --git a/package-lock.json b/package-lock.json index 3b0f0c2..fe2f27f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -180,6 +180,7 @@ "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", @@ -306,6 +307,7 @@ "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", @@ -466,7 +468,6 @@ "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" } @@ -745,7 +746,6 @@ "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,7 +765,6 @@ "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" @@ -782,7 +781,6 @@ "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" @@ -800,7 +798,6 @@ "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" @@ -818,7 +815,6 @@ "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" @@ -836,7 +832,6 @@ "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", @@ -857,7 +852,6 @@ "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" @@ -875,7 +869,6 @@ "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", @@ -904,7 +897,6 @@ "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" }, @@ -928,7 +920,6 @@ "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" }, @@ -1004,7 +995,6 @@ "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" }, @@ -1017,7 +1007,6 @@ "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" }, @@ -1030,7 +1019,6 @@ "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" }, @@ -1043,7 +1031,6 @@ "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" }, @@ -1056,7 +1043,6 @@ "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" }, @@ -1798,7 +1784,6 @@ "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" }, @@ -1814,7 +1799,6 @@ "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" }, @@ -2078,6 +2062,7 @@ "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", @@ -2517,6 +2502,7 @@ "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", @@ -3699,7 +3685,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "dev": true, - "peer": true, "engines": { "node": ">=12" } @@ -3709,7 +3694,6 @@ "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" }, @@ -3722,7 +3706,6 @@ "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", @@ -3738,7 +3721,6 @@ "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", @@ -4023,7 +4005,6 @@ "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", @@ -4056,7 +4037,6 @@ "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", @@ -4068,7 +4048,6 @@ "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", @@ -4083,7 +4062,6 @@ "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" } @@ -4093,7 +4071,6 @@ "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", @@ -4109,7 +4086,6 @@ "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", @@ -4130,7 +4106,6 @@ "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" @@ -4144,7 +4119,6 @@ "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" @@ -4158,7 +4132,6 @@ "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" @@ -4172,7 +4145,6 @@ "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" } @@ -4182,7 +4154,6 @@ "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" } @@ -4192,7 +4163,6 @@ "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", @@ -4217,7 +4187,6 @@ "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" } @@ -4227,7 +4196,6 @@ "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" }, @@ -4240,7 +4208,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true, - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -4253,7 +4220,6 @@ "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", @@ -4266,7 +4232,6 @@ "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", @@ -4281,7 +4246,6 @@ "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", @@ -4302,7 +4266,6 @@ "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", @@ -4317,7 +4280,6 @@ "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", @@ -4337,15 +4299,13 @@ "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, - "peer": true + "dev": 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", @@ -4363,7 +4323,6 @@ "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", @@ -4380,7 +4339,6 @@ "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": "*" } @@ -4390,7 +4348,6 @@ "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", @@ -4406,7 +4363,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -4428,7 +4384,6 @@ "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", @@ -4447,7 +4402,6 @@ "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" } @@ -4457,7 +4411,6 @@ "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" }, @@ -4470,7 +4423,6 @@ "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" } @@ -4480,7 +4432,6 @@ "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" } @@ -4490,7 +4441,6 @@ "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" @@ -4504,7 +4454,6 @@ "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", @@ -4519,7 +4468,6 @@ "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" } @@ -4529,7 +4477,6 @@ "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" }, @@ -4542,7 +4489,6 @@ "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" }, @@ -4558,7 +4504,6 @@ "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" }, @@ -4571,7 +4516,6 @@ "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" } @@ -4581,7 +4525,6 @@ "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" } @@ -4591,7 +4534,6 @@ "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" }, @@ -4604,7 +4546,6 @@ "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", @@ -4661,7 +4602,6 @@ "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", @@ -4683,7 +4623,6 @@ "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", @@ -4704,7 +4643,6 @@ "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", @@ -4727,7 +4665,6 @@ "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" } @@ -4737,7 +4674,6 @@ "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", @@ -4760,7 +4696,6 @@ "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" } @@ -4769,15 +4704,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": 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" @@ -4794,7 +4727,6 @@ "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" } @@ -4804,7 +4736,6 @@ "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" } @@ -4814,7 +4745,6 @@ "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", @@ -4832,15 +4762,13 @@ "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, - "peer": true + "dev": 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" @@ -4990,7 +4918,6 @@ "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", @@ -5040,7 +4967,6 @@ "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" } @@ -5050,7 +4976,6 @@ "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" }, @@ -5102,7 +5027,6 @@ "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" } @@ -5112,7 +5036,6 @@ "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" } @@ -6461,6 +6384,7 @@ "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", @@ -6611,6 +6535,7 @@ "integrity": "sha512-Xaf+UBvW6JNuV131uvSNyMXHn+bh6LyKN4tbv7tOUFQpXyz/t9YWRE04emtlUW9Y0qrm/GKFCbY8n3z6BpZbTA==", "dev": true, "hasInstallScript": true, + "peer": true, "dependencies": { "@swc/counter": "^0.1.2", "@swc/types": "^0.1.5" @@ -7199,6 +7124,7 @@ "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", @@ -7641,6 +7567,7 @@ "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" @@ -7651,7 +7578,6 @@ "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": "*" } @@ -7749,8 +7675,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/unist": { "version": "3.0.2", @@ -7767,8 +7692,7 @@ "version": "0.5.15", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.15.tgz", "integrity": "sha512-nC9116Gd4N+CqTxqo6gvCfhAMAzgRcfS8ZsciNodHq8uwW4JCVKwhagw8yN0XmC7mHrLnWqniJpoVEiR+72Drw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/ws": { "version": "8.5.10", @@ -7955,6 +7879,7 @@ "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", @@ -8703,7 +8628,6 @@ "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" }, @@ -8727,6 +8651,7 @@ "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" }, @@ -8775,6 +8700,7 @@ "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", @@ -8834,6 +8760,7 @@ "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", @@ -8867,8 +8794,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "dev": true, - "peer": true + "dev": true }, "node_modules/ansi-align": { "version": "3.0.1", @@ -8920,7 +8846,6 @@ "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", @@ -8932,7 +8857,6 @@ "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" } @@ -8942,7 +8866,6 @@ "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" }, @@ -9005,8 +8928,7 @@ "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, - "peer": true + "dev": true }, "node_modules/arg": { "version": "5.0.2", @@ -9183,8 +9105,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/assert": { "version": "2.1.0", @@ -9225,7 +9146,6 @@ "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" } @@ -9248,8 +9168,7 @@ "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, - "peer": true + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", @@ -9502,7 +9421,6 @@ "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" } @@ -9770,6 +9688,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -9789,7 +9708,6 @@ "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" } @@ -9813,7 +9731,6 @@ "url": "https://feross.org/support" } ], - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -9921,7 +9838,6 @@ "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" }, @@ -9934,7 +9850,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -9944,7 +9859,6 @@ "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" }, @@ -10214,7 +10128,6 @@ "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", @@ -10241,7 +10154,6 @@ "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", @@ -10256,7 +10168,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -10411,7 +10322,6 @@ "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", @@ -10425,15 +10335,13 @@ "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, - "peer": true + "dev": 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" } @@ -10443,7 +10351,6 @@ "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", @@ -10458,7 +10365,6 @@ "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" }, @@ -10471,7 +10377,6 @@ "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", @@ -10559,8 +10464,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/combine-promises": { "version": "1.2.0", @@ -10583,8 +10487,7 @@ "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, - "peer": true + "dev": true }, "node_modules/commander": { "version": "5.1.0", @@ -10746,7 +10649,6 @@ "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", @@ -10770,7 +10672,6 @@ "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" } @@ -10780,7 +10681,6 @@ "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", @@ -10798,15 +10698,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": 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" }, @@ -10819,7 +10717,6 @@ "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" } @@ -11365,8 +11262,7 @@ "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/debounce": { "version": "1.2.1", @@ -11395,7 +11291,6 @@ "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" } @@ -11627,8 +11522,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/depd": { "version": "2.0.0", @@ -11643,7 +11537,6 @@ "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", @@ -12171,6 +12064,7 @@ "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", @@ -13267,7 +13161,6 @@ "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" } @@ -13341,7 +13234,6 @@ "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" } @@ -13351,7 +13243,6 @@ "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" @@ -13546,6 +13437,7 @@ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -13668,6 +13560,7 @@ "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", @@ -14111,7 +14004,6 @@ "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" } @@ -14287,7 +14179,6 @@ "url": "https://paypal.me/naturalintelligence" } ], - "peer": true, "dependencies": { "strnum": "^1.0.5" }, @@ -14331,7 +14222,6 @@ "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" } @@ -14645,8 +14535,7 @@ "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, - "peer": true + "dev": true }, "node_modules/flow-parser": { "version": "0.206.0", @@ -14937,7 +14826,6 @@ "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.*" } @@ -15672,15 +15560,13 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.15.0.tgz", "integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==", - "dev": true, - "peer": true + "dev": 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" } @@ -15690,7 +15576,6 @@ "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" }, @@ -16437,7 +16322,6 @@ "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" } @@ -16489,7 +16373,6 @@ "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" } @@ -16916,7 +16799,6 @@ "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" }, @@ -16929,7 +16811,6 @@ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", "dev": true, - "peer": true, "dependencies": { "@types/react": "*" } @@ -16975,7 +16856,6 @@ "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", @@ -16993,7 +16873,6 @@ "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" } @@ -17003,7 +16882,6 @@ "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", @@ -17024,7 +16902,6 @@ "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" }, @@ -17037,7 +16914,6 @@ "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", @@ -17051,15 +16927,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true, - "peer": true + "dev": 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": "*", @@ -17090,7 +16964,6 @@ "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", @@ -17108,7 +16981,6 @@ "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" }, @@ -17121,7 +16993,6 @@ "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", @@ -17135,8 +17006,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/jest-worker": { "version": "29.7.0", @@ -17206,22 +17076,19 @@ "version": "250231.0.0", "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "dev": true, - "peer": true + "dev": 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, - "peer": true + "dev": 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", @@ -17255,7 +17122,6 @@ "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" }, @@ -17268,7 +17134,6 @@ "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", @@ -17284,7 +17149,6 @@ "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" } @@ -17310,8 +17174,7 @@ "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, - "peer": true + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -17483,7 +17346,6 @@ "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" @@ -17494,7 +17356,6 @@ "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" } @@ -17503,8 +17364,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/lightningcss": { "version": "1.30.1", @@ -17824,8 +17684,7 @@ "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, - "peer": true + "dev": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -17853,7 +17712,6 @@ "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", @@ -17868,7 +17726,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -17878,7 +17735,6 @@ "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", @@ -17889,15 +17745,13 @@ "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, - "peer": true + "dev": 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" @@ -17911,7 +17765,6 @@ "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" } @@ -17921,7 +17774,6 @@ "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" }, @@ -17934,7 +17786,6 @@ "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" }, @@ -17950,7 +17801,6 @@ "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" }, @@ -17963,7 +17813,6 @@ "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", @@ -17978,7 +17827,6 @@ "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" }, @@ -17991,7 +17839,6 @@ "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", @@ -18005,15 +17852,13 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "peer": true + "dev": 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", @@ -18036,7 +17881,6 @@ "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" @@ -18149,7 +17993,6 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -18196,8 +18039,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -18615,8 +18457,7 @@ "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, - "peer": true + "dev": true }, "node_modules/memoizerific": { "version": "1.11.3", @@ -18662,7 +18503,6 @@ "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", @@ -18720,7 +18560,6 @@ "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", @@ -18734,15 +18573,13 @@ "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, - "peer": true + "dev": 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" } @@ -18752,7 +18589,6 @@ "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" @@ -18766,7 +18602,6 @@ "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" } @@ -18776,7 +18611,6 @@ "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", @@ -18795,7 +18629,6 @@ "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" } @@ -18805,7 +18638,6 @@ "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", @@ -18821,7 +18653,6 @@ "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" @@ -18835,7 +18666,6 @@ "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" @@ -18849,7 +18679,6 @@ "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" @@ -18863,7 +18692,6 @@ "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" } @@ -18873,7 +18701,6 @@ "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" @@ -18887,7 +18714,6 @@ "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", @@ -18912,7 +18738,6 @@ "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" } @@ -18921,15 +18746,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": 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" }, @@ -18942,7 +18765,6 @@ "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" } @@ -18952,7 +18774,6 @@ "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" }, @@ -18965,7 +18786,6 @@ "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", @@ -18985,7 +18805,6 @@ "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" } @@ -18995,7 +18814,6 @@ "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", @@ -19016,7 +18834,6 @@ "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" } @@ -19026,7 +18843,6 @@ "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", @@ -19043,7 +18859,6 @@ "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", @@ -19066,15 +18881,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "peer": true + "dev": 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" } @@ -19083,15 +18896,13 @@ "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, - "peer": true + "dev": 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" } @@ -19100,15 +18911,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": 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" } @@ -19118,7 +18927,6 @@ "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" }, @@ -19131,7 +18939,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -20847,7 +20654,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "peer": true, "bin": { "mime": "cli.js" }, @@ -20992,7 +20798,6 @@ "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" }, @@ -21083,7 +20888,6 @@ "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" } @@ -21158,8 +20962,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/node-releases": { "version": "2.0.27", @@ -21172,7 +20975,6 @@ "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" }, @@ -21260,8 +21062,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/nypm": { "version": "0.3.8", @@ -21421,7 +21222,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.8.tgz", "integrity": "sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA==", "dev": true, - "peer": true, "engines": { "node": ">=18" } @@ -22145,6 +21945,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -22734,6 +22535,7 @@ "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" }, @@ -22922,7 +22724,6 @@ "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" } @@ -23151,6 +22952,7 @@ "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" }, @@ -23360,7 +23162,6 @@ "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" @@ -23371,7 +23172,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -23428,6 +23228,7 @@ "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" @@ -23519,7 +23320,6 @@ "url": "https://github.com/sponsors/lavrton" } ], - "peer": true, "dependencies": { "@types/react-reconciler": "^0.28.2", "its-fine": "^1.1.1", @@ -23537,7 +23337,6 @@ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", "dev": true, - "peer": true, "dependencies": { "@types/react": "*" } @@ -23547,7 +23346,6 @@ "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" @@ -23564,6 +23362,7 @@ "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": "*" }, @@ -23647,7 +23446,6 @@ "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", @@ -23664,7 +23462,6 @@ "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": "*" } @@ -23674,7 +23471,6 @@ "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", @@ -23689,15 +23485,13 @@ "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, - "peer": true + "dev": 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" } @@ -23707,7 +23501,6 @@ "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" @@ -23724,7 +23517,6 @@ "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" } @@ -23734,7 +23526,6 @@ "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" } @@ -23743,6 +23534,7 @@ "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", @@ -23810,7 +23602,6 @@ "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" @@ -23842,7 +23633,6 @@ "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" }, @@ -23998,8 +23788,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/recast": { "version": "0.23.6", @@ -24482,7 +24271,6 @@ "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" } @@ -24507,8 +24295,7 @@ "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, - "peer": true + "dev": true }, "node_modules/requireindex": { "version": "1.2.0", @@ -24528,8 +24315,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/resolve": { "version": "1.22.11", @@ -24756,6 +24542,7 @@ "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", @@ -24859,6 +24646,7 @@ "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", @@ -25030,7 +24818,6 @@ "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" } @@ -25205,8 +24992,7 @@ "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, - "peer": true + "dev": true }, "node_modules/set-function-length": { "version": "1.2.2", @@ -25464,7 +25250,6 @@ "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", @@ -25479,7 +25264,6 @@ "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" }, @@ -25492,7 +25276,6 @@ "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" } @@ -25501,8 +25284,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/snake-case": { "version": "3.0.4", @@ -25669,7 +25451,6 @@ "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" }, @@ -25682,7 +25463,6 @@ "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" } @@ -25691,15 +25471,13 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "peer": true + "dev": 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" }, @@ -25712,7 +25490,6 @@ "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" } @@ -26032,8 +25809,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/style-loader": { "version": "3.3.4", @@ -26078,8 +25854,7 @@ "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -26108,7 +25883,6 @@ "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" } @@ -26466,8 +26240,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/through2": { "version": "2.0.5", @@ -26543,8 +26316,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -26807,6 +26579,7 @@ "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" @@ -27525,15 +27298,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true, - "peer": true + "dev": 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" } @@ -27588,6 +27359,7 @@ "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", @@ -27906,6 +27678,7 @@ "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" }, @@ -27998,8 +27771,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -28089,8 +27861,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/which-typed-array": { "version": "1.1.15", @@ -28243,7 +28014,6 @@ "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" } @@ -28284,7 +28054,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -28307,7 +28076,6 @@ "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", @@ -28326,7 +28094,6 @@ "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" } @@ -28335,15 +28102,13 @@ "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, - "peer": true + "dev": 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" } @@ -28353,7 +28118,6 @@ "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", @@ -28368,7 +28132,6 @@ "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" },