Compare commits

...

1 Commits

Author SHA1 Message Date
Joshua Chen 0b212d2c3c
chore: migrate react-router to v6 2022-02-11 12:49:13 +08:00
20 changed files with 98 additions and 177 deletions

View File

@ -70,6 +70,7 @@
"@types/prompts": "^2.0.9", "@types/prompts": "^2.0.9",
"@types/react": "^17.0.2", "@types/react": "^17.0.2",
"@types/react-dev-utils": "^9.0.1", "@types/react-dev-utils": "^9.0.1",
"@types/react-helmet": "^6.0.0",
"@types/react-test-renderer": "^17.0.1", "@types/react-test-renderer": "^17.0.1",
"@types/semver": "^7.1.0", "@types/semver": "^7.1.0",
"@types/shelljs": "^0.8.6", "@types/shelljs": "^0.8.6",

View File

@ -15,8 +15,8 @@
"@docusaurus/types": "2.0.0-beta.15", "@docusaurus/types": "2.0.0-beta.15",
"@types/react": "*", "@types/react": "*",
"@types/react-helmet": "*", "@types/react-helmet": "*",
"@types/react-router-config": "*", "react-router": "6.x",
"@types/react-router-dom": "*" "react-router-dom": "6.x"
}, },
"license": "MIT" "license": "MIT"
} }

View File

