diff --git a/README.md b/README.md index b58e0af83..2861c925f 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,3 @@ Instead, it will copy all the configuration files and the transitive dependencie You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/package.json b/package.json index d9a0e2130..789fe5b17 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "@types/react-dom": "^17.0.0", "react": "^17.0.2", "react-dom": "^17.0.2", - "react-router-dom": "^5.3.0", + "react-router-dom": "^6.7.0", "react-scripts": "4.0.3", "typescript": "^4.1.2", "web-vitals": "^1.0.1" diff --git a/public/coffee-mug.png b/public/coffee-mug.png new file mode 100644 index 000000000..c19c2088d Binary files /dev/null and b/public/coffee-mug.png differ diff --git a/src/02-component-patterns/assets/no-image.jpg b/src/02-component-patterns/assets/no-image.jpg new file mode 100644 index 000000000..ae122b097 Binary files /dev/null and b/src/02-component-patterns/assets/no-image.jpg differ diff --git a/src/02-component-patterns/components/ProductButtons.tsx b/src/02-component-patterns/components/ProductButtons.tsx new file mode 100644 index 000000000..abfde3f78 --- /dev/null +++ b/src/02-component-patterns/components/ProductButtons.tsx @@ -0,0 +1,20 @@ +import { useContext } from "react"; + +import { ProductCardContext } from "./ProductCard"; +import { ProductCardButtons } from "../interfaces/interfaces"; + +import styles from "../styles/styles.module.css"; + +export const ProductButtons = () => { + const { counter, increaseBy }: ProductCardButtons = useContext(ProductCardContext); + + return ( +
+ + +
{counter}
+ + +
+ ) +}; \ No newline at end of file diff --git a/src/02-component-patterns/components/ProductCard.tsx b/src/02-component-patterns/components/ProductCard.tsx new file mode 100644 index 000000000..e938e6ddf --- /dev/null +++ b/src/02-component-patterns/components/ProductCard.tsx @@ -0,0 +1,36 @@ +import { createContext } from "react"; + +import { IProductCardContext, IProductCardProps } from "../interfaces/interfaces"; +// import { ProductButtons, ProductImage, ProductTitle } from "./"; + +import useProducts from "../hooks/useProducts"; + +import styles from "../styles/styles.module.css"; + +export const ProductCardContext = createContext({} as IProductCardContext); + +export const ProductCard = ({ product, children }: IProductCardProps) => { + const { counter, increaseBy } = useProducts(); + + return ( + +
+ {children} +
+
+ ) +}; + +/* + Se puede asignar componentes a otro componente de este modo + cuando los componentes a añadir se encuentran en el mismo archivo. +*/ + +// ProductCard.Title = ProductTitle; +// ProductCard.Image = ProductImage; +// ProductCard.Buttons = ProductButtons; diff --git a/src/02-component-patterns/components/ProductImage.tsx b/src/02-component-patterns/components/ProductImage.tsx new file mode 100644 index 000000000..ff8bb02bf --- /dev/null +++ b/src/02-component-patterns/components/ProductImage.tsx @@ -0,0 +1,23 @@ +import { useContext } from "react"; + +import styles from "../styles/styles.module.css"; +import noImage from "../assets/no-image.jpg"; +import { ProductCardContext } from "./ProductCard"; + +export const ProductImage = ({ image = "" }) => { + let imgToShow: string; + + const { product } = useContext(ProductCardContext); + + if (image) { + imgToShow = image + } else if (product.img) { + imgToShow = product.img + } else { + imgToShow = noImage + } + + return ( + Product img + ) +}; diff --git a/src/02-component-patterns/components/ProductTitle.tsx b/src/02-component-patterns/components/ProductTitle.tsx new file mode 100644 index 000000000..820c74618 --- /dev/null +++ b/src/02-component-patterns/components/ProductTitle.tsx @@ -0,0 +1,15 @@ +import { useContext } from "react"; + +import { ProductCardContext } from "./ProductCard"; + +import styles from "../styles/styles.module.css"; + +export const ProductTitle = ({ title }: { title?: string }) => { + const { product } = useContext(ProductCardContext); + + return ( + + { title ? title : product.title } + + ) +}; \ No newline at end of file diff --git a/src/02-component-patterns/components/index.ts b/src/02-component-patterns/components/index.ts new file mode 100644 index 000000000..6ad896f3b --- /dev/null +++ b/src/02-component-patterns/components/index.ts @@ -0,0 +1,18 @@ +import { ProductButtons } from "./ProductButtons"; +import { ProductCard as ProductCardHOC} from "./ProductCard"; +import { ProductImage } from "./ProductImage"; +import { ProductTitle } from "./ProductTitle"; + +import { IProductCardHOC } from "../interfaces/interfaces"; + +export { ProductImage } from "./ProductImage"; +export { ProductTitle } from "./ProductTitle"; +export { ProductButtons } from "./ProductButtons"; + +export const ProductCard: IProductCardHOC = Object.assign( ProductCardHOC, { + Image: ProductImage, + Title: ProductTitle, + Buttons: ProductButtons +}); + + diff --git a/src/02-component-patterns/hooks/useProducts.tsx b/src/02-component-patterns/hooks/useProducts.tsx new file mode 100644 index 000000000..0785d8e90 --- /dev/null +++ b/src/02-component-patterns/hooks/useProducts.tsx @@ -0,0 +1,14 @@ +import { useState } from 'react' + +const useProducts = () => { + + const [counter, setCounter] = useState(0) + + const increaseBy = (value: number) => { + setCounter(prev => Math.max(prev + value, 0)); + } + + return { counter, increaseBy } +} + +export default useProducts \ No newline at end of file diff --git a/src/02-component-patterns/interfaces/interfaces.ts b/src/02-component-patterns/interfaces/interfaces.ts new file mode 100644 index 000000000..c4110c489 --- /dev/null +++ b/src/02-component-patterns/interfaces/interfaces.ts @@ -0,0 +1,30 @@ +import { ReactElement } from "react"; + +export interface IProductCardContext { + product: Product; + counter: number; + increaseBy: (value: number) => void; +} + +export interface IProductCardProps { + product: Product; + children?: ReactElement | ReactElement[]; +} + +interface Product { + id: number; + title?: string; + img?: string; +} + +export interface ProductCardButtons { + counter: number; + increaseBy: (value: number) => void; +} + +export interface IProductCardHOC { + ({ product, children }: IProductCardProps): JSX.Element; + Image: ({ image }: { image?: string }) => JSX.Element; + Title: ({ title }: { title?: string }) => JSX.Element; + Buttons: () => JSX.Element; +} diff --git a/src/02-component-patterns/pages/About.tsx b/src/02-component-patterns/pages/About.tsx new file mode 100644 index 000000000..611fd846f --- /dev/null +++ b/src/02-component-patterns/pages/About.tsx @@ -0,0 +1,7 @@ +const About = () => { + return ( +
About Page
+ ) +} + +export default About; \ No newline at end of file diff --git a/src/02-component-patterns/pages/Home.tsx b/src/02-component-patterns/pages/Home.tsx new file mode 100644 index 000000000..34837a699 --- /dev/null +++ b/src/02-component-patterns/pages/Home.tsx @@ -0,0 +1,7 @@ +const Home = () => { + return ( +
Home page
+ ) +} + +export default Home; diff --git a/src/02-component-patterns/pages/Shopping.tsx b/src/02-component-patterns/pages/Shopping.tsx new file mode 100644 index 000000000..4b09a2955 --- /dev/null +++ b/src/02-component-patterns/pages/Shopping.tsx @@ -0,0 +1,40 @@ +import { ProductButtons, ProductCard, ProductImage, ProductTitle } from '../components'; + +/* Compound component pattern */ + +const product = { + id: 1, + title: "Coffee Mug", + img: "./coffee-mug.png" +} + +const product2 = { + id: 1, + title: "Coffee Mug", +} + +const Shopping = () => { + return ( + <> +

Shopping Store

+ +
+ +
+ + + + + + + + + + + +
+ + ) +} + +export default Shopping; \ No newline at end of file diff --git a/src/02-component-patterns/pages/Users.tsx b/src/02-component-patterns/pages/Users.tsx new file mode 100644 index 000000000..83274ecdb --- /dev/null +++ b/src/02-component-patterns/pages/Users.tsx @@ -0,0 +1,7 @@ +const Users = () => { + return ( +
Users Page
+ ) +} + +export default Users; \ No newline at end of file diff --git a/src/02-component-patterns/styles/styles.module.css b/src/02-component-patterns/styles/styles.module.css new file mode 100644 index 000000000..9d5af38de --- /dev/null +++ b/src/02-component-patterns/styles/styles.module.css @@ -0,0 +1,61 @@ + +.productCard { + background-color: white; + border-radius: 15px; + color: black; + padding-bottom: 5px; + width: 250px; + margin-right: 5px; + margin-top: 5px; +} + +.productImg { + border-radius: 15px 15px 0px 0px; + width: 100%; +} + +.productDescription { + margin: 10px; +} + +.buttonsContainer { + margin: 10px; + display: flex; + flex-direction: row; +} + +.buttonMinus { + cursor: pointer; + background-color: transparent; + border: 1px solid black; + border-radius: 5px 0px 0px 5px; + font-size: 20px; + width: 30px; +} + +.buttonMinus:hover { + background-color: rgba(0, 0, 0, 0.1); +} + +.countLabel { + border-bottom: 1px solid black; + border-top: 1px solid black; + font-size: 16px; + height: 25px; + padding-top: 5px; + text-align: center; + width: 30px; +} + +.buttonAdd { + cursor: pointer; + background-color: transparent; + border: 1px solid black; + border-radius: 0px 5px 5px 0px; + font-size: 20px; + width: 30px; +} + +.buttonAdd:hover { + background-color: rgba(0, 0, 0, 0.1); +} \ No newline at end of file diff --git a/src/index.css b/src/index.css index f1851c5d7..332b753ed 100644 --- a/src/index.css +++ b/src/index.css @@ -20,11 +20,22 @@ code { flex-direction: row; } +.page-layout { + width: auto; + display: flex; + flex-direction: column; +} + +.shopping-div { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + nav { background-color: #363a45; height: 100vh; margin-right: 15px; - overflow-y: scroll; text-align: center; width: 250px; } diff --git a/src/routes/Navigation.tsx b/src/routes/Navigation.tsx index a9bfe83b0..7f1390394 100644 --- a/src/routes/Navigation.tsx +++ b/src/routes/Navigation.tsx @@ -1,45 +1,42 @@ -import { - BrowserRouter as Router, - Switch, - Route, - NavLink -} from 'react-router-dom'; +import { Suspense } from 'react'; +import { Navigate, NavLink, Routes, Route, BrowserRouter } from 'react-router-dom'; + +import { routes } from './routes'; import logo from '../logo.svg'; export const Navigation = () => { return ( - -
- + + +
+ - {/* A looks through its children s and - renders the first one that matches the current URL. */} - - -

About

-
- -

Users

-
- -

Home

-
-
-
- +
+ + { + routes.map(({ path, Component }) => ( + } /> + )) + } + } /> + +
+
+ + ); } \ No newline at end of file diff --git a/src/routes/routes.ts b/src/routes/routes.ts new file mode 100644 index 000000000..e2fc0dd3b --- /dev/null +++ b/src/routes/routes.ts @@ -0,0 +1,44 @@ +import { LazyExoticComponent, lazy } from "react"; + +import Shopping from "../02-component-patterns/pages/Shopping"; + +const lazyHome = lazy(() => import(/* webpackChunkName: "LazyHome" */"../02-component-patterns/pages/Home")); +const lazyAbout = lazy(() => import(/* webpackChunkName: "LazyAbout" */"../02-component-patterns/pages/About")); +const lazyUsers = lazy(() => import(/* webpackChunkName: "LazyUsers" */"../02-component-patterns/pages/Users")); + + +type JSXComponent = () => JSX.Element; + +interface Route { + to: string; + path: string; + Component: JSXComponent | LazyExoticComponent; + name: string; +} + +export const routes: Route[] = [ + { + to: "/home", + path: "home", + Component: lazyHome, + name: "Home", + }, + { + to: "/about", + path: "about", + Component: lazyAbout, + name: "About", + }, + { + to: "/users", + path: "users", + Component: lazyUsers, + name: "Users", + }, + { + to: "/shopping", + path: "shopping", + Component: Shopping, + name: "Shopping", + }, +]; diff --git a/yarn.lock b/yarn.lock index de24f7d62..f858437dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1091,13 +1091,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": version "7.12.18" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" @@ -1105,6 +1098,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" @@ -1448,6 +1448,11 @@ schema-utils "^2.6.5" source-map "^0.7.3" +"@remix-run/router@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.0.tgz#b6ee542c7f087b73b3d8215b9bf799f648be71cb" + integrity sha512-nwQoYb3m4DDpHTeOwpJEuDt8lWVcujhYYSFGLluC+9es2PyLjm+jjq3IeRBQbwBtPLJE/lkuHuGHr8uQLgmJRA== + "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" @@ -5489,18 +5494,6 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - 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" - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5510,13 +5503,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^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" - hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" @@ -6187,11 +6173,6 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -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: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -7053,7 +7034,7 @@ loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -7259,14 +7240,6 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" 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@0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" @@ -8026,13 +7999,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -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@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -8898,7 +8864,7 @@ prompts@2.4.0, prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9118,7 +9084,7 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9133,34 +9099,20 @@ react-refresh@^0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== -react-router-dom@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" - integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== - dependencies: - "@babel/runtime" "^7.12.13" - 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: - 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-router-dom@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.7.0.tgz#0249f4ca4eb704562b8b0ff29caeb928c3a6ed38" + integrity sha512-jQtXUJyhso3kFw430+0SPCbmCmY1/kJv8iRffGHwHy3CkoomGxeYzMkmeSPYo6Egzh3FKJZRAL22yg5p2tXtfg== + dependencies: + "@remix-run/router" "1.3.0" + react-router "6.7.0" + +react-router@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.7.0.tgz#db262684c13b5c2970694084ae9e8531718a0681" + integrity sha512-KNWlG622ddq29MAM159uUsNMdbX8USruoKnwMMQcs/QWZgFUayICSn2oB7reHce1zPj6CG18kfkZIunSSRyGHg== + dependencies: + "@remix-run/router" "1.3.0" react-scripts@4.0.3: version "4.0.3" @@ -9526,11 +9478,6 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - resolve-url-loader@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" @@ -10626,16 +10573,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-invariant@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" - integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== - -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== - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -11058,11 +10995,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -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: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"