From d20730ae9ed8896dc23eac0202c0c0bd9ccf2eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Antunes?= Date: Tue, 15 Oct 2024 15:02:47 +0100 Subject: [PATCH] fix(upgrade-service): allow no preflights and no config (#4942) * fix(upgrade-service): allow no preflights and no config --- pkg/upgradeservice/handlers/config.go | 8 - web/package.json | 12 + .../components/upgrade_service/AppConfig.tsx | 2 +- .../upgrade_service/ConfirmAndDeploy.tsx | 59 +++- .../upgrade_service/PreflightChecks.tsx | 38 ++- .../upgrade_service/UpgradeService.test.tsx | 139 ++++++++ .../upgrade_service/UpgradeService.tsx | 111 ++++-- .../hooks/getPreflightResult.tsx | 7 +- .../hooks/getUpgradeInfo.test.tsx | 118 +++++++ .../upgrade_service/hooks/getUpgradeInfo.tsx | 60 ++++ .../components/upgrade_service/hooks/index.ts | 10 +- .../hooks/postPreflightRun.tsx | 14 +- web/src/jest-setup.ts | 2 + web/src/utilities/test-utils.ts | 8 + web/tsconfig.json | 3 +- web/yarn.lock | 319 ++++++++++++++++-- 16 files changed, 817 insertions(+), 93 deletions(-) create mode 100644 web/src/components/upgrade_service/UpgradeService.test.tsx create mode 100644 web/src/components/upgrade_service/hooks/getUpgradeInfo.test.tsx create mode 100644 web/src/components/upgrade_service/hooks/getUpgradeInfo.tsx create mode 100644 web/src/jest-setup.ts create mode 100644 web/src/utilities/test-utils.ts diff --git a/pkg/upgradeservice/handlers/config.go b/pkg/upgradeservice/handlers/config.go index 34482df890..fc3acd4199 100644 --- a/pkg/upgradeservice/handlers/config.go +++ b/pkg/upgradeservice/handlers/config.go @@ -25,7 +25,6 @@ import ( "github.com/replicatedhq/kots/pkg/render" rendertypes "github.com/replicatedhq/kots/pkg/render/types" "github.com/replicatedhq/kots/pkg/template" - upgradepreflight "github.com/replicatedhq/kots/pkg/upgradeservice/preflight" "github.com/replicatedhq/kots/pkg/util" kotsv1beta1 "github.com/replicatedhq/kotskinds/apis/kots/v1beta1" "github.com/replicatedhq/kotskinds/multitype" @@ -379,13 +378,6 @@ func (h *Handler) SaveConfig(w http.ResponseWriter, r *http.Request) { } } - if err := upgradepreflight.Run(params); err != nil { - response.Error = "failed to run preflights" - logger.Error(errors.Wrap(err, response.Error)) - JSON(w, http.StatusInternalServerError, response) - return - } - response.Success = true JSON(w, http.StatusOK, response) } diff --git a/web/package.json b/web/package.json index 08c278061c..3b7692762b 100644 --- a/web/package.json +++ b/web/package.json @@ -94,9 +94,12 @@ "eslint-plugin-standard": "5.0.0", "eslint-webpack-plugin": "^4.2.0", "html-webpack-plugin": "^5.6.0", + "intersection-observer": "^0.12.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "jest-fixed-jsdom": "^0.0.4", "mini-css-extract-plugin": "^2.9.1", + "msw": "^2.4.10", "object-assign": "^4.1.1", "os-browserify": "^0.3.0", "path": "^0.12.7", @@ -104,6 +107,7 @@ "prop-types": "^15.7.2", "sass": "^1.79.5", "sass-loader": "12.4.0", + "slugify": "^1.6.6", "source-map-loader": "^5.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.4", @@ -192,6 +196,14 @@ "not dead" ], "jest": { + "setupFilesAfterEnv": [ + "/src/jest-setup.ts" + ], + "testEnvironmentOptions": { + "customExportConditions": [ + "" + ] + }, "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/__mocks__/fileMock.js", "\\.(scss|css|less)$": "/__mocks__/styleMock.js", diff --git a/web/src/components/upgrade_service/AppConfig.tsx b/web/src/components/upgrade_service/AppConfig.tsx index ed033cc77d..9e393ce30c 100644 --- a/web/src/components/upgrade_service/AppConfig.tsx +++ b/web/src/components/upgrade_service/AppConfig.tsx @@ -603,7 +603,7 @@ export const AppConfig = ({ ); })} -
+
diff --git a/web/src/components/upgrade_service/ConfirmAndDeploy.tsx b/web/src/components/upgrade_service/ConfirmAndDeploy.tsx index bfc6cddd5a..eecf0139c1 100644 --- a/web/src/components/upgrade_service/ConfirmAndDeploy.tsx +++ b/web/src/components/upgrade_service/ConfirmAndDeploy.tsx @@ -26,9 +26,46 @@ interface PreflightResultResponse { showWarn: boolean; } +const BackButton = ({ + slug, + hasPreflight, + isConfigurable, +}: { + slug: string; + hasPreflight: boolean; + isConfigurable: boolean; +}) => { + const navigate = useNavigate(); + + if (hasPreflight) { + return ( + + ); + } + + return ( + + ); +}; + const ConfirmAndDeploy = ({ setCurrentStep, + hasPreflight, + isConfigurable, }: { + isConfigurable: boolean; + hasPreflight: boolean; setCurrentStep: (step: number) => void; }) => { useEffect(() => { @@ -181,7 +218,10 @@ const ConfirmAndDeploy = ({ return (
-
+
{location.pathname.includes("version-history") && (
navigate(-1)}> - {preflightCheck?.showPreflightCheckPending && ( + {hasPreflight && preflightCheck?.showPreflightCheckPending && (
- {preflightCheck?.showPreflightResults && ( + {hasPreflight && preflightCheck?.showPreflightResults && (

@@ -258,7 +298,7 @@ const ConfirmAndDeploy = ({

)} - {preflightCheck?.showIgnorePreflight && ( + {hasPreflight && preflightCheck?.showIgnorePreflight && (
- + @@ -156,6 +169,7 @@ const PreflightCheck = ({ diff --git a/web/src/components/upgrade_service/UpgradeService.test.tsx b/web/src/components/upgrade_service/UpgradeService.test.tsx new file mode 100644 index 0000000000..d43a6aa471 --- /dev/null +++ b/web/src/components/upgrade_service/UpgradeService.test.tsx @@ -0,0 +1,139 @@ +/** + * @jest-environment jest-fixed-jsdom + */ + +import { http, HttpResponse } from "msw"; +import { setupServer } from "msw/node"; +import { render } from "@testing-library/react"; +import { UpgradeService } from "./UpgradeService"; +import { MemoryRouter, Route, Routes } from "react-router-dom"; +import { getSlug } from "@src/utilities/test-utils"; + +describe("UpgradeService", () => { + const api = "http://test-api"; + + it("Loading screen is present", async () => { + const { getByText } = render( + + + } /> + + + ); + + expect(getByText("Checking required steps...")).toBeDefined(); + }); + + describe("Initial state request", () => { + const server = setupServer(); + + // Override the API url used by the query + beforeAll(() => { + process.env.API_ENDPOINT = api; + server.listen(); + }); + + // Restore the API_ENDPOINT env var and close the interceptor + afterAll(() => { + process.env.API_ENDPOINT = undefined; + server.close(); + }); + + afterEach(() => { + // Remove any handlers added + // in individual tests (runtime handlers). + server.resetHandlers(); + }); + + it("We get routed to the config section if the initial request succeeds and the app is configurable", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return HttpResponse.json({ + isConfigurable: true, + hasPreflight: false, + }); + }) + ); + + const { findByTestId } = render( + + + } /> + + + ); + + await findByTestId("config-area"); + }); + + it("We get routed to the preflight section if the initial request succeeds and the app is not configurable", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return HttpResponse.json({ + isConfigurable: false, + hasPreflight: true, + }); + }) + ); + + const { findByTestId, getByText } = render( + + + } /> + + + ); + + await findByTestId("preflight-check-area"); + + expect(getByText("Back: Config")).toBeDisabled(); + }); + + it("We get routed to the confirm and deploy section if the initial request succeeds and the app is not configurable and doesn't have preflights", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return HttpResponse.json({ + isConfigurable: false, + hasPreflight: false, + }); + }) + ); + + const { findByTestId, getByText } = render( + + + } /> + + + ); + + await findByTestId("deploy-and-confirm-area"); + + expect(getByText("Back: Config")).toBeDisabled(); + }); + + it("We show an error if the get info request fails", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return new HttpResponse("Not found", { status: 404 }); + }) + ); + + const { findByText } = render( + + + } /> + + + ); + + await findByText("Encountered an error"); + }); + }); +}); diff --git a/web/src/components/upgrade_service/UpgradeService.tsx b/web/src/components/upgrade_service/UpgradeService.tsx index fcaf705729..316fce9a2e 100644 --- a/web/src/components/upgrade_service/UpgradeService.tsx +++ b/web/src/components/upgrade_service/UpgradeService.tsx @@ -1,4 +1,4 @@ -import { Route, Routes, Navigate } from "react-router-dom"; +import { Route, Routes, Navigate, useMatch } from "react-router-dom"; import { Helmet } from "react-helmet"; import NotFound from "@components/static/NotFound"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; @@ -14,56 +14,113 @@ import PreflightChecks from "./PreflightChecks"; import ConfirmAndDeploy from "./ConfirmAndDeploy"; import { KotsPageTitle } from "@components/Head"; import { UpgradeServiceProvider } from "./UpgradeServiceContext"; +import Loader from "@components/shared/Loader"; +import { useGetUpgradeInfo } from "./hooks"; // react-query client const queryClient = new QueryClient(); -const UpgradeService = () => { +const UpgradeServiceBody = () => { const Crashz = () => { throw new Error("Crashz!"); }; const [currentStep, setCurrentStep] = useState(0); + const { params } = useMatch("/upgrade-service/app/:slug/*"); + const { + data: upgradeInfo, + error: getUpgradeInfoError, + isError, + isLoading, + isSuccess, + } = useGetUpgradeInfo({ slug: params.slug }); + return ( - - - - - - - - -
- {" "} - + + +
+ {" "} + + {isError && ( +
+
+
+

Encountered an error

+

{getUpgradeInfoError.message}

+
+
+ )} + {isLoading && ( +
+ + Checking required steps... + + +
+ )} + {isSuccess && ( - } />{" "} + } /> } /> } + element={ + upgradeInfo?.isConfigurable ? ( + + ) : ( + + ) + } /> } + element={ + upgradeInfo?.hasPreflight ? ( + + ) : ( + + ) + } /> } + element={ + + } /> } /> -
- - + )} +
+
+
+ ); +}; + +const UpgradeService = () => { + return ( + + + + + + + ); }; diff --git a/web/src/components/upgrade_service/hooks/getPreflightResult.tsx b/web/src/components/upgrade_service/hooks/getPreflightResult.tsx index 4bc412f55f..e44314c87c 100644 --- a/web/src/components/upgrade_service/hooks/getPreflightResult.tsx +++ b/web/src/components/upgrade_service/hooks/getPreflightResult.tsx @@ -8,9 +8,7 @@ import { useState } from "react"; async function getPreflightResult({ slug, }: { - apiEndpoint?: string; slug: string; - sequence?: string; }): Promise { const jsonResponse = await fetch( `${process.env.API_ENDPOINT}/upgrade-service/app/${slug}/preflight/result`, @@ -170,9 +168,11 @@ function makeRefetchInterval(preflightCheck: PreflightCheck): number | false { function useGetPrelightResults({ slug, sequence, + enabled = true, }: { slug: string; sequence?: string; + enabled?: boolean; }) { // this is for the progress bar const [refetchCount, setRefetchCount] = useState(0); @@ -181,8 +181,9 @@ function useGetPrelightResults({ queryFn: () => { setRefetchCount(refetchCount + 1); - return getPreflightResult({ slug, sequence }); + return getPreflightResult({ slug }); }, + enabled, queryKey: ["preflight-results", sequence, slug], onError: (err: Error) => { console.log(err); diff --git a/web/src/components/upgrade_service/hooks/getUpgradeInfo.test.tsx b/web/src/components/upgrade_service/hooks/getUpgradeInfo.test.tsx new file mode 100644 index 0000000000..1019949aab --- /dev/null +++ b/web/src/components/upgrade_service/hooks/getUpgradeInfo.test.tsx @@ -0,0 +1,118 @@ +/** + * @jest-environment jest-fixed-jsdom + */ +import { http, HttpResponse } from "msw"; +import { setupServer } from "msw/node"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { renderHook } from "@testing-library/react-hooks"; +import { useGetUpgradeInfo } from "./getUpgradeInfo"; +import { ReactElement } from "react"; +import { getSlug } from "@src/utilities/test-utils"; + +describe("useGetUpgradeInfo", () => { + const api = "http://test-api"; + const server = setupServer(); + let queryClient: QueryClient; + let wrapper: ({ children }: { children: ReactElement }) => ReactElement; + + beforeAll(() => { + server.listen(); + }); + + afterAll(() => { + server.close(); + }); + + afterEach(() => { + // Remove any handlers added + // in individual tests (runtime handlers). + server.resetHandlers(); + }); + + beforeEach(() => { + queryClient = new QueryClient(); + wrapper = function wrapperFunc({ children }) { + return ( + + {children} + + ); + }; + }); + + it("normal response", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return HttpResponse.json({ + isConfigurable: true, + hasPreflight: false, + }); + }) + ); + + const { result, waitFor } = renderHook(useGetUpgradeInfo, { + initialProps: { api, slug }, + // @ts-expect-error: struggling to make the wrapper types comply, ignoring for now + wrapper, + }); + + await waitFor(() => result.current.isSuccess); + expect(result.current.data.isConfigurable).toStrictEqual(true); + expect(result.current.data.hasPreflight).toStrictEqual(false); + }); + + it("non JSON response throws an error and is handled by the hook", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return HttpResponse.text("this should produce an error"); + }) + ); + + const { result, waitFor } = renderHook(useGetUpgradeInfo, { + initialProps: { api, slug, retry: 0 }, + // @ts-expect-error: struggling to make the wrapper types comply, ignoring for now + wrapper, + }); + + await waitFor(() => result.current.isError); + expect(result.current.error).toBeDefined(); + }); + + it("4xx response throws an error and is handled by the hook", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return new HttpResponse("Not found", { status: 404 }); + }) + ); + + const { result, waitFor } = renderHook(useGetUpgradeInfo, { + initialProps: { api, slug, retry: 0 }, + // @ts-expect-error: struggling to make the wrapper types comply, ignoring for now + wrapper, + }); + + await waitFor(() => result.current.isError); + expect(result.current.error).toBeDefined(); + }); + + it("5xx response throws an error and is handled by the hook", async () => { + const slug = getSlug(expect); + server.use( + http.get(`${api}/upgrade-service/app/${slug}`, () => { + return new HttpResponse("Something is really broken", { status: 503 }); + }) + ); + + const { result, waitFor } = renderHook(useGetUpgradeInfo, { + initialProps: { api, slug, retry: 0 }, + // @ts-expect-error: struggling to make the wrapper types comply, ignoring for now + wrapper, + }); + + await waitFor(() => result.current.isError); + expect(result.current.error).toBeDefined(); + }); +}); diff --git a/web/src/components/upgrade_service/hooks/getUpgradeInfo.tsx b/web/src/components/upgrade_service/hooks/getUpgradeInfo.tsx new file mode 100644 index 0000000000..2c6c87161f --- /dev/null +++ b/web/src/components/upgrade_service/hooks/getUpgradeInfo.tsx @@ -0,0 +1,60 @@ +import { useQuery } from "@tanstack/react-query"; + +type UpgradeInfoResponse = { + isConfigurable: boolean; + hasPreflight: boolean; +}; + +type UpgradeInfoParams = { + api?: string; + retry?: number; + slug: string; +}; + +// Set the retries to 0 when testing +const DEFAULT_RETRY = process.env.NODE_ENV === "test" ? 0 : 3; + +async function getUpgradeInfo({ + api = process.env.API_ENDPOINT, + slug, +}: UpgradeInfoParams): Promise { + const jsonResponse = await fetch(`${api}/upgrade-service/app/${slug}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + }); + + if (!jsonResponse.ok) { + throw new Error( + `Encountered an error while upgrade info: Unexpected status code: ${jsonResponse.status}` + ); + } + + try { + const response: UpgradeInfoResponse = await jsonResponse.json(); + + return response; + } catch (err) { + console.error(err); + throw new Error("Encountered an error while unmarshalling upgrade info"); + } +} + +function useGetUpgradeInfo({ + slug, + api, + retry = DEFAULT_RETRY, +}: UpgradeInfoParams) { + return useQuery({ + queryFn: () => getUpgradeInfo({ slug, api }), + queryKey: ["upgrade-info", slug], + retry, + onError: (err: Error) => { + console.log(err); + }, + }); +} + +export { useGetUpgradeInfo }; diff --git a/web/src/components/upgrade_service/hooks/index.ts b/web/src/components/upgrade_service/hooks/index.ts index 0380064401..397d582880 100644 --- a/web/src/components/upgrade_service/hooks/index.ts +++ b/web/src/components/upgrade_service/hooks/index.ts @@ -1,5 +1,11 @@ import { useGetPrelightResults } from "./getPreflightResult"; -import { useRerunPreflights } from "./postPreflightRun"; +import { useGetUpgradeInfo } from "./getUpgradeInfo"; +import { useRunPreflights } from "./postPreflightRun"; import { useDeployAppVersion } from "./postDeployAppVersion"; -export { useGetPrelightResults, useRerunPreflights, useDeployAppVersion }; +export { + useGetPrelightResults, + useGetUpgradeInfo, + useRunPreflights, + useDeployAppVersion, +}; diff --git a/web/src/components/upgrade_service/hooks/postPreflightRun.tsx b/web/src/components/upgrade_service/hooks/postPreflightRun.tsx index 6905c607ee..260ba19168 100644 --- a/web/src/components/upgrade_service/hooks/postPreflightRun.tsx +++ b/web/src/components/upgrade_service/hooks/postPreflightRun.tsx @@ -1,12 +1,6 @@ import { useMutation, useQueryClient } from "@tanstack/react-query"; -async function postPreflightRun({ - slug, -}: { - apiEndpoint?: string; - slug: string; - sequence: string; -}) { +async function postPreflightRun({ slug }: { slug: string }) { const response = await fetch( `${process.env.API_ENDPOINT}/upgrade-service/app/${slug}/preflight/run`, { @@ -26,7 +20,7 @@ async function postPreflightRun({ } } -function useRerunPreflights({ +function useRunPreflights({ slug, sequence, }: { @@ -36,7 +30,7 @@ function useRerunPreflights({ const queryClient = useQueryClient(); return useMutation({ - mutationFn: () => postPreflightRun({ slug, sequence }), + mutationFn: () => postPreflightRun({ slug }), onError: (err: Error) => { console.log(err); throw new Error(err.message || "Error running preflight checks"); @@ -49,4 +43,4 @@ function useRerunPreflights({ }); } -export { useRerunPreflights }; +export { useRunPreflights }; diff --git a/web/src/jest-setup.ts b/web/src/jest-setup.ts new file mode 100644 index 0000000000..e664f05232 --- /dev/null +++ b/web/src/jest-setup.ts @@ -0,0 +1,2 @@ +import "intersection-observer"; +import "@testing-library/jest-dom"; diff --git a/web/src/utilities/test-utils.ts b/web/src/utilities/test-utils.ts new file mode 100644 index 0000000000..99928880ee --- /dev/null +++ b/web/src/utilities/test-utils.ts @@ -0,0 +1,8 @@ +import slugify from "slugify"; + +/** + * Helper to build slugs based on test names + */ +export function getSlug(expect: jest.Expect) { + return `slug-${slugify(expect.getState().currentTestName)}`; +} diff --git a/web/tsconfig.json b/web/tsconfig.json index 9fb7b0ba81..65bae8beec 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -119,7 +119,8 @@ "noFallthroughCasesInSwitch": true // Report errors for fallthrough cases in switch statement }, "include": [ - "src/**/*" // *** The files TypeScript should type check *** + "src/**/*", // *** The files TypeScript should type check *** + "config/jest-setup.ts" ], "exclude": ["node_modules", "dist"] // *** The files to not type check *** } diff --git a/web/yarn.lock b/web/yarn.lock index 66ddc4fe06..d7198b0ac8 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -49,7 +49,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.25.7", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.7", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== @@ -377,7 +377,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.7", "@babel/parser@^7.25.8": +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.7", "@babel/parser@^7.25.8": version "7.25.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2" integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ== @@ -1249,14 +1249,30 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.12.7", "@babel/template@^7.25.7", "@babel/template@^7.3.3": +"@babel/runtime@^7.12.13": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.12.7", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/template@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== @@ -1278,7 +1294,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.7", "@babel/types@^7.18.6", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.25.7", "@babel/types@^7.25.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.7", "@babel/types@^7.18.6", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.25.0", "@babel/types@^7.25.7", "@babel/types@^7.25.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.25.8" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg== @@ -1302,6 +1318,28 @@ resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz" integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== +"@bundled-es-modules/cookie@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz#c3b82703969a61cf6a46e959a012b2c257f6b164" + integrity sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw== + dependencies: + cookie "^0.5.0" + +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" + +"@bundled-es-modules/tough-cookie@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz#fa9cd3cedfeecd6783e8b0d378b4a99e52bde5d3" + integrity sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw== + dependencies: + "@types/tough-cookie" "^4.0.5" + tough-cookie "^4.1.4" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1682,6 +1720,51 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@inquirer/confirm@^3.0.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.2.0.tgz#6af1284670ea7c7d95e3f1253684cfbd7228ad6a" + integrity sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + +"@inquirer/core@^9.1.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.2.1.tgz#677c49dee399c9063f31e0c93f0f37bddc67add1" + integrity sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg== + dependencies: + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" + "@types/mute-stream" "^0.0.4" + "@types/node" "^22.5.5" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.7.tgz#d050ccc0eabfacc0248c4ff647a9dfba1b01594b" + integrity sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw== + +"@inquirer/type@^1.5.3": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.5.tgz#303ea04ce7ad2e585b921b662b3be36ef7b4f09b" + integrity sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA== + dependencies: + mute-stream "^1.0.0" + +"@inquirer/type@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-2.0.0.tgz#08fa513dca2cb6264fe1b0a2fabade051444e3f6" + integrity sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag== + dependencies: + mute-stream "^1.0.0" + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2111,6 +2194,18 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@mswjs/interceptors@^0.35.8": + version "0.35.9" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.35.9.tgz#1e1488ff2f333683d374eccc8c0f4d5d851c6d3d" + integrity sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.4.3" + strict-event-emitter "^0.5.1" + "@mui/core-downloads-tracker@^5.16.7": version "5.16.7" resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz#182a325a520f7ebd75de051fceabfc0314cfd004" @@ -2245,6 +2340,24 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== + "@pact-foundation/pact-core@^14.3.4": version "14.3.4" resolved "https://registry.yarnpkg.com/@pact-foundation/pact-core/-/pact-core-14.3.4.tgz#9ca8f5ae23eea7ab1afbd83b3b87a799d1cd6319" @@ -4039,6 +4152,13 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + "@types/needle@^2.5.3": version "2.5.3" resolved "https://registry.yarnpkg.com/@types/needle/-/needle-2.5.3.tgz#cc64f46411b811df260171b68756e67d36890ea1" @@ -4088,6 +4208,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^22.5.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" @@ -4255,6 +4382,11 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/statuses@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.5.tgz#f61ab46d5352fd73c863a1ea4e1cef3b0b51ae63" + integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A== + "@types/styled-components@^5.1.26": version "5.1.26" resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af" @@ -4274,6 +4406,11 @@ resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/tough-cookie@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/uglify-js@*": version "3.17.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" @@ -4317,6 +4454,11 @@ anymatch "^3.0.0" source-map "^0.6.0" +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@types/ws@^8.5.5": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -5000,7 +5142,7 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -6763,6 +6905,11 @@ cli-table3@^0.6.1: optionalDependencies: "@colors/colors" "1.5.0" +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + clipboard@2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" @@ -6781,6 +6928,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -7033,6 +7189,11 @@ cookie@0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookie@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" @@ -10035,6 +10196,11 @@ graphql@^14.0.0: dependencies: iterall "^1.2.2" +graphql@^16.8.1: + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== + gulp-header@^1.7.1: version "1.8.12" resolved "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz" @@ -10280,6 +10446,11 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +headers-polyfill@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" + integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== + help-me@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/help-me/-/help-me-4.2.0.tgz#50712bfd799ff1854ae1d312c36eafcea85b0563" @@ -10295,7 +10466,7 @@ highlight-words@1.2.2: history@^4.9.0: version "4.10.1" - resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== dependencies: "@babel/runtime" "^7.1.2" @@ -10680,6 +10851,11 @@ interpret@^3.1.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== +intersection-observer@^0.12.2: + version "0.12.2" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" + integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== + invariant@^2.2.2: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" @@ -10991,6 +11167,11 @@ is-negative-zero@^2.0.3: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" @@ -11186,8 +11367,8 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: isarray@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" @@ -11462,6 +11643,11 @@ jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" +jest-fixed-jsdom@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/jest-fixed-jsdom/-/jest-fixed-jsdom-0.0.4.tgz#3c95610bd777aedf045fd0a5e74b9641563e2e91" + integrity sha512-P9BVuU55UMoOSqNRTLKajmfFNNP/4W4P+fJYGpgmSkTJbyMzNwjNVBMDoUmFZkvWo4oi1/NXTyF0+hTO1yShBA== + jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" @@ -12809,6 +12995,29 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@^2.4.10: + version "2.4.10" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.10.tgz#148d809f8e9dfd3c7d0abb93c1641bfaea877b9e" + integrity sha512-bDQh9b25JK4IKMs5hnamwAkcNZ9RwA4mR/4YcgWkzwHOxj7UICbVJfmChJvY1UCAAMraPpvjHdxjoUDpc3F+Qw== + dependencies: + "@bundled-es-modules/cookie" "^2.0.0" + "@bundled-es-modules/statuses" "^1.0.1" + "@bundled-es-modules/tough-cookie" "^0.1.6" + "@inquirer/confirm" "^3.0.0" + "@mswjs/interceptors" "^0.35.8" + "@open-draft/until" "^2.1.0" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" + chalk "^4.1.2" + graphql "^16.8.1" + headers-polyfill "^4.0.2" + is-node-process "^1.2.0" + outvariant "^1.4.2" + path-to-regexp "^6.3.0" + strict-event-emitter "^0.5.1" + type-fest "^4.9.0" + yargs "^17.7.2" + multicast-dns@^7.2.4: version "7.2.4" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz" @@ -12817,6 +13026,11 @@ multicast-dns@^7.2.4: dns-packet "^5.2.2" thunky "^1.0.2" +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -13355,6 +13569,11 @@ os-homedir@^1.0.0: resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= +outvariant@^1.4.0, outvariant@^1.4.2, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + p-all@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" @@ -13659,12 +13878,17 @@ path-to-regexp@0.1.10: integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz#5dc0753acbf8521ca2e0f137b4578b917b10cf24" + integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== dependencies: isarray "0.0.1" +path-to-regexp@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -15157,7 +15381,7 @@ resolve-from@^5.0.0: resolve-pathname@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== resolve-protobuf-schema@^2.1.0: @@ -15725,7 +15949,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -15754,6 +15978,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slugify@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" + integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -16013,7 +16242,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@2.0.1: +statuses@2.0.1, statuses@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== @@ -16095,6 +16324,11 @@ streamx@^2.15.0: optionalDependencies: bare-events "^2.2.0" +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" @@ -16744,14 +16978,19 @@ tiny-emitter@^2.0.0: resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== -tiny-invariant@^1.0.2, tiny-invariant@^1.3.1: +tiny-invariant@^1.0.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +tiny-invariant@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-warning@^1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== tmpl@1.0.5: @@ -16823,7 +17062,7 @@ touch@^2.0.1: dependencies: nopt "~1.0.10" -tough-cookie@^4.1.2: +tough-cookie@^4.1.2, tough-cookie@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== @@ -16992,6 +17231,11 @@ type-fest@^2.19.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-fest@^4.9.0: + version "4.26.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.1.tgz#a4a17fa314f976dd3e6d6675ef6c775c16d7955e" + integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -17162,6 +17406,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -17522,7 +17771,7 @@ validate-npm-package-license@^3.0.1: value-equal@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== vary@~1.1.2: @@ -18054,6 +18303,15 @@ worker-rpc@^0.1.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -18180,6 +18438,11 @@ yargs-parser@^21.0.0: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -18206,6 +18469,19 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" @@ -18216,6 +18492,11 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"