@ -34,11 +34,11 @@ declare module '@generated/registry' {
} }
declare module '@generated/routes' { declare module '@generated/routes' {
import type {RouteConfig} from 'react-router-config'; import type {RouteObject} from 'react-router';
type Route = { type Route = {
readonly path: string; readonly path: string;
readonly component: RouteConfig['component']; readonly component: RouteObject['element'];
readonly exact?: boolean; readonly exact?: boolean;
readonly routes?: Route[]; readonly routes?: Route[];
}; };
@ -158,6 +158,8 @@ declare module '@docusaurus/Link' {
readonly to?: string; readonly to?: string;
readonly href?: string; readonly href?: string;
readonly autoAddBaseUrl?: boolean; readonly autoAddBaseUrl?: boolean;
readonly isActive?: boolean;
readonly activeClassName?: string;
// escape hatch in case broken links check is annoying for a specific link // escape hatch in case broken links check is annoying for a specific link
readonly 'data-noBrokenLinkCheck'?: boolean; readonly 'data-noBrokenLinkCheck'?: boolean;
@ -240,13 +242,9 @@ declare module '@docusaurus/Translate' {
} }
declare module '@docusaurus/router' { declare module '@docusaurus/router' {
// eslint-disable-next-line import/no-extraneous-dependencies, no-restricted-syntax // eslint-disable-next-line no-restricted-syntax
export * from 'react-router-dom'; export * from 'react-router-dom';
} }
declare module '@docusaurus/history' {
// eslint-disable-next-line import/no-extraneous-dependencies, no-restricted-syntax
export * from 'history';
}
declare module '@docusaurus/useDocusaurusContext' { declare module '@docusaurus/useDocusaurusContext' {
import type {DocusaurusContext} from '@docusaurus/types'; import type {DocusaurusContext} from '@docusaurus/types';
@ -315,10 +313,9 @@ declare module '@docusaurus/Noop' {
} }
declare module '@docusaurus/renderRoutes' { declare module '@docusaurus/renderRoutes' {
// eslint-disable-next-line import/no-extraneous-dependencies import type {useRoutes} from 'react-router';
import {renderRoutes} from 'react-router-config';
export default renderRoutes; export default useRoutes;
} }
declare module '@docusaurus/useGlobalData' { declare module '@docusaurus/useGlobalData' {

View File

@ -38,7 +38,7 @@
"postcss": "^8.3.7", "postcss": "^8.3.7",
"prism-react-renderer": "^1.2.1", "prism-react-renderer": "^1.2.1",
"prismjs": "^1.26.0", "prismjs": "^1.26.0",
"react-router-dom": "^5.2.0", "react-router-dom": "^6.0.2",
"rtlcss": "^3.3.0" "rtlcss": "^3.3.0"
}, },
"devDependencies": { "devDependencies": {

View File

@ -6,7 +6,7 @@
*/ */
import React, {useRef} from 'react'; import React, {useRef} from 'react';
import {useHistory} from '@docusaurus/router'; import {useNavigationType} from '@docusaurus/router';
import Translate from '@docusaurus/Translate'; import Translate from '@docusaurus/Translate';
import {useLocationChange} from '@docusaurus/theme-common'; import {useLocationChange} from '@docusaurus/theme-common';
@ -20,7 +20,7 @@ function programmaticFocus(el: HTMLElement) {
function SkipToContent(): JSX.Element { function SkipToContent(): JSX.Element {
const containerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null);
const {action} = useHistory(); const action = useNavigationType();
const handleSkip = (e: React.MouseEvent<HTMLAnchorElement>) => { const handleSkip = (e: React.MouseEvent<HTMLAnchorElement>) => {
e.preventDefault(); e.preventDefault();

View File

@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import {useHistory} from '@docusaurus/router'; import {useNavigate} from '@docusaurus/router';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import {useCallback, useEffect, useState} from 'react'; import {useCallback, useEffect, useState} from 'react';
@ -18,7 +18,7 @@ interface UseSearchPageReturn {
} }
export default function useSearchPage(): UseSearchPageReturn { export default function useSearchPage(): UseSearchPageReturn {
const history = useHistory(); const navigate = useNavigate();
const { const {
siteConfig: {baseUrl}, siteConfig: {baseUrl},
} = useDocusaurusContext(); } = useDocusaurusContext();
@ -43,12 +43,15 @@ export default function useSearchPage(): UseSearchPageReturn {
searchParams.delete(SEARCH_PARAM_QUERY); searchParams.delete(SEARCH_PARAM_QUERY);
} }
history.replace({ navigate(
search: searchParams.toString(), {
}); search: searchParams.toString(),
},
{replace: true},
);
setSearchQueryState(newSearchQuery); setSearchQueryState(newSearchQuery);
}, },
[history], [navigate],
); );
const generateSearchPageLink = useCallback( const generateSearchPageLink = useCallback(

View File

@ -6,10 +6,13 @@
*/ */
import {useEffect, useRef} from 'react'; import {useEffect, useRef} from 'react';
import type {Location, NavigationType} from '@docusaurus/router';
import {useHistory} from '@docusaurus/router'; import {useHistory} from '@docusaurus/router';
import type {Location, Action} from '@docusaurus/history';
type HistoryBlockHandler = (location: Location, action: Action) => void | false; type HistoryBlockHandler = (
location: Location,
action: NavigationType,
) => void | false;
/** /**
* Permits to register a handler that will be called on history actions (pop, * Permits to register a handler that will be called on history actions (pop,

View File

@ -6,8 +6,7 @@
*/ */
import {useEffect} from 'react'; import {useEffect} from 'react';
import {useLocation} from '@docusaurus/router'; import {useLocation, type Location} from '@docusaurus/router';
import type {Location} from '@docusaurus/history';
import {usePrevious} from './usePrevious'; import {usePrevious} from './usePrevious';
import {useDynamicCallback} from './reactUtils'; import {useDynamicCallback} from './reactUtils';

View File

@ -8,7 +8,7 @@
import React, {useState, useRef, useCallback, useMemo} from 'react'; import React, {useState, useRef, useCallback, useMemo} from 'react';
import {createPortal} from 'react-dom'; import {createPortal} from 'react-dom';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import {useHistory} from '@docusaurus/router'; import {useNavigate} from '@docusaurus/router';
import {useBaseUrlUtils} from '@docusaurus/useBaseUrl'; import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
import Link from '@docusaurus/Link'; import Link from '@docusaurus/Link';
import Head from '@docusaurus/Head'; import Head from '@docusaurus/Head';
@ -105,7 +105,7 @@ function DocSearch({
}; };
const {withBaseUrl} = useBaseUrlUtils(); const {withBaseUrl} = useBaseUrlUtils();
const history = useHistory(); const navigate = useNavigate();
const searchContainer = useRef<HTMLDivElement | null>(null); const searchContainer = useRef<HTMLDivElement | null>(null);
const searchButtonRef = useRef<HTMLButtonElement>(null); const searchButtonRef = useRef<HTMLButtonElement>(null);
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
@ -160,7 +160,7 @@ function DocSearch({
if (isRegexpStringMatch(externalUrlRegex, itemUrl)) { if (isRegexpStringMatch(externalUrlRegex, itemUrl)) {
window.location.href = itemUrl!; window.location.href = itemUrl!;
} else { } else {
history.push(itemUrl!); navigate(itemUrl!);
} }
}, },
}).current; }).current;

View File

@ -84,9 +84,8 @@
"react-helmet-async": "^1.2.2", "react-helmet-async": "^1.2.2",
"react-loadable": "npm:@docusaurus/react-loadable@5.5.2", "react-loadable": "npm:@docusaurus/react-loadable@5.5.2",
"react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-loadable-ssr-addon-v5-slorber": "^1.0.1",
"react-router": "^5.2.0", "react-router": "^6.0.2",
"react-router-config": "^5.1.1", "react-router-dom": "^6.0.2",
"react-router-dom": "^5.2.0",
"remark-admonitions": "^1.2.1", "remark-admonitions": "^1.2.1",
"rtl-detect": "^1.0.4", "rtl-detect": "^1.0.4",
"semver": "^7.3.4", "semver": "^7.3.4",

View File

@ -6,21 +6,20 @@
*/ */
import React from 'react'; import React from 'react';
import {Route, withRouter, type RouteComponentProps} from 'react-router-dom'; import {Route, type RouteComponentProps} from 'react-router-dom';
import type {RouteConfig} from 'react-router-config'; import type {RouteObject, Location} from 'react-router';
import nprogress from 'nprogress'; import nprogress from 'nprogress';
import clientLifecyclesDispatcher from './client-lifecycles-dispatcher'; import clientLifecyclesDispatcher from './client-lifecycles-dispatcher';
import preload from './preload'; import preload from './preload';
import normalizeLocation from './normalizeLocation'; import normalizeLocation from './normalizeLocation';
import type {Location} from '@docusaurus/history';
import './nprogress.css'; import './nprogress.css';
nprogress.configure({showSpinner: false}); nprogress.configure({showSpinner: false});
interface Props extends RouteComponentProps { interface Props extends RouteComponentProps {
readonly routes: RouteConfig[]; readonly routes: RouteObject[];
readonly delay: number; readonly delay: number;
readonly location: Location; readonly location: Location;
} }
@ -129,4 +128,4 @@ class PendingNavigation extends React.Component<Props, State> {
} }
} }
export default withRouter(PendingNavigation); export default PendingNavigation;

