diff --git a/.eslintrc.js b/.eslintrc.js index 6974c0a40b8..e4f2509671a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,6 +16,7 @@ module.exports = { ], extends: [ "eslint:recommended", + "plugin:testing-library/react", "plugin:@typescript-eslint/recommended-requiring-type-checking", "plugin:@typescript-eslint/recommended", "plugin:import/recommended", @@ -58,6 +59,13 @@ module.exports = { "unused-imports/no-unused-imports": OFF, // look below "no-autofix/unused-imports/no-unused-imports": ERR, + /** + * Rules for tests see https://github.com/testing-library/eslint-plugin-testing-library#supported-rules for details + * on default enabled rules or to remove rules. + */ + + "testing-library/no-global-regexp-flag-in-query": OFF, + /** * Warnings */ @@ -143,5 +151,9 @@ module.exports = { "@typescript-eslint/no-non-null-assertion": OFF, }, }, + { + files: ["**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)"], + extends: ["plugin:testing-library/react"], + }, ], } diff --git a/package.json b/package.json index 63870722a8c..091d45787d1 100644 --- a/package.json +++ b/package.json @@ -294,7 +294,7 @@ "eslint-plugin-prettier": "4.2.1", "eslint-plugin-react": "7.32.1", "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-testing-library": "5.9.1", + "eslint-plugin-testing-library": "6.2.0", "eslint-plugin-unused-imports": "2.0.0", "graphql": "16.8.1", "graphql-request": "5.1.0", diff --git a/src/app/Scenes/MyCollection/Screens/Artwork/Components/Field.tests.tsx b/src/app/Scenes/MyCollection/Screens/Artwork/Components/Field.tests.tsx index 8c425e35a0a..0cbe5e072f4 100644 --- a/src/app/Scenes/MyCollection/Screens/Artwork/Components/Field.tests.tsx +++ b/src/app/Scenes/MyCollection/Screens/Artwork/Components/Field.tests.tsx @@ -1,47 +1,44 @@ -import { fireEvent, waitFor } from "@testing-library/react-native" +import { fireEvent, screen } from "@testing-library/react-native" import { Field } from "app/Scenes/MyCollection/Screens/Artwork/Components/Field" import { renderWithWrappers } from "app/utils/tests/renderWithWrappers" describe("Field", () => { it("Value is truncated when truncateLimit is set", () => { - const { queryByText } = renderWithWrappers( - - ) - expect(queryByText(longText)).toBeNull() + renderWithWrappers() - expect(queryByText("Lorem")).not.toBeNull() + expect(screen.queryByText(longText)).not.toBeOnTheScreen() + expect(screen.getByText("Lorem")).toBeOnTheScreen() }) it("Value is NOT truncated when truncateLimit is not given", () => { - const { queryByText } = renderWithWrappers() - expect(queryByText(longText)).not.toBeNull() + renderWithWrappers() + + expect(screen.getByText(longText)).toBeOnTheScreen() }) - it("Read More button is only present if value can be expanded", () => { - const { queryByText: queryByTextOne } = renderWithWrappers( - - ) - expect(queryByTextOne("Read More")).toBeNull() + describe("Read More button is only present if value can be expanded", () => { + it("Read More button is not present if truncateLimit is not given", () => { + renderWithWrappers() + expect(screen.queryByText("Read More")).not.toBeOnTheScreen() + }) - const { queryByText: queryByTextTwo } = renderWithWrappers( - - ) - expect(queryByTextTwo("Read More")).not.toBeNull() + it("Read More button is not present if truncateLimit is given", () => { + renderWithWrappers( + + ) + expect(screen.getByText("Read More")).toBeOnTheScreen() + }) }) it('Pressing "Read More" expands the text value', async () => { - const { findByTestId, queryByText } = renderWithWrappers( - - ) + renderWithWrappers() - expect(queryByText(longText)).toBeNull() + expect(screen.queryByText(longText)).not.toBeOnTheScreen() - const button = await findByTestId("ReadMoreButton") + const button = screen.getByTestId("ReadMoreButton") - waitFor(() => { - fireEvent.press(button) - expect(queryByText(longText)).not.toBeNull() - }) + fireEvent.press(button) + expect(screen.getByText(longText)).toBeOnTheScreen() }) }) diff --git a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterAdditionalGeneIDs.tests.tsx b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterAdditionalGeneIDs.tests.tsx index c104c8a31d4..13282f8cb01 100644 --- a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterAdditionalGeneIDs.tests.tsx +++ b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterAdditionalGeneIDs.tests.tsx @@ -1,5 +1,5 @@ import { OwnerType } from "@artsy/cohesion" -import { fireEvent, waitFor } from "@testing-library/react-native" +import { fireEvent, screen } from "@testing-library/react-native" import { SavedSearchFilterAdditionalGeneIDs } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterAdditionalGeneIDs" import { SavedSearchModel, @@ -13,22 +13,22 @@ const black100Hex = "#000000" describe("SavedSearchFilterAdditionalGeneIDs", () => { it("shows all available categories unselected", () => { - const { getByText } = renderWithWrappers( + renderWithWrappers( ) gravityArtworkMediumCategories.slice(0, 7).forEach((option) => { - expect(getByText(option.label)).toBeDefined() - expect(getByText(option.label)).toHaveStyle({ + expect(screen.getByText(option.label)).toBeOnTheScreen() + expect(screen.getByText(option.label)).toHaveStyle({ color: black100Hex, }) }) }) it("shows the right selected categories", () => { - const { getByText } = renderWithWrappers( + renderWithWrappers( @@ -38,10 +38,10 @@ describe("SavedSearchFilterAdditionalGeneIDs", () => { gravityArtworkMediumCategories.slice(0, 7).forEach((option) => { if (option.value === "painting") { - expect(getByText("Painting")).not.toHaveStyle({ color: black100Hex }) + expect(screen.getByText("Painting")).not.toHaveStyle({ color: black100Hex }) } else { - expect(getByText(option.label)).toBeDefined() - expect(getByText(option.label)).toHaveStyle({ + expect(screen.getByText(option.label)).toBeOnTheScreen() + expect(screen.getByText(option.label)).toHaveStyle({ color: black100Hex, }) } @@ -49,23 +49,21 @@ describe("SavedSearchFilterAdditionalGeneIDs", () => { }) it("Updates selected categories filters on press", () => { - const { getByText } = renderWithWrappers( + renderWithWrappers( ) - expect(getByText("Work on Paper")).toHaveStyle({ color: black100Hex }) + expect(screen.getByText("Work on Paper")).toHaveStyle({ color: black100Hex }) - fireEvent(getByText("Work on Paper"), "onPress") + fireEvent(screen.getByText("Work on Paper"), "onPress") - waitFor(() => { - expect(getByText("Work on Paper")).not.toHaveStyle({ color: black100Hex }) - }) + expect(screen.getByText("Work on Paper")).not.toHaveStyle({ color: black100Hex }) }) it("Shows all categories if the user has already selected mediums", () => { - const { getByText } = renderWithWrappers( + renderWithWrappers( { ) gravityArtworkMediumCategories.forEach((option) => { - expect(getByText(option.label)).toBeDefined() + expect(screen.getByText(option.label)).toBeDefined() }) }) }) diff --git a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterColor.tests.tsx b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterColor.tests.tsx index da1354604b6..f1427025e88 100644 --- a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterColor.tests.tsx +++ b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterColor.tests.tsx @@ -1,5 +1,5 @@ import { OwnerType } from "@artsy/cohesion" -import { fireEvent, waitFor } from "@testing-library/react-native" +import { fireEvent } from "@testing-library/react-native" import { COLORS_INDEXED_BY_VALUE, COLOR_OPTIONS, @@ -56,9 +56,7 @@ describe("SavedSearchFilterColor", () => { fireEvent(getByText("Red"), "onPress") - waitFor(() => { - expect(getByTestId("check-icon-Red")).toBeDefined() - }) + expect(getByTestId("check-icon-Red")).toBeDefined() }) }) diff --git a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterPriceRange.tests.tsx b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterPriceRange.tests.tsx index 7aa3b24af58..2392e43dd23 100644 --- a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterPriceRange.tests.tsx +++ b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterPriceRange.tests.tsx @@ -1,5 +1,5 @@ import { OwnerType } from "@artsy/cohesion" -import { fireEvent, waitFor } from "@testing-library/react-native" +import { fireEvent, screen, waitForElementToBeRemoved } from "@testing-library/react-native" import { SavedSearchFilterPriceRangeQR } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterPriceRange" import { SavedSearchModel, @@ -9,7 +9,7 @@ import { import { setupTestWrapper } from "app/utils/tests/setupTestWrapper" describe("SavedSearchFilterPriceRange", () => { - it("shows the right price range when available", () => { + it("shows the right price range when available", async () => { const { renderWithRelay } = setupTestWrapper({ Component: () => ( @@ -18,17 +18,17 @@ describe("SavedSearchFilterPriceRange", () => { ), }) - const { getByText } = renderWithRelay({ + renderWithRelay({ Artist: () => ({ internalID: "artistID", name: "Banksy", }), }) - waitFor(() => { - expect(getByText("200")).toBeDefined() - expect(getByText("3000")).toBeDefined() - }) + await waitForElementToBeRemoved(() => screen.getByTestId("loading-skeleton")) + + expect(screen.getByLabelText("Minimum Price Range Input")).toHaveProp("value", "200") + expect(screen.getByLabelText("Maximum Price Range Input")).toHaveProp("value", "3000") }) it("Updates the price range appropriately", async () => { @@ -40,23 +40,23 @@ describe("SavedSearchFilterPriceRange", () => { ), }) - const { getByTestId, getByText } = renderWithRelay({ + renderWithRelay({ Artist: () => ({ internalID: "artistID", name: "Banksy", }), }) - waitFor(() => { - expect(getByText("200")).toBeDefined() - expect(getByText("3000")).toBeDefined() + await waitForElementToBeRemoved(() => screen.getByTestId("loading-skeleton")) - fireEvent.changeText(getByTestId("price-min-input"), "300") - fireEvent.changeText(getByTestId("price-max-input"), "5000") + expect(screen.getByLabelText("Minimum Price Range Input")).toHaveProp("value", "200") + expect(screen.getByLabelText("Maximum Price Range Input")).toHaveProp("value", "3000") - expect(getByText("300")).toBeDefined() - expect(getByText("5000")).toBeDefined() - }) + fireEvent.changeText(screen.getByTestId("price-min-input"), "300") + fireEvent.changeText(screen.getByTestId("price-max-input"), "5000") + + expect(screen.getByLabelText("Minimum Price Range Input")).toHaveProp("value", "300") + expect(screen.getByLabelText("Maximum Price Range Input")).toHaveProp("value", "5000") }) }) diff --git a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterRarity.tests.tsx b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterRarity.tests.tsx index b665271bc26..3677a58dc37 100644 --- a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterRarity.tests.tsx +++ b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterRarity.tests.tsx @@ -1,5 +1,5 @@ import { OwnerType } from "@artsy/cohesion" -import { fireEvent, waitFor } from "@testing-library/react-native" +import { fireEvent } from "@testing-library/react-native" import { KNOWN_ATTRIBUTION_CLASS_OPTIONS } from "app/Components/ArtworkFilter/Filters/AttributionClassOptions" import { SavedSearchFilterRarity } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterRarity" import { @@ -41,20 +41,16 @@ describe("SavedSearchFilterRarity", () => { expect(getByText("Open Edition")).toHaveStyle({ color: black100Hex }) }) - it("Updates selected filters on press", () => { + it("Updates selected filters on press", async () => { const { getByText } = renderWithWrappers( ) - expect(getByText("Unique")).toHaveStyle({ color: black100Hex }) - fireEvent(getByText("Unique"), "onPress") - waitFor(() => { - expect(getByText("Unique")).not.toHaveStyle({ color: black100Hex }) - }) + expect(getByText("Unique")).not.toHaveStyle({ color: black100Hex }) }) }) diff --git a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterWaysToBuy.tests.tsx b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterWaysToBuy.tests.tsx index 88433d9b757..10075278292 100644 --- a/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterWaysToBuy.tests.tsx +++ b/src/app/Scenes/SavedSearchAlert/Components/SavedSearchFilterWaysToBuy.tests.tsx @@ -1,5 +1,5 @@ import { OwnerType } from "@artsy/cohesion" -import { fireEvent, waitFor } from "@testing-library/react-native" +import { fireEvent } from "@testing-library/react-native" import { WAYS_TO_BUY_OPTIONS } from "app/Components/ArtworkFilter/Filters/WaysToBuyOptions" import { SavedSearchFilterWaysToBuy } from "app/Scenes/SavedSearchAlert/Components/SavedSearchFilterWaysToBuy" import { @@ -58,9 +58,7 @@ describe("SavedSearchFilterWaysToBuy", () => { fireEvent(getByText("Bid"), "onPress") - waitFor(() => { - expect(getByText("Bid")).not.toHaveStyle({ color: black100Hex }) - }) + expect(getByText("Bid")).not.toHaveStyle({ color: black100Hex }) }) }) diff --git a/src/app/Scenes/SavedSearchAlert/SavedSearchAlertForm.tests.tsx b/src/app/Scenes/SavedSearchAlert/SavedSearchAlertForm.tests.tsx index 97df7738b8a..5db20512174 100644 --- a/src/app/Scenes/SavedSearchAlert/SavedSearchAlertForm.tests.tsx +++ b/src/app/Scenes/SavedSearchAlert/SavedSearchAlertForm.tests.tsx @@ -1,5 +1,5 @@ import { OwnerType } from "@artsy/cohesion" -import { fireEvent, waitFor, waitForElementToBeRemoved } from "@testing-library/react-native" +import { fireEvent, screen, waitFor } from "@testing-library/react-native" import { Aggregations } from "app/Components/ArtworkFilter/ArtworkFilterHelpers" import { SavedSearchEntity, @@ -542,7 +542,7 @@ describe("SavedSearchAlertForm", () => { expect(getByText("Prints")).toBeTruthy() }) - it("should have removable filter pills", () => { + it("should have removable filter pills", async () => { const { getByText } = renderWithWrappers() // artist pill should appear and not be removable expect(getByText("artistName")).toBeTruthy() @@ -551,8 +551,8 @@ describe("SavedSearchAlertForm", () => { fireEvent.press(getByText("Prints")) fireEvent.press(getByText("Photography")) - waitForElementToBeRemoved(() => getByText("Prints")) - waitForElementToBeRemoved(() => getByText("Photography")) + expect(screen.queryByText("Prints")).not.toBeOnTheScreen() + expect(screen.queryByText("Photography")).not.toBeOnTheScreen() }) }) diff --git a/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tests.tsx b/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tests.tsx index 6527ffad5a1..0bf473a177a 100644 --- a/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tests.tsx +++ b/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tests.tsx @@ -1,5 +1,5 @@ import { OwnerType } from "@artsy/cohesion" -import { fireEvent, waitFor } from "@testing-library/react-native" +import { fireEvent, screen } from "@testing-library/react-native" import { SavedSearchModel, SavedSearchStoreProvider, @@ -12,22 +12,30 @@ import { Alert } from "react-native" jest.spyOn(Alert, "alert") describe("ClearAllButton", () => { - it("Is enabled when there are active filters", () => { - const { getByText } = renderWithWrappers( + beforeEach(() => { + ;(Alert.alert as jest.Mock).mockClear() + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it("Is enabled when there are active filters", async () => { + renderWithWrappers( ) - fireEvent(getByText("Clear All"), "onPress") + expect(screen.getByText("Clear All")).toHaveAccessibilityState({ disabled: false }) + + fireEvent(screen.getByText("Clear All"), "onPress") - waitFor(() => { - expect(Alert.alert).toHaveBeenCalled() - }) + expect(Alert.alert).toHaveBeenCalled() }) it("Is disabled on load", async () => { - const { getByText } = renderWithWrappers( + renderWithWrappers( { ) - fireEvent(getByText("Clear All"), "onPress") + fireEvent(screen.getByText("Clear All"), "onPress") - waitFor(() => { - expect(Alert.alert).not.toHaveBeenCalled() - }) + expect(Alert.alert).not.toHaveBeenCalled() }) it("Is disabled when array attrbutes are empty", async () => { - const { getByText } = renderWithWrappers( + renderWithWrappers( { ) - fireEvent(getByText("Clear All"), "onPress") + fireEvent(screen.getByText("Clear All"), "onPress") - waitFor(() => { - expect(Alert.alert).not.toHaveBeenCalled() - }) + expect(Alert.alert).not.toHaveBeenCalled() }) }) const initialData: SavedSearchModel = { ...savedSearchModel, - attributes: {}, + attributes: { + inquireableOnly: true, + offerable: true, + }, entity: { artists: [{ id: "artistID", name: "Banksy" }], owner: { diff --git a/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tsx b/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tsx index dbb1db701c5..6ac59912c6f 100644 --- a/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tsx +++ b/src/app/Scenes/SavedSearchAlert/screens/SavedSearchFilterScreen.tsx @@ -114,7 +114,6 @@ export const ClearAllButton = () => { }} > diff --git a/src/app/utils/tests/renderWithWrappers.tsx b/src/app/utils/tests/renderWithWrappers.tsx index f660d2d61e5..92e8d813bc2 100644 --- a/src/app/utils/tests/renderWithWrappers.tsx +++ b/src/app/utils/tests/renderWithWrappers.tsx @@ -24,8 +24,7 @@ const componentWithWrappers = (component: ReactElement) => { } /** - * @deprecated - * Use `renderWithWrappers` instead. + * @deprecated Use `renderWithWrappers` instead. * * Renders a React Component with our page wrappers * @param component @@ -62,6 +61,8 @@ class PureWrapper extends Component { /** * Renders a React Component with our page wrappers * by using @testing-library/react-native + * IMPORTANT: It is meant to be used for non-Relay components + * * @param component */ export const renderWithWrappers = (component: ReactElement, wrapperProps?: WrappersProps) => { @@ -76,6 +77,10 @@ export const renderWithWrappers = (component: ReactElement, wrapperProps?: Wrapp } } +/** + * @deprecated Use `setupTestWrapper` instead. + * + */ export const renderWithHookWrappersTL = ( component: ReactElement, environment: Environment = getRelayEnvironment() diff --git a/yarn.lock b/yarn.lock index 6362f54c0d5..95c505e2599 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5431,6 +5431,14 @@ "@typescript-eslint/types" "5.57.0" "@typescript-eslint/visitor-keys" "5.57.0" +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/type-utils@5.57.0": version "5.57.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz#98e7531c4e927855d45bd362de922a619b4319f2" @@ -5456,6 +5464,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.57.0.tgz#727bfa2b64c73a4376264379cf1f447998eaa132" integrity sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + "@typescript-eslint/typescript-estree@5.48.2": version "5.48.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz#6e206b462942b32383582a6c9251c05021cc21b0" @@ -5495,6 +5508,19 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/utils@5.51.0": version "5.51.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.51.0.tgz#074f4fabd5b12afe9c8aa6fdee881c050f8b4d47" @@ -5523,7 +5549,7 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.13.0": +"@typescript-eslint/utils@^5.10.0": version "5.48.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.2.tgz#3777a91dcb22b8499a25519e06eef2e9569295a3" integrity sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow== @@ -5537,6 +5563,20 @@ eslint-utils "^3.0.0" semver "^7.3.7" +"@typescript-eslint/utils@^5.58.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/visitor-keys@5.48.2": version "5.48.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz#c247582a0bcce467461d7b696513bf9455000060" @@ -5561,6 +5601,14 @@ "@typescript-eslint/types" "5.57.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + "@xmldom/xmldom@^0.8.8": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" @@ -8550,12 +8598,12 @@ eslint-plugin-react@7.32.1: semver "^6.3.0" string.prototype.matchall "^4.0.8" -eslint-plugin-testing-library@5.9.1: - version "5.9.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.9.1.tgz#12e4bd34c48683ee98af4df2e3318ec9f51dcf8a" - integrity sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ== +eslint-plugin-testing-library@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.2.0.tgz#af3340b783c881eb19ec5ac6b3a4bfe8ab4a1f74" + integrity sha512-+LCYJU81WF2yQ+Xu4A135CgK8IszcFcyMF4sWkbiu6Oj+Nel0TrkZq/HvDw0/1WuO3dhDQsZA/OpEMGd0NfcUw== dependencies: - "@typescript-eslint/utils" "^5.13.0" + "@typescript-eslint/utils" "^5.58.0" eslint-plugin-unused-imports@2.0.0: version "2.0.0"