diff --git a/cypress/integration/vns/mui.spec.ts b/cypress/integration/vns/mui.spec.ts new file mode 100644 index 00000000..4bc779e7 --- /dev/null +++ b/cypress/integration/vns/mui.spec.ts @@ -0,0 +1,16 @@ +describe("material-ui", () => { + describe("ssr", () => { + it("does render a page", () => { + cy.visit("/vns/debug/mui"); + cy.contains("material ui", { matchCase: false, timeout: 0 }).should( + "exist" + ); + }); + }); + describe("client-side", () => { + it("does render a page", () => { + cy.visit("/vns/debug/mui"); + cy.contains("material ui", { matchCase: false }).should("exist"); + }); + }); +}); diff --git a/docs/features.md b/docs/features.md index 6da4f7da..02a458dd 100644 --- a/docs/features.md +++ b/docs/features.md @@ -156,6 +156,14 @@ There is nothing worse than a slow Storybook build, you can debug your Webpack b Run `yarn run analyze-bundle` to get insight on your Webpack build. +## Material UI + +Initial setup based on [official Next example](https://github.com/mui-org/material-ui/tree/master/examples/nextjs). + +We try to reduce the foot print of Material UI for an easy remove. In next iterations, we'll try to make it fully pluggable, like in Vulcan Meteor, so you can easily swap your UI system. + + + ## TODO ### i18n @@ -171,13 +179,16 @@ Material UI  ### Others Error boundary +HTML language in custom document +NPM package.json version in custom document + Switch between MUI and Tailwind +MUI and i18n in Storybook +Redirection demo for private pages => demo a page that is not available for example, and redirect to home with an HTTP request Graphql code generator -Redirection demo for private pages Remove debug routes from bundle Document contribution process Cleaner debug call (active only when DEBUG=1) Storybook static build -MUI and i18n in Storybook Pure JS support (no TS), in cypress, in code, in storybook, in jest... PErformance testing? Jest for the custom server diff --git a/package.json b/package.json index 6c59236b..9562ba2a 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@apollo/react-hooks": "3.1.3", "@apollo/react-ssr": "3.1.3", "@apollo/react-testing": "3.1.4", + "@material-ui/core": "^4.10.2", "apollo-cache-inmemory": "1.6.6", "apollo-client": "2.6.9", "apollo-link": "1.2.14", diff --git a/packages/@vulcan/next-material-ui/components/Link.tsx b/packages/@vulcan/next-material-ui/components/Link.tsx new file mode 100644 index 00000000..0b58e61d --- /dev/null +++ b/packages/@vulcan/next-material-ui/components/Link.tsx @@ -0,0 +1,88 @@ +// @see https://github.com/mui-org/material-ui/blob/master/examples/nextjs/src/Link.js +// /* eslint-disable jsx-a11y/anchor-has-content */ +import React, { Ref } from "react"; +import PropTypes from "prop-types"; +import clsx from "clsx"; +import { useRouter } from "next/router"; +import NextLink, { LinkProps as NextLinkProps } from "next/link"; +import MuiLink, { LinkProps as MuiLinkProps } from "@material-ui/core/Link"; + +type LinkProps = NextLinkProps & + MuiLinkProps & { + activeClassName?: string; + naked?: boolean; + }; + +const NextComposed = React.forwardRef(function NextComposed( + props: LinkProps, + ref: Ref +) { + const { as, href, ...other } = props; + + return ( + + + + ); +}); + +NextComposed.propTypes = { + as: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + // href: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), // FIXME: provokes a TS error + prefetch: PropTypes.bool, +}; + +// A styled version of the Next.js Link component: +// https://nextjs.org/docs/#with-link +function Link(props: LinkProps) { + const { + href, + activeClassName = "active", + className: classNameProps, + innerRef, + naked, + ...other + } = props; + + const router = useRouter(); + const pathname = typeof href === "string" ? href : href.pathname; + const className = clsx(classNameProps, { + [activeClassName]: router.pathname === pathname && activeClassName, + }); + + if (naked) { + return ( + + ); + } + + return ( + + ); +} + +Link.propTypes = { + activeClassName: PropTypes.string, + as: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + className: PropTypes.string, + href: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]), + naked: PropTypes.bool, + onClick: PropTypes.func, + prefetch: PropTypes.bool, +}; + +export default React.forwardRef((props: LinkProps, ref) => ( + +)); diff --git a/packages/@vulcan/next-material-ui/getMuiDocumentInitialProps.tsx b/packages/@vulcan/next-material-ui/getMuiDocumentInitialProps.tsx new file mode 100644 index 00000000..212e2b5a --- /dev/null +++ b/packages/@vulcan/next-material-ui/getMuiDocumentInitialProps.tsx @@ -0,0 +1,51 @@ +import React from "react"; +import Document, { DocumentContext } from "next/document"; +import { ServerStyleSheets } from "@material-ui/core/styles"; + +// @see https://github.com/mui-org/material-ui/blob/master/examples/nextjs/pages/_document.js +const getMuiDocumentInitialProps = async (ctx: DocumentContext) => { + // Resolution order + // + // On the server: + // 1. app.getInitialProps + // 2. page.getInitialProps + // 3. document.getInitialProps + // 4. app.render + // 5. page.render + // 6. document.render + // + // On the server with error: + // 1. document.getInitialProps + // 2. app.render + // 3. page.render + // 4. document.render + // + // On the client + // 1. app.getInitialProps + // 2. page.getInitialProps + // 3. app.render + // 4. page.render + + // Render app and page and get the context of the page with collected side effects. + const sheets = new ServerStyleSheets(); + const originalRenderPage = ctx.renderPage; + + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: (App) => (props) => sheets.collect(), + }); + + // get parent props + // NOTE: we need to have already enhanced ctx, so it has to be done here + const initialProps = await Document.getInitialProps(ctx); + + return { + // Styles fragment is rendered after the app and page rendering finish. + ...initialProps, + styles: [ + ...React.Children.toArray(initialProps.styles), + sheets.getStyleElement(), + ], + }; +}; +export default getMuiDocumentInitialProps; diff --git a/packages/@vulcan/next-material-ui/index.ts b/packages/@vulcan/next-material-ui/index.ts new file mode 100644 index 00000000..6da6c7c2 --- /dev/null +++ b/packages/@vulcan/next-material-ui/index.ts @@ -0,0 +1,5 @@ +export { default as useMuiApp } from "./useMuiApp"; + +export { default as getMuiDocumentInitialProps } from "./getMuiDocumentInitialProps"; + +export { default as Link } from "./components/Link"; diff --git a/packages/@vulcan/next-material-ui/useMuiApp.tsx b/packages/@vulcan/next-material-ui/useMuiApp.tsx new file mode 100644 index 00000000..63f9f36b --- /dev/null +++ b/packages/@vulcan/next-material-ui/useMuiApp.tsx @@ -0,0 +1,13 @@ +// @see https://github.com/mui-org/material-ui/blob/master/examples/nextjs/pages/_app.js +import { useEffect } from "react"; + +const useMuiApp = () => { + useEffect(() => { + // Remove the server-side injected CSS on each render + const jssStyles = document.querySelector("#jss-server-side"); + if (jssStyles) { + jssStyles.parentElement.removeChild(jssStyles); + } + }, []); +}; +export default useMuiApp; diff --git a/src/lib/material-ui/defaultTheme.ts b/src/lib/material-ui/defaultTheme.ts new file mode 100644 index 00000000..493f90ea --- /dev/null +++ b/src/lib/material-ui/defaultTheme.ts @@ -0,0 +1,8 @@ +// Mui theme +// @see https://material-ui.com/customization/default-theme +import { createMuiTheme } from "@material-ui/core/styles"; + +// Create a theme instance. +const theme = createMuiTheme({}); + +export default theme; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index a0065354..2a5fa0b0 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,6 +1,11 @@ import App, { AppProps } from "next/app"; // Comment if you don't need i18n import { appWithTranslation } from "~/lib/i18n"; +// Comment if you don't need Material UI +import { ThemeProvider } from "@material-ui/core/styles"; +import { useMuiApp } from "@vulcan/next-material-ui"; +import defaultTheme from "~/lib/material-ui/defaultTheme"; +import Head from "next/head"; /* // Uncomment to enable app-wide Apollo SSR @@ -15,7 +20,21 @@ import { getDataFromTree } from "@apollo/react-ssr"; // import "@vulcan/react-i18n"; // enable i18n function VNSApp({ Component, pageProps }: AppProps) { - return ; + useMuiApp(); // comment to disable Material UI + return ( + <> + + Vulcan Next Starter + + + + + + + ); } // Neeeded for next-i18n next to work diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx new file mode 100644 index 00000000..d88fee68 --- /dev/null +++ b/src/pages/_document.tsx @@ -0,0 +1,44 @@ +// @see https://github.com/mui-org/material-ui/blob/master/examples/nextjs/pages/_document.js +import React from "react"; +import Document, { + Html, + Head, + Main, + NextScript, + DocumentInitialProps, +} from "next/document"; +import theme from "~/lib/material-ui/defaultTheme"; +import { getMuiDocumentInitialProps } from "@vulcan/next-material-ui"; + +export default class MyDocument extends Document { + render() { + return ( + + + {/* PWA primary color */} + + + + +
+ + + + ); + } +} + +// `getInitialProps` belongs to `_document` (instead of `_app`), +// it's compatible with server-side generation (SSG). +MyDocument.getInitialProps = async (ctx) => { + const muiAndDocumentInitialProps: DocumentInitialProps = await getMuiDocumentInitialProps( + ctx + ); + + return { + ...muiAndDocumentInitialProps, + }; +}; diff --git a/src/pages/vns/debug/mui.tsx b/src/pages/vns/debug/mui.tsx new file mode 100644 index 00000000..718ddd54 --- /dev/null +++ b/src/pages/vns/debug/mui.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { Box, Button, Typography, Container } from "@material-ui/core"; // Next has tree shaking +import { Link } from "@vulcan/next-material-ui"; + +export default function MuiPage() { + return ( + + + + Material UI + + + + + ); +} diff --git a/yarn.lock b/yarn.lock index 889c3450..3d7616dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1360,7 +1360,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== @@ -1552,7 +1552,7 @@ "@emotion/utils" "0.11.3" babel-plugin-emotion "^10.0.27" -"@emotion/hash@0.8.0": +"@emotion/hash@0.8.0", "@emotion/hash@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== @@ -1865,6 +1865,70 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@material-ui/core@^4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.10.2.tgz#0ef78572132fcef1a25f6969bce0d34652d42e31" + integrity sha512-Uf4iDLi9sW6HKbVQDyDZDr1nMR4RUAE7w/RIIJZGNVZResC0xwmpLRZMtaUdSO43N0R0yJehfxTi4Z461Cd49A== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.10.0" + "@material-ui/system" "^4.9.14" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.10.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0" + react-transition-group "^4.4.0" + +"@material-ui/styles@^4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.10.0.tgz#2406dc23aa358217aa8cc772e6237bd7f0544071" + integrity sha512-XPwiVTpd3rlnbfrgtEJ1eJJdFCXZkHxy8TrdieaTvwxNYj42VnnCyFzxYeNW9Lhj4V1oD8YtQ6S5Gie7bZDf7Q== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.9.6" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.0.3" + jss-plugin-camel-case "^10.0.3" + jss-plugin-default-unit "^10.0.3" + jss-plugin-global "^10.0.3" + jss-plugin-nested "^10.0.3" + jss-plugin-props-sort "^10.0.3" + jss-plugin-rule-value-function "^10.0.3" + jss-plugin-vendor-prefixer "^10.0.3" + prop-types "^15.7.2" + +"@material-ui/system@^4.9.14": + version "4.9.14" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.9.14.tgz#4b00c48b569340cefb2036d0596b93ac6c587a5f" + integrity sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.9.6" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.10.2", "@material-ui/utils@^4.9.6": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.10.2.tgz#3fd5470ca61b7341f1e0468ac8f29a70bf6df321" + integrity sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -2766,7 +2830,7 @@ dependencies: "@babel/types" "^7.3.0" -"@types/body-parser@*": +"@types/body-parser@*", "@types/body-parser@1.19.0": version "1.19.0" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== @@ -2774,14 +2838,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/body-parser@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.1.tgz#18fcf61768fb5c30ccc508c21d6fd2e8b3bf7897" - integrity sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w== - dependencies: - "@types/connect" "*" - "@types/node" "*" - "@types/braces@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb" @@ -2845,13 +2901,14 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/express@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.2.tgz#a0fb7a23d8855bac31bc01d5a58cadd9b2173e6c" - integrity sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA== +"@types/express@4.17.4": + version "4.17.4" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.4.tgz#e78bf09f3f530889575f4da8a94cd45384520aac" + integrity sha512-DO1L53rGqIDUEvOjJKmbMEQ5Z+BM2cIEPy/eV3En+s166Gz+FeuzRerxcab757u/U4v4XF4RYrZPmqKa+aY/2w== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "*" + "@types/qs" "*" "@types/serve-static" "*" "@types/fs-capacitor@*": @@ -3114,6 +3171,13 @@ dependencies: "@types/react" "*" +"@types/react-transition-group@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d" + integrity sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^16.9.23": version "16.9.35" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" @@ -3769,13 +3833,6 @@ apollo-datasource@^0.7.1: apollo-server-caching "^0.5.1" apollo-server-env "^2.4.4" -apollo-engine-reporting-protobuf@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.4.tgz#73a064f8c9f2d6605192d1673729c66ec47d9cb7" - integrity sha512-SGrIkUR7Q/VjU8YG98xcvo340C4DaNUhg/TXOtGsMlfiJDzHwVau/Bv6zifAzBafp2lj0XND6Daj5kyT/eSI/w== - dependencies: - "@apollo/protobufjs" "^1.0.3" - apollo-engine-reporting-protobuf@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz#b6e66e6e382f9bcdc2ac8ed168b047eb1470c1a8" @@ -3860,7 +3917,7 @@ apollo-server-caching@^0.5.1: dependencies: lru-cache "^5.0.0" -apollo-server-core@^2.10.1: +apollo-server-core@^2.14.2: version "2.14.3" resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.14.3.tgz#64028d2faec17fc94d9d9c275f4da790b6ce57ce" integrity sha512-A9RkWuHFZ04uEnXof5V02T7wfhUel7Hx9LpEN4N59mXTpb7ewW+cb0u+J+SP+Y4vDhVqaHCGoveRVKy6X2kLhw== @@ -3888,7 +3945,7 @@ apollo-server-core@^2.10.1: subscriptions-transport-ws "^0.9.11" ws "^6.0.0" -apollo-server-env@^2.4.3, apollo-server-env@^2.4.4: +apollo-server-env@^2.4.4: version "2.4.4" resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.4.tgz#12d2d0896dcb184478cba066c7a683ab18689ca1" integrity sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg== @@ -3901,19 +3958,19 @@ apollo-server-errors@^2.4.1: resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.1.tgz#16ad49de6c9134bfb2b7dede9842e73bb239dbe2" integrity sha512-7oEd6pUxqyWYUbQ9TA8tM0NU/3aGtXSEibo6+txUkuHe7QaxfZ2wHRp+pfT1LC1K3RXYjKj61/C2xEO19s3Kdg== -apollo-server-express@2.10.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.10.1.tgz#f48b3c59ebb904d1048c80d2bc23ad8878579457" - integrity sha512-NkuWGBOCTiju/aDjfvDImm+4yzfrM0dwiRxu9fKwwh2h1oYBUKJNqjQ1mzJRi0ks6Sn1egwl/fQkTBTkWwGx7Q== +apollo-server-express@2.14.2: + version "2.14.2" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.14.2.tgz#662dfeb9c794c1eca59dd93e57e74487a8195ae6" + integrity sha512-iYyZm0kQqkM561i9l0WC9HbJsGZJbHP9bhnWaa1Itd+yNBS2AJFp6mRR3hQacsWXUw7ewaKAracMIggvfSH5Aw== dependencies: "@apollographql/graphql-playground-html" "1.6.24" "@types/accepts" "^1.3.5" - "@types/body-parser" "1.17.1" + "@types/body-parser" "1.19.0" "@types/cors" "^2.8.4" - "@types/express" "4.17.2" + "@types/express" "4.17.4" accepts "^1.3.5" - apollo-server-core "^2.10.1" - apollo-server-types "^0.2.10" + apollo-server-core "^2.14.2" + apollo-server-types "^0.5.0" body-parser "^1.18.3" cors "^2.8.4" express "^4.17.1" @@ -3930,15 +3987,6 @@ apollo-server-plugin-base@^0.9.0: dependencies: apollo-server-types "^0.5.0" -apollo-server-types@^0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.2.10.tgz#017ee0c812e70b0846826834eb2c9eda036c1c7a" - integrity sha512-ke9ViPEWfW+2XLe66CaKGVZdS7duSLbamSKSprmmeMBd8s6tmjf0FumUVxV7X4quxPZi0OPo8x0LoLU7GWsmaA== - dependencies: - apollo-engine-reporting-protobuf "^0.4.4" - apollo-server-caching "^0.5.1" - apollo-server-env "^2.4.3" - apollo-server-types@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.5.0.tgz#51f39c5fa610ece8b07f1fbcf63c47d4ac150340" @@ -5508,6 +5556,11 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -5985,6 +6038,14 @@ css-tree@1.0.0-alpha.39: mdn-data "2.0.6" source-map "^0.6.1" +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -6107,7 +6168,7 @@ cssstyle@^2.2.0: dependencies: cssom "~0.3.6" -csstype@^2.2.0, csstype@^2.5.7: +csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7, csstype@^2.6.5, csstype@^2.6.7: version "2.6.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== @@ -6503,6 +6564,14 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^5.0.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + dom-serializer@0, dom-serializer@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -8199,7 +8268,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.2.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.2.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: 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== @@ -8359,6 +8428,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +hyphenate-style-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" + integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== + i18next-browser-languagedetector@^4.0.0, i18next-browser-languagedetector@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-4.2.0.tgz#82e35d31f88a1d7c2b6d5913bf8c8481cd40aafb" @@ -8852,6 +8926,11 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + is-installed-globally@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -9699,6 +9778,76 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jss-plugin-camel-case@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.3.0.tgz#ae4da53b39a6e3ea94b70a20fc41c11f0b87386a" + integrity sha512-tadWRi/SLWqLK3EUZEdDNJL71F3ST93Zrl9JYMjV0QDqKPAl0Liue81q7m/nFUpnSTXczbKDy4wq8rI8o7WFqA== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "^10.3.0" + +jss-plugin-default-unit@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.3.0.tgz#cd74cf5088542620a82591f76c62c6b43a7e50a6" + integrity sha512-tT5KkIXAsZOSS9WDSe8m8lEHIjoEOj4Pr0WrG0WZZsMXZ1mVLFCSsD2jdWarQWDaRNyMj/I4d7czRRObhOxSuw== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-global@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.3.0.tgz#6b883e74900bb71f65ac2b19bea78f7d1e85af3f" + integrity sha512-etYTG/y3qIR/vxZnKY+J3wXwObyBDNhBiB3l/EW9/pE3WHE//BZdK8LFvQcrCO48sZW1Z6paHo6klxUPP7WbzA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-nested@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.3.0.tgz#ae8aceac95e09c3d40c991ea32403fb647d9e0a8" + integrity sha512-qWiEkoXNEkkZ+FZrWmUGpf+zBsnEOmKXhkjNX85/ZfWhH9dfGxUCKuJFuOWFM+rjQfxV4csfesq4hY0jk8Qt0w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.3.0.tgz#5b0625f87b6431a7969c56b0d8c696525969bfe4" + integrity sha512-boetORqL/lfd7BWeFD3K+IyPqyIC+l3CRrdZr+NPq7Noqp+xyg/0MR7QisgzpxCEulk+j2CRcEUoZsvgPC4nTg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-rule-value-function@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.3.0.tgz#498b0e2bae16cb316a6bdb73fd783cf9604ba747" + integrity sha512-7WiMrKIHH3rwxTuJki9+7nY11r1UXqaUZRhHvqTD4/ZE+SVhvtD5Tx21ivNxotwUSleucA/8boX+NF21oXzr5Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.3.0.tgz#b09c13a4d05a055429d8a24e19cc01ce049f0ed4" + integrity sha512-sZQbrcZyP5V0ADjCLwUA1spVWoaZvM7XZ+2fSeieZFBj31cRsnV7X70FFDerMHeiHAXKWzYek+67nMDjhrZAVQ== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "^10.3.0" + +jss@^10.0.3, jss@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.3.0.tgz#2cf7be265f72b59c1764d816fdabff1c5dd18326" + integrity sha512-B5sTRW9B6uHaUVzSo9YiMEOEp3UX8lWevU0Fsv+xtRnsShmgCfIYX44bTH8bPJe6LQKqEXku3ulKuHLbxBS97Q== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^2.6.5" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + jsx-ast-utils@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.3.0.tgz#edd727794ea284d7fda575015ed1b0cde0289ab6" @@ -11365,6 +11514,11 @@ polished@^3.3.1, polished@^3.4.4: dependencies: "@babel/runtime" "^7.9.2" +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + popper.js@^1.14.4, popper.js@^1.14.7: version "1.16.1" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" @@ -12219,7 +12373,7 @@ react-inspector@^4.0.0: is-dom "^1.0.9" prop-types "^15.6.1" -react-is@16.13.1, react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1: +react-is@16.13.1, react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.0, 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== @@ -12304,6 +12458,16 @@ react-textarea-autosize@^8.0.1: use-composed-ref "^1.0.0" use-latest "^1.0.0" +react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@16.13.0: version "16.13.0" resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" @@ -13989,6 +14153,11 @@ tiny-emitter@^2.0.0: resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== +tiny-warning@^1.0.2: + 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: version "1.4.1" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"