sts-sponsors team mailing list archive
-
sts-sponsors team
-
Mailing list archive
-
Message #05548
[Merge] ~petermakowski/maas-site-manager:list-backend-integration-MAASENG-1388 into maas-site-manager:main
Peter Makowski has proposed merging ~petermakowski/maas-site-manager:list-backend-integration-MAASENG-1388 into maas-site-manager:main.
Commit message:
feat: backend integration, add pagination MAASENG-1388
- update sites response types to include identifier
- return realistic mock data including unique sites name, address and connection status
- display country full name based on abbreviation
- display regions in singular or plural format
- update to use @tanstack/react-query
- add siteFactory, createMockSitesResolver
- add chance, fishery, i18n-iso-countries, unique-names-generator, plural
Requested reviews:
MAAS Lander (maas-lander)
MAAS Committers (maas-committers)
For more details, see:
https://code.launchpad.net/~petermakowski/maas-site-manager/+git/site-manager/+merge/438203
feat: add pagination
- update to use @tanstack/react-query
feat: display regions in singular or plural format
- add siteFactory, createMockSitesResolver
- add chance, fishery, i18n-iso-countries, unique-names-generator, plural
--
Your team MAAS Committers is requested to review the proposed merge of ~petermakowski/maas-site-manager:list-backend-integration-MAASENG-1388 into maas-site-manager:main.
diff --git a/frontend/package.json b/frontend/package.json
index 1991368..5e953c9 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -13,15 +13,16 @@
},
"dependencies": {
"@canonical/react-components": "0.38.0",
+ "@tanstack/react-query": "4.24.10",
"@tanstack/react-table": "8.7.9",
"axios": "1.3.4",
"classnames": "2.3.2",
"date-fns": "2.29.3",
"date-fns-tz": "2.0.0",
"lodash": "4.17.21",
+ "pluralize": "8.0.0",
"react": "18.2.0",
"react-dom": "18.2.0",
- "react-query": "3.39.3",
"react-router-dom": "6.8.1",
"use-local-storage-state": "18.1.2",
"vanilla-framework": "3.11.0"
@@ -31,10 +32,13 @@
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "13.4.0",
"@types/axios": "0.14.0",
+ "@types/chance": "1.1.3",
"@types/lodash": "4.14.191",
+ "@types/pluralize": "0.0.29",
"@types/react": "18.0.27",
"@types/react-dom": "18.0.10",
"@vitejs/plugin-react-swc": "3.0.0",
+ "chance": "1.1.10",
"dotenv": "16.0.3",
"eslint": "8.35.0",
"eslint-config-prettier": "8.6.0",
@@ -44,6 +48,8 @@
"eslint-plugin-no-only-tests": "3.1.0",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-react": "7.32.2",
+ "fishery": "2.2.2",
+ "i18n-iso-countries": "7.5.0",
"mockdate": "3.0.5",
"msw": "1.0.1",
"npm-package-json-lint": "6.4.0",
@@ -51,6 +57,7 @@
"sass": "1.58.1",
"timezone-mock": "1.3.6",
"typescript": "4.9.3",
+ "unique-names-generator": "4.7.1",
"vite": "4.1.0",
"vitest": "0.28.5"
},
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 9607ac4..4db42f0 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -1,5 +1,5 @@
import "./App.scss";
-import { QueryClient, QueryClientProvider } from "react-query";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { RouterProvider } from "react-router-dom";
import router from "./router";
diff --git a/frontend/src/api/handlers.ts b/frontend/src/api/handlers.ts
index f9b605f..9eff927 100644
--- a/frontend/src/api/handlers.ts
+++ b/frontend/src/api/handlers.ts
@@ -1,9 +1,14 @@
import api from "./api";
import urls from "./urls";
-export const getSites = async () => {
+export type GetSitesQueryParams = {
+ page: string;
+ size: string;
+};
+
+export const getSites = async (params: GetSitesQueryParams) => {
try {
- const response = await api.get(urls.sites);
+ const response = await api.get(urls.sites, { params });
return response.data;
} catch (error) {
// eslint-disable-next-line no-console
diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts
index 5314e6f..f4f18e3 100644
--- a/frontend/src/api/types.ts
+++ b/frontend/src/api/types.ts
@@ -1,7 +1,8 @@
export type Site = {
+ identifier: string;
name: string;
url: string; // <full URL including protocol>,
- connection: "stable" | "stale" | "lost";
+ connection: "stable" | "unstable" | "stale" | "lost";
last_seen: string; // <ISO 8601 date>,
address: {
countrycode: string; // <alpha2 country code>,
diff --git a/frontend/src/components/SitesList/SitesList.test.tsx b/frontend/src/components/SitesList/SitesList.test.tsx
index b944366..56dd9f7 100644
--- a/frontend/src/components/SitesList/SitesList.test.tsx
+++ b/frontend/src/components/SitesList/SitesList.test.tsx
@@ -1,12 +1,13 @@
import urls from "../../api/urls";
-import { sites } from "../../mocks/factories";
+import { siteFactory } from "../../mocks/factories";
+import { createMockSitesResolver } from "../../mocks/resolvers";
import { createMockGetServer } from "../../mocks/server";
import { render, screen, waitFor, within } from "../../test-utils";
import SitesList from "./SitesList";
-const sitesData = sites();
-const mockServer = createMockGetServer(urls.sites, sitesData);
+const sites = siteFactory.buildList(2);
+const mockServer = createMockGetServer(urls.sites, createMockSitesResolver(sites));
beforeAll(() => {
mockServer.listen();
@@ -18,12 +19,6 @@ afterAll(() => {
mockServer.close();
});
-it("renders header", () => {
- render(<SitesList />);
-
- expect(screen.getByRole("heading", { name: /MAAS Regions/i })).toBeInTheDocument();
-});
-
it("displays loading text", () => {
render(<SitesList />);
@@ -31,16 +26,14 @@ it("displays loading text", () => {
});
it("displays populated sites table", async () => {
- const { items } = sitesData;
render(<SitesList />);
- await waitFor(() => expect(screen.getByRole("table", { name: /sites/i })).toBeInTheDocument());
+ expect(screen.getByRole("table", { name: /sites/i })).toBeInTheDocument();
- expect(screen.getAllByRole("rowgroup")).toHaveLength(2);
- expect(screen.getByRole("heading", { name: /2 MAAS Regions/i })).toBeInTheDocument();
+ await waitFor(() => expect(screen.getAllByRole("rowgroup")).toHaveLength(2));
const tableBody = screen.getAllByRole("rowgroup")[1];
- expect(within(tableBody).getAllByRole("row")).toHaveLength(items.length);
+ expect(within(tableBody).getAllByRole("row")).toHaveLength(sites.length);
within(tableBody)
.getAllByRole("row")
- .forEach((row, i) => expect(row).toHaveTextContent(new RegExp(items[i].name, "i")));
+ .forEach((row, i) => expect(row).toHaveTextContent(new RegExp(sites[i].name, "i")));
});
diff --git a/frontend/src/components/SitesList/SitesList.tsx b/frontend/src/components/SitesList/SitesList.tsx
index 682c17a..1b520ea 100644
--- a/frontend/src/components/SitesList/SitesList.tsx
+++ b/frontend/src/components/SitesList/SitesList.tsx
@@ -1,13 +1,30 @@
+import { useState } from "react";
+
+import { Pagination } from "@canonical/react-components";
+
import { useSitesQuery } from "../../hooks/api";
import SitesTable from "./components/SitesTable";
+const DEFAULT_PAGE_SIZE = 50;
+
const SitesList = () => {
- const { data, isLoading, isFetchedAfterMount } = useSitesQuery();
+ const [page, setPage] = useState(0);
+ const [size] = useState(DEFAULT_PAGE_SIZE);
+ const { data, isLoading, isFetchedAfterMount } = useSitesQuery({ page: `${page}`, size: `${size}` });
return (
<div>
<SitesTable data={data} isFetchedAfterMount={isFetchedAfterMount} isLoading={isLoading} />
+ <Pagination
+ currentPage={page + 1}
+ disabled={isLoading}
+ itemsPerPage={size}
+ paginate={(page) => {
+ setPage(page - 1);
+ }}
+ totalItems={data?.total || 0}
+ />
</div>
);
};
diff --git a/frontend/src/components/SitesList/components/SitesCount.test.tsx b/frontend/src/components/SitesList/components/SitesCount.test.tsx
new file mode 100644
index 0000000..defa9e4
--- /dev/null
+++ b/frontend/src/components/SitesList/components/SitesCount.test.tsx
@@ -0,0 +1,20 @@
+import { siteFactory } from "../../../mocks/factories";
+import { render, screen } from "../../../test-utils";
+
+import SitesCount from "./SitesCount";
+
+it("displays plural sites count", () => {
+ const total = 11;
+ const items = siteFactory.buildList(total);
+ render(<SitesCount data={{ items, total, page: 1, size: 1 }} isLoading={false} />);
+
+ expect(screen.getByText("11 MAAS regions")).toBeInTheDocument();
+});
+
+it("displays singular sites count", () => {
+ const total = 1;
+ const items = siteFactory.buildList(total);
+ render(<SitesCount data={{ items, total, page: 1, size: 1 }} isLoading={false} />);
+
+ expect(screen.getByText("1 MAAS region")).toBeInTheDocument();
+});
diff --git a/frontend/src/components/SitesList/components/SitesCount.tsx b/frontend/src/components/SitesList/components/SitesCount.tsx
new file mode 100644
index 0000000..431dacf
--- /dev/null
+++ b/frontend/src/components/SitesList/components/SitesCount.tsx
@@ -0,0 +1,13 @@
+import pluralize from "pluralize";
+
+import type { UseSitesQueryResult } from "../../../hooks/api";
+import Placeholder from "../../Placeholder";
+
+const SitesCount = ({ data, isLoading }: Pick<UseSitesQueryResult, "data" | "isLoading">) =>
+ isLoading ? (
+ <Placeholder isLoading={isLoading} text="xx" />
+ ) : (
+ <span>{`${pluralize("MAAS regions", data?.total || 0, !!data?.total)}`}</span>
+ );
+
+export default SitesCount;
diff --git a/frontend/src/components/SitesList/components/SitesTable.test.tsx b/frontend/src/components/SitesList/components/SitesTable.test.tsx
index 38fce0d..95f7c0b 100644
--- a/frontend/src/components/SitesList/components/SitesTable.test.tsx
+++ b/frontend/src/components/SitesList/components/SitesTable.test.tsx
@@ -1,8 +1,7 @@
import timezoneMock from "timezone-mock";
import { vi } from "vitest";
-import type { Site } from "../../../api/types";
-import { sites, site } from "../../../mocks/factories";
+import { siteFactory } from "../../../mocks/factories";
import { render, screen, within } from "../../../test-utils";
import SitesTable from "./SitesTable";
@@ -24,7 +23,7 @@ it("displays an empty sites table", () => {
});
it("displays rows with details for each site", () => {
- const items = sites().items as Site[];
+ const items = siteFactory.buildList(1);
render(<SitesTable data={{ items, total: 1, page: 1, size: 1 }} isFetchedAfterMount={true} isLoading={false} />);
expect(screen.getByRole("table", { name: /sites/i })).toBeInTheDocument();
@@ -40,7 +39,7 @@ it("displays correct local time", () => {
const date = new Date("2000-01-01T12:00:00Z");
vi.setSystemTime(date);
- const item = site({ timezone: "CET" });
+ const item = siteFactory.build({ timezone: "CET" });
render(
<SitesTable data={{ items: [item], total: 1, page: 1, size: 1 }} isFetchedAfterMount={true} isLoading={false} />,
);
@@ -48,3 +47,12 @@ it("displays correct local time", () => {
expect(screen.getByRole("table", { name: /sites/i })).toBeInTheDocument();
expect(screen.getByText(/13:00 \(local time\)/i)).toBeInTheDocument();
});
+
+it("displays full name of the country", () => {
+ const item = siteFactory.build({ address: { countrycode: "GB" } });
+ render(
+ <SitesTable data={{ items: [item], total: 1, page: 1, size: 1 }} isFetchedAfterMount={true} isLoading={false} />,
+ );
+
+ expect(screen.getByText("United Kingdom")).toBeInTheDocument();
+});
diff --git a/frontend/src/components/SitesList/components/SitesTable.tsx b/frontend/src/components/SitesList/components/SitesTable.tsx
index 7791887..1e12a93 100644
--- a/frontend/src/components/SitesList/components/SitesTable.tsx
+++ b/frontend/src/components/SitesList/components/SitesTable.tsx
@@ -16,6 +16,7 @@ import useLocalStorageState from "use-local-storage-state";
import type { SitesQueryResult } from "../../../api/types";
import type { UseSitesQueryResult } from "../../../hooks/api";
+import { getCountryName } from "../../../utils";
import "./SitesTable.scss";
import SitesTableControls from "./SitesTableControls";
@@ -114,7 +115,7 @@ const SitesTable = ({
const { countrycode, city, zip, street } = address || {};
return (
<>
- <div>{countrycode}</div>
+ <div>{countrycode ? getCountryName(countrycode) : ""}</div>
<div className="u-text--muted">
{street}, {city}, {zip}
</div>
diff --git a/frontend/src/components/SitesList/components/SitesTableControls.test.tsx b/frontend/src/components/SitesList/components/SitesTableControls.test.tsx
new file mode 100644
index 0000000..b271bff
--- /dev/null
+++ b/frontend/src/components/SitesList/components/SitesTableControls.test.tsx
@@ -0,0 +1,9 @@
+import { render, screen } from "../../../test-utils";
+
+import SitesTableControls from "./SitesTableControls";
+
+it("displays correct total number of sites", () => {
+ render(<SitesTableControls allColumns={[]} data={{ items: [], total: 3, page: 1, size: 0 }} isLoading={false} />);
+
+ expect(screen.getByRole("heading", { name: /3 MAAS region/i })).toBeInTheDocument();
+});
diff --git a/frontend/src/components/SitesList/components/SitesTableControls.tsx b/frontend/src/components/SitesList/components/SitesTableControls.tsx
index 076e506..6427ceb 100644
--- a/frontend/src/components/SitesList/components/SitesTableControls.tsx
+++ b/frontend/src/components/SitesList/components/SitesTableControls.tsx
@@ -1,14 +1,11 @@
import { Row, Col } from "@canonical/react-components";
import type { UseSitesQueryResult } from "../../../hooks/api";
-import Placeholder from "../../Placeholder";
import ColumnsVisibilityControl from "./ColumnsVisibilityControl";
+import SitesCount from "./SitesCount";
import type { SitesColumn } from "./SitesTable";
-const SitesCount = ({ data, isLoading }: Pick<UseSitesQueryResult, "data" | "isLoading">) =>
- isLoading ? <Placeholder isLoading={isLoading} text="xx" /> : <span>{`${data?.items?.length || ""}`}</span>;
-
const SitesTableControls = ({
data,
isLoading,
@@ -18,7 +15,7 @@ const SitesTableControls = ({
<Row>
<Col size={10}>
<h2 className="p-heading--4">
- <SitesCount data={data} isLoading={isLoading} /> MAAS Regions
+ <SitesCount data={data} isLoading={isLoading} />
</h2>
</Col>
<Col size={2}>
diff --git a/frontend/src/hooks/api.test.ts b/frontend/src/hooks/api.test.ts
index a31acc2..736b168 100644
--- a/frontend/src/hooks/api.test.ts
+++ b/frontend/src/hooks/api.test.ts
@@ -1,14 +1,15 @@
import { renderHook, waitFor } from "@testing-library/react";
import urls from "../api/urls";
-import { sites } from "../mocks/factories";
+import { siteFactory } from "../mocks/factories";
+import { createMockSitesResolver } from "../mocks/resolvers";
import { createMockGetServer } from "../mocks/server";
import { Providers } from "../test-utils";
import { useSitesQuery } from "./api";
-const sitesData = sites();
-const mockServer = createMockGetServer(urls.sites, sitesData);
+const sitesData = siteFactory.buildList(2);
+const mockServer = createMockGetServer(urls.sites, createMockSitesResolver(sitesData));
beforeAll(() => {
mockServer.listen();
@@ -21,9 +22,9 @@ afterAll(() => {
});
it("should return sites", async () => {
- const { result } = renderHook(() => useSitesQuery(), { wrapper: Providers });
+ const { result } = renderHook(() => useSitesQuery({ page: "0", size: "2" }), { wrapper: Providers });
await waitFor(() => expect(result.current.isFetchedAfterMount).toBe(true));
- expect(result.current.data!.items).toEqual(sitesData.items);
+ expect(result.current.data!.items).toEqual(sitesData);
});
diff --git a/frontend/src/hooks/api.ts b/frontend/src/hooks/api.ts
index 71943b2..ccf0b4d 100644
--- a/frontend/src/hooks/api.ts
+++ b/frontend/src/hooks/api.ts
@@ -1,7 +1,14 @@
-import { useQuery } from "react-query";
+import { useQuery } from "@tanstack/react-query";
+import type { GetSitesQueryParams } from "../api/handlers";
import { getSites } from "../api/handlers";
import type { SitesQueryResult } from "../api/types";
-export const useSitesQuery = () => useQuery<SitesQueryResult>("/api/sites", getSites);
export type UseSitesQueryResult = ReturnType<typeof useSitesQuery>;
+
+export const useSitesQuery = ({ page, size }: GetSitesQueryParams) =>
+ useQuery<SitesQueryResult>({
+ queryKey: ["sites", page, size],
+ queryFn: () => getSites({ page, size }),
+ keepPreviousData: true,
+ });
diff --git a/frontend/src/mocks/browser.ts b/frontend/src/mocks/browser.ts
index cdc1e21..b2b9266 100644
--- a/frontend/src/mocks/browser.ts
+++ b/frontend/src/mocks/browser.ts
@@ -2,10 +2,6 @@ import { setupWorker, rest } from "msw";
import urls from "../api/urls";
-import { sites } from "./factories";
+import { createMockSitesResolver } from "./resolvers";
-export const worker = setupWorker(
- rest.get(urls.sites, (_req, res, ctx) => {
- return res(ctx.delay(), ctx.json(sites()));
- }),
-);
+export const worker = setupWorker(rest.get(urls.sites, createMockSitesResolver()));
diff --git a/frontend/src/mocks/factories.ts b/frontend/src/mocks/factories.ts
index 18e6997..db2d34b 100644
--- a/frontend/src/mocks/factories.ts
+++ b/frontend/src/mocks/factories.ts
@@ -1,43 +1,41 @@
+import Chance from "chance";
+import { Factory } from "fishery";
+import { uniqueNamesGenerator, adjectives, colors, animals } from "unique-names-generator";
+
import type { Site } from "../api/types";
-export const site = (site: Partial<Site> = {}): Site => ({
- name: "maas-example-region",
- url: "http://maas.example.com",
- connection: "stable",
- last_seen: "2020-10-20T12:00:00Z",
- address: {
- countrycode: "DE", // <alpha2 country code>,
- city: "Berlin",
- zip: "10405",
- street: "Prenzlauer Allee 132",
- },
- timezone: "CET", // <three letter abbreviation>,
- stats: {
- machines: 300,
- occupied_machines: 289,
- ready_machines: 11,
- error_machines: 0,
- },
- ...site,
-});
+const connections: Site["connection"][] = ["stable", "lost", "stale", "unstable"];
-export const sites = (sites = {}) => ({
- items: [
- site(),
- site({
- name: "maas-shanghai",
- url: "http://maas.shanghai.com",
- address: {
- countrycode: "CHN",
- city: "Shanghai",
- zip: "200000",
- street: "Xinzhen Road 3",
- },
- timezone: "CST",
- }),
- ],
- total: 42,
- page: 1,
- size: 20,
- ...sites,
+export const siteFactory = Factory.define<Site>(({ sequence }) => {
+ const chance = new Chance(`maas-${sequence}`);
+ const name = uniqueNamesGenerator({
+ dictionaries: [adjectives, colors, animals],
+ separator: "-",
+ length: 2,
+ seed: sequence,
+ });
+ const connection = uniqueNamesGenerator({
+ dictionaries: [connections],
+ seed: sequence,
+ }) as Site["connection"];
+ return {
+ identifier: `${sequence}`,
+ name,
+ url: `http://${name}.${chance.tld()}`,
+ connection,
+ last_seen: new Date(chance.date({ year: 2023 })).toISOString(),
+ address: {
+ countrycode: chance.country(), // <alpha2 country code>,
+ city: chance.city(),
+ zip: chance.zip(),
+ street: chance.address(),
+ },
+ timezone: "CET", // <three letter abbreviation>,
+ stats: {
+ machines: chance.integer({ min: 0, max: 1500 }),
+ occupied_machines: chance.integer({ min: 0, max: 500 }),
+ ready_machines: chance.integer({ min: 0, max: 500 }),
+ error_machines: chance.integer({ min: 0, max: 500 }),
+ },
+ };
});
diff --git a/frontend/src/mocks/resolvers.ts b/frontend/src/mocks/resolvers.ts
new file mode 100644
index 0000000..76207f7
--- /dev/null
+++ b/frontend/src/mocks/resolvers.ts
@@ -0,0 +1,24 @@
+import type { RestRequest, restContext, ResponseResolver } from "msw";
+
+import type { GetSitesQueryParams } from "../api/handlers";
+
+import { siteFactory } from "./factories";
+
+export const sitesList = siteFactory.buildList(155);
+
+type SitesResponseResolver = ResponseResolver<RestRequest<never, GetSitesQueryParams>, typeof restContext>;
+export const createMockSitesResolver =
+ (sites = sitesList): SitesResponseResolver =>
+ (req, res, ctx) => {
+ const searchParams = new URLSearchParams(req.url.search);
+ const page = Number(searchParams.get("page"));
+ const size = Number(searchParams.get("size"));
+ const itemsPage = sites.slice(page * Number(size), (page + 1) * size);
+ const response = {
+ items: itemsPage,
+ page,
+ total: sites.length,
+ };
+
+ return res(ctx.json(response));
+ };
diff --git a/frontend/src/mocks/server.ts b/frontend/src/mocks/server.ts
index c6e4e2a..52577dd 100644
--- a/frontend/src/mocks/server.ts
+++ b/frontend/src/mocks/server.ts
@@ -4,15 +4,11 @@ import { setupServer } from "msw/node";
import urls from "../api/urls";
-import { sites } from "./factories";
+import { createMockSitesResolver } from "./resolvers";
-const createMockGetServer = (endpoint: string, response: object) =>
- setupServer(
- rest.get(endpoint, (_req, res, ctx) => {
- return res(ctx.json(response));
- }),
- );
+const createMockGetServer = (endpoint: string, resolver: ReturnType<typeof createMockSitesResolver>) =>
+ setupServer(rest.get(endpoint, resolver));
-const mockSitesServer = createMockGetServer(urls.sites, sites());
+const mockSitesServer = createMockGetServer(urls.sites, createMockSitesResolver());
export { createMockGetServer, mockSitesServer };
diff --git a/frontend/src/pages/list.tsx b/frontend/src/pages/list.tsx
deleted file mode 100644
index 43bec57..0000000
--- a/frontend/src/pages/list.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-import SitesList from "../components/SitesList";
-
-const List: React.FC = () => <SitesList />;
-
-export default List;
diff --git a/frontend/src/pages/sites.tsx b/frontend/src/pages/sites.tsx
new file mode 100644
index 0000000..895b383
--- /dev/null
+++ b/frontend/src/pages/sites.tsx
@@ -0,0 +1,5 @@
+import SitesList from "../components/SitesList";
+
+const Sites: React.FC = () => <SitesList />;
+
+export default Sites;
diff --git a/frontend/src/router.tsx b/frontend/src/router.tsx
index b92d0b9..2a08fdf 100644
--- a/frontend/src/router.tsx
+++ b/frontend/src/router.tsx
@@ -1,7 +1,7 @@
import { createBrowserRouter, createRoutesFromElements, Route } from "react-router-dom";
import MainLayout from "./components/MainLayout";
-import SitesList from "./components/SitesList/SitesList";
+import SitesList from "./pages/sites";
const router = createBrowserRouter(
createRoutesFromElements(
diff --git a/frontend/src/test-utils.tsx b/frontend/src/test-utils.tsx
index 8653b4b..918031f 100644
--- a/frontend/src/test-utils.tsx
+++ b/frontend/src/test-utils.tsx
@@ -1,9 +1,9 @@
import type { ReactElement } from "react";
import React from "react";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import type { RenderOptions, RenderResult } from "@testing-library/react";
import { render } from "@testing-library/react";
-import { QueryClient, QueryClientProvider } from "react-query";
const queryClient = new QueryClient({
defaultOptions: {
diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts
new file mode 100644
index 0000000..4849540
--- /dev/null
+++ b/frontend/src/utils.ts
@@ -0,0 +1,10 @@
+import countries, { getName } from "i18n-iso-countries";
+import en from "i18n-iso-countries/langs/en.json";
+
+if (typeof window !== "undefined") {
+ countries.registerLocale(en);
+}
+
+export const getCountryName = (countryCode: string) => {
+ return getName(countryCode, "en", { select: "official" });
+};
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 8b0b656..6d6b727 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -1005,7 +1005,7 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-"@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2":
version "7.20.13"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
@@ -1262,7 +1262,7 @@
"@jridgewell/set-array" "^1.0.0"
"@jridgewell/sourcemap-codec" "^1.4.10"
-"@jridgewell/gen-mapping@^0.3.2":
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
@@ -1281,6 +1281,14 @@
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
version "1.4.14"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
@@ -1440,6 +1448,19 @@
"@swc/core-win32-ia32-msvc" "1.3.35"
"@swc/core-win32-x64-msvc" "1.3.35"
+"@tanstack/query-core@4.24.10":
+ version "4.24.10"
+ resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.24.10.tgz#758e1f5b2d7faf7316d299facd272a9f64c26299"
+ integrity sha512-2QywqXEAGBIUoTdgn1lAB4/C8QEqwXHj2jrCLeYTk2xVGtLiPEUD8jcMoeB2noclbiW2mMt4+Fq7fZStuz3wAQ==
+
+"@tanstack/react-query@4.24.10":
+ version "4.24.10"
+ resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.24.10.tgz#2e1004bb1d1f55198961a21e875e2c65ec865130"
+ integrity sha512-FY1DixytOcNNCydPQXLxuKEV7VSST32CAuJ55BjhDNqASnMLZn+6c30yQBMrODjmWMNwzfjMZnq0Vw7C62Fwow==
+ dependencies:
+ "@tanstack/query-core" "4.24.10"
+ use-sync-external-store "^1.2.0"
+
"@tanstack/react-table@8.7.9":
version "8.7.9"
resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.7.9.tgz#9efcd168fb0080a7e0bc213b5eac8b55513babf4"
@@ -1514,6 +1535,11 @@
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4"
integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==
+"@types/chance@1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.1.3.tgz#d19fe9391288d60fdccd87632bfc9ab2b4523fea"
+ integrity sha512-X6c6ghhe4/sQh4XzcZWSFaTAUOda38GQHmq9BUanYkOE/EO7ZrkazwKmtsj3xzTjkLWmwULE++23g3d3CCWaWw==
+
"@types/cookie@^0.4.1":
version "0.4.1"
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
@@ -1611,6 +1637,11 @@
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+"@types/pluralize@0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c"
+ integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==
+
"@types/prop-types@*":
version "15.7.5"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
@@ -1875,7 +1906,7 @@ acorn-walk@^8.2.0:
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
-acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2:
+acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2:
version "8.8.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
@@ -1895,6 +1926,13 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.6:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+ansi-colors@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
+ integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
+ dependencies:
+ ansi-wrap "^0.1.0"
+
ansi-escapes@^4.2.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
@@ -1936,6 +1974,11 @@ ansi-styles@^6.0.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+ansi-wrap@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+ integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==
+
anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
@@ -1956,6 +1999,16 @@ aria-query@^5.0.0, aria-query@^5.1.3:
dependencies:
deep-equal "^2.0.5"
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
+
array-includes@^3.1.5, array-includes@^3.1.6:
version "3.1.6"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f"
@@ -2018,6 +2071,11 @@ assertion-error@^1.1.0:
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
+
ast-types-flow@^0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
@@ -2136,11 +2194,6 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-big-integer@^1.6.16:
- version "1.6.51"
- resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
- integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
-
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@@ -2170,20 +2223,6 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-broadcast-channel@^3.4.1:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937"
- integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==
- dependencies:
- "@babel/runtime" "^7.7.2"
- detect-node "^2.1.0"
- js-sha3 "0.8.0"
- microseconds "0.2.0"
- nano-time "1.0.0"
- oblivious-set "1.0.0"
- rimraf "3.0.2"
- unload "2.2.0"
-
browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5:
version "4.21.5"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7"
@@ -2297,6 +2336,13 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chance@1.1.10:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.10.tgz#97aa50acaeb810ae293330a9e2b138ee3d49daf2"
+ integrity sha512-R6o7L/PGxBxdxzWbnLTi9nKQPtNZJySAxA1yGmAfKSiUt3KsBOAttsF04gNWA/XUcGIOrLHy7uAQ7KZwK92Qig==
+ dependencies:
+ gulp-uglify-es "^3.0.0"
+
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -2371,11 +2417,35 @@ cliui@^8.0.1:
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
+clone-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+ integrity sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==
+
+clone-stats@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+ integrity sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==
+
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+clone@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
+
+cloneable-readable@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
+ integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
+ dependencies:
+ inherits "^2.0.1"
+ process-nextick-args "^2.0.0"
+ readable-stream "^2.3.5"
+
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -2407,6 +2477,11 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -2434,6 +2509,11 @@ core-js-compat@^3.25.1:
dependencies:
browserslist "^4.21.5"
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
cosmiconfig@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
@@ -2576,10 +2656,10 @@ dependency-graph@^0.11.0:
resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27"
integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==
-detect-node@^2.0.4, detect-node@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
- integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+diacritics@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1"
+ integrity sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==
diff-sequences@^27.5.1:
version "27.5.1"
@@ -3065,6 +3145,14 @@ expect@^29.0.0:
jest-message-util "^29.4.3"
jest-util "^29.4.3"
+extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
external-editor@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
@@ -3149,6 +3237,13 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
+fishery@2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/fishery/-/fishery-2.2.2.tgz#94d3d9380295dd3ce555021e9353c5348b8beb77"
+ integrity sha512-jeU0nDhPHJkupmjX+r9niKgVMTBDB8X+U/pktoGHAiWOSyNlMd0HhmqnjrpjUOCDPJYaSSu4Ze16h6dZOKSp2w==
+ dependencies:
+ lodash.mergewith "^4.6.2"
+
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -3355,6 +3450,17 @@ grapheme-splitter@^1.0.4:
resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb"
integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==
+gulp-uglify-es@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/gulp-uglify-es/-/gulp-uglify-es-3.0.0.tgz#00466e0e3b0486057c552b8b0d3e326791f2f832"
+ integrity sha512-dQ3czMFFojNgCajcrYl0oa98+YayaQ8kXRdaacpZRZ3iw2sdVURfdt8y8Ki1ogZGQqw8BUawnB7V6NkanxqnDg==
+ dependencies:
+ o-stream "^0.3.0"
+ plugin-error "^1.0.1"
+ terser "^5.7.1"
+ vinyl "^2.2.1"
+ vinyl-sourcemaps-apply "^0.2.1"
+
hard-rejection@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
@@ -3423,6 +3529,13 @@ hosted-git-info@^4.0.1:
dependencies:
lru-cache "^6.0.0"
+i18n-iso-countries@7.5.0:
+ version "7.5.0"
+ resolved "https://registry.yarnpkg.com/i18n-iso-countries/-/i18n-iso-countries-7.5.0.tgz#74fedd72619526a195cfb2e768fe1d82eed2123f"
+ integrity sha512-PtfKJNWLVhhU0KBX/8asmywjAcuyQk07mmmMwxFJcddTNBJJ1yvpY2qxVmyxbtVF+9+6eg9phgpv83XPUKU5CA==
+ dependencies:
+ diacritics "1.3.0"
+
iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -3471,7 +3584,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.3, inherits@^2.0.4:
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3574,6 +3687,13 @@ is-date-object@^1.0.1, is-date-object@^1.0.5:
dependencies:
has-tostringtag "^1.0.0"
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -3650,6 +3770,13 @@ is-plain-obj@^3.0.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==
+is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
@@ -3725,11 +3852,21 @@ isarray@^2.0.5:
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
jest-diff@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
@@ -3817,11 +3954,6 @@ js-sdsl@^4.1.4:
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711"
integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
-js-sha3@0.8.0:
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
- integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
-
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3957,6 +4089,11 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+lodash.mergewith@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
+ integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
+
lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -4013,14 +4150,6 @@ map-obj@^4.0.0:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
-match-sorter@^6.0.2:
- version "6.3.1"
- resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda"
- integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==
- dependencies:
- "@babel/runtime" "^7.12.5"
- remove-accents "0.4.2"
-
meow@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
@@ -4052,11 +4181,6 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
-microseconds@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39"
- integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==
-
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -4155,13 +4279,6 @@ mute-stream@0.0.8:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-nano-time@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef"
- integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==
- dependencies:
- big-integer "^1.6.16"
-
nanoid@3.3.4, nanoid@^3.3.4:
version "3.3.4"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
@@ -4242,6 +4359,11 @@ npm-package-json-lint@6.4.0:
type-fest "^3.2.0"
validate-npm-package-name "^5.0.0"
+o-stream@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/o-stream/-/o-stream-0.3.0.tgz#204d27bc3fb395164507d79b381e91752e8daedc"
+ integrity sha512-gbzl6qCJZ609x/M2t25HqCYQagFzWYCtQ84jcuObGr+V8D1Am4EVubkF4J+XFs6ukfiv96vNeiBb8FrbbMZYiQ==
+
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -4310,11 +4432,6 @@ object.values@^1.1.6:
define-properties "^1.1.4"
es-abstract "^1.20.4"
-oblivious-set@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566"
- integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==
-
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -4492,6 +4609,16 @@ playwright-core@1.31.1:
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.31.1.tgz#4deeebbb8fb73b512593fe24bea206d8fd85ff7f"
integrity sha512-JTyX4kV3/LXsvpHkLzL2I36aCdml4zeE35x+G5aPc4bkLsiRiQshU5lWeVpHFAuC8xAcbI6FDcw/8z3q2xtJSQ==
+plugin-error@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
+ integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
+ dependencies:
+ ansi-colors "^1.0.1"
+ arr-diff "^4.0.0"
+ arr-union "^3.1.0"
+ extend-shallow "^3.0.2"
+
plur@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84"
@@ -4499,6 +4626,11 @@ plur@^4.0.0:
dependencies:
irregular-plurals "^3.2.0"
+pluralize@8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
postcss-cli@9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-9.1.0.tgz#1a86404cbe848e370127b4bdf5cd2be83bc45ebe"
@@ -4592,6 +4724,11 @@ pretty-hrtime@^1.0.3:
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==
+process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
prop-types@15.8.1, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
@@ -4644,15 +4781,6 @@ react-is@^18.0.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
-react-query@3.39.3:
- version "3.39.3"
- resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35"
- integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==
- dependencies:
- "@babel/runtime" "^7.5.5"
- broadcast-channel "^3.4.1"
- match-sorter "^6.0.2"
-
react-router-dom@6.8.1:
version "6.8.1"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.1.tgz#7e136b67d9866f55999e9a8482c7008e3c575ac9"
@@ -4713,6 +4841,19 @@ read-pkg@^5.2.0:
parse-json "^5.0.0"
type-fest "^0.6.0"
+readable-stream@^2.3.5:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@@ -4794,10 +4935,15 @@ regjsparser@^0.9.1:
dependencies:
jsesc "~0.5.0"
-remove-accents@0.4.2:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5"
- integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
+
+replace-ext@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
+ integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
require-directory@^2.1.1:
version "2.1.1"
@@ -4840,7 +4986,7 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rimraf@3.0.2, rimraf@^3.0.2:
+rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -4873,6 +5019,11 @@ rxjs@^7.5.5:
dependencies:
tslib "^2.1.0"
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -4993,7 +5144,7 @@ slice-ansi@^5.0.0:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
-source-map-support@^0.5.21:
+source-map-support@^0.5.21, source-map-support@~0.5.20:
version "0.5.21"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
@@ -5001,6 +5152,11 @@ source-map-support@^0.5.21:
buffer-from "^1.0.0"
source-map "^0.6.0"
+source-map@^0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
source-map@^0.6.0, source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
@@ -5130,6 +5286,13 @@ string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -5187,6 +5350,16 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+terser@^5.7.1:
+ version "5.16.5"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.5.tgz#1c285ca0655f467f92af1bbab46ab72d1cb08e5a"
+ integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==
+ dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
+ commander "^2.20.0"
+ source-map-support "~0.5.20"
+
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -5377,19 +5550,16 @@ unicode-property-aliases-ecmascript@^2.0.0:
resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
+unique-names-generator@4.7.1:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/unique-names-generator/-/unique-names-generator-4.7.1.tgz#966407b12ba97f618928f77322cfac8c80df5597"
+ integrity sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==
+
universalify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-unload@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7"
- integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==
- dependencies:
- "@babel/runtime" "^7.6.2"
- detect-node "^2.0.4"
-
update-browserslist-db@^1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
@@ -5415,7 +5585,12 @@ use-ssr@^1.0.22:
resolved "https://registry.yarnpkg.com/use-ssr/-/use-ssr-1.0.24.tgz#213a3df58f5ab9268e6fe1a57ad0a9de91e514d1"
integrity sha512-0MFps7ezL57/3o0yl4CvrHLlp9z20n1rQZV/lSRz7if+TUoM6POU1XdOvEjIgjgKeIhTEye1U0khrIYWCTWw4g==
-util-deprecate@^1.0.1:
+use-sync-external-store@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
+ integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
@@ -5460,6 +5635,25 @@ vanilla-framework@3.11.0:
sass "1.57.1"
yaml "1.10.2"
+vinyl-sourcemaps-apply@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
+ integrity sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==
+ dependencies:
+ source-map "^0.5.1"
+
+vinyl@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974"
+ integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==
+ dependencies:
+ clone "^2.1.1"
+ clone-buffer "^1.0.0"
+ clone-stats "^1.0.0"
+ cloneable-readable "^1.0.0"
+ remove-trailing-separator "^1.0.1"
+ replace-ext "^1.0.0"
+
vite-node@0.28.5:
version "0.28.5"
resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.28.5.tgz#56d0f78846ea40fddf2e28390899df52a4738006"
Follow ups