View File

@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import {matchRoutes} from 'react-router-config'; import {matchRoutes} from 'react-router';
import routesChunkNames from '@generated/routesChunkNames'; import routesChunkNames from '@generated/routesChunkNames';
import routes from '@generated/routes'; import routes from '@generated/routes';
import prefetchHelper from './prefetch'; import prefetchHelper from './prefetch';
@ -58,7 +58,7 @@ const docusaurus = {
fetched[routePath] = true; fetched[routePath] = true;
// Find all webpack chunk names needed. // Find all webpack chunk names needed.
const matches = matchRoutes(routes, routePath); const matches = matchRoutes(routes, routePath)!;
const chunkNamesNeeded = matches.flatMap((match) => const chunkNamesNeeded = matches.flatMap((match) =>
getChunkNamesToLoad(match.route.path), getChunkNamesToLoad(match.route.path),

View File

@ -5,6 +5,6 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import {renderRoutes} from 'react-router-config'; import {useRoutes} from 'react-router';
export default renderRoutes; export default useRoutes;

View File

@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import type {Location} from '@docusaurus/history'; import type {Location} from 'react-router';
// Memoize previously normalized pathnames. // Memoize previously normalized pathnames.
const pathnames: Record<string, string> = {}; const pathnames: Record<string, string> = {};

View File

@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import {matchRoutes, type RouteConfig} from 'react-router-config'; import {matchRoutes, type RouteObject} from 'react-router';
/** /**
* Helper function to make sure all async components for that particular route * Helper function to make sure all async components for that particular route
@ -17,17 +17,17 @@ import {matchRoutes, type RouteConfig} from 'react-router-config';
* @returns Promise object represents whether pathname has been preloaded * @returns Promise object represents whether pathname has been preloaded
*/ */
export default function preload( export default function preload(
routes: RouteConfig[], routes: RouteObject[],
pathname: string, pathname: string,
): Promise<void[]> { ): Promise<void[]> {
const matches = matchRoutes(routes, pathname); const matches = matchRoutes(routes, pathname)!;
return Promise.all( return Promise.all(
matches.map((match) => { matches.map((match) => {
const {component} = match.route; const {element} = match.route;
// @ts-expect-error: ComponentCreator injected this method. // @ts-expect-error: ComponentCreator injected this method.
if (component && component.preload) { if (element && element.preload) {
// @ts-expect-error: checked above. // @ts-expect-error: checked above.
return component.preload(); return component.preload();
} }

View File

@ -5,10 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
import { import {matchRoutes} from 'react-router';
matchRoutes,
type RouteConfig as RRRouteConfig,
} from 'react-router-config';
import fs from 'fs-extra'; import fs from 'fs-extra';
import {mapValues, pickBy, countBy} from 'lodash'; import {mapValues, pickBy, countBy} from 'lodash';
import type {RouteConfig, ReportingSeverity} from '@docusaurus/types'; import type {RouteConfig, ReportingSeverity} from '@docusaurus/types';
@ -21,11 +18,6 @@ import {
import {getAllFinalRoutes} from './utils'; import {getAllFinalRoutes} from './utils';
import path from 'path'; import path from 'path';
function toReactRouterRoutes(routes: RouteConfig[]): RRRouteConfig[] {
// @ts-expect-error: types incompatible???
return routes as RRRouteConfig[];
}
type BrokenLink = { type BrokenLink = {
link: string; link: string;
resolvedLink: string; resolvedLink: string;
@ -56,7 +48,7 @@ function getPageBrokenLinks({
function isBrokenLink(link: string) { function isBrokenLink(link: string) {
const matchedRoutes = [link, decodeURI(link)] const matchedRoutes = [link, decodeURI(link)]
.map((l) => matchRoutes(toReactRouterRoutes(routes), l)) .map((l) => matchRoutes(routes, l)!)
.reduce((prev, cur) => prev.concat(cur)); .reduce((prev, cur) => prev.concat(cur));
return matchedRoutes.length === 0; return matchedRoutes.length === 0;
} }

View File

@ -15,7 +15,7 @@ import React, {
useEffect, useEffect,
forwardRef, forwardRef,
} from 'react'; } from 'react';
import {useHistory} from '@docusaurus/router'; import {useNavigate, useLocation} from '@docusaurus/router';
import styles from './styles.module.css'; import styles from './styles.module.css';
interface Props { interface Props {
@ -43,18 +43,19 @@ const APITableRow = forwardRef(
const entryName = getText(children); const entryName = getText(children);
const id = name ? `${name}-${entryName}` : entryName; const id = name ? `${name}-${entryName}` : entryName;
const anchor = `#${id}`; const anchor = `#${id}`;
const history = useHistory(); const navigate = useNavigate();
const location = useLocation();
return ( return (
<tr <tr
id={id} id={id}
tabIndex={0} tabIndex={0}
ref={history.location.hash === anchor ? ref : undefined} ref={location.hash === anchor ? ref : undefined}
onClick={() => { onClick={() => {
history.push(anchor); navigate(anchor);
}} }}
onKeyDown={(e: React.KeyboardEvent) => { onKeyDown={(e: React.KeyboardEvent) => {
if (e.key === 'Enter') { if (e.key === 'Enter') {
history.push(anchor); navigate(anchor);
} }
}}> }}>
{children.props.children} {children.props.children}

View File

@ -6,7 +6,7 @@
*/ */
import React, {useState, useEffect, useCallback} from 'react'; import React, {useState, useEffect, useCallback} from 'react';
import {useHistory, useLocation} from '@docusaurus/router'; import {useNavigate, useLocation} from '@docusaurus/router';
import {prepareUserState} from '../../index'; import {prepareUserState} from '../../index';
@ -25,7 +25,7 @@ export function readOperator(search: string): Operator {
export default function ShowcaseFilterToggle(): JSX.Element { export default function ShowcaseFilterToggle(): JSX.Element {
const id = 'showcase_filter_toggle'; const id = 'showcase_filter_toggle';
const location = useLocation(); const location = useLocation();
const history = useHistory(); const navigate = useNavigate();
const [operator, setOperator] = useState(false); const [operator, setOperator] = useState(false);
useEffect(() => { useEffect(() => {
setOperator(readOperator(location.search) === 'AND'); setOperator(readOperator(location.search) === 'AND');
@ -37,12 +37,14 @@ export default function ShowcaseFilterToggle(): JSX.Element {
if (!operator) { if (!operator) {
searchParams.append(OperatorQueryKey, operator ? 'OR' : 'AND'); searchParams.append(OperatorQueryKey, operator ? 'OR' : 'AND');
} }
history.push({ navigate(
...location, {
search: searchParams.toString(), ...location,
state: prepareUserState(), search: searchParams.toString(),
}); },
}, [operator, location, history]); {state: prepareUserState()},
);
}, [operator, location, navigate]);
return ( return (
<div> <div>

View File

@ -13,7 +13,7 @@ import React, {
useState, useState,
useEffect, useEffect,
} from 'react'; } from 'react';
import {useHistory, useLocation} from '@docusaurus/router'; import {useNavigate, useLocation} from '@docusaurus/router';
import {toggleListItem} from '@site/src/utils/jsUtils'; import {toggleListItem} from '@site/src/utils/jsUtils';
import {prepareUserState} from '../../index'; import {prepareUserState} from '../../index';
import type {TagType} from '@site/src/data/users'; import type {TagType} from '@site/src/data/users';
@ -42,7 +42,7 @@ function replaceSearchTags(search: string, newTags: TagType[]) {
const ShowcaseTagSelect = React.forwardRef<HTMLLabelElement, Props>( const ShowcaseTagSelect = React.forwardRef<HTMLLabelElement, Props>(
({id, icon, label, tag, ...rest}, ref) => { ({id, icon, label, tag, ...rest}, ref) => {
const location = useLocation(); const location = useLocation();
const history = useHistory(); const navigate = useNavigate();
const [selected, setSelected] = useState(false); const [selected, setSelected] = useState(false);
useEffect(() => { useEffect(() => {
const tags = readSearchTags(location.search); const tags = readSearchTags(location.search);
@ -52,12 +52,14 @@ const ShowcaseTagSelect = React.forwardRef<HTMLLabelElement, Props>(
const tags = readSearchTags(location.search); const tags = readSearchTags(location.search);
const newTags = toggleListItem(tags, tag); const newTags = toggleListItem(tags, tag);
const newSearch = replaceSearchTags(location.search, newTags); const newSearch = replaceSearchTags(location.search, newTags);
history.push({ navigate(
...location, {
search: newSearch, ...location,
state: prepareUserState(), search: newSearch,
}); },
}, [tag, location, history]); {state: prepareUserState()},
);
}, [tag, location, navigate]);
return ( return (
<> <>
<input <input

123
yarn.lock
View File

@ -1211,10 +1211,10 @@
core-js-pure "^3.20.2" core-js-pure "^3.20.2"
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4":
version "7.16.7" version "7.16.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
@ -4110,7 +4110,7 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react-router-config@*", "@types/react-router-config@^5.0.1": "@types/react-router-config@^5.0.1":
version "5.0.6" version "5.0.6"
resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451"
integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==
@ -4119,15 +4119,6 @@
"@types/react" "*" "@types/react" "*"
"@types/react-router" "*" "@types/react-router" "*"
"@types/react-router-dom@*":
version "5.3.3"
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83"
integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==
dependencies:
"@types/history" "^4.7.11"
"@types/react" "*"
"@types/react-router" "*"
"@types/react-router@*": "@types/react-router@*":
version "5.1.18" version "5.1.18"
resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3" resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3"
@ -9988,24 +9979,12 @@ highlight.js@^10.7.1:
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
history@^4.9.0: history@^5.1.0:
version "4.10.1" version "5.1.0"
resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" resolved "https://registry.yarnpkg.com/history/-/history-5.1.0.tgz#2e93c09c064194d38d52ed62afd0afc9d9b01ece"
integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== integrity sha512-zPuQgPacm2vH2xdORvGGz1wQMuHSIB56yNAy5FnLuwOwgSYyPKptJtcMm6Ev+hRGeS+GzhbmRacHzvlESbFwDg==
dependencies: dependencies:
"@babel/runtime" "^7.1.2" "@babel/runtime" "^7.7.6"
loose-envify "^1.2.0"
resolve-pathname "^3.0.0"
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
value-equal "^1.0.1"
hoist-non-react-statics@^3.1.0:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
dependencies:
react-is "^16.7.0"
hosted-git-info@^2.1.4: hosted-git-info@^2.1.4:
version "2.8.9" version "2.8.9"
@ -10990,11 +10969,6 @@ is-yarn-global@^0.3.0:
resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
isarray@1.0.0, isarray@~1.0.0: isarray@1.0.0, isarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@ -12376,7 +12350,7 @@ longest-streak@^2.0.1:
resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
@ -12804,14 +12778,6 @@ min-indent@^1.0.0:
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
mini-create-react-context@^0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e"
integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==
dependencies:
"@babel/runtime" "^7.12.1"
tiny-warning "^1.0.3"
mini-css-extract-plugin@*, mini-css-extract-plugin@^2.5.3: mini-css-extract-plugin@*, mini-css-extract-plugin@^2.5.3:
version "2.5.3" version "2.5.3"
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz#c5c79f9b22ce9b4f164e9492267358dbe35376d9" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz#c5c79f9b22ce9b4f164e9492267358dbe35376d9"
@ -14398,13 +14364,6 @@ path-to-regexp@2.2.1:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45"
integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==
path-to-regexp@^1.7.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
dependencies:
isarray "0.0.1"
path-type@^3.0.0: path-type@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
@ -15359,7 +15318,7 @@ react-helmet-async@^1.2.2:
react-fast-compare "^3.2.0" react-fast-compare "^3.2.0"
shallowequal "^1.1.0" shallowequal "^1.1.0"
react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: react-is@^16.12.0, react-is@^16.13.1:
version "16.13.1" version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@ -15421,41 +15380,20 @@ react-popper@^2.2.5:
react-fast-compare "^3.0.1" react-fast-compare "^3.0.1"
warning "^4.0.2" warning "^4.0.2"
react-router-config@^5.1.1: react-router-dom@6.x, react-router-dom@^6.0.2:
version "5.1.1" version "6.0.2"
resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.0.2.tgz#860cefa697b9d4965eced3f91e82cdbc5995f3ad"
integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== integrity sha512-cOpJ4B6raFutr0EG8O/M2fEoyQmwvZWomf1c6W2YXBZuFBx8oTk/zqjXghwScyhfrtnt0lANXV2182NQblRxFA==
dependencies: dependencies:
"@babel/runtime" "^7.1.2" history "^5.1.0"
react-router "6.0.2"
react-router-dom@^5.2.0: react-router@6.0.2, react-router@6.x, react-router@^6.0.2:
version "5.3.0" version "6.0.2"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.0.2.tgz#bd2b0fa84fd1d152671e9f654d9c0b1f5a7c86da"
integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== integrity sha512-8/Wm3Ed8t7TuedXjAvV39+c8j0vwrI5qVsYqjFr5WkJjsJpEvNSoLRUbtqSEYzqaTUj1IV+sbPJxvO+accvU0Q==
dependencies: dependencies:
"@babel/runtime" "^7.12.13" history "^5.1.0"
history "^4.9.0"
loose-envify "^1.3.1"
prop-types "^15.6.2"
react-router "5.2.1"
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
react-router@5.2.1, react-router@^5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d"
integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==
dependencies:
"@babel/runtime" "^7.12.13"
history "^4.9.0"
hoist-non-react-statics "^3.1.0"
loose-envify "^1.3.1"
mini-create-react-context "^0.4.0"
path-to-regexp "^1.7.0"
prop-types "^15.6.2"
react-is "^16.6.0"
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
react-shallow-renderer@^16.13.1: react-shallow-renderer@^16.13.1:
version "16.14.1" version "16.14.1"
@ -17753,16 +17691,6 @@ timsort@^0.3.0:
resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
tiny-invariant@^1.0.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9"
integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==
tiny-warning@^1.0.0, tiny-warning@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
tinycolor2@^1.4.1: tinycolor2@^1.4.1:
version "1.4.2" version "1.4.2"
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
@ -18613,11 +18541,6 @@ validate-npm-package-name@^3.0.0:
dependencies: dependencies:
builtins "^1.0.3" builtins "^1.0.3"
value-equal@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
vary@~1.1.2: vary@~1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"