From 507887eac3a0c5eb96d3d6f38bf91ed788561cda Mon Sep 17 00:00:00 2001 From: Ryo Matsukawa <76232929+ryo-manba@users.noreply.github.com> Date: Mon, 14 Oct 2024 23:13:04 +0900 Subject: [PATCH] chore(test): update testing libraries and refactor (#3886) --- apps/docs/components/sandpack/entries.ts | 2 +- jest.config.js | 2 +- package.json | 16 +- .../accordion/__tests__/accordion.test.tsx | 70 +- .../__tests__/autocomplete.test.tsx | 101 +- .../button/__tests__/button-group.test.tsx | 2 +- .../button/__tests__/button.test.tsx | 25 +- .../components/card/__tests__/card.test.tsx | 10 +- .../__tests__/checkbox-group.test.tsx | 25 +- .../checkbox/__tests__/checkbox.test.tsx | 52 +- .../components/chip/__tests__/chip.test.tsx | 10 +- .../date-input/__tests__/date-input.test.tsx | 35 +- .../date-input/__tests__/time-input.test.tsx | 31 +- .../__tests__/date-picker.test.tsx | 30 +- .../dropdown/__tests__/dropdown.test.tsx | 597 +++++---- .../listbox/__tests__/listbox.test.tsx | 24 +- .../components/menu/__tests__/menu.test.tsx | 48 +- .../components/modal/__tests__/modal.test.tsx | 13 +- .../navbar/__tests__/navbar.test.tsx | 30 +- .../popover/__tests__/popover.test.tsx | 62 +- .../components/radio/__tests__/radio.test.tsx | 42 +- .../select/__tests__/select.test.tsx | 141 +-- .../slider/__tests__/slider.test.tsx | 26 +- .../switch/__tests__/switch.test.tsx | 66 +- .../components/table/__tests__/table.test.tsx | 25 +- .../components/tabs/__tests__/tabs.test.tsx | 54 +- .../tooltip/__tests__/tooltip.test.tsx | 2 +- .../__tests__/clipboard.test.tsx | 2 +- .../__tests__/use-pagination.test.tsx | 4 +- .../__tests__/use-ref-state.test.tsx | 2 +- plop/hook/__tests__/{{hookName}}.test.tsx.hbs | 2 +- pnpm-lock.yaml | 1103 ++++++++--------- scripts/setup-test.ts | 2 +- 33 files changed, 1179 insertions(+), 1477 deletions(-) diff --git a/apps/docs/components/sandpack/entries.ts b/apps/docs/components/sandpack/entries.ts index f1bc2d217..191bc54e4 100644 --- a/apps/docs/components/sandpack/entries.ts +++ b/apps/docs/components/sandpack/entries.ts @@ -10,7 +10,7 @@ ReactDOM.createRoot(document.getElementById("root")).render(
-
+
);`; diff --git a/jest.config.js b/jest.config.js index 4c8ce18dd..aaa6fd92e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -18,7 +18,7 @@ module.exports = { ], }, transformIgnorePatterns: ["[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$"], - setupFilesAfterEnv: ["@testing-library/jest-dom/extend-expect", "./scripts/setup-test.ts"], + setupFilesAfterEnv: ["@testing-library/jest-dom", "./scripts/setup-test.ts"], globals: { "ts-jest": { tsconfig: "tsconfig.json", diff --git a/package.json b/package.json index 4bd51aaf5..662d939e5 100644 --- a/package.json +++ b/package.json @@ -73,17 +73,15 @@ "@swc-node/jest": "^1.5.2", "@swc/core": "^1.3.35", "@swc/jest": "^0.2.24", - "@testing-library/dom": "^8.1.0", - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^14.0.0", - "@testing-library/react-hooks": "^8.0.1", - "@testing-library/user-event": "^14.4.3", - "@types/jest": "^28.1.1", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.13", "@types/node": "^15.12.4", "@types/react": "^18.0.1", "@types/react-dom": "^18.0.0", "@types/shelljs": "^0.8.9", - "@types/testing-library__jest-dom": "5.14.5", "@typescript-eslint/eslint-plugin": "^5.42.0", "@typescript-eslint/parser": "^5.42.0", "chalk": "^4.1.2", @@ -115,8 +113,8 @@ "gray-matter": "^4.0.3", "husky": "^8.0.1", "intl-messageformat": "^10.1.0", - "jest": "^28.1.1", - "jest-environment-jsdom": "^28.1.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^28.1.3", "jest-watch-typeahead": "1.1.0", "lint-staged": "^13.0.3", "npm-check-updates": "^16.10.18", diff --git a/packages/components/accordion/__tests__/accordion.test.tsx b/packages/components/accordion/__tests__/accordion.test.tsx index ac63c95cb..8a4d78df7 100644 --- a/packages/components/accordion/__tests__/accordion.test.tsx +++ b/packages/components/accordion/__tests__/accordion.test.tsx @@ -30,7 +30,7 @@ describe("Accordion", () => { expect(() => wrapper.unmount()).not.toThrow(); - expect(spy).toBeCalledTimes(0); + expect(spy).toHaveBeenCalledTimes(0); }); it("ref should be forwarded", () => { @@ -121,9 +121,7 @@ describe("Accordion", () => { expect(button).toHaveAttribute("aria-expanded", "false"); - await act(async () => { - await user.click(button); - }); + await user.click(button); expect(button).toHaveAttribute("aria-expanded", "true"); }); @@ -163,18 +161,12 @@ describe("Accordion", () => { const second = wrapper.getByTestId("item-2"); const secondButton = second.querySelector("button") as HTMLElement; - act(() => { - focus(firstButton); - }); - - await act(async () => { - await user.keyboard("[ArrowDown]"); - }); + await focus(firstButton); + await user.keyboard("[ArrowDown]"); expect(secondButton).toHaveFocus(); - await act(async () => { - await user.keyboard("[ArrowUp]"); - }); + await user.keyboard("[ArrowUp]"); + expect(firstButton).toHaveFocus(); }); @@ -200,14 +192,10 @@ describe("Accordion", () => { focus(secondButton); }); - await act(async () => { - await user.keyboard("[Home]"); - }); + await user.keyboard("[Home]"); expect(firstButton).toHaveFocus(); - await act(async () => { - await user.keyboard("[End]"); - }); + await user.keyboard("[End]"); expect(secondButton).toHaveFocus(); }); @@ -233,9 +221,7 @@ describe("Accordion", () => { focus(firstButton); }); - await act(async () => { - await user.keyboard("[Tab]"); - }); + await user.keyboard("[Tab]"); expect(secondButton).toHaveFocus(); }); @@ -276,10 +262,7 @@ describe("Accordion", () => { expect(button).toHaveAttribute("aria-expanded", "false"); - await act(async () => { - await user.click(button); - }); - + await user.click(button); expect(button).toHaveAttribute("aria-expanded", "true"); }); @@ -300,17 +283,11 @@ describe("Accordion", () => { expect(item1.querySelector("[role='region']")).toBeInTheDocument(); - await act(async () => { - await user.click(button); - }); - + await user.click(button); const item2 = wrapper.getByTestId("item-2"); const button2 = item2.querySelector("button") as HTMLElement; - await act(async () => { - await user.click(button2); - }); - + await user.click(button2); expect(item1.querySelector("[role='region']")).toBeInTheDocument(); expect(item2.querySelector("[role='region']")).toBeInTheDocument(); }); @@ -331,29 +308,22 @@ describe("Accordion", () => { const firstButton = await wrapper.getByRole("button", {name: "Accordion Item 1"}); - await act(() => { + act(() => { focus(firstButton); }); - await act(async () => { - await user.keyboard("[Tab]"); - }); + + await user.keyboard("[Tab]"); expect(input).toHaveFocus(); - await act(async () => { - await user.keyboard("aaa"); - }); + await user.keyboard("aaa"); expect(input).toHaveValue("aaa"); - await act(async () => { - await user.keyboard("[ArrowLeft]"); - await user.keyboard("b"); - }); + await user.keyboard("[ArrowLeft]"); + await user.keyboard("b"); expect(input).toHaveValue("aaba"); - await act(async () => { - await user.keyboard("[ArrowRight]"); - await user.keyboard("c"); - }); + await user.keyboard("[ArrowRight]"); + await user.keyboard("c"); expect(input).toHaveValue("aabac"); }); diff --git a/packages/components/autocomplete/__tests__/autocomplete.test.tsx b/packages/components/autocomplete/__tests__/autocomplete.test.tsx index fb6162007..9b46dcaa5 100644 --- a/packages/components/autocomplete/__tests__/autocomplete.test.tsx +++ b/packages/components/autocomplete/__tests__/autocomplete.test.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import {within, render, renderHook, act} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {useForm} from "react-hook-form"; import {Autocomplete, AutocompleteItem, AutocompleteProps, AutocompleteSection} from "../src"; @@ -77,6 +77,12 @@ const AutocompleteExample = (props: Partial = {}) => ( ); describe("Autocomplete", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render(); @@ -172,9 +178,7 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("autocomplete"); // open the select listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -201,9 +205,7 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("autocomplete"); // open the select listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -211,9 +213,7 @@ describe("Autocomplete", () => { let options = wrapper.getAllByRole("option"); // select the target item - await act(async () => { - await userEvent.click(options[0]); - }); + await user.click(options[0]); const {container} = wrapper; @@ -224,9 +224,7 @@ describe("Autocomplete", () => { expect(clearButton).not.toBeNull(); // click the clear button - await act(async () => { - await userEvent.click(clearButton); - }); + await user.click(clearButton); // assert that the input has empty value expect(autocomplete).toHaveValue(""); @@ -253,9 +251,7 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("autocomplete"); // open the select listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -263,9 +259,7 @@ describe("Autocomplete", () => { let options = wrapper.getAllByRole("option"); // select the target item - await act(async () => { - await userEvent.click(options[0]); - }); + await user.click(options[0]); const {container} = wrapper; @@ -276,9 +270,7 @@ describe("Autocomplete", () => { expect(clearButton).not.toBeNull(); // click the clear button - await act(async () => { - await userEvent.click(clearButton); - }); + await user.click(clearButton); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -294,9 +286,7 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("autocomplete"); // open the select listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -304,9 +294,7 @@ describe("Autocomplete", () => { let options = wrapper.getAllByRole("option"); // select the target item - await act(async () => { - await userEvent.click(options[0]); - }); + await user.click(options[0]); const {container} = wrapper; @@ -317,9 +305,7 @@ describe("Autocomplete", () => { expect(clearButton).not.toBeNull(); /// click the clear button - await act(async () => { - await userEvent.click(clearButton); - }); + await user.click(clearButton); // assert that the input has empty value expect(autocomplete).toHaveValue(""); @@ -338,9 +324,7 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("autocomplete"); // open the select listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -348,9 +332,7 @@ describe("Autocomplete", () => { let options = wrapper.getAllByRole("option"); // select the target item - await act(async () => { - await userEvent.click(options[0]); - }); + await user.click(options[0]); const {container} = wrapper; @@ -361,9 +343,7 @@ describe("Autocomplete", () => { expect(clearButton).not.toBeNull(); // click the clear button - await act(async () => { - await userEvent.click(clearButton); - }); + await user.click(clearButton); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -395,9 +375,7 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("autocomplete"); // open the select listbox by clicking selector button - await act(async () => { - await userEvent.click(selectorButton); - }); + await user.click(selectorButton); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -406,9 +384,7 @@ describe("Autocomplete", () => { expect(autocomplete).toHaveFocus(); // close the select listbox by clicking selector button again - await act(async () => { - await userEvent.click(selectorButton); - }); + await user.click(selectorButton); // assert that the autocomplete listbox is closed expect(autocomplete).toHaveAttribute("aria-expanded", "false"); @@ -439,17 +415,13 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("close-when-clicking-outside-test"); // open the select listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); // click outside the autocomplete component - await act(async () => { - await userEvent.click(document.body); - }); + await user.click(document.body); // assert that the autocomplete is closed expect(autocomplete).toHaveAttribute("aria-expanded", "false"); @@ -488,17 +460,14 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("close-when-clicking-outside-test"); // open the autocomplete listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); // click outside the autocomplete component - await act(async () => { - await userEvent.click(document.body); - }); + await user.click(document.body); // assert that the autocomplete listbox is closed expect(autocomplete).toHaveAttribute("aria-expanded", "false"); @@ -522,9 +491,7 @@ describe("Autocomplete", () => { const autocomplete = wrapper.getByTestId("autocomplete"); // open the listbox - await act(async () => { - await userEvent.click(autocomplete); - }); + await user.click(autocomplete); // assert that the autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -537,9 +504,7 @@ describe("Autocomplete", () => { expect(options.length).toBe(3); // select the target item - await act(async () => { - await userEvent.click(options[0]); - }); + await user.click(options[0]); // assert that the input has target selection expect(autocomplete).toHaveValue("Penguin"); @@ -598,9 +563,7 @@ describe("Autocomplete", () => { expect(selectorButton2).not.toBeNull(); // open the select listbox by clicking selector button in the first autocomplete - await act(async () => { - await userEvent.click(selectorButton); - }); + await user.click(selectorButton); // assert that the first autocomplete listbox is open expect(autocomplete).toHaveAttribute("aria-expanded", "true"); @@ -609,9 +572,7 @@ describe("Autocomplete", () => { expect(autocomplete).toHaveFocus(); // close the select listbox by clicking the second autocomplete - await act(async () => { - await userEvent.click(selectorButton2); - }); + await user.click(selectorButton2); // assert that the first autocomplete listbox is closed expect(autocomplete).toHaveAttribute("aria-expanded", "false"); diff --git a/packages/components/button/__tests__/button-group.test.tsx b/packages/components/button/__tests__/button-group.test.tsx index d4452870f..ce31a5b02 100644 --- a/packages/components/button/__tests__/button-group.test.tsx +++ b/packages/components/button/__tests__/button-group.test.tsx @@ -35,7 +35,7 @@ describe("ButtonGroup", () => { let button = wrapper.getByTestId("button-test"); userEvent.click(button); - expect(handler).toBeCalledTimes(0); + expect(handler).toHaveBeenCalledTimes(0); }); it("should render different variants", () => { diff --git a/packages/components/button/__tests__/button.test.tsx b/packages/components/button/__tests__/button.test.tsx index c3930e8fa..4d55de3e2 100644 --- a/packages/components/button/__tests__/button.test.tsx +++ b/packages/components/button/__tests__/button.test.tsx @@ -1,9 +1,16 @@ import * as React from "react"; -import {act, render} from "@testing-library/react"; +import {render} from "@testing-library/react"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {Button} from "../src"; describe("Button", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render( - - - New file - Copy link - Edit file - - Delete file - - - , - ); - - let triggerButton = wrapper.getByTestId("trigger-test"); - - act(() => { - triggerButton.focus(); - }); - - expect(triggerButton).toHaveFocus(); - - fireEvent.keyDown(triggerButton, {key: "Enter", charCode: keyCodes.Enter}); - - let menu = wrapper.queryByRole("menu"); - - expect(menu).toBeTruthy(); - - let menuItems = wrapper.getAllByRole("menuitemradio"); - - expect(menuItems.length).toBe(4); - - expect(menuItems[0]).toHaveFocus(); - }); - - it("should focus on the first item on keyDown (Space)", async () => { - const wrapper = render( - - - - - - New file - Copy link - Edit file - - Delete file - - - , - ); - - let triggerButton = wrapper.getByTestId("trigger-test"); - - act(() => { - triggerButton.focus(); - }); - - expect(triggerButton).toHaveFocus(); - - fireEvent.keyDown(triggerButton, {key: " ", charCode: keyCodes[" "]}); - - let menu = wrapper.queryByRole("menu"); - - expect(menu).toBeTruthy(); - - let menuItems = wrapper.getAllByRole("menuitemradio"); - - expect(menuItems.length).toBe(4); - - expect(menuItems[0]).toHaveFocus(); - }); - - it("should press the item on keyDown (Enter)", async () => { - const user = userEvent.setup(); - - const logSpy = jest.spyOn(console, "log").mockImplementation(() => {}); - - const wrapper = render( - - - - - - { - /* eslint-disable no-console */ - console.log("ENTER"); - }} - > - New file - - Copy link - Edit file - - Delete file - - - , - ); - - let triggerButton = wrapper.getByTestId("trigger-test"); - - act(() => { - triggerButton.focus(); - }); - - expect(triggerButton).toHaveFocus(); - - fireEvent.keyDown(triggerButton, {key: "Enter", charCode: keyCodes.Enter}); - - let menu = wrapper.queryByRole("menu"); - - expect(menu).toBeTruthy(); - - let menuItems = wrapper.getAllByRole("menuitemradio"); - - expect(menuItems.length).toBe(4); - - expect(menuItems[0]).toHaveFocus(); - - await act(async () => { - await user.keyboard("[Enter]"); - }); - - expect(logSpy).toHaveBeenCalledWith("ENTER"); - - logSpy.mockRestore(); - }); - - it("should press the item on keyDown (Space)", async () => { - const user = userEvent.setup(); - - const logSpy = jest.spyOn(console, "log").mockImplementation(() => {}); - - const wrapper = render( - - - - - - { - /* eslint-disable no-console */ - console.log("SPACE"); - }} - > - New file - - Copy link - Edit file - - Delete file - - - , - ); - - let triggerButton = wrapper.getByTestId("trigger-test"); - - act(() => { - triggerButton.focus(); - }); - - expect(triggerButton).toHaveFocus(); - - fireEvent.keyDown(triggerButton, {key: "Enter", charCode: keyCodes.Enter}); - - let menu = wrapper.queryByRole("menu"); - - expect(menu).toBeTruthy(); - - let menuItems = wrapper.getAllByRole("menuitemradio"); - - expect(menuItems.length).toBe(4); - - expect(menuItems[0]).toHaveFocus(); - - await act(async () => { - await user.keyboard("[Space]"); - }); - - expect(logSpy).toHaveBeenCalledWith("SPACE"); - - logSpy.mockRestore(); - }); - - it("should respect closeOnSelect setting of DropdownItem (static)", async () => { - const onOpenChange = jest.fn(); - const wrapper = render( - - - - - - - New file - - Copy link - - , - ); - - let triggerButton = wrapper.getByTestId("trigger-test"); - - act(() => { - triggerButton.click(); - }); - expect(onOpenChange).toBeCalledTimes(1); - - let menuItems = wrapper.getAllByRole("menuitem"); - - await act(async () => { - await userEvent.click(menuItems[0]); - expect(onOpenChange).toBeCalledTimes(1); - }); - - await act(async () => { - await userEvent.click(menuItems[1]); - expect(onOpenChange).toBeCalledTimes(2); - }); - }); - - it("should respect closeOnSelect setting of DropdownItem (dynamic)", async () => { - const onOpenChange = jest.fn(); - const items = [ - { - key: "new", - label: "New file", - }, - { - key: "copy", - label: "Copy link", - }, - ]; - const wrapper = render( - - - - - - {(item) => ( - - {item.label} + describe("Keyboard interactions", () => { + it("should focus on the first item on keyDown (Enter)", async () => { + const wrapper = render( + + + + + + New file + Copy link + Edit file + + Delete file - )} - - , - ); + + , + ); - let triggerButton = wrapper.getByTestId("trigger-test"); + let triggerButton = wrapper.getByTestId("trigger-test"); - act(() => { - triggerButton.click(); - }); - expect(onOpenChange).toBeCalledTimes(1); + act(() => { + triggerButton.focus(); + }); - let menuItems = wrapper.getAllByRole("menuitem"); + expect(triggerButton).toHaveFocus(); - await act(async () => { - await userEvent.click(menuItems[0]); - expect(onOpenChange).toBeCalledTimes(1); + fireEvent.keyDown(triggerButton, {key: "Enter", charCode: keyCodes.Enter}); + + let menu = wrapper.queryByRole("menu"); + + expect(menu).toBeTruthy(); + + let menuItems = wrapper.getAllByRole("menuitemradio"); + + expect(menuItems.length).toBe(4); + + expect(menuItems[0]).toHaveFocus(); }); - await act(async () => { - await userEvent.click(menuItems[1]); - expect(onOpenChange).toBeCalledTimes(2); + it("should focus on the first item on keyDown (Space)", async () => { + const wrapper = render( + + + + + + New file + Copy link + Edit file + + Delete file + + + , + ); + + let triggerButton = wrapper.getByTestId("trigger-test"); + + act(() => { + triggerButton.focus(); + }); + + expect(triggerButton).toHaveFocus(); + + fireEvent.keyDown(triggerButton, {key: " ", charCode: keyCodes[" "]}); + + let menu = wrapper.queryByRole("menu"); + + expect(menu).toBeTruthy(); + + let menuItems = wrapper.getAllByRole("menuitemradio"); + + expect(menuItems.length).toBe(4); + + expect(menuItems[0]).toHaveFocus(); + }); + + it("should press the item on keyDown (Enter)", async () => { + const logSpy = jest.spyOn(console, "log").mockImplementation(() => {}); + + const wrapper = render( + + + + + + { + /* eslint-disable no-console */ + console.log("ENTER"); + }} + > + New file + + Copy link + Edit file + + Delete file + + + , + ); + + let triggerButton = wrapper.getByTestId("trigger-test"); + + act(() => { + triggerButton.focus(); + }); + + expect(triggerButton).toHaveFocus(); + + fireEvent.keyDown(triggerButton, {key: "Enter", charCode: keyCodes.Enter}); + + let menu = wrapper.queryByRole("menu"); + + expect(menu).toBeTruthy(); + + let menuItems = wrapper.getAllByRole("menuitemradio"); + + expect(menuItems.length).toBe(4); + + expect(menuItems[0]).toHaveFocus(); + + await user.keyboard("[Enter]"); + + expect(logSpy).toHaveBeenCalledWith("ENTER"); + + logSpy.mockRestore(); + }); + + it("should press the item on keyDown (Space)", async () => { + const logSpy = jest.spyOn(console, "log").mockImplementation(() => {}); + + const wrapper = render( + + + + + + { + /* eslint-disable no-console */ + console.log("SPACE"); + }} + > + New file + + Copy link + Edit file + + Delete file + + + , + ); + + let triggerButton = wrapper.getByTestId("trigger-test"); + + act(() => { + triggerButton.focus(); + }); + + expect(triggerButton).toHaveFocus(); + + fireEvent.keyDown(triggerButton, {key: "Enter", charCode: keyCodes.Enter}); + + let menu = wrapper.queryByRole("menu"); + + expect(menu).toBeTruthy(); + + let menuItems = wrapper.getAllByRole("menuitemradio"); + + expect(menuItems.length).toBe(4); + + expect(menuItems[0]).toHaveFocus(); + + await user.keyboard("[Space]"); + + expect(logSpy).toHaveBeenCalledWith("SPACE"); + + logSpy.mockRestore(); + }); + + it("should respect closeOnSelect setting of DropdownItem (static)", async () => { + const onOpenChange = jest.fn(); + const wrapper = render( + + + + + + + New file + + Copy link + + , + ); + + let triggerButton = wrapper.getByTestId("trigger-test"); + + await user.click(triggerButton); + + expect(onOpenChange).toHaveBeenCalledTimes(1); + + let menuItems = wrapper.getAllByRole("menuitem"); + + await user.click(menuItems[0]); + expect(onOpenChange).toHaveBeenCalledTimes(1); + + await user.click(menuItems[1]); + expect(onOpenChange).toHaveBeenCalledTimes(2); + }); + + it("should respect closeOnSelect setting of DropdownItem (dynamic)", async () => { + const onOpenChange = jest.fn(); + const items = [ + { + key: "new", + label: "New file", + }, + { + key: "copy", + label: "Copy link", + }, + ]; + const wrapper = render( + + + + + + {(item) => ( + + {item.label} + + )} + + , + ); + + let triggerButton = wrapper.getByTestId("trigger-test"); + + await user.click(triggerButton); + expect(onOpenChange).toHaveBeenCalledTimes(1); + + let menuItems = wrapper.getAllByRole("menuitem"); + + await user.click(menuItems[0]); + expect(onOpenChange).toHaveBeenCalledTimes(1); + + await user.click(menuItems[1]); + expect(onOpenChange).toHaveBeenCalledTimes(2); }); }); }); diff --git a/packages/components/listbox/__tests__/listbox.test.tsx b/packages/components/listbox/__tests__/listbox.test.tsx index a3d3ab0ba..36bc7ebca 100644 --- a/packages/components/listbox/__tests__/listbox.test.tsx +++ b/packages/components/listbox/__tests__/listbox.test.tsx @@ -1,10 +1,16 @@ import * as React from "react"; -import {act, render} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import {render} from "@testing-library/react"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {Listbox, ListboxItem, ListboxSection} from "../src"; describe("Listbox", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render( @@ -145,11 +151,8 @@ describe("Listbox", () => { expect(listboxItems.length).toBe(4); - await act(async () => { - await userEvent.click(listboxItems[1]); - - expect(onSelectionChange).toBeCalledTimes(1); - }); + await user.click(listboxItems[1]); + expect(onSelectionChange).toHaveBeenCalledTimes(1); }); it("should work with multiple selection (controlled)", async () => { @@ -179,11 +182,8 @@ describe("Listbox", () => { expect(listboxItems.length).toBe(4); - await act(async () => { - await userEvent.click(listboxItems[0]); - - expect(onSelectionChange).toBeCalledTimes(1); - }); + await user.click(listboxItems[0]); + expect(onSelectionChange).toHaveBeenCalledTimes(1); }); it("should show checkmarks if selectionMode is single and has a selected item", () => { diff --git a/packages/components/menu/__tests__/menu.test.tsx b/packages/components/menu/__tests__/menu.test.tsx index aeb7f14a5..98530665e 100644 --- a/packages/components/menu/__tests__/menu.test.tsx +++ b/packages/components/menu/__tests__/menu.test.tsx @@ -1,10 +1,16 @@ import * as React from "react"; -import {act, render} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import {render} from "@testing-library/react"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {Menu, MenuItem, MenuSection} from "../src"; describe("Menu", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render( @@ -146,11 +152,8 @@ describe("Menu", () => { expect(menuItems.length).toBe(4); - await act(async () => { - await userEvent.click(menuItems[1]); - - expect(onSelectionChange).toBeCalledTimes(1); - }); + await user.click(menuItems[1]); + expect(onSelectionChange).toHaveBeenCalledTimes(1); }); it("should work with multiple selection (controlled)", async () => { @@ -180,11 +183,8 @@ describe("Menu", () => { expect(menuItems.length).toBe(4); - await act(async () => { - await userEvent.click(menuItems[0]); - - expect(onSelectionChange).toBeCalledTimes(1); - }); + await user.click(menuItems[0]); + expect(onSelectionChange).toHaveBeenCalledTimes(1); }); it("should show checkmarks if selectionMode is single and has a selected item", () => { @@ -291,11 +291,8 @@ describe("Menu", () => { let menuItems = wrapper.getAllByRole("menuitem"); - await act(async () => { - await userEvent.click(menuItems[1]); - - expect(onAction).toBeCalledTimes(1); - }); + await user.click(menuItems[1]); + expect(onAction).toHaveBeenCalledTimes(1); }); it("should not dispatch onAction events if item is disabled", async () => { @@ -316,11 +313,8 @@ describe("Menu", () => { let menuItems = wrapper.getAllByRole("menuitem"); - await act(async () => { - await userEvent.click(menuItems[1]); - - expect(onAction).toBeCalledTimes(0); - }); + await user.click(menuItems[1]); + expect(onAction).toHaveBeenCalledTimes(0); }); it("should dispatch onPress, onAction and onClick events", async () => { @@ -343,12 +337,10 @@ describe("Menu", () => { let menuItems = wrapper.getAllByRole("menuitem"); - await act(async () => { - await userEvent.click(menuItems[0]); + await user.click(menuItems[0]); - expect(onAction).toBeCalledTimes(1); - expect(onPress).toBeCalledTimes(1); - expect(onClick).toBeCalledTimes(1); - }); + expect(onAction).toHaveBeenCalledTimes(1); + expect(onPress).toHaveBeenCalledTimes(1); + expect(onClick).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/components/modal/__tests__/modal.test.tsx b/packages/components/modal/__tests__/modal.test.tsx index 70b522569..b207a2269 100644 --- a/packages/components/modal/__tests__/modal.test.tsx +++ b/packages/components/modal/__tests__/modal.test.tsx @@ -1,5 +1,6 @@ import * as React from "react"; -import {act, render, fireEvent} from "@testing-library/react"; +import {render, fireEvent} from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import {Modal, ModalContent, ModalBody, ModalHeader, ModalFooter} from "../src"; @@ -25,7 +26,7 @@ describe("Modal", () => { expect(() => wrapper.unmount()).not.toThrow(); - expect(spy).toBeCalledTimes(0); + expect(spy).toHaveBeenCalledTimes(0); }); it("ref should be forwarded", () => { @@ -68,7 +69,7 @@ describe("Modal", () => { expect(modal).toHaveAttribute("aria-describedby", modalBody.id); }); - test("should fire 'onOpenChange' callback when close button is clicked", () => { + test("should fire 'onOpenChange' callback when close button is clicked", async () => { const onClose = jest.fn(); const {getByLabelText} = render( @@ -83,9 +84,9 @@ describe("Modal", () => { const closeButton = getByLabelText("Close"); - act(() => { - closeButton.click(); - }); + const user = userEvent.setup(); + + await user.click(closeButton); expect(onClose).toHaveBeenCalled(); }); diff --git a/packages/components/navbar/__tests__/navbar.test.tsx b/packages/components/navbar/__tests__/navbar.test.tsx index 0b0170eb4..d2d9c4355 100644 --- a/packages/components/navbar/__tests__/navbar.test.tsx +++ b/packages/components/navbar/__tests__/navbar.test.tsx @@ -1,5 +1,6 @@ import * as React from "react"; -import {act, render} from "@testing-library/react"; +import {render} from "@testing-library/react"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import { Navbar, @@ -18,6 +19,12 @@ window.scrollTo = jest.fn(); const spy = jest.spyOn(console, "error").mockImplementation(() => {}); describe("Navbar", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + afterEach(() => { jest.clearAllMocks(); }); @@ -62,7 +69,7 @@ describe("Navbar", () => { expect(navbarContent.children.length).toBe(5); }); - it("should not throw error after toggle click", () => { + it("should not throw error after toggle click", async () => { const items = ["item1", "item2", "item3", "item4", "item5"]; const wrapper = render( @@ -85,14 +92,12 @@ describe("Navbar", () => { const toggle = wrapper.getByTestId("navbar-toggle-test"); - act(() => { - toggle.click(); - }); + await user.click(toggle); - expect(spy).toBeCalledTimes(0); + expect(spy).toHaveBeenCalledTimes(0); }); - it("should render correctly with menu", () => { + it("should render correctly with menu", async () => { const items = ["item1", "item2", "item3", "item4", "item5"]; const wrapper = render( @@ -115,16 +120,13 @@ describe("Navbar", () => { const toggle = wrapper.getByTestId("navbar-toggle-test"); - act(() => { - toggle.click(); - }); - + await user.click(toggle); const menu = wrapper.getByTestId("navbar-menu-test"); expect(menu.children.length).toBe(items.length); }); - it("should call on onChange when toggle is clicked", () => { + it("should call on onChange when toggle is clicked", async () => { const onChange = jest.fn(); const wrapper = render( @@ -142,9 +144,7 @@ describe("Navbar", () => { const toggle = wrapper.getByTestId("navbar-toggle-test"); - act(() => { - toggle.click(); - }); + await user.click(toggle); expect(onChange).toHaveBeenCalled(); }); diff --git a/packages/components/popover/__tests__/popover.test.tsx b/packages/components/popover/__tests__/popover.test.tsx index a73021d66..0808161f5 100644 --- a/packages/components/popover/__tests__/popover.test.tsx +++ b/packages/components/popover/__tests__/popover.test.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import {render, fireEvent, act} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {Button} from "@nextui-org/button"; import {Popover, PopoverContent, PopoverTrigger} from "../src"; @@ -11,6 +11,12 @@ import {Select, SelectItem} from "../../select/src"; const spy = jest.spyOn(console, "error").mockImplementation(() => {}); describe("Popover", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + afterEach(() => { jest.clearAllMocks(); }); @@ -30,7 +36,7 @@ describe("Popover", () => { expect(() => wrapper.unmount()).not.toThrow(); }); - it("should not throw error when clicking trigger button", () => { + it("should not throw error when clicking trigger button", async () => { const wrapper = render( @@ -44,11 +50,9 @@ describe("Popover", () => { const trigger = wrapper.getByTestId("trigger-test"); // open popover - act(() => { - trigger.click(); - }); + await user.click(trigger); - expect(spy).toBeCalledTimes(0); + expect(spy).toHaveBeenCalledTimes(0); }); it("ref should be forwarded", () => { @@ -130,7 +134,7 @@ describe("Popover", () => { expect(onClose).toHaveBeenCalledTimes(1); }); - it("should work with NextUI button", () => { + it("should work with NextUI button", async () => { const onClose = jest.fn(); const wrapper = render( @@ -149,15 +153,11 @@ describe("Popover", () => { const trigger = wrapper.getByTestId("trigger-test"); // open popover - act(() => { - trigger.click(); - }); + await user.click(trigger); expect(onClose).toHaveBeenCalledTimes(0); // close popover - act(() => { - trigger.click(); - }); + await user.click(trigger); expect(onClose).toHaveBeenCalledTimes(1); }); @@ -193,9 +193,7 @@ describe("Popover", () => { expect(popover2).not.toBeNull(); // open the popover by clicking popover in the first popover - await act(async () => { - await userEvent.click(popover); - }); + await user.click(popover); // assert that the first popover is open expect(popover).toHaveAttribute("aria-expanded", "true"); @@ -204,9 +202,7 @@ describe("Popover", () => { expect(popover2).toHaveAttribute("aria-expanded", "false"); // close the popover by clicking the second popover - await act(async () => { - await userEvent.click(popover2); - }); + await user.click(popover2); // assert that the first popover is closed expect(popover).toHaveAttribute("aria-expanded", "false"); @@ -232,9 +228,7 @@ describe("Popover", () => { const trigger = wrapper.getByTestId("trigger-test"); // open popover - await act(async () => { - await userEvent.click(trigger); - }); + await user.click(trigger); const {getByRole} = wrapper; @@ -260,9 +254,9 @@ describe("Popover", () => { await act(async () => { // open popover - await userEvent.click(trigger); + await user.click(trigger); // close popover - await userEvent.click(trigger); + await user.click(trigger); // assert that the focus is restored back to trigger expect(trigger).toHaveFocus(); }); @@ -286,27 +280,21 @@ describe("Popover", () => { const popover = wrapper.getByTestId("popover"); - await act(async () => { - // open popover - await userEvent.click(popover); - }); + // open popover + await user.click(popover); // assert that the popover is open expect(popover).toHaveAttribute("aria-expanded", "true"); const select = wrapper.getByTestId("select"); - await act(async () => { - // open select - await userEvent.click(select); - }); + // open select + await user.click(select); // assert that the select is open expect(select).toHaveAttribute("aria-expanded", "true"); - await act(async () => { - await userEvent.click(document.body); - }); + await user.click(document.body); // assert that the select is closed expect(select).toHaveAttribute("aria-expanded", "false"); @@ -334,9 +322,7 @@ describe("Popover", () => { const popover = wrapper.getByTestId("popover"); // open popover - await act(async () => { - await userEvent.click(popover); - }); + await user.click(popover); // assert that the popover is open expect(popover).toHaveAttribute("aria-expanded", "true"); diff --git a/packages/components/radio/__tests__/radio.test.tsx b/packages/components/radio/__tests__/radio.test.tsx index cd5b51302..014caaf7c 100644 --- a/packages/components/radio/__tests__/radio.test.tsx +++ b/packages/components/radio/__tests__/radio.test.tsx @@ -1,10 +1,16 @@ import * as React from "react"; import {act, render} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {RadioGroup, Radio, RadioGroupProps} from "../src"; describe("Radio", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render( @@ -62,7 +68,7 @@ describe("Radio", () => { expect(wrapper.container.querySelector("[data-testid=radio-test-2] input")).toBeChecked(); }); - it("should change value after click", () => { + it("should change value after click", async () => { const {container} = render( Option 1 @@ -74,14 +80,11 @@ describe("Radio", () => { let radio2 = container.querySelector(".radio-test-2 input") as HTMLInputElement; - act(() => { - radio2.click(); - }); - + await user.click(radio2); expect(radio2).toBeChecked(); }); - it("should ignore events when disabled", () => { + it("should ignore events when disabled", async () => { const {container} = render( @@ -93,14 +96,11 @@ describe("Radio", () => { let radio1 = container.querySelector(".radio-test-1 input") as HTMLInputElement; - act(() => { - radio1.click(); - }); - + await user.click(radio1); expect(radio1).not.toBeChecked(); }); - it('should work correctly with "onValueChange" prop', () => { + it('should work correctly with "onValueChange" prop', async () => { const onValueChange = jest.fn(); const {container} = render( @@ -114,11 +114,8 @@ describe("Radio", () => { let radio2 = container.querySelector(".radio-test-2 input") as HTMLInputElement; - act(() => { - radio2.click(); - }); - - expect(onValueChange).toBeCalledWith("2"); + await user.click(radio2); + expect(onValueChange).toHaveBeenCalledWith("2"); expect(radio2).toBeChecked(); }); @@ -141,7 +138,7 @@ describe("Radio", () => { radio2.focus(); }); - expect(onFocus).toBeCalled(); + expect(onFocus).toHaveBeenCalled(); }); it("should have required attribute when isRequired with native validationBehavior", () => { @@ -178,7 +175,7 @@ describe("Radio", () => { expect(radios[0]).not.toHaveAttribute("required"); }); - it("should work correctly with controlled value", () => { + it("should work correctly with controlled value", async () => { const onValueChange = jest.fn(); const Component = ({onValueChange}: Omit) => { @@ -205,11 +202,8 @@ describe("Radio", () => { let radio2 = container.querySelector(".radio-test-2 input") as HTMLInputElement; - act(() => { - radio2.click(); - }); - - expect(onValueChange).toBeCalled(); + await user.click(radio2); + expect(onValueChange).toHaveBeenCalled(); expect(radio2).toBeChecked(); }); diff --git a/packages/components/select/__tests__/select.test.tsx b/packages/components/select/__tests__/select.test.tsx index 6032ce951..6776344ee 100644 --- a/packages/components/select/__tests__/select.test.tsx +++ b/packages/components/select/__tests__/select.test.tsx @@ -1,8 +1,8 @@ import type {SelectProps} from "../src"; import * as React from "react"; -import {render, renderHook, act} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import {render, renderHook} from "@testing-library/react"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {useForm} from "react-hook-form"; import {Select, SelectItem, SelectSection} from "../src"; @@ -51,7 +51,7 @@ const itemsSectionData = [ ]; describe("Select", () => { - let user; + let user: UserEvent; beforeEach(() => { user = userEvent.setup(); @@ -153,11 +153,8 @@ describe("Select", () => { expect(listboxItems.length).toBe(3); - await act(async () => { - await user.click(listboxItems[1]); - - expect(onSelectionChange).toBeCalledTimes(1); - }); + await user.click(listboxItems[1]); + expect(onSelectionChange).toHaveBeenCalledTimes(1); }); it("should work with multiple selection (controlled)", async () => { @@ -186,12 +183,10 @@ describe("Select", () => { expect(listboxItems.length).toBe(3); - await act(async () => { - await user.click(listboxItems[1]); - await user.click(listboxItems[2]); + await user.click(listboxItems[1]); + await user.click(listboxItems[2]); - expect(onSelectionChange).toBeCalledTimes(2); - }); + expect(onSelectionChange).toHaveBeenCalledTimes(2); }); it("should work with dynamic placeholder and renderValue", async () => { @@ -226,15 +221,11 @@ describe("Select", () => { const select = wrapper.getByTestId("render-selected-item-test"); - await act(async () => { - await user.click(select); - }); + await user.click(select); const listboxItems = wrapper.getAllByRole("option"); - await act(async () => { - await user.click(listboxItems[0]); - }); + await user.click(listboxItems[0]); expect(select).toHaveTextContent("Penguin"); expect(wrapper.queryByText("Select an favorite animal")).toBe(null); @@ -266,17 +257,13 @@ describe("Select", () => { const select = wrapper.getByTestId("close-when-clicking-outside-test"); // open the select dropdown - await act(async () => { - await user.click(select); - }); + await user.click(select); // assert that the select is open expect(select).toHaveAttribute("aria-expanded", "true"); // click outside the select component - await act(async () => { - await user.click(document.body); - }); + await user.click(document.body); // assert that the select is closed expect(select).toHaveAttribute("aria-expanded", "false"); @@ -306,17 +293,13 @@ describe("Select", () => { const select = wrapper.getByTestId("close-when-clicking-outside-test"); // open the select dropdown - await act(async () => { - await user.click(select); - }); + await user.click(select); // assert that the select is open expect(select).toHaveAttribute("aria-expanded", "true"); // click outside the select component - await act(async () => { - await user.click(document.body); - }); + await user.click(document.body); // assert that the select is closed expect(select).toHaveAttribute("aria-expanded", "false"); @@ -341,13 +324,11 @@ describe("Select", () => { ); const select = wrapper.getByTestId("test-select"); - await act(async () => { - await user.click(document.body); - await user.tab(); - await user.type(select, "z", {skipClick: true}); + await user.click(document.body); + await user.tab(); + await user.type(select, "z", {skipClick: true}); - expect(onSelectionChange).toBeCalledTimes(0); - }); + expect(onSelectionChange).toHaveBeenCalledTimes(0); }); it("should pre-select items based on defaultSelectedKeys (numeric keys)", () => { @@ -424,17 +405,15 @@ describe("Select", () => { expect(listbox).toBeInTheDocument(); // Select item and check the correct ID is passed to the callback - await act(async () => { - await user.click(wrapperWithId.getByRole("option", {name: itemsWithId[0].value})); - }); + await user.click(wrapperWithId.getByRole("option", {name: itemsWithId[0].value})); + expect(onSelectionChangeId).toHaveBeenCalled(); let selectionArg = onSelectionChangeId.mock.calls[0][0]; expect([...selectionArg]).toEqual([itemsWithId[0].id]); - await act(async () => { - await user.click(wrapperWithId.getByRole("option", {name: itemsWithId[1].value})); - }); + await user.click(wrapperWithId.getByRole("option", {name: itemsWithId[1].value})); + expect(onSelectionChangeId).toHaveBeenCalledTimes(2); selectionArg = onSelectionChangeId.mock.calls[1][0]; expect([...selectionArg]).toEqual([itemsWithId[1].id]); @@ -464,17 +443,15 @@ describe("Select", () => { expect(listbox).toBeInTheDocument(); // Select item and check the correct key is passed to the callback - await act(async () => { - await user.click(wrapperWithKey.getByRole("option", {name: itemsWithKey[0].value})); - }); + await user.click(wrapperWithKey.getByRole("option", {name: itemsWithKey[0].value})); + expect(onSelectionChangeKey).toHaveBeenCalled(); let selectionArg = onSelectionChangeKey.mock.calls[0][0]; expect([...selectionArg]).toEqual([itemsWithKey[0].key]); - await act(async () => { - await user.click(wrapperWithKey.getByRole("option", {name: itemsWithKey[1].value})); - }); + await user.click(wrapperWithKey.getByRole("option", {name: itemsWithKey[1].value})); + expect(onSelectionChangeKey).toHaveBeenCalledTimes(2); selectionArg = onSelectionChangeKey.mock.calls[1][0]; expect([...selectionArg]).toEqual([itemsWithKey[1].key]); @@ -537,9 +514,7 @@ describe("Select", () => { expect(select2).not.toBeNull(); // open the select listbox by clicking selector button in the first select - await act(async () => { - await userEvent.click(select); - }); + await user.click(select); // assert that the first select listbox is open expect(select).toHaveAttribute("aria-expanded", "true"); @@ -548,9 +523,7 @@ describe("Select", () => { expect(select2).toHaveAttribute("aria-expanded", "false"); // close the select listbox by clicking the second select - await act(async () => { - await userEvent.click(select2); - }); + await user.click(select2); // assert that the first select listbox is closed expect(select).toHaveAttribute("aria-expanded", "false"); @@ -603,8 +576,6 @@ describe("Select", () => { it("should unset form value", async () => { const logSpy = jest.spyOn(console, "log"); - const user = userEvent.setup(); - const wrapper = render(
{ const submitButton = wrapper.getByTestId("submit-button"); - await act(async () => { - await user.click(submitButton); - }); - + await user.click(submitButton); expect(logSpy).toHaveBeenCalledWith(JSON.stringify({select: "foo"})); const select = wrapper.getByTestId("select"); expect(select).not.toBeNull(); - await act(async () => { - await user.click(select); - }); - + await user.click(select); const listbox = wrapper.getByRole("listbox"); expect(listbox).toBeTruthy(); @@ -656,13 +621,8 @@ describe("Select", () => { expect(listboxItems.length).toBe(2); - await act(async () => { - await user.click(listboxItems[0]); - }); - - await act(async () => { - await user.click(submitButton); - }); + await user.click(listboxItems[0]); + await user.click(submitButton); expect(logSpy).toHaveBeenCalledWith(JSON.stringify({select: ""})); }); @@ -682,22 +642,18 @@ describe("Select", () => { , ); - const select = wrapper.getByTestId("select"); + const select = await wrapper.findByTestId("select"); expect(select).not.toBeNull(); // open the select listbox by clicking selector button - await act(async () => { - await userEvent.click(select); - }); + await user.click(select); // assert that the select listbox is open expect(select).toHaveAttribute("aria-expanded", "true"); // open the select listbox by clicking selector button - await act(async () => { - await userEvent.click(select); - }); + await user.click(select); // assert that the select listbox is closed expect(select).toHaveAttribute("aria-expanded", "false"); @@ -730,11 +686,9 @@ describe("Select", () => { expect(listboxItems.length).toBe(10); - await act(async () => { - await user.click(listboxItems[1]); + await user.click(listboxItems[1]); - expect(onChange).toBeCalledTimes(1); - }); + expect(onChange).toHaveBeenCalledTimes(1); }); it("should work with onChange (>= 300 select items)", async () => { @@ -764,11 +718,9 @@ describe("Select", () => { expect(listboxItems.length).toBe(300); - await act(async () => { - await user.click(listboxItems[1]); + await user.click(listboxItems[1]); - expect(onChange).toBeCalledTimes(1); - }); + expect(onChange).toHaveBeenCalledTimes(1); }); it("should place the label outside when labelPlacement is outside", () => { @@ -858,11 +810,21 @@ describe("Select with React Hook Form", () => { wrapper = render( - {(item) => {item.label}} - {(item) => {item.label}} @@ -870,6 +832,7 @@ describe("Select with React Hook Form", () => { data-testid="select-3" items={itemsData} {...register("requiredField", {required: true})} + aria-label="select-3" > {(item) => {item.label}} diff --git a/packages/components/slider/__tests__/slider.test.tsx b/packages/components/slider/__tests__/slider.test.tsx index 0100c814c..842f5f255 100644 --- a/packages/components/slider/__tests__/slider.test.tsx +++ b/packages/components/slider/__tests__/slider.test.tsx @@ -1,10 +1,16 @@ import * as React from "react"; import {render, act} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {Slider, SliderValue} from "../src"; describe("Slider", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render(); @@ -138,9 +144,7 @@ describe("Slider", () => { expect(output).toHaveTextContent("50"); // change slider value - await act(async () => { - await userEvent.click(button); - }); + await user.click(button); expect(slider).toHaveProperty("value", "55"); expect(slider).toHaveAttribute("aria-valuetext", "55"); @@ -201,9 +205,7 @@ describe("Slider", () => { expect(rightSlider).toHaveAttribute("aria-valuetext", "20"); // change slider value - await act(async () => { - await userEvent.click(button); - }); + await user.click(button); expect(leftSlider).toHaveProperty("value", "15"); expect(leftSlider).toHaveAttribute("aria-valuetext", "15"); @@ -318,10 +320,7 @@ describe("Slider", () => { expect(marks).toHaveLength(3); - await act(async () => { - await userEvent.click(marks[1]); - }); - + await user.click(marks[1]); const slider = getByRole("slider"); expect(slider).toHaveProperty("value", "0.5"); @@ -358,10 +357,7 @@ describe("Slider", () => { expect(marks).toHaveLength(3); - await act(async () => { - await userEvent.click(marks[1]); - }); - + await user.click(marks[1]); const [leftSlider, rightSlider] = getAllByRole("slider"); expect(leftSlider).toHaveProperty("value", "0.5"); diff --git a/packages/components/switch/__tests__/switch.test.tsx b/packages/components/switch/__tests__/switch.test.tsx index d9b76e909..b8ae15677 100644 --- a/packages/components/switch/__tests__/switch.test.tsx +++ b/packages/components/switch/__tests__/switch.test.tsx @@ -1,11 +1,17 @@ import * as React from "react"; -import {render, renderHook, act} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import {render, renderHook} from "@testing-library/react"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {useForm} from "react-hook-form"; import {Switch} from "../src"; describe("Switch", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render(); @@ -19,35 +25,26 @@ describe("Switch", () => { expect(ref.current).not.toBeNull(); }); - it("should check and uncheck", () => { + it("should check and uncheck", async () => { const {getByRole} = render(); const checkbox = getByRole("switch"); expect(checkbox).not.toBeChecked(); - act(() => { - checkbox.click(); - }); - + await user.click(checkbox); expect(checkbox).toBeChecked(); - act(() => { - checkbox.click(); - }); - + await user.click(checkbox); expect(checkbox).not.toBeChecked(); }); - it("should not check if disabled", () => { + it("should not check if disabled", async () => { const {getByRole} = render(); const checkbox = getByRole("switch"); - act(() => { - checkbox.click(); - }); - + await user.click(checkbox); expect(checkbox).not.toBeChecked(); }); @@ -59,19 +56,16 @@ describe("Switch", () => { expect(checkbox).toBeChecked(); }); - it("should not check if readOnly", () => { + it("should not check if readOnly", async () => { const {getByRole} = render(); const checkbox = getByRole("switch"); - act(() => { - checkbox.click(); - }); - + await user.click(checkbox); expect(checkbox).not.toBeChecked(); }); - it("should check and uncheck with controlled state", () => { + it("should check and uncheck with controlled state", async () => { const ControlledSwitch = ({onChange}: any) => { const [isSelected, setIsSelected] = React.useState(false); @@ -95,10 +89,7 @@ describe("Switch", () => { expect(checkbox).not.toBeChecked(); - act(() => { - checkbox.click(); - }); - + await user.click(checkbox); expect(checkbox).toBeChecked(); expect(onChange).toHaveBeenCalledWith(true); @@ -121,7 +112,7 @@ describe("Switch", () => { expect(wrapper.getByTestId("thumb-icon")).toBeInTheDocument(); }); - it("should change the thumbIcon when clicked", () => { + it("should change the thumbIcon when clicked", async () => { const thumbIcon = jest.fn((props) => { const {isSelected} = props; @@ -138,10 +129,7 @@ describe("Switch", () => { expect(checkbox).not.toBeChecked(); - act(() => { - checkbox.click(); - }); - + await user.click(checkbox); expect(checkbox).toBeChecked(); expect(thumbIcon).toHaveBeenCalledWith( @@ -154,10 +142,7 @@ describe("Switch", () => { expect(checkedthumbIcon).toBeInTheDocument(); - act(() => { - checkbox.click(); - }); - + await user.click(checkbox); expect(checkbox).not.toBeChecked(); expect(thumbIcon).toHaveBeenCalledWith( @@ -253,21 +238,16 @@ describe("Switch with React Hook Form", () => { const user = userEvent.setup(); await user.click(submitButton); - expect(onSubmit).toHaveBeenCalledTimes(0); }); it("should submit form when required field is not empty", async () => { - act(() => { - switch3.click(); - }); - - expect(switch3.checked).toBe(true); - const user = userEvent.setup(); - await user.click(submitButton); + await switch3.click(); + expect(switch3.checked).toBe(true); + await user.click(submitButton); expect(onSubmit).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/components/table/__tests__/table.test.tsx b/packages/components/table/__tests__/table.test.tsx index e93b9be34..3e1cde7ab 100644 --- a/packages/components/table/__tests__/table.test.tsx +++ b/packages/components/table/__tests__/table.test.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import {act, render} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {Table, TableHeader, TableCell, TableColumn, TableBody, TableRow} from "../src"; @@ -16,6 +16,12 @@ let items = [ ]; describe("Table", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); + it("should render correctly", () => { const wrapper = render( @@ -131,7 +137,7 @@ describe("Table", () => { expect(wrapper.getAllByRole("gridcell")).toHaveLength(4); }); - it("should work with single selectionMode='single'", () => { + it("should work with single selectionMode='single'", async () => { const onRowAction = jest.fn(); const wrapper = render( @@ -163,14 +169,11 @@ describe("Table", () => { // get the first row const row1 = wrapper.getAllByRole("row")[1]; - act(() => { - row1.click(); - }); - + await user.click(row1); expect(onRowAction).toHaveBeenCalledTimes(1); }); - it("should work with single selectionMode='multiple'", () => { + it("should work with single selectionMode='multiple'", async () => { const onRowAction = jest.fn(); const wrapper = render( @@ -207,15 +210,13 @@ describe("Table", () => { const row1 = wrapper.getAllByRole("row")[1]; const row2 = wrapper.getAllByRole("row")[2]; - act(() => { - row1.click(); - row2.click(); - }); + await user.click(row1); + await user.click(row2); expect(onRowAction).toHaveBeenCalledTimes(2); }); - it("should set the proper aria-sort on an ascending sorted column header", () => { + it("should set the proper aria-sort on an ascending sorted column header", async () => { const wrapper = render(
diff --git a/packages/components/tabs/__tests__/tabs.test.tsx b/packages/components/tabs/__tests__/tabs.test.tsx index f412236da..fe7751e44 100644 --- a/packages/components/tabs/__tests__/tabs.test.tsx +++ b/packages/components/tabs/__tests__/tabs.test.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import {act, render, fireEvent, within} from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; +import userEvent, {UserEvent} from "@testing-library/user-event"; import {focus} from "@nextui-org/test-utils"; import {Tabs, Tab, TabsProps} from "../src"; @@ -50,6 +50,11 @@ function getPlacementTemplate(position: TabsProps["placement"]) { const spy = jest.spyOn(console, "error").mockImplementation(() => {}); describe("Tabs", () => { + let user: UserEvent; + + beforeEach(() => { + user = userEvent.setup(); + }); afterEach(() => { jest.clearAllMocks(); }); @@ -71,7 +76,7 @@ describe("Tabs", () => { expect(() => wrapper.unmount()).not.toThrow(); - expect(spy).toBeCalledTimes(0); + expect(spy).toHaveBeenCalledTimes(0); }); it("should render correctly (dynamic)", () => { @@ -168,26 +173,17 @@ describe("Tabs", () => { focus(tab1); }); - await act(async () => { - await userEvent.keyboard("[ArrowRight]"); - }); - + await user.keyboard("[ArrowRight]"); expect(tab1).toHaveAttribute("aria-selected", "false"); expect(tab2).toHaveAttribute("aria-selected", "true"); expect(tab3).toHaveAttribute("aria-selected", "false"); - await act(async () => { - await userEvent.keyboard("[ArrowRight]"); - }); - + await user.keyboard("[ArrowRight]"); expect(tab1).toHaveAttribute("aria-selected", "false"); expect(tab2).toHaveAttribute("aria-selected", "false"); expect(tab3).toHaveAttribute("aria-selected", "true"); - await act(async () => { - await userEvent.keyboard("[ArrowRight]"); - }); - + await user.keyboard("[ArrowRight]"); expect(tab1).toHaveAttribute("aria-selected", "true"); expect(tab2).toHaveAttribute("aria-selected", "false"); expect(tab3).toHaveAttribute("aria-selected", "false"); @@ -220,22 +216,13 @@ describe("Tabs", () => { focus(tab1); }); - await act(async () => { - await userEvent.keyboard("[ArrowRight]"); - }); - + await user.keyboard("[ArrowRight]"); expect(tab2).toHaveFocus(); - await act(async () => { - await userEvent.keyboard("[ArrowRight]"); - }); - + await user.keyboard("[ArrowRight]"); expect(tab3).toHaveFocus(); - await act(async () => { - await userEvent.keyboard("[ArrowLeft]"); - }); - + await user.keyboard("[ArrowLeft]"); expect(tab2).toHaveFocus(); expect(tab1).toHaveAttribute("aria-selected", "true"); @@ -280,10 +267,7 @@ describe("Tabs", () => { const tab2 = wrapper.getByTestId("item2"); - await act(async () => { - await userEvent.click(tab2); - }); - + await user.click(tab2); expect(tab2).toHaveAttribute("aria-selected", "false"); }); @@ -396,16 +380,10 @@ describe("Tabs", () => { focus(tab1); }); - await act(async () => { - await userEvent.keyboard("[ArrowRight]"); - }); - + await user.keyboard("[ArrowRight]"); expect(tab2).toHaveFocus(); - await act(async () => { - await userEvent.keyboard("[ArrowLeft]"); - }); - + await user.keyboard("[ArrowLeft]"); expect(tab1).toHaveFocus(); expect(input).toHaveValue("23"); diff --git a/packages/components/tooltip/__tests__/tooltip.test.tsx b/packages/components/tooltip/__tests__/tooltip.test.tsx index b5e2f43ff..326e59a3c 100644 --- a/packages/components/tooltip/__tests__/tooltip.test.tsx +++ b/packages/components/tooltip/__tests__/tooltip.test.tsx @@ -30,7 +30,7 @@ describe("Tooltip", () => { expect(() => wrapper.unmount()).not.toThrow(); - expect(spy).toBeCalledTimes(0); + expect(spy).toHaveBeenCalledTimes(0); }); it("ref should be forwarded", () => { diff --git a/packages/hooks/use-clipboard/__tests__/clipboard.test.tsx b/packages/hooks/use-clipboard/__tests__/clipboard.test.tsx index bb5fe4c8e..347d418c7 100644 --- a/packages/hooks/use-clipboard/__tests__/clipboard.test.tsx +++ b/packages/hooks/use-clipboard/__tests__/clipboard.test.tsx @@ -1,4 +1,4 @@ -import {renderHook, act} from "@testing-library/react-hooks"; +import {renderHook, act} from "@testing-library/react"; import {useClipboard} from "../src"; diff --git a/packages/hooks/use-pagination/__tests__/use-pagination.test.tsx b/packages/hooks/use-pagination/__tests__/use-pagination.test.tsx index b3338bfed..f2c880d6c 100644 --- a/packages/hooks/use-pagination/__tests__/use-pagination.test.tsx +++ b/packages/hooks/use-pagination/__tests__/use-pagination.test.tsx @@ -1,4 +1,4 @@ -import {renderHook, act} from "@testing-library/react-hooks"; +import {renderHook, act} from "@testing-library/react"; import {usePagination} from "../src"; @@ -97,6 +97,6 @@ describe("usePagination", () => { const {result} = renderHook(() => usePagination({total: 10, onChange})); act(() => result.current.setPage(5)); - expect(onChange).toBeCalledWith(5); + expect(onChange).toHaveBeenCalledWith(5); }); }); diff --git a/packages/hooks/use-ref-state/__tests__/use-ref-state.test.tsx b/packages/hooks/use-ref-state/__tests__/use-ref-state.test.tsx index 650aa3436..7d33b8203 100644 --- a/packages/hooks/use-ref-state/__tests__/use-ref-state.test.tsx +++ b/packages/hooks/use-ref-state/__tests__/use-ref-state.test.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import {renderHook, act} from "@testing-library/react-hooks"; +import {renderHook, act} from "@testing-library/react"; import {render} from "@testing-library/react"; import {useRefState} from "../src"; diff --git a/plop/hook/__tests__/{{hookName}}.test.tsx.hbs b/plop/hook/__tests__/{{hookName}}.test.tsx.hbs index 3f7f50887..dd9dc85d6 100644 --- a/plop/hook/__tests__/{{hookName}}.test.tsx.hbs +++ b/plop/hook/__tests__/{{hookName}}.test.tsx.hbs @@ -1,4 +1,4 @@ -import {renderHook} from "@testing-library/react-hooks"; +import {renderHook} from "@testing-library/react"; import { {{camelCase hookName}} } from "../src"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b51699d2f..12c923e1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,23 +73,20 @@ importers: specifier: ^0.2.24 version: 0.2.36(@swc/core@1.4.13(@swc/helpers@0.5.9)) '@testing-library/dom': - specifier: ^8.1.0 - version: 8.20.1 + specifier: ^10.4.0 + version: 10.4.0 '@testing-library/jest-dom': - specifier: ^5.16.4 - version: 5.17.0 + specifier: ^6.5.0 + version: 6.5.0 '@testing-library/react': - specifier: ^14.0.0 - version: 14.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@testing-library/react-hooks': - specifier: ^8.0.1 - version: 8.0.1(@types/react@18.2.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.2.4)(@types/react@18.2.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/user-event': - specifier: ^14.4.3 - version: 14.5.2(@testing-library/dom@8.20.1) + specifier: ^14.5.2 + version: 14.5.2(@testing-library/dom@10.4.0) '@types/jest': - specifier: ^28.1.1 - version: 28.1.8 + specifier: ^29.5.13 + version: 29.5.13 '@types/node': specifier: ^15.12.4 version: 15.14.9 @@ -102,9 +99,6 @@ importers: '@types/shelljs': specifier: ^0.8.9 version: 0.8.15 - '@types/testing-library__jest-dom': - specifier: 5.14.5 - version: 5.14.5 '@typescript-eslint/eslint-plugin': specifier: ^5.42.0 version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5) @@ -199,14 +193,14 @@ importers: specifier: ^10.1.0 version: 10.5.11 jest: - specifier: ^28.1.1 - version: 28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) jest-environment-jsdom: - specifier: ^28.1.1 + specifier: ^28.1.3 version: 28.1.3 jest-watch-typeahead: specifier: 1.1.0 - version: 1.1.0(jest@28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))) + version: 1.1.0(jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))) lint-staged: specifier: ^13.0.3 version: 13.3.0(enquirer@2.4.1) @@ -3046,7 +3040,7 @@ importers: version: 18.2.0 tailwind-variants: specifier: ^0.1.20 - version: 0.1.20(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5))) + version: 0.1.20(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))) packages/core/theme: dependencies: @@ -3085,7 +3079,7 @@ importers: version: 1.14.0 tailwind-variants: specifier: ^0.1.20 - version: 0.1.20(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5))) + version: 0.1.20(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))) devDependencies: '@types/color': specifier: ^3.0.3 @@ -3113,7 +3107,7 @@ importers: version: 2.2.0 tailwindcss: specifier: ^3.4.0 - version: 3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5)) + version: 3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) packages/hooks/use-aria-accordion: dependencies: @@ -3772,8 +3766,8 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - '@adobe/css-tools@4.3.3': - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} '@algolia/cache-browser-local-storage@4.23.3': resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} @@ -5242,9 +5236,13 @@ packages: resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/core@28.1.3': - resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -5259,25 +5257,33 @@ packages: resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/expect-utils@28.1.3': - resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/expect@28.1.3': - resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/fake-timers@28.1.3': resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/globals@28.1.3': - resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/reporters@28.1.3': - resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -5292,21 +5298,21 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/source-map@28.1.2': - resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/test-result@28.1.3': resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - '@jest/test-sequencer@28.1.3': - resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/transform@28.1.3': - resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/transform@29.7.0': resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} @@ -7041,6 +7047,12 @@ packages: '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@9.1.2': resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} @@ -7353,40 +7365,28 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - '@testing-library/dom@8.20.1': - resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} - engines: {node: '>=12'} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/jest-dom@5.17.0': - resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} - engines: {node: '>=8', npm: '>=6', yarn: '>=1'} - - '@testing-library/react-hooks@8.0.1': - resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} - engines: {node: '>=12'} + '@testing-library/react@16.0.1': + resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} + engines: {node: '>=18'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 react: ^18.2.0 react-dom: ^18.2.0 - react-test-renderer: ^16.9.0 || ^17.0.0 peerDependenciesMeta: '@types/react': optional: true - react-dom: + '@types/react-dom': optional: true - react-test-renderer: - optional: true - - '@testing-library/react@14.3.1': - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.2.0 - react-dom: ^18.2.0 '@testing-library/user-event@14.5.2': resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} @@ -7554,8 +7554,8 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@28.1.8': - resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} + '@types/jest@29.5.13': + resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} '@types/jsdom@16.2.15': resolution: {integrity: sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==} @@ -7647,9 +7647,6 @@ packages: '@types/parse5@6.0.3': resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - '@types/prettier@2.7.3': - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - '@types/pretty-hrtime@1.0.3': resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} @@ -7704,9 +7701,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/testing-library__jest-dom@5.14.5': - resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} - '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -8162,9 +8156,6 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -8327,9 +8318,9 @@ packages: peerDependencies: eslint: '>= 4.12.1' - babel-jest@28.1.3: - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 @@ -8345,9 +8336,9 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} - babel-plugin-jest-hoist@28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} babel-plugin-polyfill-corejs2@0.4.10: resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} @@ -8386,9 +8377,9 @@ packages: resolution: {integrity: sha512-TxbnZHb7p38jDRJh9clzCBqenyHjTkX5GX6SWwbcsW6UTMd912lbXJz7q3demciDI/BdbhjhNEirlgI9ov/JAg==} engines: {node: '>= v12.0.0'} - babel-preset-jest@28.1.3: - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 @@ -8972,9 +8963,6 @@ packages: engines: {node: '>=14'} hasBin: true - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -9016,6 +9004,11 @@ packages: typescript: optional: true + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + create-react-class@15.7.0: resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==} @@ -9186,12 +9179,13 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -9307,9 +9301,9 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff-sequences@28.1.1: - resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -9337,6 +9331,9 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-iterator@1.0.0: resolution: {integrity: sha512-7dsMOQI07EMU98gQM8NSB3GsAiIeBYIPKpnxR3c9xOvdvBjChAcOM0iJ222I3p5xyiZO9e5oggkNaCusuTdYig==} @@ -9412,6 +9409,10 @@ packages: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} @@ -9485,9 +9486,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.0.18: resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} engines: {node: '>= 0.4'} @@ -9943,11 +9941,13 @@ packages: eslint@5.16.0: resolution: {integrity: sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==} engines: {node: ^6.14.0 || ^8.10.0 || >=9.10.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true esniff@2.0.1: @@ -10069,9 +10069,9 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} - expect@28.1.3: - resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -11323,6 +11323,10 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -11347,17 +11351,17 @@ packages: engines: {node: '>=10'} hasBin: true - jest-changed-files@28.1.3: - resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-circus@28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-cli@28.1.3: - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -11365,9 +11369,9 @@ packages: node-notifier: optional: true - jest-config@28.1.3: - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -11377,54 +11381,58 @@ packages: ts-node: optional: true - jest-diff@28.1.3: - resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-docblock@28.1.1: - resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-each@28.1.3: - resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-environment-jsdom@28.1.3: resolution: {integrity: sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-environment-node@28.1.3: - resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-get-type@28.0.2: - resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - - jest-haste-map@28.1.3: - resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-haste-map@29.7.0: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-leak-detector@28.1.3: - resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-matcher-utils@28.1.3: - resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-message-util@28.1.3: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@28.1.3: resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -11442,25 +11450,25 @@ packages: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-resolve-dependencies@28.1.3: - resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-resolve@28.1.3: - resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-runner@28.1.3: - resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-runtime@28.1.3: - resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-snapshot@28.1.3: - resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-util@28.1.3: resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} @@ -11470,9 +11478,9 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-validate@28.1.3: - resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-watch-typeahead@1.1.0: resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} @@ -11484,21 +11492,21 @@ packages: resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest@28.1.3: - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -13201,6 +13209,10 @@ packages: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-hrtime@1.0.3: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} @@ -13301,6 +13313,9 @@ packages: resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} engines: {node: '>=8.16.0'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -13390,12 +13405,6 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 - react-error-boundary@3.1.4: - resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} - engines: {node: '>=10', npm: '>=6'} - peerDependencies: - react: ^18.2.0 - react-error-overlay@6.0.9: resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} @@ -13777,8 +13786,8 @@ packages: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated - resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} resolve@1.22.8: @@ -14227,10 +14236,6 @@ packages: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - store2@2.14.3: resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} @@ -14435,10 +14440,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -14525,10 +14526,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - terser-webpack-plugin@5.3.10: resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -15557,7 +15554,7 @@ snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} - '@adobe/css-tools@4.3.3': {} + '@adobe/css-tools@4.4.0': {} '@algolia/cache-browser-local-storage@4.23.3': dependencies: @@ -17426,38 +17423,47 @@ snapshots: jest-util: 28.1.3 slash: 3.0.0 - '@jest/core@28.1.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))': + '@jest/console@29.7.0': dependencies: - '@jest/console': 28.1.3 - '@jest/reporters': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/types': 29.6.3 + '@types/node': 15.14.9 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 15.14.9 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-resolve-dependencies: 28.1.3 - jest-runner: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - jest-watcher: 28.1.3 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 micromatch: 4.0.5 - pretty-format: 28.1.3 - rimraf: 3.0.2 + pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: + - babel-plugin-macros - supports-color - ts-node @@ -17472,14 +17478,21 @@ snapshots: '@types/node': 15.14.9 jest-mock: 28.1.3 - '@jest/expect-utils@28.1.3': + '@jest/environment@29.7.0': dependencies: - jest-get-type: 28.0.2 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 15.14.9 + jest-mock: 29.7.0 - '@jest/expect@28.1.3': + '@jest/expect-utils@29.7.0': dependencies: - expect: 28.1.3 - jest-snapshot: 28.1.3 + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color @@ -17492,21 +17505,31 @@ snapshots: jest-mock: 28.1.3 jest-util: 28.1.3 - '@jest/globals@28.1.3': + '@jest/fake-timers@29.7.0': dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/types': 28.1.3 + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 15.14.9 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 transitivePeerDependencies: - supports-color - '@jest/reporters@28.1.3': + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 '@types/node': 15.14.9 chalk: 4.1.2 @@ -17515,17 +17538,16 @@ snapshots: glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.7 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - jest-worker: 28.1.3 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - terminal-link: 2.1.1 v8-to-istanbul: 9.2.0 transitivePeerDependencies: - supports-color @@ -17538,7 +17560,7 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jest/source-map@28.1.2': + '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 @@ -17551,32 +17573,19 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@28.1.3': + '@jest/test-result@29.7.0': dependencies: - '@jest/test-result': 28.1.3 - graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - slash: 3.0.0 + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 - '@jest/transform@28.1.3': + '@jest/test-sequencer@29.7.0': dependencies: - '@babel/core': 7.24.4 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 + '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - micromatch: 4.0.5 - pirates: 4.0.6 + jest-haste-map: 29.7.0 slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color '@jest/transform@29.7.0': dependencies: @@ -17612,7 +17621,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.2.5 + '@types/node': 15.14.9 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -18101,13 +18110,15 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))': + '@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9)': dependencies: '@parcel/core': 2.12.0(@swc/helpers@0.5.9) '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9) '@parcel/logger': 2.12.0 '@parcel/utils': 2.12.0 lmdb: 2.8.5 + transitivePeerDependencies: + - '@swc/helpers' '@parcel/codeframe@2.12.0': dependencies: @@ -18167,7 +18178,7 @@ snapshots: '@parcel/core@2.12.0(@swc/helpers@0.5.9)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9)) + '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9) '@parcel/diagnostic': 2.12.0 '@parcel/events': 2.12.0 '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9) @@ -18582,7 +18593,7 @@ snapshots: '@parcel/types@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9)': dependencies: - '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9)) + '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9) '@parcel/diagnostic': 2.12.0 '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9) '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.9))(@swc/helpers@0.5.9) @@ -19974,6 +19985,14 @@ snapshots: dependencies: type-detect: 4.0.8 + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers@9.1.2': dependencies: '@sinonjs/commons': 1.8.6 @@ -20672,60 +20691,40 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.2.5)(typescript@4.9.5)) - '@testing-library/dom@8.20.1': + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.24.2 '@babel/runtime': 7.24.4 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/dom@9.3.4': + '@testing-library/jest-dom@6.5.0': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.4 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/jest-dom@5.17.0': - dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.4 - '@types/testing-library__jest-dom': 5.14.5 + '@adobe/css-tools': 4.4.0 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 + dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react-hooks@8.0.1(@types/react@18.2.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.2.4)(@types/react@18.2.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 + '@testing-library/dom': 10.4.0 react: 18.2.0 - react-error-boundary: 3.1.4(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) optionalDependencies: '@types/react': 18.2.8 - react-dom: 18.2.0(react@18.2.0) - - '@testing-library/react@14.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.4 - '@testing-library/dom': 9.3.4 '@types/react-dom': 18.2.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@testing-library/user-event@14.5.2(@testing-library/dom@8.20.1)': + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: - '@testing-library/dom': 8.20.1 + '@testing-library/dom': 10.4.0 '@tootallnate/once@2.0.0': {} @@ -20901,10 +20900,10 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@28.1.8': + '@types/jest@29.5.13': dependencies: - expect: 28.1.3 - pretty-format: 28.1.3 + expect: 29.7.0 + pretty-format: 29.7.0 '@types/jsdom@16.2.15': dependencies: @@ -20992,8 +20991,6 @@ snapshots: '@types/parse5@6.0.3': {} - '@types/prettier@2.7.3': {} - '@types/pretty-hrtime@1.0.3': {} '@types/prismjs@1.26.3': {} @@ -21048,10 +21045,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/testing-library__jest-dom@5.14.5': - dependencies: - '@types/jest': 28.1.8 - '@types/through@0.0.33': dependencies: '@types/node': 15.14.9 @@ -21574,10 +21567,6 @@ snapshots: dependencies: tslib: 2.6.2 - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -21752,13 +21741,13 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@28.1.3(@babel/core@7.24.4): + babel-jest@29.7.0(@babel/core@7.24.4): dependencies: '@babel/core': 7.24.4 - '@jest/transform': 28.1.3 + '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3(@babel/core@7.24.4) + babel-preset-jest: 29.6.3(@babel/core@7.24.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -21781,7 +21770,7 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@28.1.3: + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.24.0 '@babel/types': 7.24.0 @@ -21852,10 +21841,10 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-jest@28.1.3(@babel/core@7.24.4): + babel-preset-jest@29.6.3(@babel/core@7.24.4): dependencies: '@babel/core': 7.24.4 - babel-plugin-jest-hoist: 28.1.3 + babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) bail@1.0.5: {} @@ -22537,8 +22526,6 @@ snapshots: meow: 8.1.2 split2: 3.2.2 - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} cookie-signature@1.0.6: {} @@ -22571,6 +22558,21 @@ snapshots: optionalDependencies: typescript: 4.9.5 + create-jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-react-class@15.7.0: dependencies: loose-envify: 1.4.0 @@ -22732,28 +22734,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@0.7.0: {} - - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 + dedent@1.5.3: {} deep-extend@0.6.0: {} @@ -22852,7 +22833,7 @@ snapshots: didyoumean@1.2.2: {} - diff-sequences@28.1.1: {} + diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -22874,6 +22855,8 @@ snapshots: dom-accessibility-api@0.5.16: {} + dom-accessibility-api@0.6.3: {} + dom-iterator@1.0.0: dependencies: component-props: 1.1.1 @@ -22945,6 +22928,8 @@ snapshots: emittery@0.10.2: {} + emittery@0.13.1: {} + emoji-regex@7.0.3: {} emoji-regex@8.0.0: {} @@ -23053,18 +23038,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - es-iterator-helpers@1.0.18: dependencies: call-bind: 1.0.7 @@ -23334,7 +23307,7 @@ snapshots: eslint: 7.32.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@7.32.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-typescript@2.7.1)(eslint@7.32.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@7.32.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@7.32.0) eslint-plugin-react: 7.34.1(eslint@7.32.0) eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) @@ -23397,7 +23370,7 @@ snapshots: enhanced-resolve: 5.16.0 eslint: 7.32.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@7.32.0))(eslint@7.32.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-typescript@2.7.1)(eslint@7.32.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@7.32.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -23479,6 +23452,33 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-typescript@3.6.1)(eslint@7.32.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 7.32.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@7.32.0))(eslint@7.32.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5): dependencies: '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5) @@ -23838,13 +23838,13 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 - expect@28.1.3: + expect@29.7.0: dependencies: - '@jest/expect-utils': 28.1.3 - jest-get-type: 28.0.2 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 exponential-backoff@3.1.1: {} @@ -25207,6 +25207,16 @@ snapshots: transitivePeerDependencies: - supports-color + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.24.4 + '@babel/parser': 7.24.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 @@ -25247,102 +25257,106 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 - jest-changed-files@28.1.3: + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 + jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@28.1.3: + jest-circus@29.7.0: dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 15.14.9 chalk: 4.1.2 co: 4.6.0 - dedent: 0.7.0 + dedent: 1.5.3 is-generator-fn: 2.1.0 - jest-each: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 p-limit: 3.1.0 - pretty-format: 28.1.3 + pretty-format: 29.7.0 + pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: + - babel-plugin-macros - supports-color - jest-cli@28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)): + jest-cli@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 chalk: 4.1.2 + create-jest: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) exit: 0.1.2 - graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) - jest-util: 28.1.3 - jest-validate: 28.1.3 - prompts: 2.4.2 + jest-config: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node - jest-config@28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)): + jest-config@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)): dependencies: '@babel/core': 7.24.4 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 - babel-jest: 28.1.3(@babel/core@7.24.4) + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 28.1.3 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 15.14.9 ts-node: 10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5) transitivePeerDependencies: + - babel-plugin-macros - supports-color - jest-diff@28.1.3: + jest-diff@29.7.0: dependencies: chalk: 4.1.2 - diff-sequences: 28.1.1 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - jest-docblock@28.1.1: + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - jest-each@28.1.3: + jest-each@29.7.0: dependencies: - '@jest/types': 28.1.3 + '@jest/types': 29.6.3 chalk: 4.1.2 - jest-get-type: 28.0.2 - jest-util: 28.1.3 - pretty-format: 28.1.3 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 jest-environment-jsdom@28.1.3: dependencies: @@ -25360,32 +25374,16 @@ snapshots: - supports-color - utf-8-validate - jest-environment-node@28.1.3: + jest-environment-node@29.7.0: dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 15.14.9 - jest-mock: 28.1.3 - jest-util: 28.1.3 + jest-mock: 29.7.0 + jest-util: 29.7.0 - jest-get-type@28.0.2: {} - - jest-haste-map@28.1.3: - dependencies: - '@jest/types': 28.1.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 15.14.9 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - jest-worker: 28.1.3 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 + jest-get-type@29.6.3: {} jest-haste-map@29.7.0: dependencies: @@ -25403,17 +25401,17 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@28.1.3: + jest-leak-detector@29.7.0: dependencies: - jest-get-type: 28.0.2 - pretty-format: 28.1.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - jest-matcher-utils@28.1.3: + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 jest-message-util@28.1.3: dependencies: @@ -25427,115 +25425,130 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@28.1.3: dependencies: '@jest/types': 28.1.3 '@types/node': 15.14.9 - jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 15.14.9 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: - jest-resolve: 28.1.3 + jest-resolve: 29.7.0 jest-regex-util@28.0.2: {} jest-regex-util@29.6.3: {} - jest-resolve-dependencies@28.1.3: + jest-resolve-dependencies@29.7.0: dependencies: - jest-regex-util: 28.0.2 - jest-snapshot: 28.1.3 + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - jest-resolve@28.1.3: + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) - jest-util: 28.1.3 - jest-validate: 28.1.3 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 resolve: 1.22.8 - resolve.exports: 1.1.1 + resolve.exports: 2.0.2 slash: 3.0.0 - jest-runner@28.1.3: + jest-runner@29.7.0: dependencies: - '@jest/console': 28.1.3 - '@jest/environment': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 15.14.9 chalk: 4.1.2 - emittery: 0.10.2 + emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 28.1.1 - jest-environment-node: 28.1.3 - jest-haste-map: 28.1.3 - jest-leak-detector: 28.1.3 - jest-message-util: 28.1.3 - jest-resolve: 28.1.3 - jest-runtime: 28.1.3 - jest-util: 28.1.3 - jest-watcher: 28.1.3 - jest-worker: 28.1.3 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@28.1.3: + jest-runtime@29.7.0: dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/globals': 28.1.3 - '@jest/source-map': 28.1.2 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 15.14.9 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 - execa: 5.1.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@28.1.3: + jest-snapshot@29.7.0: dependencies: '@babel/core': 7.24.4 '@babel/generator': 7.24.4 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) - '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 - '@jest/expect-utils': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/babel__traverse': 7.20.5 - '@types/prettier': 2.7.3 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) chalk: 4.1.2 - expect: 28.1.3 + expect: 29.7.0 graceful-fs: 4.2.11 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - jest-haste-map: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 natural-compare: 1.4.0 - pretty-format: 28.1.3 + pretty-format: 29.7.0 semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -25558,20 +25571,20 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-validate@28.1.3: + jest-validate@29.7.0: dependencies: - '@jest/types': 28.1.3 + '@jest/types': 29.6.3 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 28.0.2 + jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 28.1.3 + pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))): + jest-watch-typeahead@1.1.0(jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + jest: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -25589,13 +25602,18 @@ snapshots: jest-util: 28.1.3 string-length: 4.0.2 - jest-worker@27.5.1: + jest-watcher@29.7.0: dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 15.14.9 - merge-stream: 2.0.0 - supports-color: 8.1.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 - jest-worker@28.1.3: + jest-worker@27.5.1: dependencies: '@types/node': 15.14.9 merge-stream: 2.0.0 @@ -25608,14 +25626,15 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)): + jest@29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)): dependencies: - '@jest/core': 28.1.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) - '@jest/types': 28.1.3 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 28.1.3(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) + jest-cli: 29.7.0(@types/node@15.14.9)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node @@ -27678,14 +27697,6 @@ snapshots: postcss: 8.4.38 ts-node: 10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5)): - dependencies: - lilconfig: 3.1.1 - yaml: 2.4.1 - optionalDependencies: - postcss: 8.4.38 - ts-node: 10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.2.5)(typescript@4.9.5)): dependencies: lilconfig: 3.1.1 @@ -27857,6 +27868,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + pretty-hrtime@1.0.3: {} prism-react-renderer@1.3.5(react@18.2.0): @@ -27973,6 +27990,8 @@ snapshots: - supports-color - utf-8-validate + pure-rand@6.1.0: {} + qs@6.11.0: dependencies: side-channel: 1.0.6 @@ -28074,11 +28093,6 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-is: 18.1.0 - react-error-boundary@3.1.4(react@18.2.0): - dependencies: - '@babel/runtime': 7.24.4 - react: 18.2.0 - react-error-overlay@6.0.9: {} react-hook-form@7.51.3(react@18.2.0): @@ -28550,7 +28564,7 @@ snapshots: resolve-url@0.2.1: {} - resolve.exports@1.1.1: {} + resolve.exports@2.0.2: {} resolve@1.22.8: dependencies: @@ -29058,10 +29072,6 @@ snapshots: dependencies: bl: 5.1.0 - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - store2@2.14.3: {} storybook-dark-mode@3.0.3(@types/react-dom@18.2.4)(@types/react@18.2.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): @@ -29291,11 +29301,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - supports-preserve-symlinks-flag@1.0.0: {} svgo@2.8.0: @@ -29335,42 +29340,15 @@ snapshots: tailwind-merge@1.14.0: {} - tailwind-variants@0.1.20(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5))): - dependencies: - tailwind-merge: 1.14.0 - tailwindcss: 3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5)) - tailwind-variants@0.1.20(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.2.5)(typescript@4.9.5))): dependencies: tailwind-merge: 1.14.0 tailwindcss: 3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.2.5)(typescript@4.9.5)) - tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5)): + tailwind-variants@0.1.20(tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5))): dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.38 - postcss-import: 15.1.0(postcss@8.4.38) - postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@15.14.9)(typescript@4.9.5)) - postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.0.16 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node + tailwind-merge: 1.14.0 + tailwindcss: 3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.5.1)(typescript@4.9.5)) tailwindcss@3.4.3(ts-node@10.9.2(@swc/core@1.4.13(@swc/helpers@0.5.9))(@types/node@20.2.5)(typescript@4.9.5)): dependencies: @@ -29488,11 +29466,6 @@ snapshots: term-size@2.2.1: {} - terminal-link@2.1.1: - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.10(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.15.18)(webpack@5.91.0(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.15.18)(webpack-cli@3.3.12)): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -29505,14 +29478,14 @@ snapshots: '@swc/core': 1.4.13(@swc/helpers@0.5.9) esbuild: 0.15.18 - terser-webpack-plugin@5.3.10(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.20.2)(webpack@5.91.0(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.20.2)(webpack-cli@3.3.12(webpack@5.91.0))): + terser-webpack-plugin@5.3.10(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.20.2)(webpack@5.91.0(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.15.18)(webpack-cli@3.3.12)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.30.3 - webpack: 5.91.0(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.20.2)(webpack-cli@3.3.12(webpack@5.91.0)) + webpack: 5.91.0(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.15.18)(webpack-cli@3.3.12) optionalDependencies: '@swc/core': 1.4.13(@swc/helpers@0.5.9) esbuild: 0.20.2 @@ -30404,7 +30377,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.20.2)(webpack@5.91.0(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.20.2)(webpack-cli@3.3.12(webpack@5.91.0))) + terser-webpack-plugin: 5.3.10(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.20.2)(webpack@5.91.0(@swc/core@1.4.13(@swc/helpers@0.5.9))(esbuild@0.15.18)(webpack-cli@3.3.12)) watchpack: 2.4.1 webpack-sources: 3.2.3 optionalDependencies: diff --git a/scripts/setup-test.ts b/scripts/setup-test.ts index 7f8af3fed..a1061ef86 100644 --- a/scripts/setup-test.ts +++ b/scripts/setup-test.ts @@ -1,4 +1,4 @@ -import "@testing-library/jest-dom/extend-expect"; +import "@testing-library/jest-dom"; import { configure } from "@testing-library/react"; const {getComputedStyle} = window;