From 70aa6c023d424c6634ad06e7e7dc895c7c3d3ec2 Mon Sep 17 00:00:00 2001 From: AlexeySafronov Date: Sun, 6 Dec 2020 20:15:01 +0300 Subject: [PATCH] Web: Added dynostore for people reducers loading --- frontend.code-workspace | 3 +- products/ASC.People/Client/package.json | 4 +- .../ASC.People/Client/src/PeopleContent.jsx | 19 +- .../Client/src/store/group/actions.js | 2 +- .../Client/src/store/people/actions.js | 4 +- .../Client/src/store/people/reducers.js | 3 +- .../Client/src/store/people/selectors.js | 12 +- .../Client/src/store/portal/actions.js | 4 +- .../Client/src/store/portal/reducers.js | 4 +- .../Client/src/store/profile/actions.js | 6 +- .../Client/src/store/rootReducer.js | 3 - web/ASC.Web.Client/package.json | 1 + .../src/store/reducerManager.js | 61 ++++++ web/ASC.Web.Client/src/store/rootReducer.js | 18 -- web/ASC.Web.Client/src/store/store.js | 46 ++-- yarn.lock | 196 +++++++++++++----- 16 files changed, 282 insertions(+), 104 deletions(-) create mode 100644 web/ASC.Web.Client/src/store/reducerManager.js delete mode 100644 web/ASC.Web.Client/src/store/rootReducer.js diff --git a/frontend.code-workspace b/frontend.code-workspace index f6d92d6fc9..0b85ed30e0 100644 --- a/frontend.code-workspace +++ b/frontend.code-workspace @@ -28,6 +28,7 @@ "settings": { "window.zoomLevel": 1, "files.autoSave": "afterDelay", - "editor.formatOnSave": true + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" } } \ No newline at end of file diff --git a/products/ASC.People/Client/package.json b/products/ASC.People/Client/package.json index dbff06bf23..5062ba9fe8 100644 --- a/products/ASC.People/Client/package.json +++ b/products/ASC.People/Client/package.json @@ -6,7 +6,7 @@ "build": "webpack --mode production", "build:dev": "webpack --mode development", "build:start": "cd dist && PORT=5001 npx serve", - "start": "webpack-dev-server --open --mode development", + "start": "webpack-dev-server --mode development", "start:live": "webpack-dev-server --open --mode development --liveReload", "docker:build": "docker build . -t login", "docker:run": "docker run -p 5001:5001 login" @@ -33,6 +33,8 @@ }, "dependencies": { "@babel/runtime": "^7.12.5", + "@redux-dynostore/core": "^3.1.1", + "@redux-dynostore/react-redux": "^3.1.1", "attr-accept": "^2.2.2", "axios": "^0.21.0", "email-addresses": "^3.1.0", diff --git a/products/ASC.People/Client/src/PeopleContent.jsx b/products/ASC.People/Client/src/PeopleContent.jsx index 0565e2c19e..377e2bbd1a 100644 --- a/products/ASC.People/Client/src/PeopleContent.jsx +++ b/products/ASC.People/Client/src/PeopleContent.jsx @@ -1,9 +1,22 @@ import React, { useEffect } from "react"; +import { useStore } from "react-redux"; +import dynamic from "@redux-dynostore/react-redux"; +import { attachReducer } from "@redux-dynostore/core"; +//import rootReducer from "./store/rootReducer"; +import portalReducer from "./store/portal/reducers"; +const PeopleContent = (props) => { + const store = useStore(); -const PeopleContent = () => { - useEffect(() => {}, []); + // useEffect(() => { + // console.log("Store object", store); + // store.reducerManager.add("portal", portalReducer); + + // return store.reducerManager.remove("portal"); + // }, []); return
PEOPLE PAGE
; }; -export default PeopleContent; +//export default PeopleContent; + +export default dynamic("portal", attachReducer(portalReducer))(PeopleContent); diff --git a/products/ASC.People/Client/src/store/group/actions.js b/products/ASC.People/Client/src/store/group/actions.js index 93a71ae42d..6060f7501c 100644 --- a/products/ASC.People/Client/src/store/group/actions.js +++ b/products/ASC.People/Client/src/store/group/actions.js @@ -1,5 +1,5 @@ import { setGroups, fetchPeople } from "../people/actions"; -import { api } from "@appserver/common"; +import api from "@appserver/common/src/api"; export const SET_GROUP = "SET_GROUP"; export const CLEAN_GROUP = "CLEAN_GROUP"; diff --git a/products/ASC.People/Client/src/store/people/actions.js b/products/ASC.People/Client/src/store/people/actions.js index 8e8511ca03..e4a443caec 100644 --- a/products/ASC.People/Client/src/store/people/actions.js +++ b/products/ASC.People/Client/src/store/people/actions.js @@ -1,4 +1,6 @@ -import { api, history, constants } from "@appserver/common"; +import api from "@appserver/common/src/api"; +import history from "@appserver/common/src/history"; +import constants from "@appserver/common/src/constants"; import config from "../../../package.json"; import { EMPLOYEE_STATUS, diff --git a/products/ASC.People/Client/src/store/people/reducers.js b/products/ASC.People/Client/src/store/people/reducers.js index ce1b450b59..03740166b1 100644 --- a/products/ASC.People/Client/src/store/people/reducers.js +++ b/products/ASC.People/Client/src/store/people/reducers.js @@ -15,8 +15,7 @@ import { TOGGLE_AVATAR_EDITOR, } from "./actions"; import { isUserSelected, skipUser, getUsersBySelected } from "./selectors"; -import { api } from "@appserver/common"; -const { Filter } = api; +import Filter from "@appserver/common/src/api/people/filter"; const initialState = { users: null, diff --git a/products/ASC.People/Client/src/store/people/selectors.js b/products/ASC.People/Client/src/store/people/selectors.js index 695560a38b..b651b54b64 100644 --- a/products/ASC.People/Client/src/store/people/selectors.js +++ b/products/ASC.People/Client/src/store/people/selectors.js @@ -1,9 +1,15 @@ import { find, filter, cloneDeep } from "lodash"; import { createSelector } from "reselect"; -import { store, constants } from "@appserver/common"; import { isMobileOnly } from "react-device-detect"; -const { isAdmin, isMe, getCurrentUser } = store.auth.selectors; -const { EmployeeActivationStatus, EmployeeStatus } = constants; +import { + isAdmin, + isMe, + getCurrentUser, +} from "@appserver/common/src/store/auth/selectors"; +import { + EmployeeActivationStatus, + EmployeeStatus, +} from "@appserver/common/src/constants"; export function getSelectedUser(selection, userId) { return find(selection, function (obj) { diff --git a/products/ASC.People/Client/src/store/portal/actions.js b/products/ASC.People/Client/src/store/portal/actions.js index 41db354db8..208fa8547d 100644 --- a/products/ASC.People/Client/src/store/portal/actions.js +++ b/products/ASC.People/Client/src/store/portal/actions.js @@ -1,4 +1,4 @@ -import { api } from "@appserver/common"; +import { getInvitationLinks } from "@appserver/common/src/api/portal"; export const SET_INVITE_LINKS = "SET_INVITE_LINKS"; @@ -17,7 +17,7 @@ export function getPortalInviteLinks() { const { auth } = getState(); if (!auth.user.isAdmin) return Promise.resolve(); - return api.portal.getInvitationLinks().then((data) => { + return getInvitationLinks().then((data) => { dispatch(setInviteLinks(data.userLink, data.guestLink)); }); }; diff --git a/products/ASC.People/Client/src/store/portal/reducers.js b/products/ASC.People/Client/src/store/portal/reducers.js index 0bd08e33ae..041f8ef4e3 100644 --- a/products/ASC.People/Client/src/store/portal/reducers.js +++ b/products/ASC.People/Client/src/store/portal/reducers.js @@ -4,7 +4,7 @@ const initialState = { inviteLinks: {}, }; -const profileReducer = (state = initialState, action) => { +const portalReducer = (state = initialState, action) => { switch (action.type) { case SET_INVITE_LINKS: return Object.assign({}, state, { @@ -15,4 +15,4 @@ const profileReducer = (state = initialState, action) => { } }; -export default profileReducer; +export default portalReducer; diff --git a/products/ASC.People/Client/src/store/profile/actions.js b/products/ASC.People/Client/src/store/profile/actions.js index 70f82e559a..092e21b594 100644 --- a/products/ASC.People/Client/src/store/profile/actions.js +++ b/products/ASC.People/Client/src/store/profile/actions.js @@ -1,7 +1,7 @@ import { updateUserList } from "../people/actions"; -import { store, api } from "@appserver/common"; -const { setCurrentUser } = store.auth.actions; -const { isMe } = store.auth.selectors; +import api from "@appserver/common/src/api"; +import { setCurrentUser } from "@appserver/common/src/store/auth/actions"; +import { isMe } from "@appserver/common/src/store/auth/selectors"; export const SET_PROFILE = "SET_PROFILE"; export const CLEAN_PROFILE = "CLEAN_PROFILE"; diff --git a/products/ASC.People/Client/src/store/rootReducer.js b/products/ASC.People/Client/src/store/rootReducer.js index cfb5942cd7..063fae2f80 100644 --- a/products/ASC.People/Client/src/store/rootReducer.js +++ b/products/ASC.People/Client/src/store/rootReducer.js @@ -3,11 +3,8 @@ import peopleReducer from "./people/reducers"; import profileReducer from "./profile/reducers"; import groupReducer from "./group/reducers"; import portalReducer from "./portal/reducers"; -import { store } from "@appserver/common"; -const { reducer: authReducer } = store.auth; const rootReducer = combineReducers({ - auth: authReducer, people: peopleReducer, profile: profileReducer, group: groupReducer, diff --git a/web/ASC.Web.Client/package.json b/web/ASC.Web.Client/package.json index 784d9f0571..fa7c3a3c53 100644 --- a/web/ASC.Web.Client/package.json +++ b/web/ASC.Web.Client/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@babel/runtime": "^7.12.5", + "@redux-dynostore/core": "^3.1.1", "attr-accept": "^2.2.2", "axios": "^0.21.0", "email-addresses": "^3.1.0", diff --git a/web/ASC.Web.Client/src/store/reducerManager.js b/web/ASC.Web.Client/src/store/reducerManager.js new file mode 100644 index 0000000000..05b7b9b89c --- /dev/null +++ b/web/ASC.Web.Client/src/store/reducerManager.js @@ -0,0 +1,61 @@ +import { combineReducers } from "redux"; + +export function createReducerManager(initialReducers) { + // Create an object which maps keys to reducers + const reducers = { ...initialReducers }; + + // Create the initial combinedReducer + let combinedReducer = combineReducers(reducers); + + // An array which is used to delete state keys when reducers are removed + let keysToRemove = []; + + return { + getReducerMap: () => reducers, + + // The root reducer function exposed by this object + // This will be passed to the store + reduce: (state, action) => { + // If any reducers have been removed, clean up their state first + if (keysToRemove.length > 0) { + state = { ...state }; + for (let key of keysToRemove) { + delete state[key]; + } + keysToRemove = []; + } + + // Delegate to the combined reducer + return combinedReducer(state, action); + }, + + // Adds a new reducer with the specified key + add: (key, reducer) => { + if (!key || reducers[key]) { + return; + } + + // Add the reducer to the reducer mapping + reducers[key] = reducer; + + // Generate a new combined reducer + combinedReducer = combineReducers(reducers); + }, + + // Removes a reducer with the specified key + remove: (key) => { + if (!key || !reducers[key]) { + return; + } + + // Remove it from the reducer mapping + delete reducers[key]; + + // Add the key to the list of keys to clean up + keysToRemove.push(key); + + // Generate a new combined reducer + combinedReducer = combineReducers(reducers); + }, + }; +} diff --git a/web/ASC.Web.Client/src/store/rootReducer.js b/web/ASC.Web.Client/src/store/rootReducer.js deleted file mode 100644 index d3ba2e26a5..0000000000 --- a/web/ASC.Web.Client/src/store/rootReducer.js +++ /dev/null @@ -1,18 +0,0 @@ -import { combineReducers } from "redux"; -import store from "@appserver/common/src/store"; -import settingsReducer from "./settings/reducer"; -import confirmReducer from "./confirm/reducer"; -import wizardReducer from "./wizard/reducer"; -import paymentsReducer from "./payments/reducer"; - -const { reducer: authReducer } = store.auth; - -const rootReducer = combineReducers({ - auth: authReducer, - settings: settingsReducer, - confirm: confirmReducer, - wizard: wizardReducer, - payments: paymentsReducer, -}); - -export default rootReducer; diff --git a/web/ASC.Web.Client/src/store/store.js b/web/ASC.Web.Client/src/store/store.js index 467e54ce61..98feac8e0c 100644 --- a/web/ASC.Web.Client/src/store/store.js +++ b/web/ASC.Web.Client/src/store/store.js @@ -1,21 +1,41 @@ import { createStore, applyMiddleware } from "redux"; -import { composeWithDevTools } from "redux-devtools-extension/logOnlyInProduction"; -import rootReducer from "./rootReducer"; import thunk from "redux-thunk"; +import { composeWithDevTools } from "redux-devtools-extension/logOnlyInProduction"; +import dynostore, { + combineReducers, + dynamicReducers, +} from "@redux-dynostore/core"; +//import { createReducerManager } from "./reducerManager"; -/* eslint-disable no-underscore-dangle */ -const composeEnhancers = composeWithDevTools({ - // options like actionSanitizer, stateSanitizer +import authReducer from "@appserver/common/src/store/auth/reducer"; +import settingsReducer from "./settings/reducer"; +import confirmReducer from "./confirm/reducer"; +import wizardReducer from "./wizard/reducer"; +import paymentsReducer from "./payments/reducer"; + +const rootReducer = combineReducers({ + auth: authReducer, + settings: settingsReducer, + confirm: confirmReducer, + wizard: wizardReducer, + payments: paymentsReducer, }); -const configureStore = (prelodedState) => - createStore( - rootReducer, - prelodedState, - composeEnhancers(applyMiddleware(thunk)) - ); -/* eslint-enable */ +/* eslint-disable no-underscore-dangle */ +// const composeEnhancers = composeWithDevTools({ +// // options like actionSanitizer, stateSanitizer +// }); -const store = configureStore({}); +//const reducerManager = createReducerManager(staticReducers); + +// Create a store with the root reducer function being the one exposed by the manager. +const store = createStore( + //reducerManager.reduce, + rootReducer, + composeWithDevTools(applyMiddleware(thunk), dynostore(dynamicReducers())) +); + +// Optional: Put the reducer manager on the store so it is easily accessible +//store.reducerManager = reducerManager; export default store; diff --git a/yarn.lock b/yarn.lock index 08703e0210..9b6a3a5abe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1792,10 +1792,10 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-1.2.2.tgz#55d927436c07ef148ec927fbf4d55580a19bd68e" - integrity sha512-vrKDLd/Rq4IE16oT+jJkDBx0r29NFkdkU8GwqVSP4RajsAvP23CMGtFhVK0pedUhAiMvG1bGnFcTC/xCKaKgmw== +"@octokit/openapi-types@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-2.0.0.tgz#6d8f8ad9db3b75a39115f5def2654df8bed39f28" + integrity sha512-J4bfM7lf8oZvEAdpS71oTvC1ofKxfEZgU5vKVwzZKi4QPiL82udjpseJwxPid9Pu2FNmyRQOX4iEj6W1iOSnPw== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" @@ -1841,13 +1841,13 @@ once "^1.4.0" "@octokit/request@^5.2.0": - version "5.4.11" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.11.tgz#2536e9095f7e90c9d22a14fed7bb7299a22050c5" - integrity sha512-vskebNjuz4oTdPIv+9cQjHvjk8vjrMv2fOmSo6zr7IIaFHeVsJlG/C07MXiSS/+g/qU1GHjkPG1XW3faz57EoQ== + version "5.4.12" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.12.tgz#b04826fa934670c56b135a81447be2c1723a2ffc" + integrity sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" - "@octokit/types" "^6.0.0" + "@octokit/types" "^6.0.3" deprecation "^2.0.0" is-plain-object "^5.0.0" node-fetch "^2.6.1" @@ -1883,14 +1883,28 @@ dependencies: "@types/node" ">= 8" -"@octokit/types@^6.0.0": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.0.1.tgz#a43a667ac8fff45012d23b771b7c3199f4491910" - integrity sha512-H/DnTKC+U09en2GFLH/MfAPNDaYb1isieD4Hx4NLpEt/I1PgtZP/8a+Ehc/j9GHuVF/UvGtOVD8AF9XXvws53w== +"@octokit/types@^6.0.0", "@octokit/types@^6.0.3": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.1.1.tgz#bc88b3eb5f447b025a2a1a8177a72db216e8d4ca" + integrity sha512-btm3D6S7VkRrgyYF31etUtVY/eQ1KzrNRqhFt25KSe2mKlXuLXJilglRC6eDA2P6ou94BUnk/Kz5MPEolXgoiw== dependencies: - "@octokit/openapi-types" "^1.2.0" + "@octokit/openapi-types" "^2.0.0" "@types/node" ">= 8" +"@redux-dynostore/core@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@redux-dynostore/core/-/core-3.1.1.tgz#50fad2ea470d26e4d1525532dbfe3e9eb252ccea" + integrity sha512-7tenoqwDr2DQ4L1i9PyAWhs2SZmmrIhq7bBeFXys3D52bxMx6uJ1hMlyyqT/D7VH+6+LifsdVFcnkR3kB8VDUA== + +"@redux-dynostore/react-redux@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@redux-dynostore/react-redux/-/react-redux-3.1.1.tgz#e469e49ccfefb3a49bb1a8167c6b08dd7e86497d" + integrity sha512-d51ffDpPWc+7cL42SrjCCKgVQhpstbPdQnRZuA0VVT9YHxOWSfhrQNoroJqs8Uvs2xeEZX4ZWikyB2EtrlAGpA== + dependencies: + "@redux-dynostore/core" "^3.1.1" + hoist-non-react-statics "^3.3.0" + recompose "^0.30.0" + "@svgr/babel-plugin-add-jsx-attribute@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" @@ -2539,7 +2553,7 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@^2.0.0: +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -2779,7 +2793,7 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.3, browserslist@^4.14.5, browserslist@^4.14.7: +browserslist@^4.14.3, browserslist@^4.14.5, browserslist@^4.15.0: version "4.15.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.15.0.tgz#3d48bbca6a3f378e86102ffd017d9a03f122bdb0" integrity sha512-IJ1iysdMkGmjjYeRlDU8PQejVwxvVO5QOfXH7ylW31GO6LwNRSmm/SgRXtNsEXqMLl2e+2H5eEJ7sfynF8TCaQ== @@ -2986,9 +3000,9 @@ camelize@^1.0.0: integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= caniuse-lite@^1.0.30001164: - version "1.0.30001164" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001164.tgz#5bbfd64ca605d43132f13cc7fdabb17c3036bfdc" - integrity sha512-G+A/tkf4bu0dSp9+duNiXc7bGds35DioCyC6vgK2m/rjA4Krpy5WeZgZyfH2f0wj2kI6yAWWucyap6oOwmY1mg== + version "1.0.30001165" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz#32955490d2f60290bb186bb754f2981917fa744f" + integrity sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA== caseless@~0.12.0: version "0.12.0" @@ -3004,6 +3018,11 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" +change-emitter@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" + integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3427,13 +3446,18 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.7.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.0.tgz#3248c6826f4006793bd637db608bca6e4cd688b1" - integrity sha512-o9QKelQSxQMYWHXc/Gc4L8bx/4F7TTraE5rhuN8I7mKBt5dBIUpXpIR3omv70ebr8ST5R3PqbDQr+ZI3+Tt1FQ== + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.1.tgz#8d1ddd341d660ba6194cbe0ce60f4c794c87a36e" + integrity sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ== dependencies: - browserslist "^4.14.7" + browserslist "^4.15.0" semver "7.0.0" +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3929,9 +3953,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.612: - version "1.3.613" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.613.tgz#5ad7ec1e19d28c81edb6d61b9d4990d1c9716182" - integrity sha512-c3gkahddiUalk7HLhTC7PsKzPZmovYFtgh+g3rZJ+dGokk4n4dzEoOBnoV8VU8ptvnGJMhrjM/lyXKSltqf2hQ== + version "1.3.616" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.616.tgz#de63d1c79bb8eb61168774df0c11c9e1af69f9e8" + integrity sha512-CI8L38UN2BEnqXw3/oRIQTmde0LiSeqWSRlPA42ZTYgJQ8fYenzAM2Z3ni+jtILTcrs5aiXZCGJ96Pm+3/yGyQ== email-addresses@^3.1.0: version "3.1.0" @@ -3982,9 +4006,9 @@ enhanced-resolve@4.1.0: tapable "^1.0.0" enhanced-resolve@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.3.2.tgz#142295dda51aaaff049cf256459dc9a82a0b67f3" - integrity sha512-G28GCrglCAH6+EqMN2D+Q2wCUS1O1vVQJBn8ME2I/Api41YBe4vLWWRBOUbwDH7vwzSZdljxwTRVqnf+sm6XqQ== + version "5.4.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz#a8bcf23b00affac9455cf71efd80844f4054f4dc" + integrity sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ== dependencies: graceful-fs "^4.2.4" tapable "^2.0.0" @@ -4324,6 +4348,19 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" +fbjs@^0.8.1: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -4894,7 +4931,12 @@ history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^2.3.1: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.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== @@ -5297,9 +5339,11 @@ is-accessor-descriptor@^1.0.0: kind-of "^6.0.0" is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -5435,9 +5479,9 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: is-extglob "^2.1.1" is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-number@^3.0.0: version "3.0.0" @@ -5511,7 +5555,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -5577,6 +5621,14 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -5923,7 +5975,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.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, 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== @@ -6472,6 +6524,14 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-fetch@^2.5.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" @@ -7237,6 +7297,13 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -7508,6 +7575,11 @@ react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-lifecycles-compat@^3.0.2: + 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== + react-onclickoutside@^6.9.0: version "6.9.0" resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.9.0.tgz#a54bc317ae8cf6131a5d78acea55a11067f37a1f" @@ -7569,9 +7641,9 @@ react-string-format@^0.1.0: integrity sha512-xkIhnh2t1YmS4r8Zz92qs0Ia8EMbBoRlMEvvMtC0sQBSxxBmBujfssSA4PYYi0w2WvJYSEktgilB+320/mlsOQ== react-svg@^11.1.2: - version "11.1.3" - resolved "https://registry.yarnpkg.com/react-svg/-/react-svg-11.1.3.tgz#14c3f1552b0893319e7466e22797cf7f08a3bfb8" - integrity sha512-OSrg4mVXgGK+Qypraa0d68bI8e6ubcBGes9lqcaMdSgPjfrzFTe4yaG94UdROwk5JvFVLKTquc4lRuvqOY92KQ== + version "11.1.4" + resolved "https://registry.yarnpkg.com/react-svg/-/react-svg-11.1.4.tgz#1a828bcf6193bae09609080fbcae29cb6bed62dc" + integrity sha512-Xx3dZNCbTc4wgogf5joE2PcJBcKplfVJGAvgYqIu+/XNSqB1KTutmebn77bO9XT6uHXSBSoy11jCDw/6fddAFQ== dependencies: "@babel/runtime" "^7.12.5" "@tanem/svg-injector" "^8.1.0" @@ -7781,6 +7853,18 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +recompose@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" + integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== + dependencies: + "@babel/runtime" "^7.0.0" + change-emitter "^0.1.2" + fbjs "^0.8.1" + hoist-non-react-statics "^2.3.1" + react-lifecycles-compat "^3.0.2" + symbol-observable "^1.0.4" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -8114,9 +8198,9 @@ sass-loader@^10.1.0: semver "^7.3.2" sass@^1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.29.0.tgz#ec4e1842c146d8ea9258c28c141b8c2b7c6ab7f1" - integrity sha512-ZpwAUFgnvAUCdkjwPREny+17BpUj8nh5Yr6zKPGtLNTLrmtoRYIjm7njP24COhjJldjwW1dcv52Lpf4tNZVVRA== + version "1.30.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.30.0.tgz#60bbbbaf76ba10117e61c6c24f00161c3d60610e" + integrity sha512-26EUhOXRLaUY7+mWuRFqGeGGNmhB1vblpTENO1Z7mAzzIZeVxZr9EZoaY1kyGLFWdSOZxRMAufiN2mkbO6dAlw== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -8258,6 +8342,11 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -8397,9 +8486,9 @@ source-list-map@^2.0.0, source-list-map@^2.0.1: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-loader@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.1.2.tgz#5b782bf08496d3a7f355e1780df0e25190a80991" - integrity sha512-bjf6eSENOYBX4JZDfl9vVLNsGAQ6Uz90fLmOazcmMcyDYOBFsGxPNn83jXezWLY9bJsVAo1ObztxPcV8HAbjVA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.1.3.tgz#7dbc2fe7ea09d3e43c51fd9fc478b7f016c1f820" + integrity sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA== dependencies: abab "^2.0.5" iconv-lite "^0.6.2" @@ -8778,7 +8867,7 @@ svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@^1.2.0: +symbol-observable@^1.0.4, 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== @@ -8789,9 +8878,9 @@ tapable@^1.0.0, tapable@^1.1.3: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tapable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.1.1.tgz#b01cc1902d42a7bb30514e320ce21c456f72fd3f" - integrity sha512-Wib1S8m2wdpLbmQz0RBEVosIyvb/ykfKXf3ZIDqvWoMg/zTNm6G/tDSuUM61J1kNCDXWJrLHGSFeMhAG+gAGpQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" @@ -9098,7 +9187,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -ua-parser-js@^0.7.22: +ua-parser-js@^0.7.18, ua-parser-js@^0.7.22: version "0.7.22" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== @@ -9506,6 +9595,11 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +whatwg-fetch@>=0.10.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" + integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== + whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"