Andrew Swistak 6 vuotta sitten
vanhempi
commit
f94019c162

+ 2 - 0
.eslintignore

@@ -0,0 +1,2 @@
+# Ignore generated files
+app/javascript/packs/frontend/__generated__/*

+ 40 - 35
app/javascript/packs/frontend/App.tsx

@@ -1,55 +1,60 @@
-//import React, {lazy, Suspense} from 'react';
-import React from 'react';
-import {Route, Link, makeRouteConfig, RouteConfig} from 'found';
-import {hot} from 'react-hot-loader/root';
+import React, {lazy, Suspense} from 'react';
+//import React from 'react';
+//import {Route, Link, makeRouteConfig, RouteConfig} from 'found';
+//import {hot} from 'react-hot-loader/root';
 
-import {BrowserProtocol, queryMiddleware} from 'farce';
-import {createFarceRouter, createRender} from 'found';
-import {Resolver} from 'found-relay';
+import {BrowserRouter, Link, Route, Switch} from 'react-router-dom';
+//import {BrowserProtocol, queryMiddleware} from 'farce';
+//import {createFarceRouter, createRender} from 'found';
+//import {Resolver} from 'found-relay';
 
 import ApplicationLayout from './components/layout/ApplicationLayout';
-import graphqlEnvironment from './graphqlEnvironment';
+//import graphqlEnvironment from './graphqlEnvironment';
 
 //const Pokemon = lazy((): Promise<any> => import('./components/pages/Pokemon'));
 //const NotFound = lazy((): Promise<any> => import('./components/pages/NotFound'));
 //const TestComponent = lazy((): Promise<any> => import('./components/TestComponent'));
 //const TestComponent = lazy((): Promise<any> => import('./components/TestComponent'));
 import TestComponent from './components/TestComponent';
-import RelayTest from './components/pages/RelayTest';
+import RelayTest from './components/RelayTest';
 
 import './assets/stylesheets/app.scss';
 
 function App(): React.ReactElement {
-  //<ApplicationLayout>
-  //  <Suspense fallback={<div>Loading...</div>}>
-  //    <Route component={TestComponent} path='/' />
-  //    <Route component={Pokemon} path='/pokemon' />
-  //    <Route component={NotFound} />
-  //    <p>
-  //      <Link to='/pokemon'>Show me the pokemon!</Link>
-  //    </p>
-  //  </Suspense>
-  //</ApplicationLayout>
+  return (
+    <BrowserRouter>
+      <ApplicationLayout>
+        <Suspense fallback={<div>Loading...</div>}>
+          <Switch>
+            <Route component={RelayTest} path='/' />
+          </Switch>
+          <p>
+            <Link to='/pokemon'>Show me the pokemon!</Link>
+          </p>
+        </Suspense>
+      </ApplicationLayout>
+    </BrowserRouter>
+  );
 
   //const BrowserRouter = createBrowserRouter({
   //  ),
   //});
-  const routeConfig: RouteConfig = makeRouteConfig(
-    <Route Component={ApplicationLayout} path='/'>
-      <Route Component={RelayTest} />
-    </Route>
-  );
-
-  const Router = createFarceRouter({
-    historyProtocol: new BrowserProtocol(),
-    historyMiddlewares: [queryMiddleware],
-    routeConfig,
-
-    render: createRender({}),
-  });
+  //const routeConfig: RouteConfig = makeRouteConfig(
+  //<Route Component={ApplicationLayout} path='/'>
+  //<Route Component={TestComponent} />
+  //</Route>
+  //);
+
+  //const Router = createFarceRouter({
+  //historyProtocol: new BrowserProtocol(),
+  //historyMiddlewares: [queryMiddleware],
+  //routeConfig,
+
+  //render: createRender({}),
+  //});
 
-  return <Router resolver={new Resolver(graphqlEnvironment)} />;
+  //return <Router resolver={new Resolver(graphqlEnvironment)} />;
 }
 
-export default hot(App);
-//export default App;
+//export default hot(App);
+export default App;

+ 3 - 3
app/javascript/packs/frontend/components/pages/RelayTest.tsx → app/javascript/packs/frontend/components/RelayTest.tsx

@@ -1,10 +1,10 @@
 import * as React from 'react';
 import {graphql, QueryRenderer} from 'react-relay';
 
-import environment from '../../graphqlEnvironment';
+import environment from '../graphqlEnvironment';
 
 class RelayTest extends React.Component {
-  public render(): JSX.Element {
+  render() {
     //const {id} = this.props.match.params;
 
     return (
@@ -18,7 +18,7 @@ class RelayTest extends React.Component {
             }
           }
         `}
-        render={({error, props}): JSX.Element => {
+        render={({error, props}) => {
           if (error) {
             return <div>Error!</div>;
           }

+ 1 - 1
app/javascript/packs/frontend/components/layout/ApplicationLayout.tsx

@@ -1,7 +1,7 @@
 import React from 'react';
 import {Navbar, Nav, Form, FormControl, Button} from 'react-bootstrap';
 //import {LinkContainer} from 'react-router-bootstrap';
-import {Link} from 'found';
+import {Link} from 'react-router-dom';
 
 import './style';
 

+ 7 - 6
app/javascript/packs/frontend/components/pages/Pokemon.tsx

@@ -1,11 +1,12 @@
-import React, {lazy, Suspense} from 'react';
-import {Route} from 'found';
+import React from 'react';
+//import React, {lazy, Suspense} from 'react';
+//import {Route} from 'found';
 
-const PokemonShow = lazy((): Promise<any> => import('./pokemon/Show'));
-const PokemonIndex = lazy((): Promise<any> => import('./pokemon/Index'));
-const RelayTest = lazy((): Promise<any> => import('./RelayTest'));
+//const PokemonShow = lazy((): Promise<any> => import('./pokemon/Show'));
+//const PokemonIndex = lazy((): Promise<any> => import('./pokemon/Index'));
+//const RelayTest = lazy((): Promise<any> => import('../RelayTest'));
 
-import NotFound from './NotFound';
+//import NotFound from './NotFound';
 
 function Pokemon(): React.FunctionComponentElement<void> {
   return <>PokemonComponent</>;

+ 1 - 1
app/javascript/packs/frontend/components/pages/pokemon/Index.tsx

@@ -1,5 +1,5 @@
 import React from 'react';
-import {Link} from 'found';
+import {Link} from 'react-router-dom';
 
 //import {Pokemon} from '../../../api';
 

+ 19 - 21
app/javascript/packs/frontend/components/pages/pokemon/Show.tsx

@@ -1,6 +1,6 @@
 import * as React from 'react';
 import {graphql, createFragmentContainer} from 'react-relay';
-import {Link} from 'found';
+import {Link} from 'react-router-dom';
 
 // eslint-disable-next-line @typescript-eslint/camelcase, camelcase
 import {Show_pokemon} from '../../../__generated__/Show_pokemon.graphql';
@@ -10,27 +10,25 @@ interface Props {
   pokemon: Show_pokemon;
 }
 
-class PokemonShow extends React.Component<Props> {
-  public render(): JSX.Element {
-    const {
-      pokemon: {iid, nickname, pokedexNumber, createdAt, updatedAt},
-    } = this.props;
+function PokemonShow<Props>(): React.FunctionComponentElement<void> {
+  const {
+    pokemon: {iid, nickname, pokedexNumber, createdAt, updatedAt},
+  } = this.props;
 
-    return (
-      <>
-        <ul>
-          <li>IID: {iid}</li>
-          <li>nickname: {nickname}</li>
-          <li>pokedexNumber: {pokedexNumber}</li>
-          <li>createdAt: {createdAt}</li>
-          <li>updatedAt: {updatedAt}</li>
-        </ul>
-        <p>
-          <Link to={`/pokemon/${iid}/404`}>404 page</Link>
-        </p>
-      </>
-    );
-  }
+  return (
+    <>
+      <ul>
+        <li>IID: {iid}</li>
+        <li>nickname: {nickname}</li>
+        <li>pokedexNumber: {pokedexNumber}</li>
+        <li>createdAt: {createdAt}</li>
+        <li>updatedAt: {updatedAt}</li>
+      </ul>
+      <p>
+        <Link to={`/pokemon/${iid}/404`}>404 page</Link>
+      </p>
+    </>
+  );
 }
 
 export default createFragmentContainer(

+ 1 - 1
babel.config.js

@@ -34,7 +34,7 @@ module.exports = function(api) {
       ],
     ].filter(Boolean),
     plugins: [
-      require('react-hot-loader/babel'),
+      //require('react-hot-loader/babel'),
       require('babel-plugin-macros'),
       [
         require('babel-plugin-relay'),

+ 5 - 6
package.json

@@ -36,15 +36,16 @@
     "@rails/ujs": "^6.0.0-alpha",
     "@rails/webpacker": "^4.0.2",
     "bootstrap": "^4.3.1",
+    "farce": "^0.2.8",
+    "found": "^0.3.21",
+    "found-relay": "^0.4.0-alpha.8",
     "graphql-ruby-client": "^1.6.4",
     "prop-types": "^15.7.2",
     "react": "^16.8.6",
     "react-bootstrap": "^1.0.0-beta.8",
-    "react-dom": "yarn:@hot-loader/react-dom",
-    "react-hot-loader": "^4.8.4",
+    "react-dom": "16.8.6",
     "react-relay": "^4.0.0",
     "react-router": "^5.0.0",
-    "react-router-bootstrap": "^0.25.0",
     "react-router-dom": "^5.0.0",
     "relay-runtime": "^4.0.0",
     "webpack-cli": "^3.3.0"
@@ -56,17 +57,15 @@
     "@types/enzyme-adapter-react-16": "^1.0.5",
     "@types/jest": "^24.0.11",
     "@types/react": "^16.8.14",
-    "@types/react-bootstrap": "^0.32.17",
     "@types/react-dom": "^16.8.4",
     "@types/react-relay": "^1.3.14",
-    "@types/react-router": "^4.4.5",
-    "@types/react-router-dom": "^4.3.2",
     "@types/relay-runtime": "^1.3.12",
     "@typescript-eslint/eslint-plugin": "^1.7.0",
     "@typescript-eslint/parser": "^1.7.0",
     "babel-core": "^7.0.0-bridge.0",
     "babel-eslint": "^10.0.1",
     "babel-jest": "^24.7.1",
+    "babel-plugin-macros": "^2.5.1",
     "babel-plugin-relay": "^4.0.0",
     "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
     "enzyme": "^3.9.0",

+ 9 - 0
spec/javascript/setup.js

@@ -0,0 +1,9 @@
+import * as Enzyme from 'enzyme';
+import * as Adapter from 'enzyme-adapter-react-16';
+Enzyme.configure({ adapter: new Adapter() });
+// Cast global to any type so TS compilation doesn't complain about missing
+// property
+const globalAny = global;
+globalAny.shallow = Enzyme.shallow;
+globalAny.render = Enzyme.render;
+globalAny.mount = Enzyme.mount;

+ 3 - 3
tsconfig.json

@@ -5,10 +5,10 @@
     "emitDecoratorMetadata": true,
     "experimentalDecorators": true,
     "jsx": "react",
-    "lib": ["es6", "dom"],
-    "module": "esNext",
+    "lib": ["esNext", "dom"],
+    "module": "es2015",
     "moduleResolution": "node",
-    "target": "es6",
+    "target": "es2015",
     "baseUrl": "./app/javascript"
   },
   "exclude": [

+ 102 - 95
yarn.lock

@@ -710,6 +710,14 @@
     "@babel/plugin-transform-react-jsx-self" "^7.0.0"
     "@babel/plugin-transform-react-jsx-source" "^7.0.0"
 
+"@babel/runtime-corejs2@^7.4.4":
+  version "7.4.4"
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.4.4.tgz#4d4519a4c85e9d98fdff59f5371758a34ae07923"
+  integrity sha512-hE7oVwVsRws84u5/nkaWWdN2J4SXEGuXKjrAsP0E4nkYImjSbpdHfGTS2nvFc82aDGIuG6OzhAQMpIzTHuZeKA==
+  dependencies:
+    core-js "^2.6.5"
+    regenerator-runtime "^0.13.2"
+
 "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.4.tgz#dc2e34982eb236803aa27a07fea6857af1b9171d"
@@ -1071,11 +1079,6 @@
     "@types/minimatch" "*"
     "@types/node" "*"
 
-"@types/history@*":
-  version "4.7.2"
-  resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.2.tgz#0e670ea254d559241b6eeb3894f8754991e73220"
-  integrity sha512-ui3WwXmjTaY73fOQ3/m3nnajU/Orhi6cEu5rzX+BrAAJxa3eITXZ5ch9suPqtM03OWhAHhPSyBGCN4UKoxO20Q==
-
 "@types/istanbul-lib-coverage@^2.0.0":
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
@@ -1113,13 +1116,6 @@
   resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
   integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
 
-"@types/react-bootstrap@^0.32.17":
-  version "0.32.17"
-  resolved "https://registry.yarnpkg.com/@types/react-bootstrap/-/react-bootstrap-0.32.17.tgz#62be3350734c7433683f54ec02afba69e7412427"
-  integrity sha512-w/Agv91PQ2q5w4MK+plWshyvLMFePxdl+b2KtlFHBSbr6FgaguIGEAdhA3l0hyKDmEj3VMHGFiBqwhsQJ2Rltg==
-  dependencies:
-    "@types/react" "*"
-
 "@types/react-dom@^16.8.4":
   version "16.8.4"
   resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.8.4.tgz#7fb7ba368857c7aa0f4e4511c4710ca2c5a12a88"
@@ -1135,23 +1131,6 @@
     "@types/react" "*"
     "@types/relay-runtime" "*"
 
-"@types/react-router-dom@^4.3.2":
-  version "4.3.2"
-  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.3.2.tgz#52c17c3682597638f31c17c42620403dc5c2a3f5"
-  integrity sha512-biesHodFxPgDxku2m08XwPeAfUYBcxAnrQG7pwFikuA3L2e3u2OKAb+Sb16bJuU3L5CTHd+Ivap+ke4mmGsHqQ==
-  dependencies:
-    "@types/history" "*"
-    "@types/react" "*"
-    "@types/react-router" "*"
-
-"@types/react-router@*", "@types/react-router@^4.4.5":
-  version "4.4.5"
-  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.4.5.tgz#1166997dc7eef2917b5ebce890ebecb32ee5c1b3"
-  integrity sha512-12+VOu1+xiC8RPc9yrgHCyLI79VswjtuqeS2gPrMcywH6tkc8rGIUhs4LaL3AJPqo5d+RPnfRpNKiJ7MK2Qhcg==
-  dependencies:
-    "@types/history" "*"
-    "@types/react" "*"
-
 "@types/react@*", "@types/react@^16.8.14":
   version "16.8.14"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.14.tgz#b561bfabeb8f60d12e6d4766367e7a9ae927aa18"
@@ -1816,7 +1795,7 @@ babel-plugin-jest-hoist@^24.6.0:
   dependencies:
     "@types/babel__traverse" "^7.0.6"
 
-babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.5.0:
+babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.5.0, babel-plugin-macros@^2.5.1:
   version "2.5.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz#4a119ac2c2e19b458c259b9accd7ee34fd57ec6f"
   integrity sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q==
@@ -1883,7 +1862,7 @@ babel-preset-jest@^24.6.0:
     "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
     babel-plugin-jest-hoist "^24.6.0"
 
-babel-runtime@6.x.x:
+babel-runtime@6.x.x, babel-runtime@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -3256,11 +3235,6 @@ dom-serializer@0, dom-serializer@~0.1.1:
     domelementtype "^1.3.0"
     entities "^1.1.1"
 
-dom-walk@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
-  integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
-
 domain-browser@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
@@ -3866,6 +3840,18 @@ extsprintf@^1.2.0:
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
   integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
 
+farce@^0.2.6, farce@^0.2.8:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/farce/-/farce-0.2.8.tgz#bd9c5343b5970357d9446d43212a2036f27886ed"
+  integrity sha512-x4N70Ti9nOo6/waNJUZMLDd/U6+WA0gV+AUE1gFS/npD/FliTUCKbBLNQYbgeejzDdw0MgtPCCjRX8kPTHjspA==
+  dependencies:
+    dom-helpers "^3.4.0"
+    invariant "^2.2.4"
+    is-promise "^2.1.0"
+    query-string "^5.1.1"
+    redux "^4.0.1"
+    warning "^4.0.3"
+
 fast-deep-equal@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
@@ -3893,7 +3879,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
   integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
 
-fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4:
+fast-levenshtein@~2.0.4:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
@@ -4120,6 +4106,34 @@ forwarded@~0.1.2:
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
   integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
 
+found-relay@^0.4.0-alpha.8:
+  version "0.4.0-alpha.8"
+  resolved "https://registry.yarnpkg.com/found-relay/-/found-relay-0.4.0-alpha.8.tgz#90f0e3f66a9cef53970df190019de3d6fd76c60e"
+  integrity sha512-HiwWY6fQLfrysnmFA2L4GxlGVu4cLujLhKbfzvDWV47EB5lHt/EylLpwEDgR64ayZus1p6Z0X6ryyv+T2SPWow==
+  dependencies:
+    "@babel/runtime-corejs2" "^7.4.4"
+    is-promise "^2.1.0"
+    lodash "^4.17.11"
+    prop-types "^15.7.2"
+    warning "^4.0.3"
+
+found@^0.3.21:
+  version "0.3.21"
+  resolved "https://registry.yarnpkg.com/found/-/found-0.3.21.tgz#9eebf2fb69f10259680762c62d10173efe740033"
+  integrity sha512-iaeGVTBirrTAravFPcIfWPuJHIaFNqnJ87AMvnpB4Ig8RTB97C4PipVopmSxK+lLeMdEybUwaW+BhNDhLPEUSw==
+  dependencies:
+    babel-runtime "^6.26.0"
+    farce "^0.2.6"
+    is-promise "^2.1.0"
+    lodash "^4.17.11"
+    path-to-regexp "^1.7.0"
+    prop-types "^15.6.2"
+    prop-types-extra "^1.1.0"
+    react-redux "^5.1.1"
+    react-static-container "^1.0.2"
+    redux "^4.0.1"
+    warning "^4.0.2"
+
 fragment-cache@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -4304,14 +4318,6 @@ global-prefix@^1.0.1:
     is-windows "^1.0.1"
     which "^1.2.14"
 
-global@^4.3.0:
-  version "4.3.2"
-  resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
-  integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
-  dependencies:
-    min-document "^2.19.0"
-    process "~0.5.1"
-
 globals@^11.1.0, globals@^11.7.0:
   version "11.11.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e"
@@ -4507,7 +4513,7 @@ hmac-drbg@^1.0.0:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.1"
 
-hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
+hoist-non-react-statics@^3.1.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b"
   integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==
@@ -6159,13 +6165,6 @@ mimic-fn@^2.0.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
-min-document@^2.19.0:
-  version "2.19.0"
-  resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
-  integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
-  dependencies:
-    dom-walk "^0.1.0"
-
 mini-css-extract-plugin@^0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
@@ -7822,11 +7821,6 @@ process@^0.11.10:
   resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
   integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
-process@~0.5.1:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
-  integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
-
 progress@^2.0.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -7869,7 +7863,7 @@ prop-types-extra@^1.1.0:
     react-is "^16.3.2"
     warning "^3.0.0"
 
-prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.6.1, prop-types@^15.6.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==
@@ -7963,6 +7957,15 @@ qs@6.5.2, qs@~6.5.2:
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
   integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
 
+query-string@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+  integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+  dependencies:
+    decode-uri-component "^0.2.0"
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
 querystring-es3@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@@ -8064,37 +8067,22 @@ react-context-toolbox@^2.0.2:
   resolved "https://registry.yarnpkg.com/react-context-toolbox/-/react-context-toolbox-2.0.2.tgz#35637287cb23f801e6ed802c2bb7a97e1f04e3fb"
   integrity sha512-tY4j0imkYC3n5ZlYSgFkaw7fmlCp3IoQQ6DxpqeNHzcD0hf+6V+/HeJxviLUZ1Rv1Yn3N3xyO2EhkkZwHn0m1A==
 
-"react-dom@yarn:@hot-loader/react-dom":
+react-dom@16.8.6:
   version "16.8.6"
-  resolved "https://registry.yarnpkg.com/@hot-loader/react-dom/-/react-dom-16.8.6.tgz#7923ba27db1563a7cc48d4e0b2879a140df461ea"
-  integrity sha512-+JHIYh33FVglJYZAUtRjfT5qZoT2mueJGNzU5weS2CVw26BgbxGKSujlJhO85BaRbg8sqNWyW1hYBILgK3ZCgA==
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f"
+  integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
     prop-types "^15.6.2"
     scheduler "^0.13.6"
 
-react-hot-loader@^4.8.4:
-  version "4.8.4"
-  resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.8.4.tgz#357ba342e367fd42d6a870a9c0601c23fa0730c6"
-  integrity sha512-O98btZXcm24ZgP+aPBD0W9N+GEnkOg6vlLEy/IMZ53u3K/dGqO0I/RU4qrmQzE+wMDLpwNo5TwxaAjVw9Y+IBA==
-  dependencies:
-    fast-levenshtein "^2.0.6"
-    global "^4.3.0"
-    hoist-non-react-statics "^3.3.0"
-    loader-utils "^1.1.0"
-    lodash "^4.17.11"
-    prop-types "^15.6.1"
-    react-lifecycles-compat "^3.0.4"
-    shallowequal "^1.0.2"
-    source-map "^0.7.3"
-
 react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
   version "16.8.6"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
   integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==
 
-react-lifecycles-compat@^3.0.4:
+react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
   integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
@@ -8125,6 +8113,19 @@ react-popper@^1.3.2:
     typed-styles "^0.0.7"
     warning "^4.0.2"
 
+react-redux@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f"
+  integrity sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg==
+  dependencies:
+    "@babel/runtime" "^7.1.2"
+    hoist-non-react-statics "^3.1.0"
+    invariant "^2.2.4"
+    loose-envify "^1.1.0"
+    prop-types "^15.6.1"
+    react-is "^16.6.0"
+    react-lifecycles-compat "^3.0.0"
+
 react-relay@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/react-relay/-/react-relay-4.0.0.tgz#000f63ca3ae179b4415ee11765d04bc2fe4278da"
@@ -8135,13 +8136,6 @@ react-relay@^4.0.0:
     nullthrows "^1.1.0"
     relay-runtime "4.0.0"
 
-react-router-bootstrap@^0.25.0:
-  version "0.25.0"
-  resolved "https://registry.yarnpkg.com/react-router-bootstrap/-/react-router-bootstrap-0.25.0.tgz#5d1a99b5b8a2016c011fc46019d2397e563ce0df"
-  integrity sha512-/22eqxjn6Zv5fvY2rZHn57SKmjmJfK7xzJ6/G1OgxAjLtKVfWgV5sn41W2yiqzbtV5eE4/i4LeDLBGYTqx7jbA==
-  dependencies:
-    prop-types "^15.5.10"
-
 react-router-dom@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.0.0.tgz#542a9b86af269a37f0b87218c4c25ea8dcf0c073"
@@ -8171,6 +8165,11 @@ react-router@5.0.0, react-router@^5.0.0:
     tiny-invariant "^1.0.2"
     tiny-warning "^1.0.0"
 
+react-static-container@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/react-static-container/-/react-static-container-1.0.2.tgz#30a4f7548860be1d55d5eb4c20645b835c2bdf34"
+  integrity sha512-rxlZtZk5t6Y3gqqpaZ1lxY3RqlQcBU5uGsSoZj/hbF3ZweDqPbFHDkczT4emAxeaw37OD96RAAoayFGFQZCdWg==
+
 react-test-renderer@^16.0.0-0, react-test-renderer@^16.8.6:
   version "16.8.6"
   resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.6.tgz#188d8029b8c39c786f998aa3efd3ffe7642d5ba1"
@@ -8305,6 +8304,14 @@ redent@^1.0.0:
     indent-string "^2.1.0"
     strip-indent "^1.0.1"
 
+redux@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5"
+  integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==
+  dependencies:
+    loose-envify "^1.4.0"
+    symbol-observable "^1.2.0"
+
 reflect.ownkeys@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460"
@@ -8882,11 +8889,6 @@ shallow-clone@^1.0.0:
     kind-of "^5.0.0"
     mixin-object "^2.0.1"
 
-shallowequal@^1.0.2:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
-  integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
-
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -9044,11 +9046,6 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6:
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
 
-source-map@^0.7.3:
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
-  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
 spark-md5@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.0.tgz#3722227c54e2faf24b1dc6d933cc144e6f71bfef"
@@ -9209,6 +9206,11 @@ stream-shift@^1.0.0:
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
   integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
 
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+  integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
 string-length@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
@@ -9372,6 +9374,11 @@ svgo@^1.0.0:
     unquote "~1.1.1"
     util.promisify "~1.0.0"
 
+symbol-observable@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
+  integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
+
 symbol-tree@^3.2.2:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"