From 98252ad7a1ebb1244b77d5e3010c70f9973465b0 Mon Sep 17 00:00:00 2001 From: urwithat Date: Mon, 14 Dec 2020 23:40:27 +0530 Subject: [PATCH 1/6] Fix logout url --- src/utils/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/index.js b/src/utils/index.js index d17dfa4..5f37fa2 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -5,7 +5,7 @@ import config from "../../config"; */ export const getLogoutUrl = () => `${config.URL.AUTH}/?logout=true&retUrl=${encodeURIComponent( - window.location.href.match(/[^?]*/)[0] + "https://" + window.location.host )}`; /** From 228bb2a77a15bf018f1ceb5d80425d93490bc579 Mon Sep 17 00:00:00 2001 From: urwithat Date: Thu, 17 Dec 2020 11:31:20 +0530 Subject: [PATCH 2/6] Integrate Submission Review --- server.js | 2 +- src/constants/apps.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index 665a20e..a5a32f8 100644 --- a/server.js +++ b/server.js @@ -20,6 +20,6 @@ app.get('/', function (req, res) { res.send('alive') }) -const PORT = process.env.PORT || 8080; +const PORT = process.env.PORT || 3001; app.listen(PORT); console.log(`App is hosted on port ${PORT}.`); // eslint-disable-line no-console diff --git a/src/constants/apps.js b/src/constants/apps.js index 22fbf93..f69c01c 100644 --- a/src/constants/apps.js +++ b/src/constants/apps.js @@ -4,6 +4,7 @@ import appReactIcon from "../assets/images/reactjs.svg"; import appAngularIcon from "../assets/images/angularjs.svg"; import appTaasIcon from "../assets/images/integrations.svg"; +import appSubmissionReviewIcon from "../assets/images/integrations.svg"; import manageWorkIcon from "../assets/images/managework.svg"; import ondemandTalentIcon from "../assets/images/ondemand-talent.svg"; import myOrganizationIcon from "../assets/images/my-organization.svg"; @@ -67,6 +68,12 @@ export const APP_CATEGORIES = [ }, ], }, + { + title: "Submission Review", + icon: appSubmissionReviewIcon, + path: "/submissions", + menu: [], + }, { title: "Manage Work", icon: manageWorkIcon, From a0096963f7e3bb03641109032f8dd508c87c68a4 Mon Sep 17 00:00:00 2001 From: Samir Date: Fri, 15 Jan 2021 23:30:32 +0100 Subject: [PATCH 3/6] notifications implementation --- README.md | 2 +- babel.config.js | 59 + babel.config.json | 24 - config/development.js | 9 +- config/index.js | 2 +- config/production.js | 5 +- jest.config.js | 2 +- package-lock.json | 5944 +++++++++++++---- package.json | 34 +- server.js | 2 +- src/App.jsx | 13 + src/actions/notifications.js | 278 + src/assets/fonts/roboto/apache-license.txt | 203 + src/assets/fonts/roboto/roboto-black.svg | 642 ++ .../fonts/roboto/roboto-blackitalic.svg | 642 ++ src/assets/fonts/roboto/roboto-bold.svg | 593 ++ src/assets/fonts/roboto/roboto-bolditalic.svg | 642 ++ src/assets/fonts/roboto/roboto-italic.svg | 642 ++ src/assets/fonts/roboto/roboto-light.svg | 641 ++ .../fonts/roboto/roboto-lightitalic.svg | 641 ++ src/assets/fonts/roboto/roboto-medium.svg | 593 ++ .../fonts/roboto/roboto-mediumitalic.svg | 642 ++ src/assets/fonts/roboto/roboto-regular.svg | 621 ++ src/assets/fonts/roboto/roboto-thin.svg | 631 ++ src/assets/fonts/roboto/roboto-thinitalic.svg | 631 ++ src/assets/icons/bell.svg | 1 + src/assets/icons/check.svg | 4 + .../icons/notification-member-added.svg | 13 + src/assets/icons/notification-new-posts.svg | 13 + src/assets/icons/notification-new-project.svg | 11 + .../icons/notification-review-pending.svg | 13 + src/assets/icons/notification-updates.svg | 12 + src/assets/icons/notification-warning.svg | 13 + .../icons/ui-16px-1_settings-gear-64.svg | 11 + src/assets/icons/ui-bell.svg | 11 + src/assets/icons/x-mark-white.svg | 13 + src/assets/icons/x-mark.svg | 4 + src/components/Dropdown/Dropdown.jsx | 186 + src/components/Dropdown/Dropdown.scss | 188 + src/components/Dropdown/DropdownItem.jsx | 35 + src/components/Dropdown/enhanceDropdown.js | 118 + src/components/LoadingIndicator/index.jsx | 23 + src/components/LoadingIndicator/styles.scss | 19 + src/components/LoadingSpinner/index.jsx | 14 + src/components/NavBar/index.jsx | 1 + src/components/NavBar/styles.css | 4 +- .../Notifications/MobilePage/index.jsx | 87 + .../Notifications/MobilePage/styles.scss | 39 + .../Notifications/NotificationItem/index.jsx | 123 + .../NotificationItem/styles.scss | 133 + .../Notifications/NotificationsBell/index.jsx | 30 + .../NotificationsBell/styles.scss | 40 + .../NotificationsDropdown/index.jsx | 97 + .../NotificationsDropdownHeader/index.jsx | 24 + .../NotificationsDropdownHeader/styles.scss | 49 + .../NotificationsEmpty/index.jsx | 26 + .../NotificationsEmpty/styles.scss | 65 + .../NotificationsMobilePage/index.jsx | 37 + .../NotificationsMobilePage/styles.scss | 80 + .../NotificationsReadAll/index.jsx | 20 + .../NotificationsReadAll/styles.scss | 20 + .../NotificationsSection/index.jsx | 66 + .../NotificationsSection/styles.scss | 47 + .../NotificationsSectionTitle/index.jsx | 32 + .../NotificationsSectionTitle/styles.scss | 81 + src/components/NotificationsMenu/index.jsx | 10 +- src/components/NotificationsMenu/styles.css | 24 - src/components/NotificationsModal/index.jsx | 42 + src/components/NotificationsModal/styles.scss | 68 + src/components/SideFilter/SideFilter.jsx | 42 + src/components/SideFilter/SideFilter.scss | 17 + .../SideFilter/SideFilterSection.jsx | 35 + .../SideFilter/SideFilterSection.scss | 11 + .../SideFilter/SideFilterSectionItem.jsx | 37 + .../SideFilter/SideFilterSectionItem.scss | 34 + src/components/SideFilter/index.js | 2 + src/components/Sticky/index.jsx | 43 + src/constants/apps.js | 2 +- src/constants/notifications.js | 1287 ++++ .../NotificationsContainer/index.jsx | 247 + .../NotificationsContainer/styles.scss | 74 + .../NotificationsDropdownContainer/index.jsx | 456 ++ .../styles.scss | 71 + src/reducers/index.js | 2 + src/reducers/notifications.js | 283 + src/root.component.test.js | 2 +- src/services/auth.js | 18 +- src/services/notifications.js | 67 + src/store.js | 3 +- src/styles/_fonts.scss | 48 + src/styles/main.module.scss | 11 + src/topcoder-micro-frontends-navbar-app.js | 4 + src/utils/exports.js | 3 + src/utils/getToken.js | 22 + src/utils/notifications.js | 797 +++ webpack.config.js | 96 +- 96 files changed, 18290 insertions(+), 1509 deletions(-) create mode 100644 babel.config.js delete mode 100644 babel.config.json create mode 100644 src/actions/notifications.js create mode 100644 src/assets/fonts/roboto/apache-license.txt create mode 100644 src/assets/fonts/roboto/roboto-black.svg create mode 100644 src/assets/fonts/roboto/roboto-blackitalic.svg create mode 100644 src/assets/fonts/roboto/roboto-bold.svg create mode 100644 src/assets/fonts/roboto/roboto-bolditalic.svg create mode 100644 src/assets/fonts/roboto/roboto-italic.svg create mode 100644 src/assets/fonts/roboto/roboto-light.svg create mode 100644 src/assets/fonts/roboto/roboto-lightitalic.svg create mode 100644 src/assets/fonts/roboto/roboto-medium.svg create mode 100644 src/assets/fonts/roboto/roboto-mediumitalic.svg create mode 100644 src/assets/fonts/roboto/roboto-regular.svg create mode 100644 src/assets/fonts/roboto/roboto-thin.svg create mode 100644 src/assets/fonts/roboto/roboto-thinitalic.svg create mode 100644 src/assets/icons/bell.svg create mode 100644 src/assets/icons/check.svg create mode 100644 src/assets/icons/notification-member-added.svg create mode 100644 src/assets/icons/notification-new-posts.svg create mode 100644 src/assets/icons/notification-new-project.svg create mode 100644 src/assets/icons/notification-review-pending.svg create mode 100644 src/assets/icons/notification-updates.svg create mode 100644 src/assets/icons/notification-warning.svg create mode 100644 src/assets/icons/ui-16px-1_settings-gear-64.svg create mode 100644 src/assets/icons/ui-bell.svg create mode 100644 src/assets/icons/x-mark-white.svg create mode 100644 src/assets/icons/x-mark.svg create mode 100644 src/components/Dropdown/Dropdown.jsx create mode 100644 src/components/Dropdown/Dropdown.scss create mode 100644 src/components/Dropdown/DropdownItem.jsx create mode 100644 src/components/Dropdown/enhanceDropdown.js create mode 100644 src/components/LoadingIndicator/index.jsx create mode 100644 src/components/LoadingIndicator/styles.scss create mode 100644 src/components/LoadingSpinner/index.jsx create mode 100644 src/components/Notifications/MobilePage/index.jsx create mode 100644 src/components/Notifications/MobilePage/styles.scss create mode 100644 src/components/Notifications/NotificationItem/index.jsx create mode 100644 src/components/Notifications/NotificationItem/styles.scss create mode 100644 src/components/Notifications/NotificationsBell/index.jsx create mode 100644 src/components/Notifications/NotificationsBell/styles.scss create mode 100644 src/components/Notifications/NotificationsDropdown/index.jsx create mode 100644 src/components/Notifications/NotificationsDropdownHeader/index.jsx create mode 100644 src/components/Notifications/NotificationsDropdownHeader/styles.scss create mode 100644 src/components/Notifications/NotificationsEmpty/index.jsx create mode 100644 src/components/Notifications/NotificationsEmpty/styles.scss create mode 100644 src/components/Notifications/NotificationsMobilePage/index.jsx create mode 100644 src/components/Notifications/NotificationsMobilePage/styles.scss create mode 100644 src/components/Notifications/NotificationsReadAll/index.jsx create mode 100644 src/components/Notifications/NotificationsReadAll/styles.scss create mode 100644 src/components/Notifications/NotificationsSection/index.jsx create mode 100644 src/components/Notifications/NotificationsSection/styles.scss create mode 100644 src/components/Notifications/NotificationsSectionTitle/index.jsx create mode 100644 src/components/Notifications/NotificationsSectionTitle/styles.scss create mode 100644 src/components/NotificationsModal/index.jsx create mode 100644 src/components/NotificationsModal/styles.scss create mode 100644 src/components/SideFilter/SideFilter.jsx create mode 100644 src/components/SideFilter/SideFilter.scss create mode 100644 src/components/SideFilter/SideFilterSection.jsx create mode 100644 src/components/SideFilter/SideFilterSection.scss create mode 100644 src/components/SideFilter/SideFilterSectionItem.jsx create mode 100644 src/components/SideFilter/SideFilterSectionItem.scss create mode 100644 src/components/SideFilter/index.js create mode 100644 src/components/Sticky/index.jsx create mode 100644 src/constants/notifications.js create mode 100644 src/containers/NotificationsContainer/index.jsx create mode 100644 src/containers/NotificationsContainer/styles.scss create mode 100644 src/containers/NotificationsDropdownContainer/index.jsx create mode 100644 src/containers/NotificationsDropdownContainer/styles.scss create mode 100644 src/reducers/notifications.js create mode 100644 src/services/notifications.js create mode 100644 src/styles/_fonts.scss create mode 100644 src/styles/main.module.scss create mode 100644 src/utils/getToken.js create mode 100644 src/utils/notifications.js diff --git a/README.md b/README.md index 3ec4783..57e25b7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This is a [single-spa](https://single-spa.js.org/) microapp which shows the main ## Config There are 2 config file for production and development environment in the `config` folder. -Set environment variable `NODE_ENV=development` to use development config, or `NODE_ENV=production` to use production config. +Set environment variable `APPENV=dev` to use development config, or `APPENV=prod` to use production config. ## NPM Commands diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..82a460b --- /dev/null +++ b/babel.config.js @@ -0,0 +1,59 @@ +let cssLocalIdent; +if (process.env.APPMODE == 'development') { + cssLocalIdent = 'navbar_[path][name]___[local]___[hash:base64:6]'; +} else { + cssLocalIdent = '[hash:base64:6]'; +} + +const config = { + presets: ['@babel/preset-env', '@babel/preset-react'], + plugins: [ + [ + '@babel/plugin-transform-runtime', + { + useESModules: true, + regenerator: false + } + ], + [ + 'module-resolver', + { + extensions: ['.js', '.jsx'], + root: [ + './src' + ] + } + ], + [ + 'inline-react-svg', + { + ignorePattern: '[/\/]assets[/\/]images' + } + ], + [ + 'react-css-modules', + { + filetypes: { + '.scss': { + syntax: 'postcss-scss' + } + }, + generateScopedName: cssLocalIdent + } + ] + ], + env: { + test: { + presets: [ + [ + '@babel/preset-env', + { + targets: 'current node' + } + ] + ] + } + } +} + +module.exports = config; diff --git a/babel.config.json b/babel.config.json deleted file mode 100644 index 6fddeeb..0000000 --- a/babel.config.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "presets": ["@babel/preset-env", "@babel/preset-react"], - "plugins": [ - [ - "@babel/plugin-transform-runtime", - { - "useESModules": true, - "regenerator": false - } - ] - ], - "env": { - "test": { - "presets": [ - [ - "@babel/preset-env", - { - "targets": "current node" - } - ] - ] - } - } -} diff --git a/config/development.js b/config/development.js index 3633ee6..d52b5f4 100644 --- a/config/development.js +++ b/config/development.js @@ -1,10 +1,13 @@ module.exports = { URL: { - ACCOUNTS_APP_CONNECTOR: "https://accounts-auth0.topcoder-dev.com", - AUTH: "https://accounts-auth0.topcoder-dev.com", + ACCOUNTS_APP_CONNECTOR: "https://accounts-auth0.topcoder-dev.com", // "http://localhost:5000" + AUTH: "https://accounts-auth0.topcoder-dev.com", // "http://localhost:5000" + TC_NOTIFICATION_URL: 'https://api.topcoder-dev.com/v5/notifications', + CONNECT_DOMAIN: 'https://connect.topcoder-dev.com', + COMMUNITY_DOMAIN: 'https://www.topcoder-dev.com', }, API: { V3: "https://api.topcoder-dev.com/v3", }, - REAUTH_TIME: 55, + REAUTH_OFFSET: 55, // seconds }; diff --git a/config/index.js b/config/index.js index d89d922..3e76d5b 100644 --- a/config/index.js +++ b/config/index.js @@ -1,7 +1,7 @@ /* global process */ module.exports = (() => { - const env = process.env.NODE_ENV || "development"; + const env = process.env.APPENV || "development"; // for security reason don't let to require any arbitrary file defined in process.env if (["production", "development"].indexOf(env) < 0) { diff --git a/config/production.js b/config/production.js index e89c1a3..8dfdb56 100644 --- a/config/production.js +++ b/config/production.js @@ -2,9 +2,12 @@ module.exports = { URL: { ACCOUNTS_APP_CONNECTOR: "https://accounts-auth0.topcoder.com", AUTH: "https://accounts-auth0.topcoder.com", + TC_NOTIFICATION_URL: 'https://api.topcoder.com/v5/notifications', + CONNECT_DOMAIN: 'https://connect.topcoder.com', + COMMUNITY_DOMAIN: 'https://www.topcoder.com', }, API: { V3: "https://api.topcoder.com/v3", }, - REAUTH_TIME: 55, + REAUTH_OFFSET: 55, // seconds }; diff --git a/jest.config.js b/jest.config.js index 759099c..add373e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,7 +5,7 @@ module.exports = { }, transformIgnorePatterns: ["node_modules/?!(tc-auth-lib)"], moduleNameMapper: { - "\\.css$": "identity-obj-proxy", + "\\.(css|scss)$": "identity-obj-proxy", "\\.svg$": "/__mocks__/fileMock.js", }, setupFilesAfterEnv: [ diff --git a/package-lock.json b/package-lock.json index 5f621f7..930f175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,67 +4,92 @@ "lockfileVersion": 1, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true }, "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", "lodash": "^4.17.19", - "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -77,63 +102,39 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", - "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.11.5" - } - }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" } }, "@babel/helper-define-map": { @@ -148,32 +149,32 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-hoist-variables": { @@ -186,45 +187,47 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.7" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.10" } }, "@babel/helper-plugin-utils": { @@ -233,77 +236,72 @@ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -313,14 +311,14 @@ } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { @@ -335,36 +333,36 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", + "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -372,9 +370,9 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -382,9 +380,9 @@ } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -392,9 +390,9 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -402,9 +400,9 @@ } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -412,9 +410,9 @@ } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -422,20 +420,20 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -443,33 +441,33 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -492,9 +490,9 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -537,9 +535,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -600,56 +598,56 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", + "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -657,52 +655,52 @@ "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", @@ -710,18 +708,18 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -729,171 +727,150 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.12.tgz", + "integrity": "sha512-JDWGuzGNWscYcq8oJVCtSE61a5+XAOos+V0HrxnDieUus4UMnBEosDnY1VJqU5iZ4pA04QY7l0+JvHL1hZEfsw==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.10", + "@babel/helper-module-imports": "^7.12.5", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-syntax-jsx": "^7.12.1", + "@babel/types": "^7.12.12" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", - "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.11.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.12.tgz", + "integrity": "sha512-i1AxnKxHeMxUaWVXQOSIco4tvVvvCxMSfeBMnMM06mpaJt3g+MpxYQQrDfojUQldP1xxraPSJYSMEljoWM/dCg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-transform-react-jsx": "^7.12.12" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -901,127 +878,125 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-runtime": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz", - "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz", + "integrity": "sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.5", "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", "semver": "^5.5.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", + "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", "dev": true, "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/helper-validator-option": "^7.12.11", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -1031,45 +1006,42 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.11", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.5", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", + "@babel/types": "^7.12.11", + "core-js-compat": "^3.8.0", "semver": "^5.5.0" } }, @@ -1087,32 +1059,30 @@ } }, "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.10.tgz", + "integrity": "sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.10", + "@babel/plugin-transform-react-jsx-development": "^7.12.7", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz", + "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", "dev": true, "requires": { "core-js-pure": "^3.0.0", @@ -1120,40 +1090,57 @@ } }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1187,6 +1174,12 @@ "resolve-from": "^5.0.0" }, "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1197,6 +1190,16 @@ "path-exists": "^4.0.0" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -1407,12 +1410,26 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", "dev": true, "optional": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1561,12 +1578,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -1992,12 +2003,26 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", "dev": true, "optional": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2137,12 +2162,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2204,14 +2223,6 @@ "callsites": "^3.0.0", "graceful-fs": "^4.1.15", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@jest/test-result": { @@ -2348,9 +2359,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", "dev": true, "optional": true }, @@ -2529,12 +2540,6 @@ "requires": { "@types/yargs-parser": "*" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -2643,9 +2648,9 @@ } }, "@testing-library/jest-dom": { - "version": "5.11.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.4.tgz", - "integrity": "sha512-6RRn3epuweBODDIv3dAlWjOEHQLpGJHB2i912VS3JQtsD22+ENInhdDNl4ZZQiViLlIfFinkSET/J736ytV9sw==", + "version": "5.11.6", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.6.tgz", + "integrity": "sha512-cVZyUNRWwUKI0++yepYpYX7uhrP398I+tGz4zOlLVlUYnZS+Svuxv4fwLeCIy7TnBYKXUaOlQr3vopxL8ZfEnA==", "dev": true, "requires": { "@babel/runtime": "^7.9.2", @@ -2727,9 +2732,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.10", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", - "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -2749,9 +2754,9 @@ } }, "@types/babel__template": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", - "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -2759,9 +2764,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", - "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -2778,14 +2783,20 @@ } }, "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", "dev": true, "requires": { "@types/node": "*" } }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -2834,9 +2845,9 @@ "dev": true }, "@types/node": { - "version": "14.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==", + "version": "14.14.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz", + "integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw==", "dev": true }, "@types/normalize-package-data": { @@ -2845,6 +2856,12 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", @@ -2858,9 +2875,9 @@ "dev": true }, "@types/react": { - "version": "16.9.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.51.tgz", - "integrity": "sha512-lQa12IyO+DMlnSZ3+AGHRUiUcpK47aakMMoBG8f7HGxJT8Yfe+WE128HIXaHOHVPReAW0oDS3KAI0JI2DDe1PQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.0.tgz", + "integrity": "sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw==", "dev": true, "requires": { "@types/prop-types": "*", @@ -2868,9 +2885,9 @@ } }, "@types/react-dom": { - "version": "16.9.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", - "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.0.tgz", + "integrity": "sha512-lUqY7OlkF/RbNtD5nIq7ot8NquXrdFrjSOR6+w9a9RFQevGi1oZO1dcJbXMeONAPKtZ2UrZOEJ5UOCVsxbLk/g==", "dev": true, "requires": { "@types/react": "*" @@ -2950,9 +2967,9 @@ } }, "@types/testing-library__jest-dom": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.4.tgz", - "integrity": "sha512-6spmpkKOCVCO9XolAR23gfv09Nfd4QByRM3WbnYnPhVfjmOzEKlNrcj6GqFLZKduUvtJIH7Mf5t2TY6rs93zDA==", + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz", + "integrity": "sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==", "dev": true, "requires": { "@types/jest": "*" @@ -2970,26 +2987,18 @@ } }, "@types/uglify-js": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.0.tgz", - "integrity": "sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", + "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==", "dev": true, "requires": { "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@types/webpack": { - "version": "4.41.22", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.22.tgz", - "integrity": "sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ==", + "version": "4.41.25", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz", + "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==", "dev": true, "requires": { "@types/anymatch": "*", @@ -2998,20 +3007,12 @@ "@types/uglify-js": "*", "@types/webpack-sources": "*", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@types/webpack-sources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.0.0.tgz", - "integrity": "sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", "dev": true, "requires": { "@types/node": "*", @@ -3028,18 +3029,18 @@ } }, "@types/yargs": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.8.tgz", - "integrity": "sha512-b0BYzFUzBpOhPjpl1wtAHU994jBeKF4TKVlT7ssFv44T617XNcPdRoG4AzHLVshLzlrF7i3lTelH7UbuNYV58Q==", + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", + "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, "@webassemblyjs/ast": { @@ -3235,6 +3236,12 @@ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -3245,10 +3252,9 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" }, "acorn-globals": { "version": "4.3.4", @@ -3280,26 +3286,61 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, - "airbnb-prop-types": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", - "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "dev": true, "requires": { - "array.prototype.find": "^2.1.1", - "function.prototype.name": "^1.1.2", - "is-regex": "^1.1.0", - "object-is": "^1.1.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2", - "prop-types": "^15.7.2", + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "airbnb-prop-types": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", + "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", + "requires": { + "array.prototype.find": "^2.1.1", + "function.prototype.name": "^1.1.2", + "is-regex": "^1.1.0", + "object-is": "^1.1.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2", + "prop-types": "^15.7.2", "prop-types-exact": "^1.2.0", "react-is": "^16.13.1" } }, "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -3320,6 +3361,11 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -3380,6 +3426,16 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3399,6 +3455,12 @@ "@babel/runtime-corejs3": "^7.10.2" } }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", + "dev": true + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3429,26 +3491,34 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", "is-string": "^1.0.5" }, "dependencies": { "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -3456,6 +3526,7 @@ "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -3491,26 +3562,6 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.4" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "arrify": { @@ -3519,6 +3570,11 @@ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -3587,6 +3643,11 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -3614,6 +3675,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -3632,6 +3699,40 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "attr-accept": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", + "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", + "requires": { + "core-js": "^2.5.0" + } + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + } + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -3639,17 +3740,25 @@ "dev": true }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "axe-core": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", - "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.1.tgz", + "integrity": "sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ==", "dev": true }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -3713,33 +3822,58 @@ } }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, "requires": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } @@ -3753,6 +3887,19 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-inline-react-svg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-inline-react-svg/-/babel-plugin-inline-react-svg-1.1.2.tgz", + "integrity": "sha512-oDR/eraFbMtvg4bDxv4W8bQWTDxLVkKpIYKx0cey/J2QqFyogyQOvEz9SjSYmNK3jI+yZdVMAshTwkKnj6J/Aw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/parser": "^7.0.0", + "lodash.isplainobject": "^4.0.6", + "resolve": "^1.10.0", + "svgo": "^0.7.2" + } + }, "babel-plugin-istanbul": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", @@ -3774,6 +3921,61 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-module-resolver": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz", + "integrity": "sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==", + "dev": true, + "requires": { + "find-babel-config": "^1.1.0", + "glob": "^7.1.2", + "pkg-up": "^2.0.0", + "reselect": "^3.0.1", + "resolve": "^1.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "babel-plugin-react-css-modules": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/babel-plugin-react-css-modules/-/babel-plugin-react-css-modules-3.4.2.tgz", + "integrity": "sha512-pU7owkj5IO6rlleRzaF27ME/eCG7ZhO+EM+WfthfeykYe0eZzK51JD7nlcUr4UU9y4Zlc+QsTH+139L7PSwYtQ==", + "dev": true, + "requires": { + "ajv": "^6.5.0", + "ajv-keywords": "^3.2.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-types": "^6.26.0", + "generic-names": "^1.0.3", + "postcss": "^6.0.22", + "postcss-modules": "^1.1.0", + "postcss-modules-extract-imports": "^1.1.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-parser": "^1.1.1", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, "babel-preset-current-node-syntax": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", @@ -3804,10 +4006,9 @@ } }, "babel-runtime": { - "version": "7.0.0-beta.3", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-7.0.0-beta.3.tgz", - "integrity": "sha512-jlzZ8RACjt0QGxq+wqsw5bCQE9RcUyWpw987mDY3GYxTpOQT2xoyNoG++oVCHzr/nACLBIprfVBNvv/If1ZYcg==", - "dev": true, + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -3816,7 +4017,26 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true } } @@ -3824,8 +4044,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -3882,10 +4101,15 @@ } } }, + "base62": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.8.tgz", + "integrity": "sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==" + }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "batch": { @@ -3916,9 +4140,9 @@ } }, "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, "binary-extensions": { @@ -3965,26 +4189,6 @@ "qs": "6.7.0", "raw-body": "2.4.0", "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } } }, "bonjour": { @@ -4009,11 +4213,26 @@ } } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bourbon": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/bourbon/-/bourbon-4.3.4.tgz", + "integrity": "sha1-TaOAAp6SwMj5dkx3lFGhNLEefMM=" + }, + "bourbon-neat": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/bourbon-neat/-/bourbon-neat-1.7.2.tgz", + "integrity": "sha1-oiixJ0R53iR20yszFTEHylBTzz0=" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4120,21 +4339,13 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } } }, "browserify-sign": { @@ -4154,6 +4365,12 @@ "safe-buffer": "^5.2.0" }, "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -4183,15 +4400,16 @@ } }, "browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", + "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" } }, "bser": { @@ -4264,6 +4482,43 @@ "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "cache-base": { @@ -4283,22 +4538,67 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, "caniuse-lite": { - "version": "1.0.30001146", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001146.tgz", - "integrity": "sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug==", + "version": "1.0.30001170", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz", + "integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==", "dev": true }, "capture-exit": { @@ -4327,6 +4627,11 @@ "supports-color": "^5.3.0" } }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -4340,9 +4645,9 @@ "dev": true }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "optional": true, "requires": { @@ -4353,7 +4658,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" }, "dependencies": { "anymatch": { @@ -4421,9 +4726,9 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "chrome-trace-event": { @@ -4451,6 +4756,42 @@ "safe-buffer": "^5.0.1" } }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -4479,7 +4820,16 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, - "clean-webpack-plugin": { + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", @@ -4513,6 +4863,23 @@ "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "co": { @@ -4521,6 +4888,21 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -4552,6 +4934,18 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4564,8 +4958,7 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "commondir": { "version": "1.0.1", @@ -4573,12 +4966,37 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "commoner": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dev": true, + "requires": { + "arity-n": "^1.0.4" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -4608,29 +5026,13 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -4684,9 +5086,9 @@ } }, "config": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/config/-/config-3.3.2.tgz", - "integrity": "sha512-NlGfBn2565YA44Irn7GV5KHlIGC3KJbf0062/zW5ddP9VXIuRj0m7HVyFAWvMZvaHPEglyGfwmevGz3KosIpCg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/config/-/config-3.3.3.tgz", + "integrity": "sha512-T3RmZQEAji5KYqUQpziWtyGJFli6Khz7h0rpxDwYNjSkr5ynyTWwO7WpfjHzTXclNCDfSWQRcwMb+NwxJesCKw==", "requires": { "json5": "^2.1.1" } @@ -4703,6 +5105,12 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, "consolidated-events": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz", @@ -4767,18 +5175,17 @@ "dev": true }, "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", + "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.15.0", "semver": "7.0.0" }, "dependencies": { @@ -4791,9 +5198,9 @@ } }, "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.1.tgz", + "integrity": "sha512-Se+LaxqXlVXGvmexKGPvnUIYC1jwXu1H6Pkyb3uBM5d8/NELMYCHs/4/roD7721NxrTLyv7e5nXd5/QLBO+10g==", "dev": true }, "core-util-is": { @@ -4802,6 +5209,39 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -4847,6 +5287,15 @@ "sha.js": "^2.4.8" } }, + "create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "create-react-context": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", @@ -4854,22 +5303,12 @@ "requires": { "gud": "^1.0.0", "warning": "^4.0.3" - }, - "dependencies": { - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - } } }, "cross-env": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", - "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "requires": { "cross-spawn": "^7.0.1" @@ -4961,10 +5400,10 @@ "source-map-resolve": "^0.6.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true } } @@ -4990,28 +5429,116 @@ "semver": "^6.3.0" }, "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" } }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -5020,6 +5547,118 @@ "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" }, + "css-modules-loader-core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", + "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", + "dev": true, + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.1", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", + "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, "css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -5032,6 +5671,24 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -5056,17 +5713,36 @@ } }, "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==", "dev": true }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -5100,12 +5776,11 @@ "dev": true }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "2.1.2" + "ms": "2.0.0" } }, "decamelize": { @@ -5130,7 +5805,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -5211,6 +5885,11 @@ } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -5240,6 +5919,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -5278,6 +5963,15 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, "diff-sequences": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", @@ -5351,26 +6045,104 @@ "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==", "dev": true }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "utila": "~0.4" } }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true }, "duplexify": { "version": "3.7.1", @@ -5406,9 +6178,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.578", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.578.tgz", - "integrity": "sha512-z4gU6dA1CbBJsAErW5swTGAaU2TBzc2mPAonJb00zqW1rOraDo2zfBMDRvaz9cVic+0JEZiYbHWPw/fTaZlG2Q==", + "version": "1.3.633", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.633.tgz", + "integrity": "sha512-bsVCsONiVX1abkWdH7KtpuDAhsQ3N3bjPYhROSAXE78roJKet0Y5wznA14JE9pzbwSZmSMAW6KiKYf1RvbTJkA==", "dev": true }, "elliptic": { @@ -5441,9 +6213,9 @@ "dev": true }, "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, "encodeurl": { @@ -5451,6 +6223,24 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -5483,10 +6273,31 @@ } } }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "envify": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.1.tgz", + "integrity": "sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg=", + "requires": { + "jstransform": "^11.0.3", + "through": "~2.3.4" + } + }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "requires": { "prr": "~1.0.1" @@ -5502,16 +6313,15 @@ } }, "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -5530,10 +6340,42 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-html": { @@ -5560,12 +6402,11 @@ "source-map": "~0.6.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true } } }, @@ -5614,6 +6455,27 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -5623,11 +6485,36 @@ "type-fest": "^0.8.1" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -5638,9 +6525,9 @@ "dev": true }, "eslint-config-prettier": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz", - "integrity": "sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -5658,36 +6545,36 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", - "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", "dev": true, "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.11.2", "aria-query": "^4.2.2", "array-includes": "^3.1.1", "ast-types-flow": "^0.0.7", - "axe-core": "^3.5.4", - "axobject-query": "^2.1.2", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.6", "emoji-regex": "^9.0.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", + "jsx-ast-utils": "^3.1.0", "language-tags": "^1.0.5" }, "dependencies": { "emoji-regex": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", - "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", + "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==", "dev": true } } }, "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz", + "integrity": "sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -5733,13 +6620,20 @@ "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "esprima-fb": { + "version": "15001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz", + "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=" }, "esquery": { "version": "1.3.1", @@ -5793,10 +6687,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" }, "events": { "version": "3.2.0", @@ -5865,15 +6758,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -5891,12 +6775,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -6080,25 +6958,22 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true } } }, @@ -6235,6 +7110,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -6253,6 +7134,27 @@ "bser": "2.1.1" } }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "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" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -6278,15 +7180,27 @@ } }, "file-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dev": true, "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "loader-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", @@ -6359,20 +7273,23 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + } + }, + "find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "dev": true, + "requires": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true } } }, @@ -6463,10 +7380,9 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", - "dev": true + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" }, "for-in": { "version": "1.0.2", @@ -6520,6 +7436,15 @@ "readable-stream": "^2.0.0" } }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -6555,25 +7480,27 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz", - "integrity": "sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.3.tgz", + "integrity": "sha512-H51qkbNSp8mtkJt+nyW1gyStBiKZxfRqySNUR99ylq6BPXHKI4SEvIlTKp4odLfjRKJV04DFWMU3G/YRlQOsag==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "functions-have-names": "^1.2.0" + "es-abstract": "^1.18.0-next.1", + "functions-have-names": "^1.2.1" }, "dependencies": { "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -6591,14 +7518,70 @@ "dev": true }, "functions-have-names": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.1.tgz", - "integrity": "sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz", + "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "generic-names": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", + "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", + "dev": true, + "requires": { + "loader-utils": "^0.2.16" + } }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -6607,6 +7590,16 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -6644,15 +7637,13 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -6718,6 +7709,20 @@ "path-exists": "^4.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -6882,6 +7887,20 @@ "array-uniq": "^1.0.1" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -6890,14 +7909,40 @@ } } }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "growly": { - "version": "1.3.0", + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growly": { + "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true, @@ -6932,6 +7977,18 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -6962,6 +8019,23 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6973,6 +8047,12 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -7016,6 +8096,12 @@ "safe-buffer": "^5.2.0" }, "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -7045,6 +8131,33 @@ "minimalistic-assert": "^1.0.1" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "history": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/history/-/history-2.1.2.tgz", + "integrity": "sha1-SqLeiXoOSGfkU5hDvm7Nsphr/ew=", + "requires": { + "deep-equal": "^1.0.0", + "invariant": "^2.0.0", + "query-string": "^3.0.0", + "warning": "^2.0.0" + }, + "dependencies": { + "warning": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz", + "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -7107,9 +8220,9 @@ } }, "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "html-escaper": { @@ -7118,6 +8231,123 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -7134,13 +8364,6 @@ "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } } }, "http-proxy": { @@ -7152,6 +8375,14 @@ "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + } } }, "http-proxy-middleware": { @@ -7202,6 +8433,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, "icss-utils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", @@ -7209,6 +8446,28 @@ "dev": true, "requires": { "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "identity-obj-proxy": { @@ -7221,9 +8480,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "iferr": { @@ -7239,9 +8498,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -7286,22 +8545,20 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "inquirer": { @@ -7476,10 +8733,12 @@ } }, "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } }, "is-arrayish": { "version": "0.2.1", @@ -7517,6 +8776,15 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -7580,6 +8848,12 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -7602,9 +8876,9 @@ } }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-number": { "version": "3.0.0", @@ -7670,8 +8944,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { "version": "1.0.5", @@ -7693,6 +8966,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -7727,6 +9006,15 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -7807,16 +9095,25 @@ "source-map": "^0.6.1" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -8407,12 +9704,26 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", "dev": true, "optional": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8536,12 +9847,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9297,12 +10602,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9768,9 +11067,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", "dev": true, "optional": true }, @@ -10103,12 +11402,26 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", "dev": true, "optional": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -10287,12 +11600,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -10601,12 +11908,6 @@ "requires": { "@types/yargs-parser": "*" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -10864,19 +12165,33 @@ } } }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, "requires": { "argparse": "^1.0.7", - "esprima": "^4.0.0" + "esprima": "^2.6.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } } }, "jsbn": { @@ -10917,6 +12232,14 @@ "whatwg-url": "^7.0.0", "ws": "^7.0.0", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "jsesc": { @@ -10987,14 +12310,41 @@ "verror": "1.10.0" } }, + "jstransform": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz", + "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", + "requires": { + "base62": "^1.1.0", + "commoner": "^0.10.1", + "esprima-fb": "^15001.1.0-dev-harmony-fb", + "object-assign": "^2.0.0", + "source-map": "^0.4.2" + }, + "dependencies": { + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" } }, "killable": { @@ -11015,10 +12365,16 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, "language-subtag-registry": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", - "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", "dev": true }, "language-tags": { @@ -11036,15 +12392,6 @@ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -11080,24 +12427,22 @@ "dev": true }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true } } }, @@ -11116,6 +12461,85 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, + "lodash-es": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.20.tgz", + "integrity": "sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA==" + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._baseeach": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", + "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", + "dev": true, + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.foreach": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-3.0.3.tgz", + "integrity": "sha1-b9fvt5aRrs1n/erCdhyY5wHWw5o=", + "dev": true, + "requires": { + "lodash._arrayeach": "^3.0.0", + "lodash._baseeach": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -11123,9 +12547,9 @@ "dev": true }, "loglevel": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", - "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", "dev": true }, "lolex": { @@ -11145,13 +12569,40 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "make-dir": { @@ -11186,6 +12637,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -11229,6 +12686,148 @@ "readable-stream": "^2.0.1" } }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -11330,7 +12929,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -11340,6 +12938,25 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -11383,11 +13000,15 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, "requires": { "minimist": "^1.2.5" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -11409,10 +13030,9 @@ "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -11450,11 +13070,16 @@ "dev": true }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true }, "nanomatch": { "version": "1.2.13", @@ -11489,7 +13114,12 @@ "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, "nice-try": { @@ -11498,12 +13128,108 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "node-bourbon": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/node-bourbon/-/node-bourbon-4.2.8.tgz", + "integrity": "sha1-5ETx8JQ0q3ZQ6jGMKOLhA9P5Qs0=", + "requires": { + "bourbon": "^4.2.6" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -11555,6 +13281,15 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, + "node-neat": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-neat/-/node-neat-1.7.2.tgz", + "integrity": "sha1-OEcpELgV4mG4sbmbpRmZRGWhXCE=", + "requires": { + "bourbon-neat": "1.7.2", + "node-bourbon": "^4.2.3" + } + }, "node-notifier": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", @@ -11579,11 +13314,132 @@ } }, "node-releases": { - "version": "1.1.61", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", - "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", "dev": true }, + "node-sass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-5.0.0.tgz", + "integrity": "sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^7.1.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -11605,6 +13461,12 @@ "remove-trailing-separator": "^1.0.1" } }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -11614,6 +13476,39 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -11663,17 +13558,17 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" }, "object-is": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", - "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "object-keys": { @@ -11691,36 +13586,38 @@ } }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" }, "dependencies": { "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -11732,19 +13629,20 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.1" }, "dependencies": { "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -11752,6 +13650,7 @@ "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -11772,26 +13671,27 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" }, "dependencies": { "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -11826,7 +13726,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -11899,9 +13798,9 @@ "dev": true }, "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-finally": { @@ -11966,6 +13865,24 @@ "readable-stream": "^2.1.5" } }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -12015,6 +13932,24 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -12042,8 +13977,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -12093,8 +14027,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { "version": "2.2.2", @@ -12177,6 +14110,60 @@ } } }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -12195,13 +14182,19 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, @@ -12212,22 +14205,139 @@ "dev": true }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.4.2", + "chalk": "^2.4.1", "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "supports-color": "^5.4.0" + } + }, + "postcss-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.1.0.tgz", + "integrity": "sha512-vbCkP70F3Q9PIk6d47aBwjqAMI4LfkXCoyxj+7NPNuVIwfTGdzv2KVQes59/RuxMniIgsYQCFSY42P3+ykJfaw==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "postcss-modules": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.5.0.tgz", + "integrity": "sha512-KiAihzcV0TxTTNA5OXreyIXctuHOfR50WIhqBpc8pe0Q5dcs/Uap9EVlifOI9am7zGGdGOJQ6B1MPYKo2UxgOg==", + "dev": true, + "requires": { + "css-modules-loader-core": "^1.1.0", + "generic-names": "^2.0.1", + "lodash.camelcase": "^4.3.0", + "postcss": "^7.0.1", + "string-hash": "^1.1.1" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "generic-names": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", + "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -12240,44 +14350,137 @@ } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", "dev": true, "requires": { - "postcss": "^7.0.5" + "postcss": "^6.0.1" } }, "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "dev": true, "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-parser/-/postcss-modules-parser-1.1.1.tgz", + "integrity": "sha1-lfca15FvDzkge7gcQBM2yNJFc4w=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.0.2", + "lodash.foreach": "^3.0.3", + "postcss": "^5.0.10" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "postcss-scss": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-3.0.4.tgz", + "integrity": "sha512-BAkBZ35aXhCeBRmliHylYqTN1PvNJyh9aBPQHUmk9SdDdbk7n3GExm7cQivDckOgJpB+agyig9TwRAmf6WnvfA==", "dev": true, "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "postcss": "^8.1.6" + }, + "dependencies": { + "postcss": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz", + "integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==", + "dev": true, + "requires": { + "colorette": "^1.2.1", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + } + } } }, "postcss-selector-parser": { @@ -12293,9 +14496,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "prelude-ls": { @@ -12305,9 +14508,9 @@ "dev": true }, "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", "dev": true }, "prettier-linter-helpers": { @@ -12319,6 +14522,16 @@ "fast-diff": "^1.1.2" } }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, "pretty-format": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", @@ -12501,6 +14714,11 @@ } } }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -12519,6 +14737,14 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -12526,13 +14752,13 @@ "dev": true }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "prop-types": { @@ -12637,11 +14863,23 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.3.tgz", + "integrity": "sha1-ri4UtNBQcdTpuetIc8NbDc1C5jg=", + "requires": { + "strict-uri-encode": "^1.0.0" + } }, "querystring": { "version": "0.2.0", @@ -12661,6 +14899,14 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12697,19 +14943,45 @@ } }, "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2" } }, + "react-addons-shallow-compare": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.3.tgz", + "integrity": "sha512-EDJbgKTtGRLhr3wiGDXK/+AEJ59yqGS+tKE6mue0aNXT6ZMR7VJbbzIiT6akotmHg1BLj46ElJSb+NBMp80XBg==", + "requires": { + "object-assign": "^4.1.0" + } + }, + "react-datetime": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/react-datetime/-/react-datetime-2.16.3.tgz", + "integrity": "sha512-amWfb5iGEiyqjLmqCLlPpu2oN415jK8wX1qoTq7qn6EYiU7qQgbNHglww014PT4O/3G5eo/3kbJu/M/IxxTyGw==", + "requires": { + "create-react-class": "^15.5.2", + "object-assign": "^3.0.0", + "prop-types": "^15.5.7", + "react-onclickoutside": "^6.5.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } + }, "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -12717,6 +14989,20 @@ "scheduler": "^0.19.1" } }, + "react-dropzone": { + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-3.13.4.tgz", + "integrity": "sha1-hNomgVxAM5aRxJtFRMLvehaRLMw=", + "requires": { + "attr-accept": "^1.0.3", + "prop-types": "^15.5.7" + } + }, + "react-input-autosize": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-0.6.13.tgz", + "integrity": "sha1-OG/3qdLD3AFsJlvy5Z05cFD2Wvc=" + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -12727,6 +15013,11 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "react-onclickoutside": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.9.0.tgz", + "integrity": "sha512-8ltIY3bC7oGhj2nPAvWOGi+xGFybPNhJM0V1H8hY/whNcXgmDeaeoCMPPd8VatrpTsUWjb/vGzrmu6SrXVty3A==" + }, "react-outside-click-handler": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/react-outside-click-handler/-/react-outside-click-handler-1.3.0.tgz", @@ -12739,22 +15030,30 @@ "prop-types": "^15.7.2" } }, + "react-portal": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.1.tgz", + "integrity": "sha512-fE9kOBagwmTXZ3YGRYb4gcMy+kSA+yLO0xnPankjRlfBv4uCpFXqKPfkpsGQQR15wkZ9EssnvTOl1yMzbkxhPQ==", + "requires": { + "prop-types": "^15.5.8" + } + }, "react-redux": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.1.tgz", - "integrity": "sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.2.tgz", + "integrity": "sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA==", "requires": { - "@babel/runtime": "^7.5.5", - "hoist-non-react-statics": "^3.3.0", + "@babel/runtime": "^7.12.1", + "hoist-non-react-statics": "^3.3.2", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", - "react-is": "^16.9.0" + "react-is": "^16.13.1" } }, "react-responsive": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.1.0.tgz", - "integrity": "sha512-U8Nv2/ZWACIw/fAE9XNPbc2Xo33X5q1bcCASc2SufvJ9ifB+o/rokfogfznSVcvS22hN1rafGi0uZD6GiVFEHw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", + "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", "requires": { "hyphenate-style-name": "^1.0.0", "matchmediaquery": "^0.3.0", @@ -12762,6 +15061,80 @@ "shallow-equal": "^1.1.0" } }, + "react-router": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-2.8.1.tgz", + "integrity": "sha1-c+lJH2zrMW0Pd5gpCBhj43juTtc=", + "requires": { + "history": "^2.1.2", + "hoist-non-react-statics": "^1.2.0", + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "warning": "^3.0.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "react-s-alert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-s-alert/-/react-s-alert-1.4.1.tgz", + "integrity": "sha512-+cSpVPe6YeGklhlo7zbVlB0Z6jdiU9HPmEVzp5nIhNm9lvdL7rVO2Jx09pCwT99GmODyoN0iNhbQku6r7six8A==", + "requires": { + "babel-runtime": "^6.23.0" + } + }, + "react-scroll-lock-component": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-scroll-lock-component/-/react-scroll-lock-component-1.2.0.tgz", + "integrity": "sha512-J4WzvBMczHM8l7mTdyssq3r7cdhnRVyBIOQeuLqobk5hyQBWQg6u3mjQcBo/+97exXCfF3HyUP9r8fpWs/TF0A==", + "requires": { + "prop-types": "^15.6.0" + } + }, + "react-select": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-0.9.1.tgz", + "integrity": "sha1-4yKi0KBjlqSCBrBVPfXsR9Fgg7o=", + "requires": { + "classnames": "^2.2.0", + "react-input-autosize": "^0.6.2" + } + }, + "react-stickynode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-stickynode/-/react-stickynode-1.4.1.tgz", + "integrity": "sha512-V2ep9tgDcK3SLhVzz24OOFxOBMUz55lDM77m6tlstxc0mudQ9vx+RNBl9Tnt1Y96quSyNq0iZnEadviR2hDo9A==", + "requires": { + "classnames": "^2.0.0", + "prop-types": "^15.6.0", + "react-addons-shallow-compare": "^0.14.2 || ^15.0.0", + "subscribe-ui-event": "^1.0.0" + } + }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -12799,9 +15172,9 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "optional": true, "requires": { @@ -12817,6 +15190,49 @@ "util.promisify": "^1.0.0" } }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "recompose": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", + "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", + "requires": { + "@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" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + } + } + }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -12845,15 +15261,20 @@ "deep-diff": "^0.3.5" } }, + "redux-thunk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + }, "reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=" }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { @@ -12889,35 +15310,19 @@ "safe-regex": "^1.1.0" } }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "regexpp": { @@ -12963,12 +15368,31 @@ } } }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "renderkid": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", + "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -12981,6 +15405,15 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -13009,6 +15442,12 @@ "uuid": "^3.3.2" }, "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -13071,12 +15510,19 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=", + "dev": true + }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -13132,6 +15578,72 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "resolve-url-loader": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -13154,6 +15666,55 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dev": true, + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", + "dev": true + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -13161,6 +15722,22 @@ "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "ripemd160": { @@ -13217,27 +15794,119 @@ "ret": "~0.1.10" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "sass-loader": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.0.tgz", + "integrity": "sha512-ZCKAlczLBbFd3aGAhowpYEy69Te3Z68cg8bnHHl6WnSCvnKpbM6pQrz957HWMa8LKVuhnD9uMplmMAHwGQtHeg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true }, "saxes": { "version": "3.1.11", @@ -13258,14 +15927,35 @@ } }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } } }, "select-hose": { @@ -13309,21 +15999,6 @@ "statuses": "~1.5.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -13355,15 +16030,6 @@ "parseurl": "~1.3.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -13376,18 +16042,6 @@ "statuses": ">= 1.4.0 < 2" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -13439,8 +16093,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { "version": "1.1.1", @@ -13535,15 +16188,6 @@ "use": "^3.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -13562,10 +16206,10 @@ "is-extendable": "^0.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { @@ -13680,9 +16324,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -13696,6 +16340,12 @@ "requires": { "websocket-driver": ">=0.5.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, @@ -13706,10 +16356,9 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { "version": "0.6.0", @@ -13729,14 +16378,6 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "source-map-url": { @@ -13778,9 +16419,9 @@ } }, "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "spdy": { @@ -13794,6 +16435,23 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "spdy-transport": { @@ -13810,6 +16468,21 @@ "wbuf": "^1.7.3" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -13865,9 +16538,26 @@ } }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", + "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "standalone-single-spa-webpack-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/standalone-single-spa-webpack-plugin/-/standalone-single-spa-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-I5XgZ34EZJer9QXSfB09gSZ/cGYa6gdSYEiCqys9Rgrw3gEMhJUgQJIA8yUPEUBCoTDZlEQ9GxnqfcR7fdODbA==", "dev": true }, "static-extend": { @@ -13896,6 +16586,15 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -13941,6 +16640,17 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", + "dev": true + }, "string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", @@ -13949,6 +16659,23 @@ "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "string-width": { @@ -13960,64 +16687,41 @@ "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" }, "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "ansi-regex": "^4.1.0" } } } }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string_decoder": { @@ -14030,18 +16734,18 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true } } @@ -14080,15 +16784,27 @@ "dev": true }, "style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "dev": true, "requires": { "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" + "schema-utils": "^3.0.0" }, "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "loader-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", @@ -14101,18 +16817,28 @@ } }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } } } }, + "subscribe-ui-event": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/subscribe-ui-event/-/subscribe-ui-event-1.1.2.tgz", + "integrity": "sha512-K0s0bIYQjVEoheNQJ1wZfRIF11jQ5P8nMdHTYe4ADB87hsHVgJC6bBcL0A/Fb6SS0NC58Hz32ZYKaiADYI12yQ==", + "requires": { + "eventemitter3": "^2.0.0", + "lodash": "^4.17.10", + "raf": "^3.0.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -14149,6 +16875,21 @@ } } }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + } + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -14161,9 +16902,9 @@ "dev": true }, "systemjs-webpack-interop": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/systemjs-webpack-interop/-/systemjs-webpack-interop-2.1.2.tgz", - "integrity": "sha512-ddoBSbZUfMxKoaS/JqCv4EHrildEfHrmwYF8R/Co/NqDxdvT6uYIrdHwBvY4PuYk+p9/BwQEtN5M5Aw2IHZdHQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/systemjs-webpack-interop/-/systemjs-webpack-interop-2.3.4.tgz", + "integrity": "sha512-RubTMdfVZUq5+oB/G3V2wOfQUP8wIDf24siLGphlsUThDEo9h4pZx3bEtpUl5idEcspX6by0lBaCuwFzrB+jiQ==", "dev": true }, "table": { @@ -14184,6 +16925,28 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "tc-auth-lib": { "version": "github:topcoder-platform/tc-auth-lib#ae8be611e6f616df73097b90e403ff783bed9ea9", "from": "github:topcoder-platform/tc-auth-lib#1.0.3", @@ -14191,6 +16954,86 @@ "lodash": "^4.17.19" } }, + "tc-ui": { + "version": "github:appirio-tech/tc-ui#e577a0e704136f1e9ecce92ce4c0626aab932691", + "from": "github:appirio-tech/tc-ui#feature/connectv2", + "requires": { + "classnames": "^2.2.3", + "lodash": "^4.0.0", + "moment": "^2.11.2", + "node-neat": "~1.7.1-beta1", + "react": "^0.14.7", + "react-datetime": "^2.0.2", + "react-dom": "^0.14.7", + "react-dropzone": "^3.3.2", + "react-redux": "^4.2.1", + "react-router": "^2.0.0-rc6", + "react-select": "^0.9.1", + "redux": "^3.3.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "fbjs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.6.1.tgz", + "integrity": "sha1-lja3cF9bqWhNRLcveDISVK/IYPc=", + "requires": { + "core-js": "^1.0.0", + "loose-envify": "^1.0.0", + "promise": "^7.0.3", + "ua-parser-js": "^0.7.9", + "whatwg-fetch": "^0.9.0" + } + }, + "react": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/react/-/react-0.14.10.tgz", + "integrity": "sha512-yxMw5aorZG4qsLVBfjae4wGFvd5708DhcxaXLJ3IOTgr1TCs8k9+ZheGgLGr5OfwWMhSahNbGvvoEDzrxVWouA==", + "requires": { + "envify": "^3.0.0", + "fbjs": "^0.6.1" + } + }, + "react-dom": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.10.tgz", + "integrity": "sha512-kDs8SWFb8Sry4NAplhpJbZEeAnTPir/m+s9s+lkdqA2a89BzmWGnEgGG/CfmhULjv1ogc4oHrjMfAvFNruT3jQ==" + }, + "react-redux": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.10.tgz", + "integrity": "sha512-tjL0Bmpkj75Td0k+lXlF8Fc8a9GuXFv/3ahUOCXExWs/jhsKiQeTffdH0j5byejCGCRL4tvGFYlrwBF1X/Aujg==", + "requires": { + "create-react-class": "^15.5.1", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.0.0", + "lodash": "^4.17.11", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2" + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "whatwg-fetch": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz", + "integrity": "sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA=" + } + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -14210,14 +17053,6 @@ "commander": "^2.20.0", "source-map": "~0.6.1", "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "terser-webpack-plugin": { @@ -14243,11 +17078,16 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } } } }, @@ -14261,6 +17101,22 @@ "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", "require-main-filename": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "text-table": { @@ -14278,8 +17134,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", @@ -14298,9 +17153,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -14406,6 +17261,37 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -14439,6 +17325,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -14484,6 +17376,17 @@ "is-typedarray": "^1.0.0" } }, + "ua-parser-js": { + "version": "0.7.23", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.23.tgz", + "integrity": "sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA==" + }, + "uglify-js": { + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.3.tgz", + "integrity": "sha512-feZzR+kIcSVuLi3s/0x0b2Tx4Iokwqt+8PJM7yRHKuldg4MLdam4TCFeICv+lgDtuYiCtdmrtIP+uN9LWvDasw==", + "optional": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -14604,6 +17507,33 @@ "semver": "^5.5.0", "util.promisify": "^1.0.0", "warning": "^3.0.0" + }, + "dependencies": { + "babel-runtime": { + "version": "7.0.0-beta.3", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-7.0.0-beta.3.tgz", + "integrity": "sha512-jlzZ8RACjt0QGxq+wqsw5bCQE9RcUyWpw987mDY3GYxTpOQT2xoyNoG++oVCHzr/nACLBIprfVBNvv/If1ZYcg==", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + } } }, "upath": { @@ -14668,14 +17598,6 @@ "dev": true, "requires": { "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } } }, "util-deprecate": { @@ -14694,29 +17616,14 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -14729,9 +17636,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "v8-to-istanbul": { @@ -14821,30 +17728,29 @@ } }, "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "requires": { "loose-envify": "^1.0.0" } }, "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" + "watchpack-chokidar2": "^2.0.1" } }, "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "dev": true, "optional": true, "requires": { @@ -14985,6 +17891,18 @@ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -14994,6 +17912,37 @@ "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } } } }, @@ -15018,6 +17967,12 @@ "ws": "^6.0.0" }, "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -15054,6 +18009,18 @@ "yargs": "^13.3.2" }, "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -15064,6 +18031,26 @@ "resolve-cwd": "^2.0.0" } }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -15100,32 +18087,70 @@ } }, "webpack-config-single-spa": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/webpack-config-single-spa/-/webpack-config-single-spa-1.12.0.tgz", - "integrity": "sha512-BO1nI7LqmHQ/oDYR11AEmFssHjFijt2O1UQO0c4QVr/w9fuVDvPo0Qei7WrfexxrudReQbURk5v/UEGAP306aA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/webpack-config-single-spa/-/webpack-config-single-spa-1.18.0.tgz", + "integrity": "sha512-ATH4qQ3EzGqfUE1z8F2d82z7hkKJs+MNCxTrhWq0yYP1d+cvTaX9D41lQdMPL4oXpVLoNh8yuWX6h570auKnWw==", "dev": true, "requires": { "babel-loader": "^8.1.0", "clean-webpack-plugin": "^3.0.0", "css-loader": "^3.5.3", + "html-webpack-plugin": "^4.5.0", + "standalone-single-spa-webpack-plugin": "^1.0.1", "style-loader": "^1.2.1", + "systemjs-webpack-interop": "^2.3.1", "unused-files-webpack-plugin": "^3.4.0", "webpack-bundle-analyzer": "^3.6.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + } + } } }, "webpack-config-single-spa-react": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/webpack-config-single-spa-react/-/webpack-config-single-spa-react-1.12.0.tgz", - "integrity": "sha512-xQtKTWYIXB8821aBk3r0yT7tjIVTbLRbPfmwQrZ/kFsS1crUX66z21k5QjRAaLMmUHBX9hSkXLjJ+7A/ebNCug==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/webpack-config-single-spa-react/-/webpack-config-single-spa-react-1.18.0.tgz", + "integrity": "sha512-tBFCWFN1cZlBFP1J1Z9ibscn4xFKfSeG+Y1NqlnRwQFXmSZ30oayzBtyAm9qql60Ug5kG3SkoCLYkgE5KJZHpg==", "dev": true, "requires": { - "webpack-config-single-spa": "^1.12.0" + "webpack-config-single-spa": "^1.18.0" } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "dev": true, "requires": { "memory-fs": "^0.4.1", @@ -15136,9 +18161,9 @@ }, "dependencies": { "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", "dev": true } } @@ -15184,12 +18209,6 @@ "yargs": "^13.3.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -15216,6 +18235,15 @@ "upath": "^1.1.1" } }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -15256,6 +18284,12 @@ "binary-extensions": "^1.0.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -15297,21 +18331,23 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -15359,14 +18395,6 @@ "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "websocket-driver": { @@ -15393,6 +18421,11 @@ "iconv-lite": "0.4.24" } }, + "whatwg-fetch": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz", + "integrity": "sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A==" + }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", @@ -15410,6 +18443,12 @@ "webidl-conversions": "^4.0.2" } }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -15425,12 +18464,53 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -15449,13 +18529,29 @@ "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "1.0.3", @@ -15478,9 +18574,9 @@ } }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", "dev": true }, "xml-name-validator": { @@ -15502,15 +18598,21 @@ "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index 5eac2ff..10028df 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "@topcoder/micro-frontends-navbar-app", "scripts": { "start": "node server.js", - "dev": "webpack-dev-server", - "dev-https": "webpack-dev-server --https", - "build": "webpack --mode=${APPMODE:-development} --env.config=${APPENV:-dev}", + "dev": "cross-env APPMODE=development webpack-dev-server", + "dev-https": "cross-env APPMODE=development webpack-dev-server --https", + "build": "webpack --mode=${APPMODE:-production} --env.config=${APPENV:-dev}", "analyze": "webpack --mode=production --env.analyze=true", "lint": "eslint src --ext js", "format": "prettier --write \"./**\"", @@ -22,22 +22,33 @@ "@testing-library/react": "^9.4.0", "@types/jest": "^25.2.1", "@types/systemjs": "^6.1.0", + "autoprefixer": "^7.2.6", "babel-eslint": "^11.0.0-beta.2", "babel-jest": "^24.9.0", + "babel-plugin-inline-react-svg": "^1.1.2", + "babel-plugin-module-resolver": "^3.2.0", + "babel-plugin-react-css-modules": "^3.4.2", "concurrently": "^5.0.1", "cross-env": "^7.0.2", + "css-loader": "^3.6.0", "eslint": "^6.7.2", "eslint-config-prettier": "^6.7.0", "eslint-config-react-important-stuff": "^2.0.0", "eslint-plugin-prettier": "^3.1.1", - "file-loader": "^6.1.1", + "file-loader": "^6.2.0", "identity-obj-proxy": "^3.0.0", "jest": "^25.2.7", "jest-cli": "^25.2.7", + "node-sass": "^5.0.0", + "postcss-loader": "^4.1.0", + "postcss-scss": "^3.0.4", "prettier": "^2.0.4", "pretty-quick": "^2.0.1", "redux-logger": "^3.0.6", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.1.0", "single-spa-react": "^2.14.0", + "style-loader": "^2.0.0", "systemjs-webpack-interop": "^2.1.2", "webpack": "^4.41.2", "webpack-cli": "^3.3.10", @@ -47,17 +58,28 @@ }, "dependencies": { "@reach/router": "^1.3.4", - "tc-auth-lib": "topcoder-platform/tc-auth-lib#1.0.3", + "axios": "^0.21.1", "browser-cookies": "^1.2.0", "classnames": "^2.2.6", "config": "^3.3.2", "express": "^4.17.1", + "handlebars": "^4.7.6", "lodash": "^4.17.20", + "moment": "^2.29.1", "react": "^16.13.1", "react-dom": "^16.13.1", "react-outside-click-handler": "^1.3.0", + "react-portal": "^4.2.1", "react-redux": "^7.2.1", "react-responsive": "^8.1.0", - "redux": "^4.0.5" + "react-s-alert": "^1.4.1", + "react-scroll-lock-component": "^1.2.0", + "react-stickynode": "^1.4.1", + "react-transition-group": "^2.9.0", + "recompose": "^0.30.0", + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", + "tc-auth-lib": "topcoder-platform/tc-auth-lib#1.0.3", + "tc-ui": "appirio-tech/tc-ui#feature/connectv2" } } diff --git a/server.js b/server.js index a5a32f8..30eb854 100644 --- a/server.js +++ b/server.js @@ -21,5 +21,5 @@ app.get('/', function (req, res) { }) const PORT = process.env.PORT || 3001; -app.listen(PORT); +app.listen(PORT, '0.0.0.0'); console.log(`App is hosted on port ${PORT}.`); // eslint-disable-line no-console diff --git a/src/App.jsx b/src/App.jsx index 58aa4dc..10afc84 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -8,6 +8,8 @@ import NavBar from "./components/NavBar"; import { Router } from "@reach/router"; import { useSelector } from "react-redux"; import useMatchSomeRoute from "./hooks/useMatchSomeRoute"; +import NotificationsModal from './components/NotificationsModal' +import "./styles/main.module.scss"; const App = () => { // all menu options @@ -24,6 +26,11 @@ const App = () => { const toggleSidebar = useCallback(() => { setSidebarCollapsed(!sidebarCollapsed); }, [sidebarCollapsed, setSidebarCollapsed]); + const isNotificationsEmpty = useSelector((state) => + state.notifications.isLoading || + state.notifications.isCommunityLoading || + !state.notifications.initialized && !state.notifications.communityInitialized + ); // set/remove class for the whole page, to know if sidebar is present or no useEffect(() => { @@ -52,6 +59,12 @@ const App = () => { )} + + + ); }; diff --git a/src/actions/notifications.js b/src/actions/notifications.js new file mode 100644 index 0000000..0e0787a --- /dev/null +++ b/src/actions/notifications.js @@ -0,0 +1,278 @@ +/** + * Notification related actions + */ +import { + GET_NOTIFICATIONS_PENDING, + GET_NOTIFICATIONS_SUCCESS, + GET_NOTIFICATIONS_FAILURE, + GET_COMMUNITY_NOTIFICATIONS_PENDING, + GET_COMMUNITY_NOTIFICATIONS_SUCCESS, + GET_COMMUNITY_NOTIFICATIONS_FAILURE, + TOGGLE_NOTIFICATION_SEEN, + SET_NOTIFICATIONS_FILTER_BY, + MARK_ALL_NOTIFICATIONS_READ, + MARK_ALL_NOTIFICATIONS_SEEN, + MARK_NOTIFICATIONS_READ, + TOGGLE_NOTIFICATION_READ, + VIEW_OLDER_NOTIFICATIONS_SUCCESS, + HIDE_OLDER_NOTIFICATIONS_SUCCESS, + NOTIFICATIONS_PENDING, + SET_NOTIFICATION_PLATFORM, + RESET_NOTIFICATIONS, + RESET_COMMUNITY_NOTIFICATIONS, +} from "../constants/notifications"; +import notificationsService from "../services/notifications"; +import { + filterNotificationsByCriteria, + filterReadNotifications, +} from "../utils/notifications"; +import Alert from "react-s-alert"; +import _ from "lodash"; + +const handleDispatchNotificationReadByType = ( + type, + dispatch, + payload, + isRead +) => { + dispatch({ + type, + payload, + isRead, + }); +}; + +const handleDispatchNotificationSeenByType = ( + type, + dispatch, + payload, + isSeen +) => { + dispatch({ + type, + payload, + isSeen, + }); +}; + +const handleDispatchNotificationRead = handleDispatchNotificationReadByType.bind( + this, + TOGGLE_NOTIFICATION_READ +); +const handleDispatchMarkAllNotificationsRead = handleDispatchNotificationReadByType.bind( + this, + MARK_ALL_NOTIFICATIONS_READ +); +const handleDispatchMarkNotificationsRead = handleDispatchNotificationReadByType.bind( + this, + MARK_NOTIFICATIONS_READ +); +const handleDispatchMarkAllNotificationsSeen = handleDispatchNotificationSeenByType.bind( + this, + MARK_ALL_NOTIFICATIONS_SEEN +); + +export const getNotifications = () => (dispatch) => { + dispatch({ type: GET_NOTIFICATIONS_PENDING }); + notificationsService + .getNotifications() + .then((notifications) => { + dispatch({ + type: GET_NOTIFICATIONS_SUCCESS, + payload: notifications, + }); + }) + .catch((err) => { + dispatch({ + type: GET_NOTIFICATIONS_FAILURE, + payload: err, + }); + console.error(`Failed to load notifications. ${err.message}`); + }); +}; + +export const getCommunityNotifications = () => (dispatch) => { + dispatch({ type: GET_COMMUNITY_NOTIFICATIONS_PENDING }); + notificationsService + .getCommunityNotifications() + .then((notifications) => { + dispatch({ + type: GET_COMMUNITY_NOTIFICATIONS_SUCCESS, + payload: notifications, + }); + }) + .catch((err) => { + dispatch({ + type: GET_COMMUNITY_NOTIFICATIONS_FAILURE, + payload: err, + }); + console.error(`Failed to load notifications. ${err.message}`); + }); +}; + +export const setNotificationsFilterBy = (filterBy) => (dispatch) => + dispatch({ + type: SET_NOTIFICATIONS_FILTER_BY, + payload: filterBy, + }); + +export const markAllNotificationsSeen = (sourceId, notifications = []) => ( + dispatch +) => { + let ids = null; + const sourceNfs = _.filter(notifications, (n) => !n.seen); + if (sourceNfs.length === 0) { + return; + } + ids = _.map(sourceNfs, (n) => n.id).join("-"); + + dispatch({ + type: NOTIFICATIONS_PENDING, + }); + + handleDispatchMarkAllNotificationsSeen(dispatch, sourceId, true); + notificationsService.markNotificationsSeen(ids).catch((err) => { + Alert.error(`Failed to mark notification seen. ${err.message}`); + handleDispatchMarkAllNotificationsSeen(dispatch, sourceId, false); + }); +}; + +export const markAllNotificationsRead = (sourceId, notifications = []) => ( + dispatch +) => { + let ids = null; + if (sourceId) { + const sourceNfs = _.filter( + notifications, + (n) => n.sourceId === sourceId && !n.isRead + ); + if (sourceNfs.length === 0) { + return; + } + ids = _.map(sourceNfs, (n) => n.id).join("-"); + } + + dispatch({ + type: NOTIFICATIONS_PENDING, + }); + handleDispatchMarkAllNotificationsRead(dispatch, sourceId, true); + notificationsService.markNotificationsRead(ids).catch((err) => { + Alert.error(`Failed to mark notifications read. ${err.message}`); + handleDispatchMarkAllNotificationsRead(dispatch, sourceId, false); + }); +}; + +export const toggleNotificationRead = (notificationId) => (dispatch) => { + handleDispatchNotificationRead(dispatch, notificationId, true); + notificationsService.markNotificationsRead(notificationId).catch((err) => { + Alert.error(`Failed to mark notification read. ${err.message}`); + handleDispatchNotificationRead(dispatch, notificationId, false); + }); +}; + +export const toggleBundledNotificationRead = ( + bundledNotificationId, + bundledIds +) => (dispatch) => { + dispatch({ + type: NOTIFICATIONS_PENDING, + }); + handleDispatchNotificationRead(dispatch, bundledNotificationId, true); + notificationsService + .markNotificationsRead(bundledIds.join("-")) + .catch((err) => { + Alert.error(`Failed to mark notification read. ${err.message}`); + handleDispatchNotificationRead(dispatch, bundledNotificationId, false); + }); +}; + +export const toggleNotificationSeen = (notificationId) => (dispatch) => { + dispatch({ + type: NOTIFICATIONS_PENDING, + }); + + notificationsService + .markNotificationsSeen(notificationId) + .then(() => { + dispatch({ + type: TOGGLE_NOTIFICATION_SEEN, + payload: notificationId, + }); + }) + .catch(() => { + // ignored + // any network error will still be logged by the browser/client + }); +}; + +export const viewOlderNotifications = (sourceId) => (dispatch) => + dispatch({ + type: VIEW_OLDER_NOTIFICATIONS_SUCCESS, + payload: sourceId, + }); + +export const hideOlderNotifications = () => (dispatch) => + dispatch({ + type: HIDE_OLDER_NOTIFICATIONS_SUCCESS, + }); + +export const markNotificationsReadByCriteria = (criteria) => ( + dispatch, + getState +) => { + const notifications = getState().notifications.notifications; + const notificationsToRead = filterReadNotifications( + filterNotificationsByCriteria(notifications, criteria) + ); + + if (notificationsToRead.length > 0) { + const notificationIds = _.map(notificationsToRead, "id"); + markNotificationsRead(notificationIds)(dispatch, getState); + } +}; + +export const markNotificationsRead = (notificationIds) => (dispatch) => { + dispatch({ + type: NOTIFICATIONS_PENDING, + }); + handleDispatchMarkNotificationsRead(dispatch, notificationIds, true); + notificationsService + .markNotificationsRead(notificationIds.join("-")) + .catch((err) => { + Alert.error(`Failed to mark notification read. ${err.message}`); + handleDispatchMarkNotificationsRead(dispatch, notificationIds, false); + }); +}; + +export const setNotificationPlatform = (platform) => (dispatch) => { + dispatch({ + type: SET_NOTIFICATION_PLATFORM, + payload: platform, + }); +}; + +export const resetNotifications = () => (dispatch) => { + dispatch({ type: RESET_NOTIFICATIONS }); +}; + +export const resetCommunityNotifications = () => (dispatch) => { + dispatch({ type: RESET_COMMUNITY_NOTIFICATIONS }); +}; + +export default { + getNotifications, + getCommunityNotifications, + setNotificationsFilterBy, + markAllNotificationsSeen, + markAllNotificationsRead, + toggleNotificationRead, + toggleBundledNotificationRead, + toggleNotificationSeen, + viewOlderNotifications, + hideOlderNotifications, + markNotificationsReadByCriteria, + markNotificationsRead, + setNotificationPlatform, + resetNotifications, + resetCommunityNotifications, +}; diff --git a/src/assets/fonts/roboto/apache-license.txt b/src/assets/fonts/roboto/apache-license.txt new file mode 100644 index 0000000..aa4927d --- /dev/null +++ b/src/assets/fonts/roboto/apache-license.txt @@ -0,0 +1,203 @@ +Font data copyright Google 2012 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/assets/fonts/roboto/roboto-black.svg b/src/assets/fonts/roboto/roboto-black.svg new file mode 100644 index 0000000..ec0d8ad --- /dev/null +++ b/src/assets/fonts/roboto/roboto-black.svg @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-blackitalic.svg b/src/assets/fonts/roboto/roboto-blackitalic.svg new file mode 100644 index 0000000..b8cd237 --- /dev/null +++ b/src/assets/fonts/roboto/roboto-blackitalic.svg @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-bold.svg b/src/assets/fonts/roboto/roboto-bold.svg new file mode 100644 index 0000000..9edb4a2 --- /dev/null +++ b/src/assets/fonts/roboto/roboto-bold.svg @@ -0,0 +1,593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-bolditalic.svg b/src/assets/fonts/roboto/roboto-bolditalic.svg new file mode 100644 index 0000000..b33b83b --- /dev/null +++ b/src/assets/fonts/roboto/roboto-bolditalic.svg @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-italic.svg b/src/assets/fonts/roboto/roboto-italic.svg new file mode 100644 index 0000000..dbe1859 --- /dev/null +++ b/src/assets/fonts/roboto/roboto-italic.svg @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-light.svg b/src/assets/fonts/roboto/roboto-light.svg new file mode 100644 index 0000000..3c68fda --- /dev/null +++ b/src/assets/fonts/roboto/roboto-light.svg @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-lightitalic.svg b/src/assets/fonts/roboto/roboto-lightitalic.svg new file mode 100644 index 0000000..822229e --- /dev/null +++ b/src/assets/fonts/roboto/roboto-lightitalic.svg @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-medium.svg b/src/assets/fonts/roboto/roboto-medium.svg new file mode 100644 index 0000000..c7c8cff --- /dev/null +++ b/src/assets/fonts/roboto/roboto-medium.svg @@ -0,0 +1,593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-mediumitalic.svg b/src/assets/fonts/roboto/roboto-mediumitalic.svg new file mode 100644 index 0000000..21223bc --- /dev/null +++ b/src/assets/fonts/roboto/roboto-mediumitalic.svg @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-regular.svg b/src/assets/fonts/roboto/roboto-regular.svg new file mode 100644 index 0000000..63af636 --- /dev/null +++ b/src/assets/fonts/roboto/roboto-regular.svg @@ -0,0 +1,621 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-thin.svg b/src/assets/fonts/roboto/roboto-thin.svg new file mode 100644 index 0000000..78ba6b8 --- /dev/null +++ b/src/assets/fonts/roboto/roboto-thin.svg @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/roboto/roboto-thinitalic.svg b/src/assets/fonts/roboto/roboto-thinitalic.svg new file mode 100644 index 0000000..4d1cf5f --- /dev/null +++ b/src/assets/fonts/roboto/roboto-thinitalic.svg @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/bell.svg b/src/assets/icons/bell.svg new file mode 100644 index 0000000..ac4535b --- /dev/null +++ b/src/assets/icons/bell.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/check.svg b/src/assets/icons/check.svg new file mode 100644 index 0000000..e1bc5b6 --- /dev/null +++ b/src/assets/icons/check.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/notification-member-added.svg b/src/assets/icons/notification-member-added.svg new file mode 100644 index 0000000..072df84 --- /dev/null +++ b/src/assets/icons/notification-member-added.svg @@ -0,0 +1,13 @@ + + + + Created with Sketch. + + + + + + + + + diff --git a/src/assets/icons/notification-new-posts.svg b/src/assets/icons/notification-new-posts.svg new file mode 100644 index 0000000..4f131bf --- /dev/null +++ b/src/assets/icons/notification-new-posts.svg @@ -0,0 +1,13 @@ + + + + Created with Sketch. + + + + + + + + + diff --git a/src/assets/icons/notification-new-project.svg b/src/assets/icons/notification-new-project.svg new file mode 100644 index 0000000..e671b4f --- /dev/null +++ b/src/assets/icons/notification-new-project.svg @@ -0,0 +1,11 @@ + + + + Created with Sketch. + + + + + + + diff --git a/src/assets/icons/notification-review-pending.svg b/src/assets/icons/notification-review-pending.svg new file mode 100644 index 0000000..8ff8ec5 --- /dev/null +++ b/src/assets/icons/notification-review-pending.svg @@ -0,0 +1,13 @@ + + + + Created with Sketch. + + + + + + + + + diff --git a/src/assets/icons/notification-updates.svg b/src/assets/icons/notification-updates.svg new file mode 100644 index 0000000..9d4f794 --- /dev/null +++ b/src/assets/icons/notification-updates.svg @@ -0,0 +1,12 @@ + + + + Created with Sketch. + + + + + + + + diff --git a/src/assets/icons/notification-warning.svg b/src/assets/icons/notification-warning.svg new file mode 100644 index 0000000..10c5dc0 --- /dev/null +++ b/src/assets/icons/notification-warning.svg @@ -0,0 +1,13 @@ + + + + Created with Sketch. + + + + + + + + + diff --git a/src/assets/icons/ui-16px-1_settings-gear-64.svg b/src/assets/icons/ui-16px-1_settings-gear-64.svg new file mode 100644 index 0000000..39c1fd4 --- /dev/null +++ b/src/assets/icons/ui-16px-1_settings-gear-64.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/src/assets/icons/ui-bell.svg b/src/assets/icons/ui-bell.svg new file mode 100644 index 0000000..50b7fe2 --- /dev/null +++ b/src/assets/icons/ui-bell.svg @@ -0,0 +1,11 @@ + + + + Created with Sketch. + + + + + + + diff --git a/src/assets/icons/x-mark-white.svg b/src/assets/icons/x-mark-white.svg new file mode 100644 index 0000000..c081d79 --- /dev/null +++ b/src/assets/icons/x-mark-white.svg @@ -0,0 +1,13 @@ + + + + X + Created with Sketch. + + + + + + + + diff --git a/src/assets/icons/x-mark.svg b/src/assets/icons/x-mark.svg new file mode 100644 index 0000000..074937a --- /dev/null +++ b/src/assets/icons/x-mark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/Dropdown/Dropdown.jsx b/src/components/Dropdown/Dropdown.jsx new file mode 100644 index 0000000..2d2b7cc --- /dev/null +++ b/src/components/Dropdown/Dropdown.jsx @@ -0,0 +1,186 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classNames from 'classnames' +import enhanceDropdown from './enhanceDropdown' +import './Dropdown.scss' + +class Dropdown extends React.Component { + constructor(props) { + super(props) + } + + render() { + const props = this.props + const { children, className, pointerShadow, noPointer, pointerLeft, isOpen, handleClick, theme, noAutoclose, handleKeyboardNavigation } = props + const ddClasses = classNames('dropdown-wrap', { + [`${className}`] : true, + [`${ theme }`] : true + }) + const ndClasses = classNames('Dropdown', { + 'pointer-shadow' : pointerShadow, + 'pointer-hide' : noPointer, + 'pointer-left' : pointerLeft, + 'no-autoclose' : noAutoclose, + hide : !isOpen + }) + + let childSelectionIndex = -1 + const focusOnNextChild = () => { + const listChild = this.listRef.getElementsByTagName('li') + if (listChild.length === 0) { + return + } + childSelectionIndex += 1 + if (childSelectionIndex >= listChild.length) { + childSelectionIndex -= 1 + } else { + listChild[childSelectionIndex].focus() + } + } + const focusOnPreviousChild = () => { + const listChild = this.listRef.getElementsByTagName('li') + if (listChild.length === 0) { + return + } + childSelectionIndex -= 1 + if (childSelectionIndex < 0) { + childSelectionIndex = 0 + } else { + listChild[childSelectionIndex].focus() + } + } + let searchKey = '' + let timer + const focusOnCharacter = (value) => { + searchKey += value + if (timer) { + clearTimeout(timer) + } + timer = setTimeout(() => { searchKey = '' }, 500) + const listChild = this.listRef.getElementsByTagName('li') + if (listChild.length === 0) { + return + } + const length = listChild.length + for (let i = 0; i < length; i++) { + let textContent = listChild[i].textContent + if (textContent && textContent.length > 0) { + textContent = textContent.toLowerCase() + const search = searchKey.toLowerCase() + if (textContent.startsWith(search)) { + childSelectionIndex = i + listChild[i].focus() + return true + } + } + } + return false + } + const onFocus = () => { + this.containerRef.classList.add('focused') + } + const onBlur = () => { + this.containerRef.classList.remove('focused') + } + const onKeydown = (e) => { + if (!handleKeyboardNavigation) { + return + } + const keyCode = e.keyCode + if (keyCode === 32 || keyCode === 38 || keyCode === 40) { // space or Up/Down + // open dropdown menu + if (!noAutoclose && !isOpen) { + e.preventDefault() + handleClick(event) + } else { + if (keyCode === 40) { + focusOnNextChild() + } else if (keyCode === 38) { + focusOnPreviousChild() + } + e.preventDefault() + } + } else if (isOpen) { + const value = String.fromCharCode(e.keyCode) + if (focusOnCharacter(value)) { + e.preventDefault() + } + } + } + const onChildKeydown = (e) => { + if (!handleKeyboardNavigation) { + return + } + const keyCode = e.keyCode + if (keyCode === 38 || keyCode === 40 || keyCode === 13) { // Up/Down or enter + if (keyCode === 40) { + focusOnNextChild() + } else if (keyCode === 38) { + focusOnPreviousChild() + } else if (keyCode === 13) { // enter + const listChild = this.listRef.getElementsByTagName('li') + if (listChild.length === 0) { + return + } + listChild[childSelectionIndex].click() + this.handleKeyboardRef.focus() + } + e.preventDefault() + } else { + const value = String.fromCharCode(e.keyCode) + if (focusOnCharacter(value)) { + e.preventDefault() + } + } + } + + const setListRef = (c) => this.listRef = c + const setContainerRef = (c) => this.containerRef = c + const setHandleKeyboardRef = (c) => this.handleKeyboardRef = c + + const childrenWithProps = React.Children.map(children, child => + React.cloneElement(child, {onKeyDown: onChildKeydown}) + ) + return ( +
{ } : handleClick}> + {handleKeyboardNavigation && ()} + { + childrenWithProps.map((child, index) => { + if (child.props.className.indexOf('dropdown-menu-header') > -1) + return noAutoclose ? React.cloneElement(child, { + onClick: handleClick, + key: child.props.key || index + }) : child + }) + } +
+ { + childrenWithProps.map((child) => { + if (child.props.className.indexOf('dropdown-menu-list') > -1) + return child + }) + } +
+
+ ) + + } +} + +Dropdown.propTypes = { + children: PropTypes.array.isRequired, + /* + If true, prevents dropdown closing when clicked inside dropdown + */ + noAutoclose: PropTypes.bool, + /* + If true, prevents handle keyboard event + */ + handleKeyboardNavigation: PropTypes.bool +} + +Dropdown.defaultProps = { + handleKeyboardNavigation: false +} + +export default enhanceDropdown(Dropdown) diff --git a/src/components/Dropdown/Dropdown.scss b/src/components/Dropdown/Dropdown.scss new file mode 100644 index 0000000..aed28b0 --- /dev/null +++ b/src/components/Dropdown/Dropdown.scss @@ -0,0 +1,188 @@ +@import '~tc-ui/src/styles/tc-includes'; + + +:global { + .dropdown-wrap { + cursor: pointer; + position: relative; + } + + .Dropdown { + background-color: #fff; + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.17); + border-radius: 5px; + display: inline-block; + position: absolute; + left: 0; + top: 5px; + width: 100%; + z-index: 2; + + ul { + height: 100%; + width: 100%; + position: relative; + z-index: 10; + background-color: #fff; + padding: 11px 20px; + border-radius: 5px; + + li { + list-style: none; + } + + li a { + color: #394146; + font-family: "Roboto", Arial, Helvetica, sans-serif; + font-size: 12px; + display: block; + line-height: 26px; + } + } + } + + .dropdown-wrap.default { + border: 1px solid $tc-gray-20; + display: flex; + align-items: center; + padding: calc(2 * #{$base_unit}); + position: relative; + + .Dropdown { + ul.dropdown-menu-list { + padding: 10px 0px; + li { + padding: 0 20px; + @include ellipsis; + } + + li:focus, + li:hover { + background-color: $tc-gray-neutral-dark; + outline: none; + } + } + } + } + + .dropdown-wrap.default::after { + content: " "; + width: 10px; + height: 10px; + display: block; + right: 10px; + top: 50%; + position: absolute; + transform: translateY(-50%) rotate(45deg); + border-bottom: 2px solid $tc-gray-20; + border-right: 2px solid $tc-gray-20; + } + + .dropdown-wrap { + &.focused { + box-shadow: 0 0 2px 0 rgba(6, 129, 255, 0.7); + border: 1px solid $tc-dark-blue-100!important; + } + .handle-keyboard { + position: absolute; + width: 100%; + max-height: 40px; + top: 0; + left: 0; + height: 100%; + + &:focus { + outline: none; + } + } + } + + .Dropdown.hide { + display: none; + } + + .Dropdown.pointer-left:before { + right: initial; + left: 15px; + } + + .UserDropdownMenu .Dropdown.pointer-shadow { + margin-top: 35px; + + &:before { + content: ''; + display: block; + position: absolute; + top: -6px; + right: 24px; + width: 12px; + height: 12px; + background: #FFFFFF; + border-right: 1px solid $tc-gray-20;; + border-bottom: 1px solid $tc-gray-20;; + transform: rotate(-135deg); + z-index:999; + } + } + + .Dropdown.pointer-hide:before { + display: none; + } + + .Dropdown.no-autoclose { + cursor: default; + } + + .new-theme { + text-align: left; + height: 30px; + color: $tc-black; + background: $tc-gray-neutral-light; + border: 1px solid $tc-gray-20; + @include roboto; + font-size: 13px; + line-height: 20px; + width: 100%; + border-radius: 2px; + position: relative; + + .dropdown-menu-header { + width: 100%; + border: 0; + height: 28px; + line-height: 28px; + margin: 0; + padding: 0 0 0 10px; + color: $tc-gray-50; + font-size: 13px; + } + &:after{ + display: block; + content: ''; + position: absolute; + width: 10px; + height: 14px; + right: 11px; + top: 50%; + margin-top: -7px; + background: url("./icon-select.png") left top no-repeat; + background-size: 10px 14px; + z-index:2; + } + .Dropdown { + ul.dropdown-menu-list { + padding: 10px 0px; + li { + padding: 0 20px; + @include ellipsis; + } + li:focus, + li:hover { + background-color: $tc-gray-neutral-dark; + outline: none; + } + } + } + } +} + diff --git a/src/components/Dropdown/DropdownItem.jsx b/src/components/Dropdown/DropdownItem.jsx new file mode 100644 index 0000000..e345181 --- /dev/null +++ b/src/components/Dropdown/DropdownItem.jsx @@ -0,0 +1,35 @@ +import React from 'react' +import PropTypes from 'prop-types' +import cn from 'classnames' + +const DropdownItem = ({item, onItemClick, currentSelection}) => { + const _onClick = () => onItemClick(item.val) + const activeClass = cn({ + active: item.val === currentSelection + }) + return ( +
  • + { item.label } +
  • + ) +} + +DropdownItem.propTypes = { + // item must have at least these 2 properties + item: PropTypes.shape({ + // label that is displayed in the dropdown + label: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.number, + PropTypes.element + ]).isRequired, + // value to be provided when item is clicked + val: PropTypes.any.isRequired + }).isRequired, + // function to be invoked when an item is clicked + onItemClick: PropTypes.func.isRequired, + // current selection used to set active class + currentSelection: PropTypes.any +} + +export default DropdownItem diff --git a/src/components/Dropdown/enhanceDropdown.js b/src/components/Dropdown/enhanceDropdown.js new file mode 100644 index 0000000..927be4f --- /dev/null +++ b/src/components/Dropdown/enhanceDropdown.js @@ -0,0 +1,118 @@ +import React, { Component } from "react"; + +const enhanceDropdown = (CompositeComponent) => + class extends Component { + constructor(props) { + super(props); + this.state = { isOpen: false }; + this.handleClick = this.handleClick.bind(this); + this.onClickOutside = this.onClickOutside.bind(this); + this.onClickOtherDropdown = this.onClickOtherDropdown.bind(this); + this.refreshEventHandlers = this.refreshEventHandlers.bind(this); + } + + refreshEventHandlers() { + if (this.state.isOpen) { + document.addEventListener("click", this.onClickOutside); + document.addEventListener("touchstart", this.onClickOutside); + document.addEventListener("dropdownClicked", this.onClickOtherDropdown); + } else { + document.removeEventListener("click", this.onClickOutside); + document.removeEventListener("touchstart", this.onClickOutside); + document.removeEventListener( + "dropdownClicked", + this.onClickOtherDropdown + ); + } + } + + handleClick() { + const dropdownClicked = document.createEvent("Event"); + dropdownClicked.initEvent("dropdownClicked", true, false); + + document.dispatchEvent(dropdownClicked); + + this.setState({ isOpen: !this.state.isOpen }, () => { + this.refreshEventHandlers(); + }); + } + + onClickOutside(evt) { + let currNode = evt.target; + let isDropdown = false; + + do { + if ( + currNode.className && + currNode.className.indexOf && + currNode.className.indexOf("dropdown-wrap") > -1 + ) { + isDropdown = true; + break; + } + + currNode = currNode.parentNode; + + if (!currNode) break; + } while (currNode.tagName); + + if (!isDropdown) { + this.setState({ isOpen: false }, () => { + this.refreshEventHandlers(); + }); + } + } + + onClickOtherDropdown() { + this.setState({ isOpen: false }, () => { + this.refreshEventHandlers(); + }); + } + + componentDidMount() { + document.removeEventListener("click", this.onClickOutside); + document.removeEventListener("touchstart", this.onClickOutside); + document.removeEventListener( + "dropdownClicked", + this.onClickOtherDropdown + ); + + if (this.state.isOpen) { + document.addEventListener("click", this.onClickOutside); + document.addEventListener("touchstart", this.onClickOutside); + document.addEventListener("dropdownClicked", this.onClickOtherDropdown); + } + } + + componentWillUnmount() { + document.removeEventListener("click", this.onClickOutside); + document.removeEventListener("touchstart", this.onClickOutside); + document.removeEventListener( + "dropdownClicked", + this.onClickOtherDropdown + ); + } + + stopEventPropagation(e) { + e.stopPropagation(); + } + + render() { + const { isOpen } = this.state; + return ( +
    + +
    + ); + } + }; + +export default enhanceDropdown; diff --git a/src/components/LoadingIndicator/index.jsx b/src/components/LoadingIndicator/index.jsx new file mode 100644 index 0000000..e0a5956 --- /dev/null +++ b/src/components/LoadingIndicator/index.jsx @@ -0,0 +1,23 @@ +import React from 'react' +import PropTypes from 'prop-types' +import cn from 'classnames' + +import './styles.scss' + +const LoadingIndicator = ({ isSmall }) => { + return ( +
    + ) +} + +LoadingIndicator.defaulProps = { + isSmall: false +} + +LoadingIndicator.propTypes = { + isSmall: PropTypes.bool +} + +export default LoadingIndicator diff --git a/src/components/LoadingIndicator/styles.scss b/src/components/LoadingIndicator/styles.scss new file mode 100644 index 0000000..61a6a4b --- /dev/null +++ b/src/components/LoadingIndicator/styles.scss @@ -0,0 +1,19 @@ +:global { + .loading-indicator { + height: 80%; + width: 100%; + min-height: 70px; + min-width: 70px; + background: 50% 50% no-repeat; + background-size: 70px 70px; + background-image: url('../../assets/icons/loader.gif'); + + &.small { + height: 32px; + width: 32px; + min-height: 0; + min-width: 0; + background-size: 32px 32px; + } + } +} diff --git a/src/components/LoadingSpinner/index.jsx b/src/components/LoadingSpinner/index.jsx new file mode 100644 index 0000000..be27ccc --- /dev/null +++ b/src/components/LoadingSpinner/index.jsx @@ -0,0 +1,14 @@ +import { branch, renderComponent } from 'recompose' +import LoadingIndicator from '../LoadingIndicator' +const identity = t => t + +// `hasLoaded()` is a function that returns whether or not the the component +// has all the props it needs +const spinnerWhileLoading = hasLoaded => + branch( + hasLoaded, + identity, + renderComponent(LoadingIndicator) + ) + +export default spinnerWhileLoading diff --git a/src/components/NavBar/index.jsx b/src/components/NavBar/index.jsx index a2276ef..973d061 100644 --- a/src/components/NavBar/index.jsx +++ b/src/components/NavBar/index.jsx @@ -66,6 +66,7 @@ const NavBar = () => { Topcoder Logo ) : ()} + {process.env.NODE_ENV === 'test' &&

    Navbar App Test

    }
    diff --git a/src/components/NavBar/styles.css b/src/components/NavBar/styles.css index f290986..caae3f9 100644 --- a/src/components/NavBar/styles.css +++ b/src/components/NavBar/styles.css @@ -6,6 +6,8 @@ justify-content: space-between; padding: 0 24px; padding-right: 16px; + position: relative; + z-index: 1; } .navbar-left { display: flex; @@ -44,7 +46,7 @@ .navbar-right .navbar-divider { margin: 0 15px; } -.navbar-login { +.navbar-right .navbar-login { color: #fff; font-size: 14px; font-weight: bold; diff --git a/src/components/Notifications/MobilePage/index.jsx b/src/components/Notifications/MobilePage/index.jsx new file mode 100644 index 0000000..4b6bf99 --- /dev/null +++ b/src/components/Notifications/MobilePage/index.jsx @@ -0,0 +1,87 @@ +/** + * Displays page in mobile resolution on top of the current page without changing URL address (kind of fullscreen popup) + * While displaying the content it cuts the main content + * so browser scrollbar works for the content of this mobile page + */ +import React from 'react' +import PropTypes from 'prop-types' +import _ from 'lodash' +import { Portal } from 'react-portal'; + +import './styles.scss' + +// unique id of the page +let uid = 0 +const openedPages = [] + +class MobilePage extends React.Component { + constructor(props) { + super(props) + + // to remember page scroll position + this.scrollTop + this.topToolbarPaddingRight + + // assign a unique id to each of the components + uid += 1 + this.uid = uid + } + + componentWillMount() { + // if browser window has scrollbar, we add class to body to keep scrollbar + // no matter what content is, to avoid content jumping + const hasVScroll = document.body.scrollHeight > window.innerHeight + if (hasVScroll) { + document.body.classList.add('persist-scrollbar') + } + + // save scroll position + this.scrollTop = document.body.scrollTop || document.documentElement.scrollTop + document.body.classList.add('hidden-content') + + // add to the list of opened components + openedPages.push(this.uid) + } + + componentDidMount() { + // scroll to the top when open + document.body.scrollTop = document.documentElement.scrollTop = 0 + } + + componentWillUnmount() { + // remove from list of opened components + _.remove(openedPages, (uid) => uid === this.uid) + + // only if there are no opened components left, we clear body classes + if (openedPages.length === 0) { + document.body.classList.remove('hidden-content') + document.body.classList.remove('persist-scrollbar') + } + + // restore scroll position + document.body.scrollTop = document.documentElement.scrollTop = this.scrollTop + } + + render() { + const { children } = this.props + + return ( + +
    + {children} +
    +
    + ) + } +} + +MobilePage.defaultProps = { + keepToolbar: false, +} + +MobilePage.propTypes = { + title: PropTypes.string, + children: PropTypes.any, +} + +export default MobilePage diff --git a/src/components/Notifications/MobilePage/styles.scss b/src/components/Notifications/MobilePage/styles.scss new file mode 100644 index 0000000..b4ab1af --- /dev/null +++ b/src/components/Notifications/MobilePage/styles.scss @@ -0,0 +1,39 @@ +@import '~tc-ui/src/styles/tc-includes'; + +// :global { +// body.hidden-content #wrapper-main { +// height: 1px; +// min-height: 0; +// overflow: hidden; +// } + +// body.persist-scrollbar { +// overflow: hidden; +// overflow-y: scroll; +// } +// } + +.container { + bottom: 0; + height: 100vh; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 2000; + + // &.keep-toolbar { + // padding-top: 60px; + // z-index: 19; + + // @media screen and (max-width: $screen-md - 1px) { + // padding-top: 0; + // z-index: 21; + // } + // } + + // :global(.mobile-page-gateway) &:last-child { + // height: auto; + // overflow: initial; + // } +} diff --git a/src/components/Notifications/NotificationItem/index.jsx b/src/components/Notifications/NotificationItem/index.jsx new file mode 100644 index 0000000..879508d --- /dev/null +++ b/src/components/Notifications/NotificationItem/index.jsx @@ -0,0 +1,123 @@ +/** + * Notification Item + * + * Has a tick to toggle read status + */ +import React from 'react' +import PropTypes from 'prop-types' +import _ from 'lodash' +import cn from 'classnames' +import { NOTIFICATION_TYPE } from '../../../constants/notifications' +import moment from 'moment' +import './styles.scss' +import Check from '../../../assets/icons/check.svg' +import IconNotificationMememberAdded from '../../../assets/icons/notification-member-added.svg' +import IconNotificationNewPosts from '../../../assets/icons/notification-new-posts.svg' +import IconNotificationNewProject from '../../../assets/icons/notification-new-project.svg' +import IconNotificationReviewPending from '../../../assets/icons/notification-review-pending.svg' +import IconNotificationUpdates from '../../../assets/icons/notification-updates.svg' +import IconNotificationWarning from '../../../assets/icons/notification-warning.svg' + +/** + * @parmas {string} type notification type + * @parmas {string} class name + */ +const NotificationIcons = ({ type, className }) => { + switch(type){ + case 'member-added': + return + case 'new-posts': + return + case 'new-project': + return + case 'review-pending': + return + case 'updates': + return + case 'warning': + return + default: + return + } +} + +NotificationIcons.propTypes = { + type: PropTypes.string.isRequired, + className: PropTypes.string.isRequired +} + +/** + * Format date + * + * TODO + * Currently this method doesn't take into account user timezone + * When there is real data comes from the server and we know source date timezone + * we have to update this method, probably using moment-timezone package + * + * @param {String} date date to format + * + * @return {String} formated date + */ +const formatDate = (date) => { + const today = moment() + const mDate = moment(date) + let format + + if (mDate.isSame(today, 'd')) { + format = mDate.fromNow() + } else if (mDate.isSame(today, 'y')) { + format = mDate.format('MMM DD') + } else { + format = mDate.format('MMM DD, YYYY') + } + + return format +} + +const NotificationItem = (props) => { + const { id, onLinkClick } = props + const notificationItem = ( +
    +
    + +
    +
    +

    +

    {formatDate(props.date)}

    +
    +
    + +
    +
    + ) + + return ( + props.goto + ? onLinkClick(id)}>{notificationItem} + : notificationItem + ) +} + +const notificationType = PropTypes.oneOf(_.values(NOTIFICATION_TYPE)) + +NotificationItem.propTypes = { + type: notificationType.isRequired, + text: PropTypes.string.isRequired, + goTo: PropTypes.string, + date: PropTypes.string.isRequired, + id: PropTypes.string.isRequired, + transitionState: PropTypes.string.isRequired, + seen: PropTypes.bool, + onReadToggleClick: PropTypes.func.isRequired, + onLinkClick: PropTypes.func.isRequired, +} + +export default NotificationItem diff --git a/src/components/Notifications/NotificationItem/styles.scss b/src/components/Notifications/NotificationItem/styles.scss new file mode 100644 index 0000000..a3f29ed --- /dev/null +++ b/src/components/Notifications/NotificationItem/styles.scss @@ -0,0 +1,133 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .notification-item-link { + display: block; + border-top: 1px solid $tc-gray-10; + overflow: hidden; + + @media screen and (max-width: $screen-md - 1px) { + border-top: 0; + } + + &:first-child { + border: none; + } + + &.unseen { + .notification-item { + box-shadow: inset 2px 0 0 0 $tc-light-blue; + &:hover{ + box-shadow: none; + } + } + } + + &.exiting { + opacity: 0; + transform: scaleY(0); + margin: -35px 0; + overflow: hidden; + transition: 500ms all ease-in; + } + } + + .notification-item { + display: flex; + background-color: $tc-white; + justify-content: space-between; + transition: 150ms all; + overflow: hidden; + + &:hover { + background-color: $tc-dark-blue-10; + } + + &.exiting { + opacity: 0; + transform: scaleY(0); + margin: -35px 0; + overflow: hidden; + transition: 500ms all ease-in; + } + + .icon { + align-items: center; + // border-left: 2px solid $tc-dark-blue-70; + display: flex; + flex: 0 0 44px; + justify-content: center; + } + + .body { + flex: 1; + padding: 15px 0; + + .content { + @include roboto; + color: $tc-black; + font-size: 13px; + line-height: 20px; + + @media screen and (max-width: $screen-md - 1px) { + font-size: 15px; + line-height: 22px; + } + + > strong { + color: $tc-black; + font-weight: bold; + } + } + + > .date { + @include roboto; + color: $tc-gray-50; + font-size: 11px; + line-height: 20px; + + @media screen and (max-width: $screen-md - 1px) { + font-size: 13px; + } + } + } + + .mark-read { + align-items: center; + display: flex; + flex: 0 0 40px; + justify-content: flex-end; + transition: all 150ms; + + &:hover { + background-color: $tc-dark-blue-30; + + svg { + fill: $tc-dark-blue; + } + } + + button { + background: none; + border: 0; + display: block; + height: 42px; + margin: 0; + padding: 0; + width: 42px; + + svg { + height: auto; + fill: $tc-gray-20; + width: 16px; + } + } + } + + .notification-item + .notification-item, + .notification-item-link + .notification-item { + border-top: 1px solid $tc-gray-10; + } + } +} diff --git a/src/components/Notifications/NotificationsBell/index.jsx b/src/components/Notifications/NotificationsBell/index.jsx new file mode 100644 index 0000000..11b1eb2 --- /dev/null +++ b/src/components/Notifications/NotificationsBell/index.jsx @@ -0,0 +1,30 @@ +/** + * Notifications bell icon + */ +import React from 'react' +import PropTypes from 'prop-types' +import cn from 'classnames' +import Bell from '../../../assets/icons/ui-bell.svg' +import { useSelector } from "react-redux"; +import { filterReadNotifications } from '../../../utils/notifications'; +import './styles.scss' + +const NotificationsBell = ({ onClick, hasUnread }) => { + const unread = useSelector((state) => { + return filterReadNotifications(state.notifications.notifications).length + + filterReadNotifications(state.notifications.communityNotifications).length; + }); + + return ( +
    + +
    + ) +} + +NotificationsBell.propTypes = { + hasUnread: PropTypes.bool, + onClick: PropTypes.func +} + +export default NotificationsBell diff --git a/src/components/Notifications/NotificationsBell/styles.scss b/src/components/Notifications/NotificationsBell/styles.scss new file mode 100644 index 0000000..de45930 --- /dev/null +++ b/src/components/Notifications/NotificationsBell/styles.scss @@ -0,0 +1,40 @@ +@import '~tc-ui/src/styles/tc-includes'; + +.container { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + height: 32px; + /* prevent notifications text selection when clicking the bell fast */ + user-select: none; + position: relative; + width: 32px; + + svg path { + fill: $tc-white; + } +} + +.container.has-unread { + &::after { + background-color: $tc-red-110; + border-radius: 50%; + content: attr(data-count); + display: block; + height: 12px; + position: absolute; + right: -2px; + top: 2px; + width: 12px; + color: $tc-white; + font-size: 8px; + line-height: 12px; + text-align: center; + overflow: hidden; + + @media screen and (max-width: $screen-md - 1px) { + right: 2px; + } + } +} diff --git a/src/components/Notifications/NotificationsDropdown/index.jsx b/src/components/Notifications/NotificationsDropdown/index.jsx new file mode 100644 index 0000000..e30c65a --- /dev/null +++ b/src/components/Notifications/NotificationsDropdown/index.jsx @@ -0,0 +1,97 @@ +/** + * Notifications dropdown + * + * A bell icon which toggles a dropdown with notifications + */ +import React from 'react' +import PropTypes from 'prop-types' +import Dropdown from '../../Dropdown/Dropdown' +import NotificationsBell from '../NotificationsBell' + +class EnhancedDropdown extends Dropdown { + constructor(props) { + super(props) + this.onClickOutside = this.onClickOutside.bind(this) + } + + onClickOutside(evt) { + let currNode = evt.target + let isDropdown = false + + do { + if (currNode.className + && currNode.className.indexOf + && currNode.className.indexOf('dropdown-wrap') > -1) { + isDropdown = true + break + } + + currNode = currNode.parentNode + + if (!currNode) + break + } while (currNode.tagName) + + if (!isDropdown) { + this.setState({ isOpen: false }, () => { + this.props.onToggle(false) + this.refreshEventHandlers() + }) + } + } +} + +class NotificationsDropdown extends React.Component { + + constructor(props) { + super(props) + this.state = { + isOpen: false + } + + this.toggle = this.toggle.bind(this) + } + + toggle(isOpen) { + if (typeof isOpen === 'object') { + if (this.props.onToggle) { + this.props.onToggle(!this.state.isOpen) + } + this.setState({ isOpen: !this.state.isOpen}) + } else { + if (this.props.onToggle) { + this.props.onToggle(isOpen) + } + this.setState({ isOpen }) + } + } + + render() { + const { hasUnread, children } = this.props + return ( +
    + +
    + +
    +
    +
    + {children} +
    +
    +
    +
    + ) + } +} + +NotificationsDropdown.propTypes = { + hasUnread: PropTypes.bool, + onToggle: PropTypes.func, + children: PropTypes.node +} + +export default NotificationsDropdown diff --git a/src/components/Notifications/NotificationsDropdownHeader/index.jsx b/src/components/Notifications/NotificationsDropdownHeader/index.jsx new file mode 100644 index 0000000..e822fb8 --- /dev/null +++ b/src/components/Notifications/NotificationsDropdownHeader/index.jsx @@ -0,0 +1,24 @@ +/** + * Header for NotificatonsDropdown component + * + * Shows title and "Mark all as read" button + */ +import React from 'react' +import PropTypes from 'prop-types' +import './styles.scss' + +const NotificationsDropdownHeader = (props) => ( +
    +

    Notifications

    +
    + +
    +
    +) + +NotificationsDropdownHeader.propTypes = { + onMarkAllClick: PropTypes.func.isRequired, + hasUnread: PropTypes.bool +} + +export default NotificationsDropdownHeader diff --git a/src/components/Notifications/NotificationsDropdownHeader/styles.scss b/src/components/Notifications/NotificationsDropdownHeader/styles.scss new file mode 100644 index 0000000..5811676 --- /dev/null +++ b/src/components/Notifications/NotificationsDropdownHeader/styles.scss @@ -0,0 +1,49 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .notifications-dropdown-header { + align-items: center; + background: $tc-gray-neutral-light; + border-bottom: 1px solid $tc-gray-20; + display: flex; + justify-content: space-between; + padding: 0 15px; + + .header { + @include roboto-medium; + color: $tc-gray-70; + font-size: 12px; + line-height: 39px; + letter-spacing: 0; + text-transform: uppercase; + } + + .right-content { + display: flex; + color: $tc-gray-50; + + .dot { + line-height: 39px; + position: relative; + &:after { + content: '\a0\b7\a0'; + display: inline-block; + } + } + + .mark-all, .settings { + @include roboto; + background: none; + border: 0; + height: 39px; + line-height: 39px; + display: block; + font-size: 12px; + letter-spacing: 0; + padding: 0; + align-self: flex-end + } + } + } +} diff --git a/src/components/Notifications/NotificationsEmpty/index.jsx b/src/components/Notifications/NotificationsEmpty/index.jsx new file mode 100644 index 0000000..993d7e5 --- /dev/null +++ b/src/components/Notifications/NotificationsEmpty/index.jsx @@ -0,0 +1,26 @@ +/** + * Message to show when there is no notifications + */ +import React from 'react' +import PropTypes from 'prop-types' +import './styles.scss' +import Bell from '../../../assets/icons/bell.svg' + + + +const NotificationsEmpty = ({children, message = 'Good job! You�re all caught up'}) => ( +
    +
    + +
    +

    {message}

    + {children &&
    {children}
    } +
    +) + +NotificationsEmpty.propTypes = { + message: PropTypes.string, + children: PropTypes.node +} + +export default NotificationsEmpty diff --git a/src/components/Notifications/NotificationsEmpty/styles.scss b/src/components/Notifications/NotificationsEmpty/styles.scss new file mode 100644 index 0000000..95f2bfe --- /dev/null +++ b/src/components/Notifications/NotificationsEmpty/styles.scss @@ -0,0 +1,65 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .notifications-empty { + background-color: $tc-white; + border-radius: 4px; + padding: 70px 0 110px; + text-align: center; + + @media screen and (max-width: $screen-md - 1px) { + display: flex; + flex-direction: column; + height: 100%; + justify-content: center; + padding: 0; + } + + > .icon { + line-height: 0; + + > svg { + height: 32px; + width: 32px; + + > g > g { + fill: $tc-gray-60; + } + } + } + + > .additional-content { + line-height: normal; + } + + > .message { + @include roboto; + color: $tc-gray-70; + font-size: 20px; + line-height: 30px; + margin-top: 14px; + } + + > .notification-settings { + margin-top: 30px; + } + + .notifications-empty-note { + @include roboto; + color: $tc-gray-50; + font-size: 13px; + line-height: 20px; + margin: 10 * $base-unit auto 6 * $base-unit; + max-width: 440px; + + > a { + color: $tc-dark-blue-70; + + &:hover { + color: $tc-dark-blue; + } + } + } + } +} diff --git a/src/components/Notifications/NotificationsMobilePage/index.jsx b/src/components/Notifications/NotificationsMobilePage/index.jsx new file mode 100644 index 0000000..b01d4ef --- /dev/null +++ b/src/components/Notifications/NotificationsMobilePage/index.jsx @@ -0,0 +1,37 @@ +/** + * Fullscreen popup which shows notifications in mobile resolution + */ +import React from 'react' +import PropTypes from 'prop-types' +import MobilePage from '../MobilePage' +import NotificationsBell from '../NotificationsBell' +import XMartIcon from '../../../assets/icons/x-mark-white.svg' +import './styles.scss' + +const NotificationsDropdown = ({ onToggle, children, hasUnread, isOpen }) => ( +
    + + {isOpen && ( + +
    +
    Notifications
    +
    +
    +
    + {children} +
    +
    + )} +
    +) + +NotificationsDropdown.propTypes = { + hasUnread: PropTypes.bool, + onToggle: PropTypes.func.isRequired, + children: PropTypes.node +} + +export default NotificationsDropdown diff --git a/src/components/Notifications/NotificationsMobilePage/styles.scss b/src/components/Notifications/NotificationsMobilePage/styles.scss new file mode 100644 index 0000000..c68062c --- /dev/null +++ b/src/components/Notifications/NotificationsMobilePage/styles.scss @@ -0,0 +1,80 @@ +@import '~tc-ui/src/styles/tc-includes'; + +.container { + align-items: center; + display: flex; + padding-right: 14px; + + :global(.notifications-empty-note) { + max-width: 270px; + } +} + +.header { + align-items: center; + background-color: $tc-black; + display: flex; + justify-content: space-between; + height: 60px; + padding: 0 16px; + + &::before { + content: ''; + } +} + +.logo { + display: block; + height: 20px; + overflow: hidden; + + svg { + margin-left: -4px; + margin-top: -1px; + width: 60px; + + path { + fill: $tc-gray-10; + + &:last-child { + display: none; + } + } + } +} + +.title { + @include roboto; + color: $tc-gray-10; + font-size: 15px; + text-transform: uppercase; +} + +.btn { + align-items: center; + display: flex; + justify-content: center; + height: 32px; + width: 32px; +} + +.settings-icon { + fill: $tc-white; +} + +.body { + background-color: $tc-white; + height: calc(100vh - 50px); /* window height - header height */ +} + +.read-all { + @include roboto; + background-color: $tc-gray-neutral-light; + border-top: 1px solid $tc-gray-10; + color: $tc-gray-50; + display: block; + font-size: 12px; + line-height: 40px; + letter-spacing: 0; + text-align: center; +} diff --git a/src/components/Notifications/NotificationsReadAll/index.jsx b/src/components/Notifications/NotificationsReadAll/index.jsx new file mode 100644 index 0000000..a64fe3d --- /dev/null +++ b/src/components/Notifications/NotificationsReadAll/index.jsx @@ -0,0 +1,20 @@ +/** + * Notifications "read all" footer button + * + * FIXME reimplement this component using general Button component from `topcoder-react-utils` + * after update to the latest version of `topcoder-react-utils` + */ +import React from 'react' +import { Link } from '@reach/router' + +import './styles.scss' + +const NotificationsReadAll = ({ children, to, onClick }) => ( + to ? ( + {children} + ) : ( + + ) +) + +export default NotificationsReadAll diff --git a/src/components/Notifications/NotificationsReadAll/styles.scss b/src/components/Notifications/NotificationsReadAll/styles.scss new file mode 100644 index 0000000..b276843 --- /dev/null +++ b/src/components/Notifications/NotificationsReadAll/styles.scss @@ -0,0 +1,20 @@ +@import '~tc-ui/src/styles/tc-includes'; + +.read-all { + @include roboto; + background-color: $tc-gray-neutral-light; + border: 0; + border-top: 1px solid $tc-gray-10; + color: $tc-gray-50; + cursor: pointer; + display: block; + font-size: 12px; + line-height: 40px; + letter-spacing: 0; + text-align: center; + width: 100%; + + @media screen and (max-width: $screen-md - 1px) { + font-size: 13px; + } +} diff --git a/src/components/Notifications/NotificationsSection/index.jsx b/src/components/Notifications/NotificationsSection/index.jsx new file mode 100644 index 0000000..6b3623c --- /dev/null +++ b/src/components/Notifications/NotificationsSection/index.jsx @@ -0,0 +1,66 @@ +/** + * Section of notifications from one source + * + * Displays source title, "mark all" button and list of notifications + */ +import React from 'react' +import PropTypes from 'prop-types' +import { TransitionGroup, Transition } from 'react-transition-group' +import NotificationItem from '../NotificationItem' +import NotificationsSectionTitle from '../NotificationsSectionTitle' +import LoadingIndicator from '../../LoadingIndicator' +import cn from 'classnames' +import './styles.scss' + +const NotificationsSection = (props) => { + return ( +
    + {!(props.isSimple && props.isGlobal) && + + } + + {props.transitionState !== 'exiting' && props.notifications.map(notification => ( + + { state => ( + + )} + + ))} + + {props.onViewOlderClick && props.total > props.notifications.length && ( + props.isLoading || props.isCommunityLoading ? ( +
    + ) : ( + + ) + ) + } +
    + ) +} + +NotificationsSection.propTypes = { + isSimple: PropTypes.bool, + isGlobal: PropTypes.bool, + title: PropTypes.string.isRequired, + transitionState: PropTypes.string, + onMarkAllClick: PropTypes.func, + onLinkClick: PropTypes.func.isRequired, + onReadToggleClick: PropTypes.func.isRequired, + onViewOlderClick: PropTypes.func, + total: PropTypes.number, + notifications: PropTypes.array.isRequired, + isLoading: PropTypes.bool, + isCommunityLoading: PropTypes.bool, +} + +export default NotificationsSection diff --git a/src/components/Notifications/NotificationsSection/styles.scss b/src/components/Notifications/NotificationsSection/styles.scss new file mode 100644 index 0000000..e03b361 --- /dev/null +++ b/src/components/Notifications/NotificationsSection/styles.scss @@ -0,0 +1,47 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .notifications-section { + border: 1px solid $tc-gray-20; + overflow: hidden; + + @media screen and (max-width: $screen-md - 1px) { + border: 0; + } + + .view-older { + @include roboto; + align-items: center; + background: $tc-gray-neutral-light; + border: 0; + color: $tc-gray-50; + border-radius: 0; + border-top: 1px solid $tc-gray-10; + display: flex; + font-size: 13px; + height: 40px; + justify-content: center; + line-height: 40px; + text-align: center; + width: 100%; + } + + .notification-list { + overflow: hidden; + } + } + + .notifications-section + .notifications-section { + margin-top: 20px; + } + + .notifications-section.is-simple+.notifications-section.is-simple { + margin-top: 0; + } + + // Hide border in dropdown menu + .Dropdown .notifications-section { + border: none; + } +} diff --git a/src/components/Notifications/NotificationsSectionTitle/index.jsx b/src/components/Notifications/NotificationsSectionTitle/index.jsx new file mode 100644 index 0000000..5dbcb13 --- /dev/null +++ b/src/components/Notifications/NotificationsSectionTitle/index.jsx @@ -0,0 +1,32 @@ +/** + * Title for sections of notifications + * + * Can be two types depend on isGlobal flag + */ +import React from 'react' +import PropTypes from 'prop-types' +import './styles.scss' + +const NotificationsSectionTitle = (props) => { + return ( +
    + {props.isGlobal ? +

    {props.title}

    : +

    {props.title}

    + } + {props.onMarkAllClick && +
    + +
    + } +
    + ) +} + +NotificationsSectionTitle.propTypes = { + isGlobal: PropTypes.bool, + title: PropTypes.string.isRequired, + onMarkAllClick: PropTypes.func +} + +export default NotificationsSectionTitle diff --git a/src/components/Notifications/NotificationsSectionTitle/styles.scss b/src/components/Notifications/NotificationsSectionTitle/styles.scss new file mode 100644 index 0000000..fc83f45 --- /dev/null +++ b/src/components/Notifications/NotificationsSectionTitle/styles.scss @@ -0,0 +1,81 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .exiting { + .notifications-section-title { + opacity: 0; + margin: -15px 0; + transform: scaleY(0); + transition: 500ms all ease-in; + } + } + + .notifications-section-title { + align-items: center; + background-color: $tc-gray-20; + // border-bottom: 1px solid $tc-gray-20; + display: flex; + justify-content: space-between; + margin: 0; + overflow: hidden; + + @media screen and (max-width: $screen-md - 1px) { + background-color: $tc-gray-10; + } + + .title { + @include roboto-bold; + color: $tc-gray-80; + font-size: 13px; + line-height: 20px; + padding: 5px 0; + margin-left: 15px; + + @media screen and (max-width: $screen-md - 1px) { + font-size: 15px; + line-height: 30px; + } + } + + .controls { + .mark-all { + @include roboto; + background: none; + border: 0; + color: $tc-gray-50; + display: block; + font-size: 11px; + line-height: 30px; + white-space: nowrap; + } + } + + &.global { + align-items: flex-end; + background-color: transparent; + margin: 31px 0 10px; + padding: 0; + + &:first-child { + margin-top: 0; + } + + .title { + color: $tc-black; + font-size: 20px; + font-weight: 400; + line-height: 30px; + margin-left: 0; + } + + .controls { + .mark-all { + height: 20px; + line-height: 20px; + padding: 0; + } + } + } + } +} diff --git a/src/components/NotificationsMenu/index.jsx b/src/components/NotificationsMenu/index.jsx index e4116b1..84f7d4e 100644 --- a/src/components/NotificationsMenu/index.jsx +++ b/src/components/NotificationsMenu/index.jsx @@ -1,19 +1,17 @@ /** * Notification menu component - * Dropdown / model not implemented yet + * + * Component to show the bell icon and the notification dropdown */ import React, {} from "react"; import "./styles.css"; -import bellIcon from '../../assets/images/bell.svg'; +import NotificationDropdown from '../../containers/NotificationsDropdownContainer' const NotificationsMenu = () => { return (
    -
    - 3 -
    - Notifications +
    ); }; diff --git a/src/components/NotificationsMenu/styles.css b/src/components/NotificationsMenu/styles.css index 9f2e985..5ef0cf7 100644 --- a/src/components/NotificationsMenu/styles.css +++ b/src/components/NotificationsMenu/styles.css @@ -7,27 +7,3 @@ align-items: center; justify-content: center; } -.notifications-number-container { - position: absolute; - right: -8px; - top: -3px; - border-radius: 120px; - width: 16px; - height: 16px; - display: flex; - align-items: center; - justify-content: center; - background: #E90C5A; -} - -.notifications-number { - font-weight: bold; - font-size: 11px; - line-height: 16px; - text-align: center; - color: #fff; -} - -.notifications-icon { - width: 16px; -} \ No newline at end of file diff --git a/src/components/NotificationsModal/index.jsx b/src/components/NotificationsModal/index.jsx new file mode 100644 index 0000000..047e82e --- /dev/null +++ b/src/components/NotificationsModal/index.jsx @@ -0,0 +1,42 @@ +/** + * Modal component + * + * The component to contain View All Notifications page. + */ +import React from "react"; +import { Portal } from 'react-portal' +import { useNavigate } from '@reach/router' +import Notifications from '../../containers/NotificationsContainer' +import XMark from '../../assets/icons/x-mark.svg' +import "./styles.scss"; + +const NotificationsModal = ({ isEmpty }) => { + const navigate = useNavigate() + + const close = ( + + ); + + return ( + +
    +
    + {!isEmpty && close} +
    + +
    +
    +
    +
    + ); +}; + +export default NotificationsModal diff --git a/src/components/NotificationsModal/styles.scss b/src/components/NotificationsModal/styles.scss new file mode 100644 index 0000000..32f1952 --- /dev/null +++ b/src/components/NotificationsModal/styles.scss @@ -0,0 +1,68 @@ +@import '~tc-ui/src/styles/tc-includes'; + +.main-overlay { + position: absolute; + top: 0; + left: 0; + min-height: 100vh; + padding-top: var(--navbarHeight); + width: 100%; + margin: 0 auto; +} + +@media screen and (max-width: $screen-md - 1px) { + .main-overlay { + padding-top: 30px; + min-height: calc(100vh - 50px); + overflow-x: hidden; + } +} + +.modal { + position: relative; +} + +.modal-body { + background: #f4f5f6; +} + +.close { + align-items: center; + background-color: $tc-gray-05; + border-radius: 29px; + display: flex; + height: 30px; + justify-content: center; + width: 30px; + position: absolute; + top: 2px; + right: 16px; + z-index: 1; + appearance: none; + border: 0; + + @media screen and (max-width: 1280px - 1px) { + background-color: transparent; + margin-right: 10px; + right: 0; + } + + @media screen and (max-width: $screen-md - 1px) { + top: 36px; + left: 520px; + right: auto; + } + + &:hover { + background-color: $tc-dark-blue-70; + } + + .icon-x-mark { + fill: $tc-gray-100; + margin: -6px; + + @media screen and (max-width: $screen-md - 1px) { + fill: $tc-gray-100; + } + } +} diff --git a/src/components/SideFilter/SideFilter.jsx b/src/components/SideFilter/SideFilter.jsx new file mode 100644 index 0000000..f8c931e --- /dev/null +++ b/src/components/SideFilter/SideFilter.jsx @@ -0,0 +1,42 @@ +/** + * Side filter + * + * Visually splits filters into sections. + */ +import React from 'react' +import PropTypes from 'prop-types' +import SideFilterSection from './SideFilterSection' +import './SideFilter.scss' + +const SideFilter = (props) => ( +
    +
      + {props.filterSections.map((filters, index) => ( + + ))} +
    + {props.children && +
    + {props.children} +
    + } +
    +) + +SideFilter.defaultProps = { + filterSections: [], + selectedFilter: '' +} + +SideFilter.propTypes = { + filterSections: PropTypes.array, + onFilterItemClick: PropTypes.func.isRequired, + selectedFilter: PropTypes.string +} + +export default SideFilter diff --git a/src/components/SideFilter/SideFilter.scss b/src/components/SideFilter/SideFilter.scss new file mode 100644 index 0000000..a7fa35f --- /dev/null +++ b/src/components/SideFilter/SideFilter.scss @@ -0,0 +1,17 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .side-filter { + background: $tc-white; + border-radius: 4px; + padding: 10px; + + .additional-content { + border-top: 1px solid $tc-gray-10; + margin-top: 10px; + text-align: center; + padding: 20px 0 10px; + } + } +} diff --git a/src/components/SideFilter/SideFilterSection.jsx b/src/components/SideFilter/SideFilterSection.jsx new file mode 100644 index 0000000..80ce593 --- /dev/null +++ b/src/components/SideFilter/SideFilterSection.jsx @@ -0,0 +1,35 @@ +/** + * Filter section + */ +import React from 'react' +import PropTypes from 'prop-types' +import SideFilterSectionItem from './SideFilterSectionItem' +import './SideFilterSection.scss' + +const SideFilterSection = (props) => ( +
  • +
      + {props.filters.map(filter => ( + + ))} +
    +
  • +) + +SideFilterSection.defaultProps = { + filter: [], + selectedFilter: '' +} + +SideFilterSection.propTypes = { + filter: PropTypes.array, + onFilterItemClick: PropTypes.func.isRequired, + selectedFilter: PropTypes.string +} + +export default SideFilterSection diff --git a/src/components/SideFilter/SideFilterSection.scss b/src/components/SideFilter/SideFilterSection.scss new file mode 100644 index 0000000..65089b3 --- /dev/null +++ b/src/components/SideFilter/SideFilterSection.scss @@ -0,0 +1,11 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .side-filter-section + .side-filter-section::before { + content: ''; + display: block; + border-top: 1px solid $tc-gray-10; + margin: 10px; + } +} diff --git a/src/components/SideFilter/SideFilterSectionItem.jsx b/src/components/SideFilter/SideFilterSectionItem.jsx new file mode 100644 index 0000000..5a16308 --- /dev/null +++ b/src/components/SideFilter/SideFilterSectionItem.jsx @@ -0,0 +1,37 @@ +/** + * Filter item in the filter section + * + * - Shows filter name and quantity if defined + * - Has onClick callback with filter value argument + */ + +import React from 'react' +import PropTypes from 'prop-types' +import _ from 'lodash' +import './SideFilterSectionItem.scss' + +const SideFilterSectionItem = (props) => ( +
  • props.onClick(props.value)} + > +
    {props.title}
    + {_.isNumber(props.quantity) &&
    {props.quantity}
    } +
  • +) + +SideFilterSectionItem.defaultProps = { + quantity: null, + isSelected: false +} + +SideFilterSectionItem.propTypes = { + onClick: PropTypes.func.isRequired, + value: PropTypes.string.isRequired, + title: PropTypes.string.isRequired, + quantity: PropTypes.number, + isSelected: PropTypes.bool +} + +export default SideFilterSectionItem diff --git a/src/components/SideFilter/SideFilterSectionItem.scss b/src/components/SideFilter/SideFilterSectionItem.scss new file mode 100644 index 0000000..9fb24ca --- /dev/null +++ b/src/components/SideFilter/SideFilterSectionItem.scss @@ -0,0 +1,34 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .side-filter-section-item { + @include roboto; + border-radius: 4px; + color: $tc-black; + cursor: pointer; + display: flex; + font-size: 13px; + justify-content: space-between; + line-height: 30px; + padding: 0 10px; + + &.active { + @include roboto-bold; + background-color: $tc-gray-10; + cursor: default; + font-weight: bold; + } + + .title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .quantity { + text-align: right; + width: 40px; + } + } +} diff --git a/src/components/SideFilter/index.js b/src/components/SideFilter/index.js new file mode 100644 index 0000000..a277e5a --- /dev/null +++ b/src/components/SideFilter/index.js @@ -0,0 +1,2 @@ +import SideFilter from "./SideFilter"; +export default SideFilter; diff --git a/src/components/Sticky/index.jsx b/src/components/Sticky/index.jsx new file mode 100644 index 0000000..0cf938d --- /dev/null +++ b/src/components/Sticky/index.jsx @@ -0,0 +1,43 @@ +import React from 'react' +import StickyComponent from 'react-stickynode' + +export default class Sticky extends React.Component { + + constructor(props) { + super(props) + this.mountSticky = (sticky) => { this.sticky = sticky } + this.handleScroll = this.handleScroll.bind(this) + this.updateSticky = this.updateSticky.bind(this) + } + + componentDidMount() { + window.addEventListener('scroll', this.handleScroll) + document.addEventListener('refreshsticky', this.updateSticky) + } + + componentWillUnmount() { + window.removeEventListener('scroll', this.handleScroll) + document.removeEventListener('refreshsticky', this.updateSticky) + } + + updateSticky() { + setTimeout(() => { + if (this.sticky) { + this.sticky.updateInitialDimension() + this.sticky.update() + } + }) + } + + handleScroll() { + setTimeout(() => { + if (this.sticky) { + this.sticky.update() + } + }) + } + + render() { + return + } +} diff --git a/src/constants/apps.js b/src/constants/apps.js index f69c01c..94898b4 100644 --- a/src/constants/apps.js +++ b/src/constants/apps.js @@ -4,7 +4,7 @@ import appReactIcon from "../assets/images/reactjs.svg"; import appAngularIcon from "../assets/images/angularjs.svg"; import appTaasIcon from "../assets/images/integrations.svg"; -import appSubmissionReviewIcon from "../assets/images/integrations.svg"; +const appSubmissionReviewIcon = appTaasIcon; import manageWorkIcon from "../assets/images/managework.svg"; import ondemandTalentIcon from "../assets/images/ondemand-talent.svg"; import myOrganizationIcon from "../assets/images/my-organization.svg"; diff --git a/src/constants/notifications.js b/src/constants/notifications.js new file mode 100644 index 0000000..b0ebc7d --- /dev/null +++ b/src/constants/notifications.js @@ -0,0 +1,1287 @@ +import config from "../../config"; + +// Notifications +export const GET_NOTIFICATIONS_PENDING = "GET_NOTIFICATIONS_PENDING"; +export const GET_NOTIFICATIONS_SUCCESS = "GET_NOTIFICATIONS_SUCCESS"; +export const GET_NOTIFICATIONS_FAILURE = "GET_NOTIFICATIONS_FAILURE"; +export const GET_COMMUNITY_NOTIFICATIONS_PENDING = + "GET_COMMUNITY_NOTIFICATIONS_PENDING"; +export const GET_COMMUNITY_NOTIFICATIONS_SUCCESS = + "GET_COMMUNITY_NOTIFICATIONS_SUCCESS"; +export const GET_COMMUNITY_NOTIFICATIONS_FAILURE = + "GET_COMMUNITY_NOTIFICATIONS_FAILURE"; +export const SET_NOTIFICATIONS_FILTER_BY = "SET_NOTIFICATIONS_FILTER_BY"; +export const MARK_ALL_NOTIFICATIONS_READ = "MARK_ALL_NOTIFICATIONS_READ"; +export const TOGGLE_NOTIFICATION_READ = "TOGGLE_NOTIFICATION_READ"; +export const TOGGLE_NOTIFICATION_SEEN = "TOGGLE_NOTIFICATION_SEEN"; +export const MARK_ALL_NOTIFICATIONS_SEEN = "MARK_ALL_NOTIFICATIONS_SEEN"; +export const VIEW_OLDER_NOTIFICATIONS_SUCCESS = + "VIEW_OLDER_NOTIFICATIONS_SUCCESS"; +export const HIDE_OLDER_NOTIFICATIONS_SUCCESS = + "HIDE_OLDER_NOTIFICATIONS_SUCCESS"; +export const NOTIFICATIONS_PENDING = "NOTIFICATIONS_PENDING"; +export const MARK_NOTIFICATIONS_READ = "MARK_NOTIFICATIONS_READ"; +export const SET_NOTIFICATION_PLATFORM = "SET_NOTIFICATION_PLATFORM"; +export const RESET_NOTIFICATIONS = "RESET_NOTIFICATIONS"; +export const RESET_COMMUNITY_NOTIFICATIONS = "RESET_COMMUNITY_NOTIFICATIONS"; + +/* + * Project member role + */ +export const PROJECT_ROLE_COPILOT = "copilot"; +export const PROJECT_ROLE_MANAGER = "manager"; +export const PROJECT_ROLE_ACCOUNT_MANAGER = "account_manager"; +export const PROJECT_ROLE_CUSTOMER = "customer"; +export const PROJECT_ROLE_OWNER = "owner"; +export const PROJECT_ROLE_MEMBER = "member"; // this is need for notifications +export const PROJECT_ROLE_ACCOUNT_EXECUTIVE = "account_executive"; +export const PROJECT_ROLE_PROGRAM_MANAGER = "program_manager"; +export const PROJECT_ROLE_SOLUTION_ARCHITECT = "solution_architect"; +export const PROJECT_ROLE_PROJECT_MANAGER = "project_manager"; + +/* + * User Roles + */ +export const ROLE_TOPCODER_USER = "Topcoder User"; +export const ROLE_CONNECT_COPILOT = "Connect Copilot"; +export const ROLE_CONNECT_MANAGER = "Connect Manager"; +export const ROLE_CONNECT_ACCOUNT_MANAGER = "Connect Account Manager"; +export const ROLE_CONNECT_ADMIN = "Connect Admin"; +export const ROLE_ADMINISTRATOR = "administrator"; +export const ROLE_CONNECT_COPILOT_MANAGER = "Connect Copilot Manager"; +export const ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE = + "Business Development Representative"; +export const ROLE_PRESALES = "Presales"; +export const ROLE_ACCOUNT_EXECUTIVE = "Account Executive"; +export const ROLE_PROGRAM_MANAGER = "Program Manager"; +export const ROLE_SOLUTION_ARCHITECT = "Solution Architect"; +export const ROLE_PROJECT_MANAGER = "Project Manager"; + +// ToolTip +export const TOOLTIP_DEFAULT_DELAY = 300; // in ms + +// Screen breakpoints +export const SCREEN_BREAKPOINT_LG = 1360; +export const SCREEN_BREAKPOINT_RG = 992; +export const SCREEN_BREAKPOINT_MD = 768; +export const SCREEN_BREAKPOINT_SM = 640; +export const SCREEN_BREAKPOINT_XS = 320; + +export const REFRESH_NOTIFICATIONS_INTERVAL = 1000 * 60 * 1; // 1 minute interval +export const NOTIFICATIONS_DROPDOWN_PER_SOURCE = 5; +export const NOTIFICATIONS_NEW_PER_SOURCE = 10; + +export const NOTIFICATIONS_LIMIT = 1000; + +export const PLATFORM = { + CONNECT: "connect", + COMMUNITY: "community", + BOTH: "connect+community", +}; + +// Notifications event types +export const EVENT_TYPE = { + POST: { + UPDATED: "connect.notification.project.post.edited", + CREATED: "connect.notification.project.post.created", + DELETED: "connect.notification.project.post.deleted", + MENTION: "connect.notification.project.post.mention", + }, + MEMBER: { + JOINED: "connect.notification.project.member.joined", + LEFT: "connect.notification.project.member.left", + REMOVED: "connect.notification.project.member.removed", + MANAGER_JOINED: "connect.notification.project.member.managerJoined", + COPILOT_JOINED: "connect.notification.project.member.copilotJoined", + ASSIGNED_AS_OWNER: "connect.notification.project.member.assignedAsOwner", + INVITE_REQUESTED: "connect.notification.project.member.invite.requested", + INVITE_APPROVED: "connect.notification.project.member.invite.approved", + INVITE_REFUSED: "connect.notification.project.member.invite.rejected", + INVITE_CREATED: "connect.notification.project.member.invite.created", + }, + PROJECT: { + ACTIVE: "connect.notification.project.active", + APPROVED: "connect.notification.project.approved", + CANCELED: "connect.notification.project.canceled", + COMPLETED: "connect.notification.project.completed", + CREATED: "connect.notification.project.created", + FILE_UPLOADED: "connect.notification.project.fileUploaded", + LINK_CREATED: "connect.notification.project.linkCreated", + PAUSED: "connect.notification.project.paused", + SUBMITTED_FOR_REVIEW: "connect.notification.project.submittedForReview", + SPECIFICATION_MODIFIED: "connect.notification.project.updated.spec", + }, + PROJECT_PLAN: { + READY: "connect.notification.project.plan.ready", + MODIFIED: "connect.notification.project.plan.updated", + PROGRESS_UPDATED: "connect.notification.project.updated.progress", + PHASE_ACTIVATED: "connect.notification.project.phase.transition.active", + PHASE_COMPLETED: "connect.notification.project.phase.transition.completed", + PHASE_PAYMENT_UPDATED: "connect.notification.project.phase.update.payment", + PHASE_PROGRESS_UPDATED: + "connect.notification.project.phase.update.progress", + PHASE_SCOPE_UPDATED: "connect.notification.project.phase.update.scope", + PHASE_PRODUCT_SPEC_UPDATED: + "connect.notification.project.product.update.spec", + MILESTONE_ACTIVATED: + "connect.notification.project.timeline.milestone.transition.active", + MILESTONE_COMPLETED: + "connect.notification.project.timeline.milestone.transition.completed", + WAITING_FOR_CUSTOMER_INPUT: + "connect.notification.project.timeline.milestone.waiting.customer", + TIMELINE_ADJUSTED: "connect.notification.project.timeline.adjusted", + }, + TOPIC: { + CREATED: "connect.notification.project.topic.created", + DELETED: "connect.notification.project.topic.deleted", + }, + CHALLENGE: { + ACTIVE: "challenge.notification.events", + AUTOPILOT_ACTIVE: "notifications.autopilot.events", + COMPLETED: "challenge.notification.completed", + }, + BROADCAST: "admin.notification.broadcast", +}; + +export const NOTIFICATION_TYPE = { + WARNING: "warning", + NEW_PROJECT: "new-project", + UPDATES: "updates", + NEW_POSTS: "new-posts", + REVIEW_PENDING: "review-pending", + MEMBER_ADDED: "member-added", + CHALLENGE: "challenge", + BROADCAST: "broadcast", +}; + +/* + * NOTIFICATIONS + */ + +export const GOTO = { + PROJECT_DASHBOARD: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}`, + PROJECT_SPECIFICATION: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}/scope`, + PROJECT_PLAN: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}/plan`, + TOPIC: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}/messages/{{topicId}}`, + POST: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}/messages/{{topicId}}#comment-{{postId}}`, + PHASE_POST: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}/plan#phase-{{phaseId}}-posts-{{postId}}`, + FILE_LIST: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}/specification#appDefinition-files`, + PHASE: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}/plan#phase-{{phaseId}}`, + TOPCODER_TEAM: `${config.URL.CONNECT_DOMAIN}/projects/{{projectId}}#manageTopcoderTeam`, + CHALLENGE: `${config.URL.COMMUNITY_DOMAIN}/challenges/{{id}}`, +}; + +// each notification can be displayed differently depend on WHO see them +// that's why each notification can have several rules to display which describe user roles +// NOTE for each version of notification have to repeat ALL rules, even if some rules are not changed +export const NOTIFICATIONS = [ + // Outside project + { + eventType: EVENT_TYPE.PROJECT.CREATED, + type: NOTIFICATION_TYPE.NEW_PROJECT, + rules: [ + { + text: "Your Project was created successfully", + projectRoles: [PROJECT_ROLE_OWNER], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "New project is created", + topcoderRoles: [ + ROLE_CONNECT_ACCOUNT_MANAGER, + ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE, + ROLE_PRESALES, + ROLE_ACCOUNT_EXECUTIVE, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.ACTIVE, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Your project is now active", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "A project has been set to active", + topcoderRoles: [ + ROLE_CONNECT_COPILOT, + ROLE_CONNECT_MANAGER, + ROLE_PROGRAM_MANAGER, + ROLE_SOLUTION_ARCHITECT, + ROLE_PROJECT_MANAGER, + ROLE_ADMINISTRATOR, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.SUBMITTED_FOR_REVIEW, + type: NOTIFICATION_TYPE.REVIEW_PENDING, + rules: [ + { + text: "Your project is now in review", + projectRoles: [PROJECT_ROLE_OWNER], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "Project is available for review", + topcoderRoles: [ + ROLE_CONNECT_MANAGER, + ROLE_PROGRAM_MANAGER, + ROLE_SOLUTION_ARCHITECT, + ROLE_PROJECT_MANAGER, + ROLE_CONNECT_ACCOUNT_MANAGER, + ROLE_BUSINESS_DEVELOPMENT_REPRESENTATIVE, + ROLE_PRESALES, + ROLE_ACCOUNT_EXECUTIVE, + ROLE_ADMINISTRATOR, + ], + goTo: GOTO.PROJECT_SPECIFICATION, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.APPROVED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Your project was approved, work will soon start", + projectRoles: [PROJECT_ROLE_OWNER], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "Project is available for pickup", + topcoderRoles: [ROLE_CONNECT_COPILOT, ROLE_ADMINISTRATOR], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "Project was approved", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.PAUSED, + type: NOTIFICATION_TYPE.REVIEW_PENDING, + rules: [ + { + text: "Your project was paused", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "A project was paused", + topcoderRoles: [ROLE_ADMINISTRATOR], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.COMPLETED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Your project completed successfully!", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "A project was completed", + topcoderRoles: [ROLE_ADMINISTRATOR], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.CANCELED, + type: NOTIFICATION_TYPE.WARNING, + rules: [ + { + text: "Your project was canceled. If you think that was a mistake...", + projectRoles: [PROJECT_ROLE_OWNER], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + // User management + { + eventType: EVENT_TYPE.MEMBER.JOINED, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: "A new team member joined your project", + shouldBundle: true, + bundledText: "{{bundledCount}} new team members joined your project", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.LEFT, + type: NOTIFICATION_TYPE.WARNING, + rules: [ + { + text: "{{userHandle}} left a project", + shouldBundle: true, + bundledText: "{{bundledCount}} team members left your project", + projectRoles: [ + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.MEMBER.LEFT, + type: NOTIFICATION_TYPE.WARNING, + rules: [ + { + text: "{{userFullName}} left a project", + shouldBundle: true, + bundledText: "{{bundledCount}} team members left your project", + projectRoles: [ + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.REMOVED, + type: NOTIFICATION_TYPE.WARNING, + rules: [ + { + text: "{{userHandle}} was removed from project", + shouldBundle: true, + bundledText: + "{{bundledCount}} team members were removed from your project", + projectRoles: [ + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "You were removed from a project", + toUserHandle: true, + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.MEMBER.REMOVED, + type: NOTIFICATION_TYPE.WARNING, + rules: [ + { + text: "{{userFullName}} was removed from project", + shouldBundle: true, + bundledText: + "{{bundledCount}} team members were removed from your project", + projectRoles: [ + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "You were removed from a project", + toUserHandle: true, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.ASSIGNED_AS_OWNER, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: "You are now the owner of project", + toUserHandle: true, + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "Project owner was changed to {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.MEMBER.ASSIGNED_AS_OWNER, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: "You are now the owner of project", + toUserHandle: true, + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "Project owner was changed to {{userFullName}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.INVITE_REQUESTED, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: + "You are requested to add {{userFullName}} as a copilot", + topcoderRoles: [ROLE_CONNECT_COPILOT_MANAGER], + goTo: GOTO.TOPCODER_TEAM, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.INVITE_APPROVED, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: "You are added as a copilot", + toUserHandle: true, + goTo: GOTO.PROJECT_DASHBOARD, + }, + { + text: "Your request to invite the copilot was approved", + originator: true, + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.INVITE_REFUSED, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: "Your request to invite the copilot was refused", + originator: true, + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.COPILOT_JOINED, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: "A copilot joined your project team", + shouldBundle: true, + bundledText: "{{bundledCount}} copilots joined your project team", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.MEMBER.MANAGER_JOINED, + type: NOTIFICATION_TYPE.MEMBER_ADDED, + rules: [ + { + text: "A manager joined your project team", + shouldBundle: true, + bundledText: "{{bundledCount}} managers joined your project team", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.TOPIC.CREATED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userHandle}} created a new post ", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.TOPIC, + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.TOPIC.CREATED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userFullName}} created a new post ", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.TOPIC, + }, + ], + }, + + { + eventType: EVENT_TYPE.POST.CREATED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userHandle}} responded to your post", + shouldBundle: true, + bundledText: + "{{#showMore __history__ 3}}{{userHandle}}{{/showMore}} created {{bundledCount}} new posts to your topic", + toTopicStarter: true, + goTo: [ + { goTo: GOTO.POST, condition: (contents) => !contents.phaseId }, + { + goTo: GOTO.PHASE_POST, + condition: (contents) => !!contents.phaseId, + }, + ], + }, + { + text: "{{userHandle}} responded to a post", + shouldBundle: true, + bundledText: + "{{#showMore __history__ 3}}{{userHandle}}{{/showMore}} created {{bundledCount}} new posts", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: [ + { goTo: GOTO.POST, condition: (contents) => !contents.phaseId }, + { + goTo: GOTO.PHASE_POST, + condition: (contents) => !!contents.phaseId, + }, + ], + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.POST.CREATED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userFullName}} responded to your post", + shouldBundle: true, + bundledText: + "{{#showMore __history__ 3}}{{fallback userFullName userHandle}}{{/showMore}} created {{bundledCount}} new posts to your topic", + toTopicStarter: true, + goTo: [ + { goTo: GOTO.POST, condition: (contents) => !contents.phaseId }, + { + goTo: GOTO.PHASE_POST, + condition: (contents) => !!contents.phaseId, + }, + ], + }, + { + text: "{{userFullName}} responded to a post", + shouldBundle: true, + bundledText: + "{{#showMore __history__ 3}}{{fallback userFullName userHandle}}{{/showMore}} created {{bundledCount}} new posts", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: [ + { goTo: GOTO.POST, condition: (contents) => !contents.phaseId }, + { + goTo: GOTO.PHASE_POST, + condition: (contents) => !!contents.phaseId, + }, + ], + }, + ], + }, + + { + version: 2, + eventType: EVENT_TYPE.POST.UPDATED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userFullName}} edited post", + shouldBundle: true, + bundledText: + "{{#showMore __history__ 3}}{{fallback userFullName userHandle}}{{/showMore}} edited {{bundledCount}} posts", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + toTopicStarter: true, + goTo: GOTO.POST, + }, + ], + }, + + { + version: 2, + eventType: EVENT_TYPE.POST.MENTION, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userFullName}} mentioned you in a post", + toUserHandle: true, + goTo: [ + { goTo: GOTO.POST, condition: (contents) => !contents.phaseId }, + { + goTo: GOTO.PHASE_POST, + condition: (contents) => !!contents.phaseId, + }, + ], + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.LINK_CREATED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userHandle}} added a link to your project", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.PROJECT.LINK_CREATED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userFullName}} added a link to your project", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.PROJECT_DASHBOARD, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.FILE_UPLOADED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userHandle}} added a new file", + shouldBundle: true, + bundledText: "{{bundledCount}} new files were added", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.FILE_LIST, + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.PROJECT.FILE_UPLOADED, + type: NOTIFICATION_TYPE.NEW_POSTS, + rules: [ + { + text: "{{userFullName}} added a new file", + shouldBundle: true, + bundledText: "{{bundledCount}} new files were added", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.FILE_LIST, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT.SPECIFICATION_MODIFIED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: + "{{userHandle}} updated the project specification", + shouldBundle: true, + bundledText: + "Project specification has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.PROJECT_SPECIFICATION, + }, + ], + }, + { + version: 2, + eventType: EVENT_TYPE.PROJECT.SPECIFICATION_MODIFIED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: + "{{userFullName}} updated the project specification", + shouldBundle: true, + bundledText: + "Project specification has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_OWNER, + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + PROJECT_ROLE_MEMBER, + ], + goTo: GOTO.PROJECT_SPECIFICATION, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.READY, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Project plan is ready", + shouldBundle: true, + bundledText: + "Project plan is ready for your project. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PROJECT_PLAN, + }, + { + text: "Project plan is ready for {{projectName}}", + shouldBundle: true, + bundledText: + "Project plan is ready. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_PLAN, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.MODIFIED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Project plan is modified", + shouldBundle: true, + bundledText: + "Project plan is modified {{bundledCount}} times for your project. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PROJECT_PLAN, + }, + { + text: "Project plan is modified for {{projectName}}", + shouldBundle: true, + bundledText: + "Project plan is modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_PLAN, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.PHASE_ACTIVATED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Phase {{updatedPhase.name}} is activated", + shouldBundle: true, + bundledText: + "{{bundledCount}} phases are activated. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: "Phase {{updatedPhase.name}} is activated", + shouldBundle: true, + bundledText: + "{{bundledCount}} phases are activated. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.PHASE_COMPLETED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Phase {{updatedPhase.name}} is completed", + shouldBundle: true, + bundledText: + "{{bundledCount}} phases are completed. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: "Phase {{updatedPhase.name}} is completed", + shouldBundle: true, + bundledText: + "{{bundledCount}} phases are completed. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.PHASE_PAYMENT_UPDATED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Payments for {{updatedPhase.name}} updated", + shouldBundle: true, + bundledText: + "Payments updated for {{bundledCount}} phases. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: "Payments for {{updatedPhase.name}} updated", + shouldBundle: true, + bundledText: + "Payments updated for {{bundledCount}} phases. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.PHASE_PROGRESS_UPDATED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Phase {{updatedPhase.name}} is progressed", + shouldBundle: true, + bundledText: + "Progress updated for {{bundledCount}} phases. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: "Phase {{updatedPhase.name}} is progressed", + shouldBundle: true, + bundledText: + "Progress updated for {{bundledCount}} phases. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + // using product spec modified event instead of phase scope modified + eventType: EVENT_TYPE.PROJECT_PLAN.PHASE_PRODUCT_SPEC_UPDATED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "{{userHandle}} updated the phase specification", + shouldBundle: true, + bundledText: + "Phase specification has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: "{{userHandle}} updated the phase specification", + shouldBundle: true, + bundledText: + "Phase specification has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.PROGRESS_UPDATED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "{{userHandle}} updated the project progress", + shouldBundle: true, + bundledText: + "Project progress has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PROJECT_PLAN, + }, + { + text: "{{userHandle}} updated the project progress", + shouldBundle: true, + bundledText: + "Project progress has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PROJECT_PLAN, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.TIMELINE_ADJUSTED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "{{userHandle}} updated the phase timeline", + shouldBundle: true, + bundledText: + "Phase timeline has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: "{{userHandle}} updated the phase timeline", + shouldBundle: true, + bundledText: + "Phase timeline has been modified {{bundledCount}} times. Last modified by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.MILESTONE_ACTIVATED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Milestone is activated in the phase", + shouldBundle: true, + bundledText: + "Milestones activated {{bundledCount}} times. Last activated by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: + "{{userHandle}} activated a milestone in the phase", + shouldBundle: true, + bundledText: + "Milestones activated {{bundledCount}} times. Last activated by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.MILESTONE_COMPLETED, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "Milestone is completed in the phase", + shouldBundle: true, + bundledText: + "Milestones completed {{bundledCount}} times. Last completed by: {{userHandle}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: + "{{userHandle}} completed a milestone in the phase", + shouldBundle: true, + bundledText: + "Milestones completed {{bundledCount}} times. Last completed by: {{userHandle}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.PROJECT_PLAN.WAITING_FOR_CUSTOMER_INPUT, + type: NOTIFICATION_TYPE.UPDATES, + rules: [ + { + text: "We are waiting for your input in the project {{projectName}}", + projectRoles: [PROJECT_ROLE_OWNER, PROJECT_ROLE_MEMBER], + goTo: GOTO.PHASE, + }, + { + text: + "Waiting for customer on a milestone in the project {{projectName}}", + projectRoles: [ + PROJECT_ROLE_COPILOT, + PROJECT_ROLE_MANAGER, + PROJECT_ROLE_PROGRAM_MANAGER, + PROJECT_ROLE_SOLUTION_ARCHITECT, + PROJECT_ROLE_PROJECT_MANAGER, + ], + goTo: GOTO.PHASE, + }, + ], + }, + + { + eventType: EVENT_TYPE.CHALLENGE.ACTIVE, + type: NOTIFICATION_TYPE.CHALLENGE, + rules: [ + { + shouldBundle: false, + goTo: GOTO.CHALLENGE, + }, + ], + }, + + { + eventType: EVENT_TYPE.CHALLENGE.AUTOPILOT_ACTIVE, + type: NOTIFICATION_TYPE.CHALLENGE, + rules: [ + { + shouldBundle: false, + goTo: GOTO.CHALLENGE, + }, + ], + }, + + { + eventType: EVENT_TYPE.CHALLENGE.COMPLETED, + type: NOTIFICATION_TYPE.CHALLENGE, + rules: [ + { + shouldBundle: false, + goTo: GOTO.CHALLENGE, + }, + ], + }, +]; + +// list of ignored notifications +export const IGNORED_NOTIFICATION_TYPES = [ + EVENT_TYPE.POST.DELETED, + EVENT_TYPE.MEMBER.INVITE_CREATED, + EVENT_TYPE.TOPIC.DELETED, +]; + +// create a flat list of all possible notifications (expand notification rules) +export const NOTIFICATION_RULES = (() => { + const notificationRules = []; + + NOTIFICATIONS.forEach((notification) => { + notification.rules.forEach((notificationRule) => { + notificationRules.push({ ...notification, ...notificationRule }); + }); + }); + + return notificationRules; +})(); diff --git a/src/containers/NotificationsContainer/index.jsx b/src/containers/NotificationsContainer/index.jsx new file mode 100644 index 0000000..5b9a585 --- /dev/null +++ b/src/containers/NotificationsContainer/index.jsx @@ -0,0 +1,247 @@ +/** + * Container component for notifications list with filter + */ +import React, { Component } from 'react' + +import PropTypes from 'prop-types' +import _ from 'lodash' +import { connect } from 'react-redux' +import { Link } from '@reach/router' +import Sticky from '../../components/Sticky' +import { getNotifications, getCommunityNotifications, setNotificationsFilterBy, markAllNotificationsRead, + toggleNotificationRead, viewOlderNotifications, toggleBundledNotificationRead, + hideOlderNotifications, toggleNotificationSeen } from '../../actions/notifications' +import NotificationsSection from '../../components/Notifications/NotificationsSection' +import NotificationsSectionTitle from '../../components/Notifications/NotificationsSectionTitle' +import SideFilter from '../../components/SideFilter' +import NotificationsEmpty from '../../components/Notifications/NotificationsEmpty' +import spinnerWhileLoading from '../../components/LoadingSpinner' +import { + getNotificationsFilters, + getCommunityNotificationsFilters, + splitNotificationsBySources, + splitCommunityNotificationsBySources, + filterReadNotifications, + limitQuantityInSources, + preRenderNotifications, + preRenderCommunityNotifications, +} from '../../utils/notifications' +import { NOTIFICATIONS_NEW_PER_SOURCE } from '../../constants/notifications' +import './styles.scss' + +const NotificationsContainerView = (props) => { + if (!props.initialized && !props.communityInitialized) { + return null + } + const { sources, communitySources, notifications, communityNotifications, filterBy, setNotificationsFilterBy, + markAllNotificationsRead, toggleNotificationRead, viewOlderNotifications, + oldSourceIds, pending, toggleBundledNotificationRead } = props + + const notReadNotifications = filterReadNotifications(notifications) + const allNotificationsBySources = splitNotificationsBySources(sources, notReadNotifications) + const notificationsBySources = limitQuantityInSources( + allNotificationsBySources, + NOTIFICATIONS_NEW_PER_SOURCE, + oldSourceIds + ) + + const notReadCommunityNotifications = filterReadNotifications(communityNotifications) + const allCommunityNotificationsBySources = splitCommunityNotificationsBySources(communitySources, notReadCommunityNotifications) + const communityNotificationsBySources = allCommunityNotificationsBySources + + let globalSource = notificationsBySources.length > 0 && notificationsBySources[0].id === 'global' ? notificationsBySources[0] : null + let projectSources = globalSource ? notificationsBySources.slice(1) : notificationsBySources + if (filterBy) { + if (filterBy === 'global') { + projectSources = [] + } else { + globalSource = null + projectSources = _.filter(projectSources, { id: filterBy }) + } + } + + let broadcastSource = communityNotificationsBySources.find(source => source.id === 'broadcast') + let challengeSources = communityNotificationsBySources.filter(source => source.id !== 'broadcast') + if (filterBy) { + if (filterBy === 'broadcast') { + challengeSources = [] + } else { + broadcastSource = null + challengeSources = _.filter(challengeSources, { id: filterBy }) + } + } + + const toggleNotificationOrBundleRead = (notificationId) => { + if (!pending) { + const notification = _.find(notReadNotifications, { id: notificationId }) || _.find(notReadCommunityNotifications, { id: notificationId }) + // if it's bundled notification, then toggle all notifications inside the bundle + if (notification.bundledIds) { + toggleBundledNotificationRead(notificationId, notification.bundledIds) + } else { + toggleNotificationRead(notificationId) + } + } + } + + // this function checks that notification is not seen yet, + // before marking it as seen + const markNotificationSeen = (notificationId) => { + const notification = _.find(notifications, { id: notificationId }) || _.find(communityNotifications, { id: notificationId }) + + if (notification && !notification.seen) { + toggleNotificationSeen(notificationId) + } + } + + return ( +
    +
    +
    +
    +
    + {globalSource && globalSource.total > 0 && + !pending && markAllNotificationsRead('global', notifications)} + onReadToggleClick={toggleNotificationOrBundleRead} + onViewOlderClick={() => viewOlderNotifications(globalSource.id)} + onLinkClick={(notificationId) => { + markNotificationSeen(notificationId) + }} + /> + } + + {projectSources.length > 0 && } + {projectSources.filter(source => source.total > 0).map(source => ( + !pending && markAllNotificationsRead(source.id, notifications)} + onReadToggleClick={toggleNotificationOrBundleRead} + onViewOlderClick={() => viewOlderNotifications(source.id)} + onLinkClick={(notificationId) => { + markNotificationSeen(notificationId) + }} + /> + ))} + + {challengeSources.length > 0 && } + {challengeSources.filter(source => source.total > 0).map(source => ( + !pending && markAllNotificationsRead(source.id, communityNotifications)} + onReadToggleClick={toggleNotificationOrBundleRead} + onViewOlderClick={() => viewOlderNotifications(source.id)} + onLinkClick={(notificationId) => { + markNotificationSeen(notificationId) + }} + /> + ))} + + {broadcastSource && broadcastSource.total > 0 && } + {broadcastSource && broadcastSource.total > 0 && + !pending && markAllNotificationsRead('broadcast', notifications)} + onReadToggleClick={toggleNotificationOrBundleRead} + onViewOlderClick={() => viewOlderNotifications(broadcastSource.id)} + onLinkClick={(notificationId) => { + markNotificationSeen(notificationId) + }} + /> + } + + {globalSource || projectSources.length > 0 || challengeSources.length || broadcastSource ? +
    End of list
    : + +

    + Maybe you need to check your notification settings to + get up to date with the latest activity from your projects? +

    +
    + } +
    + +
    +
    +
    +
    + ) +} + +class NotificationsContainer extends Component { + constructor(props) { + super(props) + } + + componentWillMount() { + document.title = 'Notifications - TopCoder' + } + + componentWillUnmount() { + this.props.hideOlderNotifications() + } + + render() { + const { notifications, communityNotifications, ...restProps } = this.props + const preRenderedNotifications = preRenderNotifications(notifications) + const preRenderedNotifications2 = preRenderCommunityNotifications(communityNotifications) + + return ( + + ) + } +} + +const enhance = spinnerWhileLoading(props => !(props.isLoading || props.isCommunityLoading)) +const NotificationsContainerWithLoader = enhance(NotificationsContainer) + +NotificationsContainer.propTypes = { + isLoading: PropTypes.bool.isRequired, + initialized: PropTypes.bool.isRequired, + notifications: PropTypes.array, + sources: PropTypes.array, + filterBy: PropTypes.string, + oldSourceIds: PropTypes.array, + pending: PropTypes.bool, + isCommunityLoading: PropTypes.bool.isRequired, + communityInitialized: PropTypes.bool.isRequired, + communityNotifications: PropTypes.array, +} + +const mapStateToProps = ({ notifications, auth }) => { + return Object.assign({}, notifications, { user: auth.profile }) +} + +const mapDispatchToProps = { + getNotifications, + getCommunityNotifications, + setNotificationsFilterBy, + markAllNotificationsRead, + toggleNotificationRead, + viewOlderNotifications, + hideOlderNotifications, + toggleBundledNotificationRead, + toggleNotificationSeen, +} + +export default connect(mapStateToProps, mapDispatchToProps)(NotificationsContainerWithLoader) diff --git a/src/containers/NotificationsContainer/styles.scss b/src/containers/NotificationsContainer/styles.scss new file mode 100644 index 0000000..dc47eec --- /dev/null +++ b/src/containers/NotificationsContainer/styles.scss @@ -0,0 +1,74 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + .container { + display: flex; + + @media screen and (max-width: $screen-md - 1px) { + flex-direction: column; + } + + &.no-padding { + .content-wrapper { + padding: 0; + } + + .content-wrapper-inner { + max-width: 100%; + } + } + } + + .content-wrapper { + padding-bottom: 4 * $base-unit; + padding-left: 4 * $base-unit; + padding-right: 4 * $base-unit; + width: calc(100% - 1px); + + @media screen and (min-width: $screen-md) and (max-width: 280px * 3) { + /* minus sidebar border width */ + width: calc(100% * 2/3 - 1px); + } + + @media screen and (max-width: $screen-md - 1px) { + padding-left: 0; + padding-right: 0; + width: 100%; + } + } + + .content-wrapper-inner { + margin: 0 auto; + max-width: 760px; + } + + .notifications-container { + display: flex; + justify-content: space-between; + margin: 0 auto; + max-width: 1150px; + min-width: 960px; + padding: 30px 20px 0; + + > .content { + flex: 1; + margin-right: 30px; + max-width: 720px; + + > .end-of-list { + @include roboto-medium; + color: $tc-gray-50; + font-size: 13px; + line-height: 20px; + text-align: center; + padding: 20px 0; + } + } + + > .filters { + flex: 1; + max-width: 360px; + } + } +} diff --git a/src/containers/NotificationsDropdownContainer/index.jsx b/src/containers/NotificationsDropdownContainer/index.jsx new file mode 100644 index 0000000..86203e3 --- /dev/null +++ b/src/containers/NotificationsDropdownContainer/index.jsx @@ -0,0 +1,456 @@ +/** + * Container component for NotificationsDropdown component + * + * Connects to the state and prepare data for dummy component + */ +import React from 'react' +import { Link, navigate } from '@reach/router' +import { connect } from 'react-redux' +import _ from 'lodash' +import { TransitionGroup, Transition } from 'react-transition-group' +import { getNotifications, getCommunityNotifications, toggleNotificationSeen, markAllNotificationsRead, markAllNotificationsSeen, toggleNotificationRead, + toggleBundledNotificationRead, viewOlderNotifications, hideOlderNotifications, resetNotifications, resetCommunityNotifications } from '../../actions/notifications' +import { + splitNotificationsBySources, + splitCommunityNotificationsBySources, + filterReadNotifications, + filterSeenNotifications, + limitQuantityInSources, + preRenderNotifications, + preRenderCommunityNotifications, +} from '../../utils/notifications' +import NotificationsSection from '../../components/Notifications/NotificationsSection' +import NotificationsEmpty from '../../components/Notifications/NotificationsEmpty' +import NotificationsDropdownHeader from '../../components/Notifications/NotificationsDropdownHeader' +import NotificationsDropdown from '../../components/Notifications/NotificationsDropdown' +import NotificationsMobilePage from '../../components/Notifications/NotificationsMobilePage' +import NotificationsReadAll from '../../components/Notifications/NotificationsReadAll' +import ScrollLock from 'react-scroll-lock-component' +import MediaQuery from 'react-responsive' +import LoadingIndicator from '../../components/LoadingIndicator' +import { + NOTIFICATIONS_DROPDOWN_PER_SOURCE, + NOTIFICATIONS_NEW_PER_SOURCE, + REFRESH_NOTIFICATIONS_INTERVAL, + SCREEN_BREAKPOINT_MD, + PLATFORM, +} from '../../constants/notifications' +import './styles.scss' + +const NotificationsDropdownContainerView = (props) => { + const {initialized, communityInitialized, isLoading, isCommunityLoading, sources, communitySources, notifications, communityNotifications, markAllNotificationsRead, toggleNotificationRead, toggleNotificationSeen, + pending, toggleBundledNotificationRead, oldSourceIds, viewOlderNotifications, isDropdownMobileOpen, isDropdownWebOpen, + toggleNotificationsDropdownMobile, toggleNotificationsDropdownWeb, markAllNotificationsSeen } = props + if ((!initialized && isLoading) || (!communityInitialized && isCommunityLoading)) { + return ( + + + + ) + } + const getPathname = link => link.split(/[?#]/)[0].replace(/\/?$/, '') + + // mark notifications with url match current page's url as seen + if (!pending) { + const seenNotificationIds = notifications + .filter(({ isRead, seen, goto = '' }) => !isRead && !seen && getPathname(goto) === getPathname(window.location.pathname)) + .map(({ id }) => id) + .join('-') + seenNotificationIds.length && setTimeout(() => toggleNotificationSeen(seenNotificationIds), 0) + } + + const notReadNotifications = filterReadNotifications(notifications); + const allNotificationsBySources = splitNotificationsBySources(sources, notReadNotifications) + + const notReadCommunityNotifications = filterReadNotifications(communityNotifications); + const allCommunityNotificationsBySources = splitCommunityNotificationsBySources(communitySources, notReadCommunityNotifications) + + const hasUnread = notReadNotifications.length > 0 || notReadCommunityNotifications.length > 0 + // we have to give Dropdown component some time + // before removing notification item node from the list + // otherwise dropdown thinks we clicked outside and closes dropdown + const toggleNotificationReadWithDelay = (notificationId) => { + if (!pending) { + const notification = _.find(notReadNotifications, { id: notificationId }) || _.find(notReadCommunityNotifications, { id: notificationId }) + setTimeout(() => { + // if it's bundled notification, then toggle all notifications inside the bundle + if (notification.bundledIds) { + toggleBundledNotificationRead(notificationId, notification.bundledIds) + } else { + toggleNotificationRead(notificationId) + } + }, 0) + } + } + + let notificationsEmpty = ( + +

    + Maybe you need to check your notification settings to + get up to date with the latest activity from your projects? +

    +
    + Notification Settings +
    +
    + ) + if ((!isLoading && !initialized) || (!isCommunityLoading && !communityInitialized)) { + notificationsEmpty = ( + +

    + Maybe the notification server is not working or your device is offline. +

    +
    + ) + } + + const markNotificationsSeen = (isOpen) => { + if (isOpen) { + markAllNotificationsSeen(null, [...notifications, ...communityNotifications]) + } + } + + // this function checks that notification is not seen yet, + // before marking it as seen + const markNotificationSeen = (notificationId) => { + const notification = _.find(notifications, { id: notificationId }) || _.find(communityNotifications, { id: notificationId }) + + if (notification && !notification.seen) { + toggleNotificationSeen(notificationId) + } + } + + return ( + + {(matches) => { + if (matches) { + const notificationsBySources = limitQuantityInSources( + allNotificationsBySources, + NOTIFICATIONS_DROPDOWN_PER_SOURCE, + oldSourceIds + ) + const hiddenByLimitCount = _.sumBy(notificationsBySources, 'total') - _.sumBy(notificationsBySources, 'notifications.length') + const globalSource = notificationsBySources.length > 0 && notificationsBySources[0].id === 'global' ? notificationsBySources[0] : null + const projectSources = notificationsBySources.length > 1 && globalSource ? notificationsBySources.slice(1) : notificationsBySources + + const communityNotificationsBySources = allCommunityNotificationsBySources + const broadcastSource = communityNotificationsBySources.find(source => source.id === 'broadcast') + const challengeSources = communityNotificationsBySources.filter(source => source.id !== 'broadcast') + + return ( + { + toggleNotificationsDropdownWeb(isOpen) + markNotificationsSeen(isOpen) + }} + > + {isDropdownWebOpen &&
    + !pending && markAllNotificationsRead()} hasUnread={hasUnread}/> + {!hasUnread ? ( +
    + {notificationsEmpty} +
    + ) : ([ + +
    + + {state => ( + { + toggleNotificationsDropdownWeb() + markNotificationSeen(notificationId) + }} + /> + )} + + + {projectSources.filter(source => source.notifications.length > 0).map(source => ( + + {state => ( + { + toggleNotificationsDropdownWeb() + markNotificationSeen(notificationId) + }} + /> + )} + + ))} + + + {challengeSources.filter(source => source.notifications.length > 0).map(source => ( + + {state => ( + { + toggleNotificationsDropdownWeb() + markNotificationSeen(notificationId) + }} + /> + )} + + ))} + + + {state => ( + { + toggleNotificationsDropdownWeb() + markNotificationSeen(notificationId) + }} + /> + )} + +
    +
    , + { + toggleNotificationsDropdownWeb() + navigate('/notifications') + }}> + { + hiddenByLimitCount > 0 ? + `View ${hiddenByLimitCount} older notification${hiddenByLimitCount > 1 ? 's' : ''}` : + 'View all notifications' + } + + ])} +
    } +
    + ) + } else { + const notificationsBySources = limitQuantityInSources( + allNotificationsBySources, + NOTIFICATIONS_NEW_PER_SOURCE, + oldSourceIds + ) + const globalSource = notificationsBySources.length > 0 && notificationsBySources[0].id === 'global' ? notificationsBySources[0] : null + const projectSources = notificationsBySources.length > 1 && globalSource ? notificationsBySources.slice(1) : notificationsBySources + + const communityNotificationsBySources = allCommunityNotificationsBySources + const broadcastSource = communityNotificationsBySources.find(source => source.id === 'broadcast') + const challengeSources = communityNotificationsBySources.filter(source => source.id !== 'broadcast') + + return ( + { + toggleNotificationsDropdownMobile() + }} + isOpen={isDropdownMobileOpen} + > + {!hasUnread ? ( + notificationsEmpty + ) : ( +
    + + {state => ( + viewOlderNotifications(globalSource.id)} + onLinkClick={(notificationId) => { + toggleNotificationsDropdownMobile() + markNotificationSeen(notificationId) + }} + /> + )} + + + {projectSources.filter(source => source.notifications.length).map(source => ( + + {state => ( + viewOlderNotifications(source.id)} + onLinkClick={(notificationId) => { + toggleNotificationsDropdownMobile() + markNotificationSeen(notificationId) + }} + /> + )} + + ))} + + + {challengeSources.filter(source => source.notifications.length > 0).map(source => ( + + {state => ( + viewOlderNotifications(source.id)} + onLinkClick={(notificationId) => { + toggleNotificationsDropdownWeb() + markNotificationSeen(notificationId) + }} + /> + )} + + ))} + + + {state => ( + { + toggleNotificationsDropdownWeb() + markNotificationSeen(notificationId) + }} + /> + )} + +
    + )} +
    + ) + } + }} +
    + ) +} + +class NotificationsDropdownContainer extends React.Component { + constructor(props) { + super(props) + this.state = { + isDropdownWebOpen: false, + isDropdownMobileOpen: false, + notificationsVisited: false, + } + + this.onToggleNotificationsDropdownWeb = this.onToggleNotificationsDropdownWeb.bind(this) + this.onToggleNotificationsDropdownMobile = this.onToggleNotificationsDropdownMobile.bind(this) + } + + componentDidMount() { + const { initialized, communityInitialized } = this.props + + if (!(initialized || communityInitialized)) { + this.getPlatformNotifications() + } + + this.autoRefreshNotifications = setInterval(() => { + this.getPlatformNotifications() + }, REFRESH_NOTIFICATIONS_INTERVAL) + } + + componentWillUnmount() { + clearInterval(this.autoRefreshNotifications) + // hide notifications dropdown for mobile, when this component is unmounted + this.onToggleNotificationsDropdownMobile(false) + this.onToggleNotificationsDropdownWeb(false) + this.props.hideOlderNotifications() + } + + componentWillReceiveProps(nextProps) { + const { platform: oldPlatform } = this.props + const { platform } = nextProps + + if (platform !== oldPlatform) { + this.getPlatformNotifications(platform) + } + } + + getPlatformNotifications(p) { + const { + getNotifications, + getCommunityNotifications, + platform, + resetNotifications, + resetCommunityNotifications, + } = this.props + + p = p || platform + + if (p === PLATFORM.BOTH) { + resetNotifications() + resetCommunityNotifications() + getNotifications() + getCommunityNotifications() + } else if (p === PLATFORM.CONNECT) { + resetCommunityNotifications() + getNotifications() + } else { + resetNotifications() + getCommunityNotifications() + } + } + + onToggleNotificationsDropdownWeb(isOpen) { + this.setState({ isDropdownWebOpen: !_.isUndefined(isOpen) ? isOpen : !this.state.isDropdownWebOpen}) + } + + onToggleNotificationsDropdownMobile(isOpen) { + this.setState({ isDropdownMobileOpen: !_.isUndefined(isOpen) ? isOpen : !this.state.isDropdownMobileOpen}) + } + + render() { + const { notifications, communityNotifications, ...restProps } = this.props + const preRenderedNotifications = preRenderNotifications(notifications) + const preRenderedCommunityNotifications = preRenderCommunityNotifications(communityNotifications) + return ( + + ) + } +} + +const mapStateToProps = ({ notifications }) => notifications + +const mapDispatchToProps = { + getNotifications, + getCommunityNotifications, + toggleNotificationSeen, + markAllNotificationsRead, + markAllNotificationsSeen, + toggleNotificationRead, + toggleBundledNotificationRead, + viewOlderNotifications, + hideOlderNotifications, + resetNotifications, + resetCommunityNotifications, +} + +export default connect(mapStateToProps, mapDispatchToProps)(NotificationsDropdownContainer) diff --git a/src/containers/NotificationsDropdownContainer/styles.scss b/src/containers/NotificationsDropdownContainer/styles.scss new file mode 100644 index 0000000..89fff46 --- /dev/null +++ b/src/containers/NotificationsDropdownContainer/styles.scss @@ -0,0 +1,71 @@ +// this is to include tc styles in the output library +@import '~tc-ui/src/styles/tc-includes'; + +:global { + // project override for dropdown shadow + .Dropdown { + box-shadow: 0 3px 30px 2px rgba(0, 0, 0, 0.5); + cursor: default; + user-select: none; + } + + .notifications-dropdown { + align-items: center; + display: flex; + margin-left: -8px; + margin-right: 12px; + position: relative; + + .UserDropdownMenu { + padding: 0; + display: flex; + } + + .Dropdown { + right: -2px; + left: auto; + padding-bottom: 0; + position: absolute; + top: 40px; + width: auto; + } + + .UserDropdownMenu .Dropdown.pointer-shadow { + margin-top: 0; + + &::before { + background-color: $tc-gray-neutral-light; + right: 12px; + } + } + + .notifications-dropdown-body { + // window height + // - 54px dropdown top position + // - 40px dropdown header + // - 41px dropdown footer + // - 10px dropdown margin bottom + height: calc(100vh - 145px); + max-height: 500px; + overflow: auto; + } + + .notifications-dropdown-content { + border-radius: 4px; + overflow: hidden; + width: 480px; + } + + .notifications-empty { + justify-content: center; + display: flex; + height: 100%; + flex-direction: column; + padding: 0; + } + + .notifications-empty-note { + max-width: 270px; + } + } +} diff --git a/src/reducers/index.js b/src/reducers/index.js index 32320fa..166907e 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -4,10 +4,12 @@ import { combineReducers } from "redux"; import authReducer from "./auth"; import menuReducer from "./menu"; +import notificationsReducer from "./notifications"; const rootReducer = combineReducers({ auth: authReducer, menu: menuReducer, + notifications: notificationsReducer, }); export default rootReducer; diff --git a/src/reducers/notifications.js b/src/reducers/notifications.js new file mode 100644 index 0000000..f638f3e --- /dev/null +++ b/src/reducers/notifications.js @@ -0,0 +1,283 @@ +/** + * Notifications related reducers + */ +import { + GET_NOTIFICATIONS_PENDING, + GET_NOTIFICATIONS_SUCCESS, + GET_NOTIFICATIONS_FAILURE, + GET_COMMUNITY_NOTIFICATIONS_PENDING, + GET_COMMUNITY_NOTIFICATIONS_SUCCESS, + GET_COMMUNITY_NOTIFICATIONS_FAILURE, + TOGGLE_NOTIFICATION_SEEN, + SET_NOTIFICATIONS_FILTER_BY, + MARK_ALL_NOTIFICATIONS_READ, + MARK_ALL_NOTIFICATIONS_SEEN, + TOGGLE_NOTIFICATION_READ, + VIEW_OLDER_NOTIFICATIONS_SUCCESS, + HIDE_OLDER_NOTIFICATIONS_SUCCESS, + NOTIFICATIONS_PENDING, + MARK_NOTIFICATIONS_READ, + SET_NOTIFICATION_PLATFORM, + PLATFORM, + RESET_NOTIFICATIONS, + RESET_COMMUNITY_NOTIFICATIONS, +} from "../constants/notifications"; +import _ from "lodash"; +import { getActiveAndBroadcastNotifications } from "../utils/notifications"; + +const initialState = { + isLoading: false, + isCommunityLoading: false, + initialized: false, + communityInitialized: false, + filterBy: "", + sources: [{ id: "global", title: "Global" }], + communitySources: [{ id: "broadcast", title: "Broadcast Message" }], + notifications: [], + communityNotifications: [], + // ids of sources that will also show old notifications + oldSourceIds: [], + pending: false, + readers: {}, + platform: PLATFORM.COMMUNITY, +}; + +// get sources from notifications +const getSources = (notifications) => { + const sources = [ + ...initialState.sources, + ..._.uniqBy( + notifications.map((notification) => ({ + id: notification.sourceId, + title: notification.sourceName, + })), + "id" + ), + ]; + return sources; +}; + +const getCommunitySources = (notifications) => { + notifications = getActiveAndBroadcastNotifications(notifications); + notifications = notifications.filter( + (notification) => notification.sourceId !== "broadcast" + ); + + const challengeTitles = _.uniq( + notifications.map((noti) => noti.sourceName).filter((x) => x) + ); + const sources = challengeTitles + .map((title) => ({ title, id: title })) + .concat(initialState.communitySources); + + return sources; +}; + +// check if no unread notifications available in the filtered section +const isNotificationSectionCleared = (notifications, filterBy) => { + if ( + filterBy && + notifications + .filter((n) => !n.isRead) + .map((n) => n.sourceId) + .indexOf(filterBy) >= 0 + ) { + return false; + } + + return true; +}; + +// get notifications and updated filterBy based on the unread notifications in current filter +const getNotificationsAndFilterBy = (notifications, filterBy) => { + if (isNotificationSectionCleared(notifications, filterBy)) { + return { notifications, filterBy: "" }; + } + + return { notifications }; +}; + +const getCommunityNotificationsAndFilterBy = ( + communityNotifications, + filterBy +) => { + if (isNotificationSectionCleared(communityNotifications, filterBy)) { + return { communityNotifications, filterBy: "" }; + } + + return { communityNotifications }; +}; + +export default (state = initialState, action) => { + switch (action.type) { + case GET_NOTIFICATIONS_PENDING: + return { ...state, isLoading: true }; + case GET_NOTIFICATIONS_SUCCESS: + return { + ...state, + initialized: true, + isLoading: false, + notifications: action.payload, + sources: getSources(action.payload), + }; + case GET_NOTIFICATIONS_FAILURE: + return { ...state, isLoading: false }; + + case GET_COMMUNITY_NOTIFICATIONS_PENDING: + return { ...state, isCommunityLoading: true }; + case GET_COMMUNITY_NOTIFICATIONS_SUCCESS: + return { + ...state, + communityInitialized: true, + isCommunityLoading: false, + communityNotifications: action.payload, + communitySources: getCommunitySources(action.payload), + }; + case GET_COMMUNITY_NOTIFICATIONS_FAILURE: + return { ...state, isCommunityLoading: false }; + + case TOGGLE_NOTIFICATION_SEEN: { + const ids = action.payload.split("-"); + const newState = { + ...state, + pending: false, + notifications: state.notifications.map((n) => + ids.indexOf(n.id) >= 0 ? { ...n, seen: true } : n + ), + communityNotifications: state.communityNotifications.map((n) => + ids.indexOf(n.id) >= 0 ? { ...n, seen: true } : n + ), + }; + return newState; + } + + case SET_NOTIFICATIONS_FILTER_BY: + return { ...state, filterBy: action.payload }; + + case NOTIFICATIONS_PENDING: + return { ...state, pending: true }; + + case MARK_ALL_NOTIFICATIONS_READ: { + const newState = { + ...state, + pending: false, + ...getNotificationsAndFilterBy( + state.notifications.map((n) => + !action.payload || n.sourceId === action.payload + ? { ...n, isRead: action.isRead } + : n + ), + state.filterBy + ), + ...getCommunityNotificationsAndFilterBy( + state.communityNotifications.map((n) => + !action.payload || n.sourceId === action.payload + ? { ...n, isRead: action.isRead } + : n + ), + state.filterBy + ), + }; + return newState; + } + + case MARK_ALL_NOTIFICATIONS_SEEN: { + const newState = { + ...state, + pending: false, + ...getNotificationsAndFilterBy( + state.notifications.map((n) => + !action.payload || n.sourcId === action.payload + ? { ...n, seen: action.isSeen } + : n + ), + state.filterBy + ), + ...getCommunityNotificationsAndFilterBy( + state.communityNotifications.map((n) => + !action.payload || n.sourcId === action.payload + ? { ...n, seen: action.isSeen } + : n + ), + state.filterBy + ), + }; + return newState; + } + + case TOGGLE_NOTIFICATION_READ: { + const newState = { + ...state, + pending: false, + ...getNotificationsAndFilterBy( + state.notifications.map((n) => + n.id === action.payload ? { ...n, isRead: action.isRead } : n + ), + state.filterBy + ), + ...getCommunityNotificationsAndFilterBy( + state.communityNotifications.map((n) => + n.id === action.payload ? { ...n, isRead: action.isRead } : n + ), + state.filterBy + ), + }; + + return newState; + } + + case MARK_NOTIFICATIONS_READ: { + const newState = { + ...state, + pending: false, + ...getNotificationsAndFilterBy( + state.notifications.map((n) => + _.includes(action.payload, n.id) + ? { ...n, isRead: action.isRead } + : n + ), + state.filterBy + ), + ...getCommunityNotificationsAndFilterBy( + state.notifications.map((n) => + _.includes(action.payload, n.id) + ? { ...n, isRead: action.isRead } + : n + ), + state.filterBy + ), + }; + + return newState; + } + + case VIEW_OLDER_NOTIFICATIONS_SUCCESS: + return { + ...state, + oldSourceIds: [...state.oldSourceIds, action.payload], + }; + + case HIDE_OLDER_NOTIFICATIONS_SUCCESS: + return { ...state, oldSourceIds: [] }; + + case SET_NOTIFICATION_PLATFORM: + return { ...state, platform: action.payload }; + + case RESET_NOTIFICATIONS: + return { + ...state, + notifications: [], + sources: [], + }; + + case RESET_COMMUNITY_NOTIFICATIONS: + return { + ...state, + communityNotifications: [], + communitySources: [], + }; + + default: + return state; + } +}; diff --git a/src/root.component.test.js b/src/root.component.test.js index 90599f1..6314faf 100644 --- a/src/root.component.test.js +++ b/src/root.component.test.js @@ -5,6 +5,6 @@ import Root from "./root.component"; describe("Root component", () => { it("should be in the document", () => { const { getByText } = render(); - expect(getByText(/All Apps/i)).toBeInTheDocument(); + expect(getByText(/Navbar App Test/i)).toBeInTheDocument(); }); }); diff --git a/src/services/auth.js b/src/services/auth.js index 41ac9ed..abd7b16 100644 --- a/src/services/auth.js +++ b/src/services/auth.js @@ -64,22 +64,18 @@ const loadProfile = (userTokenV3) => { .then((res) => (res.result.status === 200 ? res.result.content : {})); }; +configureConnector({ + connectorUrl: config.URL.ACCOUNTS_APP_CONNECTOR, + frameId: "tc-accounts-iframe", + frameTitle: "Accounts authentication window", +}); + /** * Uses Topcoder accounts-app to fetch / refresh authentication tokens. * Results will be storted in the Redux store, inside state.auth. * @param {Object} store Redux store. */ -let firstAuth = true; export function authenticate(store) { - if (firstAuth) { - firstAuth = false; - configureConnector({ - connectorUrl: config.URL.ACCOUNTS_APP_CONNECTOR, - frameId: "tc-accounts-iframe", - frameTitle: "Accounts authentication window", - }); - } - getFreshToken() .then((tctV3) => { const tctV2 = cookies.get("tcjwt"); @@ -122,7 +118,7 @@ export function authenticate(store) { if (tctV2) time = decodeToken(tctV2).exp; if (userV3) time = Math.min(time, userV3.exp); if (time < Number.MAX_VALUE) { - time = 1000 * (time - config.REAUTH_TIME); + time = 1000 * (time - config.REAUTH_OFFSET); time = Math.max(0, time - Date.now()); logger.log("Reauth scheduled in", time / 1000, "seconds"); setTimeout(() => authenticate(store), time); diff --git a/src/services/notifications.js b/src/services/notifications.js new file mode 100644 index 0000000..93e10d6 --- /dev/null +++ b/src/services/notifications.js @@ -0,0 +1,67 @@ +import axios from "axios"; +import { getToken } from "../utils/getToken"; +import { NOTIFICATIONS_LIMIT } from "../constants/notifications"; +import { URL } from "../../config"; +import { + prepareNotifications, + prepareCommunityNotifications, +} from "../utils/notifications"; + +const logger = console; + +const axiosInstance = axios.create({ + headers: { + "Content-Type": "application/json", + }, +}); + +// request interceptor to pass auth token +axiosInstance.interceptors.request.use((config) => { + return getToken() + .then((token) => { + config.headers["Authorization"] = `Bearer ${token}`; + return config; + }) + .catch((err) => { + // TODO handle this error somehow + logger.log(err); + return config; + }); +}); + +// the id can be either: null/undefined (mark all); notification id; or '-' separated ids, e.g. '123-456-789' +const markNotificationsRead = (id) => { + if (id) { + return axiosInstance.put(`${URL.TC_NOTIFICATION_URL}/${id}/read`); + } else { + return axiosInstance.put(`${URL.TC_NOTIFICATION_URL}/read`); + } +}; + +// the id can be either: notification id; or '-' separated ids, e.g. '123-456-789' +const markNotificationsSeen = (id) => { + return axiosInstance.put(`${URL.TC_NOTIFICATION_URL}/${id}/seen`); +}; + +const getNotifications = () => { + return axiosInstance + .get( + `${URL.TC_NOTIFICATION_URL}/list?read=false&platform=connect&per_page=${NOTIFICATIONS_LIMIT}` + ) + .then((resp) => prepareNotifications(resp.data.items)); +}; + +const getCommunityNotifications = () => { + return axiosInstance + .get( + `${URL.TC_NOTIFICATION_URL}/list?read=false&platform=community&per_page=${NOTIFICATIONS_LIMIT}` + ) + .then((resp) => prepareCommunityNotifications(resp.data.items)); +}; + +export default { + getNotifications, + getCommunityNotifications, + markNotificationsRead, + markNotificationsSeen, +}; diff --git a/src/store.js b/src/store.js index 7e26f19..6a21a34 100644 --- a/src/store.js +++ b/src/store.js @@ -5,8 +5,9 @@ import { createStore, compose, applyMiddleware } from "redux"; import rootReducer from "./reducers"; import { authenticate } from "./services/auth"; +import thunk from "redux-thunk"; -const middleware = []; +const middleware = [thunk]; // enable Redux Logger in in DEV environment if (process.env.NODE_ENV === "development") { const { createLogger } = require("redux-logger"); diff --git a/src/styles/_fonts.scss b/src/styles/_fonts.scss new file mode 100644 index 0000000..b955b4c --- /dev/null +++ b/src/styles/_fonts.scss @@ -0,0 +1,48 @@ +// FONT STACK +// -------------------------------------------------------------------------------------------- +// Use the mixin to include fonts. +@mixin font-family($font-name, $font-weight, $font-style, $font-url, $font-file) { + @font-face { + font-family: '#{$font-name}'; + src: url('#{$font-url}#{$font-file}.eot'); + src: url('#{$font-url}#{$font-file}.eot?#iefix') format('embedded-opentype'), + url('#{$font-url}#{$font-file}.woff') format('woff'), + url('#{$font-url}#{$font-file}.ttf') format('truetype'), + url('#{$font-url}#{$font-file}.svg##{$font-name}') format('svg'); + font-weight: $font-weight; + font-style: $font-style; + } +} + +// FONT WEIGHTS +// -------------------------------------------------------------------------------------------- +// Use the numerical value instead of the weight name. + +// 100 Thin (Hairline) +// 200 Extra Light (Ultra Light) +// 300 Light +// 400 Normal +// 500 Medium +// 600 Semi Bold (Demi Bold) +// 700 Bold +// 800 Extra Bold (Ultra Bold) +// 900 Black (Heavy) + +// Roboto +@include font-family('Roboto', 900, normal, '../assets/fonts/roboto/', 'roboto-black'); +@include font-family('Roboto', 900, italic, '../assets/fonts/roboto/', 'roboto-blackitalic'); + +@include font-family('Roboto', 700, normal, '../assets/fonts/roboto/', 'roboto-bold'); +@include font-family('Roboto', 700, italic, '../assets/fonts/roboto/', 'roboto-bolditalic'); + +@include font-family('Roboto', 500, normal, '../assets/fonts/roboto/', 'roboto-medium'); +@include font-family('Roboto', 500, italic, '../assets/fonts/roboto/', 'roboto-mediumitalic'); + +@include font-family('Roboto', 400, normal, '../assets/fonts/roboto/', 'roboto-regular'); +@include font-family('Roboto', 400, italic, '../assets/fonts/roboto/', 'roboto-italic'); + +@include font-family('Roboto', 300, normal, '../assets/fonts/roboto/', 'roboto-light'); +@include font-family('Roboto', 300, italic, '../assets/fonts/roboto/', 'roboto-lightitalic'); + +@include font-family('Roboto', 100, normal, '../assets/fonts/roboto/', 'roboto-thin'); +@include font-family('Roboto', 100, italic, '../assets/fonts/roboto/', 'roboto-thinitalic'); diff --git a/src/styles/main.module.scss b/src/styles/main.module.scss new file mode 100644 index 0000000..0f7b5e5 --- /dev/null +++ b/src/styles/main.module.scss @@ -0,0 +1,11 @@ +@import '~tc-ui/src/styles/tc-styles'; +@import '~tc-ui/src/styles/tc-includes'; +// This is the partial where we load all the Roboto fonts for Webpack +@import 'fonts'; + +:global { + .notifications-dropdown, + .notifications-container { + @include roboto; + } +} diff --git a/src/topcoder-micro-frontends-navbar-app.js b/src/topcoder-micro-frontends-navbar-app.js index 67ecfcf..5e146bd 100644 --- a/src/topcoder-micro-frontends-navbar-app.js +++ b/src/topcoder-micro-frontends-navbar-app.js @@ -16,9 +16,11 @@ import { enableSidebarForRoute, getAuthUserTokens, getAuthUserProfile, + setNotificationPlatform, } from "./utils/exports"; import { login, logout } from "./utils"; +import { PLATFORM } from "./constants/notifications"; const lifecycles = singleSpaReact({ React, @@ -41,4 +43,6 @@ export { getAuthUserProfile, disableSidebarForRoute, enableSidebarForRoute, + setNotificationPlatform, + PLATFORM, }; diff --git a/src/utils/exports.js b/src/utils/exports.js index ec22d26..bfd6648 100644 --- a/src/utils/exports.js +++ b/src/utils/exports.js @@ -7,17 +7,20 @@ import _ from "lodash"; import { bindActionCreators } from "redux"; import store from "../store"; import menuActions from "../actions/menu"; +import notificationActions from "../actions/notifications"; // bind all the actions for exporting here export const { setAppMenu, disableSidebarForRoute, enableSidebarForRoute, + setNotificationPlatform, } = bindActionCreators( { setAppMenu: menuActions.setAppMenu, disableSidebarForRoute: menuActions.disableSidebarForRoute, enableSidebarForRoute: menuActions.enableSidebarForRoute, + setNotificationPlatform: notificationActions.setNotificationPlatform, }, store.dispatch ); diff --git a/src/utils/getToken.js b/src/utils/getToken.js new file mode 100644 index 0000000..d5a5320 --- /dev/null +++ b/src/utils/getToken.js @@ -0,0 +1,22 @@ +import store from "../store"; +import { getFreshToken, isTokenExpired } from "tc-auth-lib"; +const logger = console; + +export const getToken = () => { + return new Promise((resolve, reject) => { + const userState = store.getState().loadUser; + const token = userState && userState.user ? userState.user.token : null; + if (token && !isTokenExpired(token)) { + return resolve(token); + } else { + return getFreshToken() + .then((token) => { + resolve(token); + }) + .catch((err) => { + logger.log(err); + reject(err); + }); + } + }); +}; diff --git a/src/utils/notifications.js b/src/utils/notifications.js new file mode 100644 index 0000000..c382379 --- /dev/null +++ b/src/utils/notifications.js @@ -0,0 +1,797 @@ +/** + * Helper methods to filter and preprocess notifications + */ +import _ from "lodash"; +import { + NOTIFICATION_RULES, + IGNORED_NOTIFICATION_TYPES, + EVENT_TYPE, +} from "../constants/notifications"; +import Handlebars from "handlebars"; + +/** + * Handlebars helper to display limited quantity of item and text +N more + * + * Example: + * ``` + * {{#showMore __history__ 3}}{{userHandle}}{{/showMore}} + * ``` + * Gets 3 items from `__history__` array and render them comma-separated. + * If there are more than 3 items, adds '+N more'. Output can be: + * ``` + * userHandle1, userHandle1, userHandle3 +7 more + * ``` + * + * @param {Array} items list of items + * @param {Number} max max items to display + * @param {Object} options handlebars options + */ +const handlebarsShowMoreHelper = (items, max, options) => { + const renderedItems = items.map(options.fn); + const uniqRenderedItems = _.uniq(renderedItems); + const maxRenderedItems = uniqRenderedItems.slice(0, max); + const restItemsCount = uniqRenderedItems.length - maxRenderedItems.length; + + let out = maxRenderedItems.join(", "); + + if (restItemsCount > 0) { + out += ` +${restItemsCount} more`; + } + + return out; +}; + +/** + * Handlebars helper which displays fallback value if the value is not provided (falsy) + * + * Example: + * ``` + * {{fallback userFullName userHandle}} + * ``` + * Will output `userHandle` if `userFullName` is not provided + * + * @param {String} value value + * @param {String} fallbackValue fallback value + */ +const handlebarsFallbackHelper = (value, fallbackValue) => { + const out = value || fallbackValue; + + return new Handlebars.SafeString(out); +}; + +// register handlebars helpers +Handlebars.registerHelper("showMore", handlebarsShowMoreHelper); +Handlebars.registerHelper("fallback", handlebarsFallbackHelper); + +export const renderGoTo = (goTo, contents) => { + let goToHandlebars = ""; + + if (_.isArray(goTo)) { + const goToRule = _.find(goTo, (goToRuleTemp) => + goToRuleTemp.condition(contents) + ); + + if (goToRule) { + goToHandlebars = goToRule.goTo; + } else { + console.error("Cannot find goTo rule.", goTo, contents); + } + } else { + goToHandlebars = goTo; + } + + return Handlebars.compile(goToHandlebars)(contents); +}; + +/** + * Filter notifications by criteria + * + * @param {Array} notifications notifications list + * @param {Object} criteria criteria to filter notifications + * + * @returns {Array} notifiations which meet the criteria + */ +export const filterNotificationsByCriteria = (notifications, criteria) => { + return notifications.filter((notification) => + isNotificationMeetCriteria(notification, criteria) + ); +}; + +export const isSubEqual = (object, criteria) => { + let isEqual = true; + + _.forOwn(criteria, (value, key) => { + if (_.isObject(value)) { + isEqual = isSubEqual(object[key], value); + } else { + isEqual = !!object && value === object[key]; + } + + return isEqual; + }); + + return isEqual; +}; + +export const isNotificationMeetCriteria = (notification, criteria) => { + if (_.isArray(criteria)) { + return _.some(criteria, isSubEqual.bind(null, notification)); + } + + return isSubEqual(notification, criteria); +}; + +/** + * Get notification filters by sources + * + * @param {Array} sources list of sources + * + * @return {Array} list of filters by sources + */ +export const getNotificationsFilters = (sources) => { + const globalNotificationsSection = _.find(sources, { id: "global" }); + const filterSections = [[{ title: "All Notifications", value: "" }]]; + if (globalNotificationsSection && globalNotificationsSection.total) { + filterSections.push([ + { + title: "Global", + value: "global", + quantity: globalNotificationsSection.total, + }, + ]); + } + const filtersBySource = []; + const sortedSources = [...sources].sort(compareSourcesByLastNotificationDate); + + sortedSources.forEach((source) => { + if (source.id !== "global" && source.total !== 0) { + filtersBySource.push({ + title: source.title, + value: source.id, + quantity: source.total, + }); + } + }); + + if (filtersBySource.length > 0) { + filterSections.push(filtersBySource); + } + + return filterSections; +}; + +/** + * Compare two sources by the first's (latest) notification date + * If source doesn't have notifications, such source is "less" than another + * + * @param {Object} s1 source object + * @param {Object} s2 source object + */ +const compareSourcesByLastNotificationDate = (s1, s2) => { + const date1 = + s1.notifications && s1.notifications.length + ? new Date(s1.notifications[0].date).getTime() + : 0; + const date2 = + s2.notifications && s2.notifications.length + ? new Date(s2.notifications[0].date).getTime() + : 0; + + return date2 - date1; +}; + +/** + * Split notifications by sources + * + * @param {Array} sources list of sources + * @param {Array} notifications list of notifications + * + * @return {Array} list of sources with related notifications + */ +export const splitNotificationsBySources = (sources, notifications) => { + const notificationsBySources = sources.map((source) => { + const sourceNotifications = _.filter(notifications, { + sourceId: source.id, + }); + + return { + ...source, + notifications: sourceNotifications, + total: sourceNotifications.length, + }; + }); + + // source that has the most recent notification should be on top + notificationsBySources.sort(compareSourcesByLastNotificationDate); + + return notificationsBySources; +}; + +/** + * Filter notifications by posts + * + * So only notifications related to provided posts will stay + * + * @param {Array} notifications list of notifications + * @param {Array} posts list of posts + * + * @return {Array} list of filtered notifications + */ +export const filterNotificationsByPosts = (notifications, posts) => { + const postIds = _.map(posts, "id"); + + return notifications.filter((notification) => + _.includes(postIds, _.get(notification, "contents.postId")) + ); +}; + +/** + * Filter notifications to only not read yet + * + * @param {Array} notifications list of notifications + * + * @return {Array} list of filtered notifications + */ +export const filterReadNotifications = (notifications) => + _.filter(notifications, { isRead: false }); + +/** + * + * @param {Array} notifications list of notifications + * + * @return {Array} list of filtered notifications + */ +export const filterSeenNotifications = (notifications) => + _.filter(notifications, { seen: false }); + +/** + * Filter notifications that belongs to project:projectId + * + * @param {Array} notifications list of notifications + * + * @param {Number} projectId + * + * @return {Array} notifications list filtered of notifications + */ +export const filterNotificationsByProjectId = (notifications, projectId) => + _.filter(notifications, (notification) => { + return notification.sourceId === `${projectId}`; + }); + +/** + * Filter notifications about Topic and Post changed + * + * @param {Array} notifications list of notifications + * @param {RegExp} [tagRegExp] regexp to filter notification by tags + * + * @return {Array} notifications list filtered of notifications + */ +export const filterTopicAndPostChangedNotifications = ( + notifications, + tagRegExp +) => { + let topicAndPostNotifications = _.filter( + notifications, + (notification) => + notification.eventType === EVENT_TYPE.TOPIC.CREATED || + notification.eventType === EVENT_TYPE.POST.CREATED || + notification.eventType === EVENT_TYPE.POST.UPDATED || + notification.eventType === EVENT_TYPE.POST.MENTION + ); + + // filter messages using `tags` + if (tagRegExp) { + topicAndPostNotifications = _.filter( + topicAndPostNotifications, + (notification) => { + const tags = _.get(notification, "contents.tags", []); + + return _.some(tags, (tag) => tagRegExp.test(tag)); + } + ); + } + + return topicAndPostNotifications; +}; + +/** + * Filter notifications about Link and File changed + * + * @param {Array} notifications list of notifications + * + * @return {Array} notifications list filtered of notifications + */ +export const filterFileAndLinkChangedNotifications = (notifications) => { + return _.filter( + notifications, + (notification) => + notification.eventType === EVENT_TYPE.PROJECT.FILE_UPLOADED || + notification.eventType === EVENT_TYPE.PROJECT.LINK_CREATED + ); +}; + +/** + * Filter notification about post mentions + * @param {Array} notifications list of notifications + * + * @return {Array} notifications list filtered by post mention event type + */ +export const filterPostsMentionNotifications = (notifications) => + _.filter(notifications, (notification) => { + return notification.eventType === EVENT_TYPE.POST.MENTION; + }); + +/** + * Filter notifications about the project + * + * @param {Array} notifications list of notifications + * + * @return {Array} notifications list filtered of notifications + */ +export const filterProjectNotifications = (notifications) => + _.filter(notifications, (notification) => { + return ( + notification.eventType === EVENT_TYPE.PROJECT.CREATED || + notification.eventType === EVENT_TYPE.PROJECT.APPROVED || + notification.eventType === EVENT_TYPE.PROJECT.PAUSED || + notification.eventType === EVENT_TYPE.PROJECT.COMPLETED || + notification.eventType === EVENT_TYPE.PROJECT.SPECIFICATION_MODIFIED || + notification.eventType === EVENT_TYPE.PROJECT.SUBMITTED_FOR_REVIEW || + notification.eventType === EVENT_TYPE.PROJECT.FILE_UPLOADED || + notification.eventType === EVENT_TYPE.PROJECT.CANCELED || + notification.eventType === EVENT_TYPE.PROJECT.LINK_CREATED + ); + }); + +/** + * Limits notifications quantity per source + * + * @param {Array} notificationsBySources list of sources with notifications + * @param {Number} maxPerSource maximum number of notifications to include per source + * @param {Array} skipSourceIds list of ids of sources that will have all notifications + * + * @return {Array} list of sources with related notifications + */ +export const limitQuantityInSources = ( + notificationsBySources, + maxPerSource, + skipSourceIds +) => + notificationsBySources.map((source) => { + // clone sources to avoid updating existent objects + const limitedSource = { ...source }; + + if (!_.includes(skipSourceIds, limitedSource.id)) { + limitedSource.notifications = limitedSource.notifications.slice( + 0, + maxPerSource + ); + } + + return limitedSource; + }); + +/** + * Get a rule for notification + * + * @param {Object} notification notification + * + * @return {Object} notification rule + */ +const getNotificationRule = (notification) => { + const notificationRule = _.find(NOTIFICATION_RULES, (_notificationRule) => { + let match = _notificationRule.eventType === notification.eventType; + + if (notification.version) { + match = match && _notificationRule.version === notification.version; + } + + if (notification.contents.toTopicStarter) { + match = match && _notificationRule.toTopicStarter; + } + + if (notification.contents.toUserHandle) { + match = match && _notificationRule.toUserHandle; + } + + if (notification.contents.originator) { + match = match && _notificationRule.originator; + } + + if (notification.contents.projectRole) { + match = + match && + _notificationRule.projectRoles && + _.includes( + _notificationRule.projectRoles, + notification.contents.projectRole + ); + } + + if (notification.contents.topcoderRole) { + match = + match && + _notificationRule.topcoderRoles && + _.includes( + _notificationRule.topcoderRoles, + notification.contents.topcoderRole + ); + } + + return match; + }); + + return notificationRule; +}; + +/** + * Compare notification rules ignoring version + * + * @param {Object} rule1 notification rule 1 + * @param {Object} rule2 notification rule 2 + * + * @returns {Boolean} true if rules are equal + */ +const isNotificationRuleEqual = (rule1, rule2) => { + /** + * Properties which distinguish one rule from another + * + * @type {Array} + */ + const ESSENTIAL_RULE_PROPERTIES = [ + "eventType", + "toTopicStarter", + "toUserHandle", + "projectRole", + "topcoderRole", + "originator", + ]; + const essentialRule1 = _.pick(rule1, ESSENTIAL_RULE_PROPERTIES); + const essentialRule2 = _.pick(rule2, ESSENTIAL_RULE_PROPERTIES); + + return _.isEqual(essentialRule1, essentialRule2); +}; + +/** + * Bundle same type notifications for the same project + * + * @param {Array<{notification, notificationRule}>} notificationsWithRules list of notification with rules + * + * @returns {Array<{notification, notificationRule}>} bundled notifications with rules + */ +const bundleNotifications = (notificationsWithRules) => { + /** + * List of `contents` properties for which we want to keep the whole history + * + * @type {Array} + */ + const PROPERTIES_KEEP_IN_HISTORY = ["userHandle", "userFullName"]; + const bundledNotificationsWithRules = []; + + // starting from the latest notifications + // find older notifications with the same notification rule and the same project + _.reverse(notificationsWithRules).forEach((notificationWithRule) => { + // if notifications doesn't have to be bundled, add it to notifications list as it is + if (!notificationWithRule.notificationRule.shouldBundle) { + bundledNotificationsWithRules.push(notificationWithRule); + return; + } + + // try to find existent notification in the list to which we can bundle current one + const existentNotificationWithRule = _.find( + bundledNotificationsWithRules, + (bundledNotificationWithRule) => + // same source id means same project + bundledNotificationWithRule.notification.sourceId === + notificationWithRule.notification.sourceId && + // same notification rule means same type + isNotificationRuleEqual( + bundledNotificationWithRule.notificationRule, + notificationWithRule.notificationRule + ) + ); + + // if already have notification of the same type, update it instead of adding new notification to the list + if (existentNotificationWithRule) { + // if haven't bundled any notifications yet, then init properties which only bundled notifications has + if (!existentNotificationWithRule.notification.bundledIds) { + existentNotificationWithRule.notification.bundledIds = [ + existentNotificationWithRule.notification.id, + ]; + existentNotificationWithRule.notification.contents.bundledCount = 1; + existentNotificationWithRule.notification.contents.__history__ = [ + _.pick( + existentNotificationWithRule.notification.contents, + PROPERTIES_KEEP_IN_HISTORY + ), + ]; + } + + // at this point bundled notification is initialized, + // so we just update values of bundled notifications + existentNotificationWithRule.notification.bundledIds.push( + notificationWithRule.notification.id + ); + existentNotificationWithRule.notification.contents.bundledCount += 1; + existentNotificationWithRule.notification.contents.__history__.push( + _.pick( + notificationWithRule.notification.contents, + PROPERTIES_KEEP_IN_HISTORY + ) + ); + if ( + notificationWithRule.notification.date > + existentNotificationWithRule.notification.date + ) { + _.merge( + existentNotificationWithRule.notification, + notificationWithRule.notification + ); + } + } else { + bundledNotificationsWithRules.push(notificationWithRule); + } + }); + + return bundledNotificationsWithRules; +}; + +/** + * Prepare notification contents: + * - extracts phaseId from tags + * + * @param {Object} contents notification contents + * + * @returns {Object} notification contents + */ +const prepareNotificationContents = (contents) => { + const tags = _.get(contents, "tags", []); + const preparedContents = { ...contents }; + + // check if any of the tags has phaseId + const PHASE_ID_REGEXP = /phase#(\d+)/; + const phaseIds = tags.map((tag) => + _.get(tag.match(PHASE_ID_REGEXP), "1", null) + ); + const phaseId = _.find(phaseIds, (phaseId) => phaseId !== null); + + if (phaseId) { + preparedContents.phaseId = phaseId; + } + + return preparedContents; +}; + +/** + * Prepare notifications + * + * @param {Array} rawNotifications notifications list + * + * @return {Array} notification list + */ +export const prepareNotifications = (rawNotifications) => { + const notifications = rawNotifications.map((rawNotification) => ({ + id: `${rawNotification.id}`, + sourceId: rawNotification.contents.projectId + ? `${rawNotification.contents.projectId}` + : "global", + sourceName: rawNotification.contents.projectId + ? rawNotification.contents.projectName || "project" + : "Global", + eventType: rawNotification.type, + date: rawNotification.createdAt, + isRead: rawNotification.read, + seen: rawNotification.seen, + contents: prepareNotificationContents(rawNotification.contents), + version: rawNotification.version, + })); + + // populate notifications with additional properties + // - type + // - goto + // - rule + notifications.forEach((notification) => { + const notificationRule = getNotificationRule(notification); + const isIgnoredNotification = + IGNORED_NOTIFICATION_TYPES.indexOf(notification.eventType) > -1; + + // if rule for notification is not found and not in the list of ignored show a warning for now as such notification cannot be displayed + if (!notificationRule) { + if (!isIgnoredNotification) { + console.warn( + `Cannot find notification rule for eventType '${notification.eventType}' version '${notification.version}'.` + ); + } + } else { + // populate notification data + notification.type = notificationRule.type; + if (notificationRule.goTo) { + notification.goto = renderGoTo( + notificationRule.goTo, + notification.contents + ); + } + + notification.rule = notificationRule; + } + }); + + return notifications; +}; + +/** + * Bundle notifications and renders notifications texts + * + * @param {Array} notifications notifications list + * + * @returns {Array} notifications list with rendered texts + */ +export const preRenderNotifications = (notifications) => { + // we will only render notification which has rules + const notificationsWithRules = _.compact( + notifications.map((notification) => + notification.rule + ? { + notification: _.omit(notification, "rule"), + notificationRule: notification.rule, + } + : null + ) + ); + + const bundledNotificationsWithRules = bundleNotifications( + notificationsWithRules + ); + + // render notifications texts + bundledNotificationsWithRules.forEach((bundledNotificationWithRule) => { + const { notification, notificationRule } = bundledNotificationWithRule; + const textTpl = notification.contents.bundledCount + ? notificationRule.bundledText || notificationRule.text // if text for bundled notification is not defined, just use regular text + : notificationRule.text; + + const renderText = Handlebars.compile(textTpl); + notification.text = renderText(notification.contents); + }); + + const preRenderedNotifications = _.map( + bundledNotificationsWithRules, + "notification" + ); + // sort notifications by date (newer first) + preRenderedNotifications.sort((n1, n2) => { + const date1 = new Date(n1.date).getTime(); + const date2 = new Date(n2.date).getTime(); + + return date2 - date1; + }); + + return preRenderedNotifications; +}; + +//----- // +const getCommunityNotificationRule = (notification) => { + const notificationRule = _.find(NOTIFICATION_RULES, (_notificationRule) => { + return _notificationRule.eventType === notification.eventType; + }); + return notificationRule; +}; + +export const prepareCommunityNotifications = (data) => { + const notifications = _.map(data, (item) => { + const object = {}; + object.id = item.id; + object.sourceId = + item.type === EVENT_TYPE.BROADCAST ? "broadcast" : item.contents.name; + object.sourceName = item.contents.name || item.contents.title; + object.eventType = item.type; + object.isRead = item.read; + object.seen = item.seen; + object.contents = { + text: item.contents.message || item.contents.title, + id: item.contents.id, + }; + object.version = item.version; + object.date = item.createdAt; + return object; + }); + + notifications.forEach((notification) => { + const notificationRule = getCommunityNotificationRule(notification); + + if (notificationRule) { + notification.type = notificationRule.type; + if (notificationRule.goTo) { + notification.goto = renderGoTo( + notificationRule.goTo, + notification.contents + ); + } + + notification.rule = notificationRule; + } + }); + + return notifications; +}; + +export const getActiveAndBroadcastNotifications = (notifications) => { + return _.uniq(notifications || []).filter( + (t) => + EVENT_TYPE.CHALLENGE.ACTIVE.includes(t.eventType) || + EVENT_TYPE.BROADCAST.includes(t.eventType) + ); +}; + +export const splitCommunityNotificationsBySources = ( + sources, + notifications +) => { + const notificationsBySources = sources.map((source) => { + const sourceNotifications = _.filter(notifications, { + sourceName: source.title, + }); + + return { + ...source, + notifications: sourceNotifications, + total: sourceNotifications.length, + }; + }); + + notificationsBySources.sort(compareSourcesByLastNotificationDate); + + return notificationsBySources; +}; + +export const getCommunityNotificationsFilters = (sources) => { + const broadcastNotifications = _.find(sources, { id: "broadcast" }); + const filterSections = []; + const filtersBySource = []; + const sortedSources = [...sources].sort(compareSourcesByLastNotificationDate); + + sortedSources.forEach((source) => { + if (source.id !== "broadcast" && source.total !== 0) { + filtersBySource.push({ + title: source.title, + value: source.id, + quantity: source.total, + }); + } + }); + + if (filtersBySource.length > 0) { + filterSections.push(filtersBySource); + } + + if (broadcastNotifications && broadcastNotifications.notifications.length) { + filterSections.push([ + { + title: "Broadcast Message", + value: "broadcast", + quantity: broadcastNotifications.total, + }, + ]); + } + + return filterSections; +}; + +export const preRenderCommunityNotifications = (notifications) => { + notifications = getActiveAndBroadcastNotifications(notifications); + + const preRenderedNotifications = notifications; + + preRenderedNotifications.forEach((notification) => { + notification.text = notification.contents.text; + }); + + preRenderedNotifications.sort((n1, n2) => { + const date1 = new Date(n1.date).getTime(); + const date2 = new Date(n2.date).getTime(); + + return date2 - date1; + }); + + return preRenderedNotifications; +}; diff --git a/webpack.config.js b/webpack.config.js index 2739c23..757a9e9 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,26 +2,112 @@ const webpackMerge = require("webpack-merge"); const singleSpaDefaults = require("webpack-config-single-spa-react"); +const autoprefixer = require('autoprefixer'); +const path = require('path') +const webpack = require('webpack') -module.exports = (webpackConfigEnv) => { +module.exports = (webpackConfigEnv, options) => { const defaultConfig = singleSpaDefaults({ orgName: "topcoder", projectName: "micro-frontends-navbar-app", webpackConfigEnv, + disableHtmlGeneration: true, }); + let cssLocalIdent; + if (options.mode === 'production') { + cssLocalIdent = '[hash:base64:6]'; + } else { + cssLocalIdent = 'navbar_[path][name]___[local]___[hash:base64:6]'; + } + // modify the webpack config however you'd like to by adding to this object return webpackMerge.smart(defaultConfig, { + output: { + path: path.resolve(__dirname, 'dist'), + publicPath: 'navbar', + }, module: { rules: [ { - test: /\.svg$/, + /* Loads svg images. */ + test: /[/\/]assets[/\/]images[/\/].+\.svg$/, exclude: /node_modules/, - use: { - loader: require.resolve("file-loader", { paths: [__dirname] }), - }, + loader: 'file-loader', + options: { + outputPath: 'images', + } + }, + { + /* Loads image assets. */ + test: /\.(gif|jpe?g|png)$/, + loader: 'file-loader', + options: { + outputPath: 'images', + } + }, + { + /* Loads font resources from "src/assets/fonts" folder. */ + test: /\.(eot|otf|svg|ttf|woff2?)$/, + include: [/src[/\\]assets[/\\]fonts/], + loader: 'file-loader', + options: { + outputPath: 'fonts', + } + }, + { + /* Loads SCSS stylesheets. */ + test: /\.scss/, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { + modules: { + localIdentName: cssLocalIdent, + mode: 'local', + } + }, + }, + { + loader: 'postcss-loader', + options: { + postcssOptions: { + plugins: [autoprefixer], + } + }, + }, + 'resolve-url-loader', + { + loader: 'sass-loader', + options: { + sourceMap: true, + }, + } + ] }, ], }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + APPENV: JSON.stringify(process.env.APPENV), + }, + }), + ], + resolve: { + alias: { + assets: path.resolve(__dirname, "src/assets"), + components: path.resolve(__dirname, "src/components"), + fonts: path.resolve(__dirname, "src/assets/fonts"), + styles: path.resolve(__dirname, "src/styles"), + handlebars: path.resolve(__dirname, 'node_modules/handlebars/dist/handlebars.min.js'), + }, + symlinks: false, + }, + devServer: { + port: 3001, + host: '0.0.0.0' + } }); }; From 8db2c4c8d44ac294689092fde0ba3084f272a3e6 Mon Sep 17 00:00:00 2001 From: urwithat Date: Sun, 17 Jan 2021 21:52:43 +0530 Subject: [PATCH 4/6] Node version 10.22.1 in docker file --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index de10b3c..a06aa8f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # Use the base image with Node.js -FROM node:latest +FROM node:10.22.1 ARG APPMODE ARG APPENV From eb50995705bb48c0cbd079660c3c9251fde3845c Mon Sep 17 00:00:00 2001 From: urwithat Date: Mon, 18 Jan 2021 13:22:09 +0530 Subject: [PATCH 5/6] Build fix's for notifications implementation --- package.json | 2 +- src/assets/icons/icon-select.png | Bin 0 -> 15032 bytes src/assets/icons/loader.gif | Bin 0 -> 8821 bytes src/components/Dropdown/Dropdown.scss | 2 +- src/styles/_fonts.scss | 6 +----- 5 files changed, 3 insertions(+), 7 deletions(-) create mode 100644 src/assets/icons/icon-select.png create mode 100644 src/assets/icons/loader.gif diff --git a/package.json b/package.json index 10028df..2295db0 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "start": "node server.js", "dev": "cross-env APPMODE=development webpack-dev-server", "dev-https": "cross-env APPMODE=development webpack-dev-server --https", - "build": "webpack --mode=${APPMODE:-production} --env.config=${APPENV:-dev}", + "build": "webpack --mode=${APPMODE:-development} --env.config=${APPENV:-dev}", "analyze": "webpack --mode=production --env.analyze=true", "lint": "eslint src --ext js", "format": "prettier --write \"./**\"", diff --git a/src/assets/icons/icon-select.png b/src/assets/icons/icon-select.png new file mode 100644 index 0000000000000000000000000000000000000000..3cac81638e02dd29e982aab93753b9d12e95bed1 GIT binary patch literal 15032 zcmeI3Ux*t;9LGmnr=b8JIO6gcGKOx zOYRUYYQc&RQUr?>p)bCv2tJ6#Ua9p(Q7EVtQK&6g|6!pIf(X{xY?A%uU+08APL3qM zoB4gev-6qXO!j3@%+5TyZS>($gwVF>sr(%I-bLPfNA4k?KO1NMB41l-QwLpywr=;| zccHgVKZKC-wpm>877F`S-LA$o!(PO(Mzuz=5lZiC)HMAF_P9k{HmywL#@Y1O<$G7els88nkn9q zOk~_2kXtCsayi?OwNbrIeVMNTuSby__V730{zSS%^xq8W+^K#I;_L>?n!S zj!{zQ@{_IM$bXs0lIPV_p0C&IvAP_yoiZ;fioy#LFG*375p`EBPisUicSm5-_Q_*c zcg&h++7{>gYK!)=mx)CDfjY0&ysEX%K$hELM=0_Qt;UNnfgd6&6mBo8RtG9wZw`ku z8#tg_T&-b#4!icUqhpf3W6&kI-oy%-QVY=rj3!pFbYF5S)SbP1Eyuzb@#C}-zy0VCv?Mk&BIwz*vY7%M5Sa=lvPntMRAXiPz3>) z1erY^1=}!7tKA-{qDZ81RZ2n+klE`&Hlm?<+J;hxyw5ss>&t#2wX6+dJuZ$-h>Dm> zkUvqJNGgJq8=n}@jiqFHER{<%*%4bH?YG5_xq^*J$F4T_cujL$>~Eb+q`h}KheE3m znww8G`={Evp7`+V>63=nL(J1bw=s0437RvIhRz)f;Z%F-nlO6GG0Cy6RRAl01^*A` z0T$pQh#MJZ%5=&8Sq0S~lZRl#rcB-0}HLF?~^EIoS=EKHt%yj3s zK+V||+aV_!&dO@K3t-n_#>IHNmk4DHw;kOnno zxTuI=0>cGqP-BLRiU=k!T#yDeX1J(`U;@JhX;5Q^i;4&)FkFxZHDcGqP-BLRiU=k!T#yDe zX1J(`U;@JhX;5Q^i;4&)FkFxZHDcGqP-BLRiU=k!T#yDeX1J(`U;@JhX;9F&lhdc>3J9(3MCjN{2>pGFeE*8jvVhQUhY?awA@rbq^3Z3KB=?Q! z{CKhP{U4VvZMh)afBdKQtBI5N{qvth&t6Dgd*Jc4Pd~o$+;v~wviWDv4_gtsb!!t^d?)hF VwKu=MM6M4_Pt4@sd*bkm{{iS=S#|&b literal 0 HcmV?d00001 diff --git a/src/assets/icons/loader.gif b/src/assets/icons/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a880b39992b37c4dbb53f5b28902ee5559b9166 GIT binary patch literal 8821 zcmaKxcT^K=yY^=$lLirz5JEso=tV?uTM*G5Ac0VnB1jQ1Gyz47iV%uA2?0Wn^ls>& zAfTw&6BGeO!G`D-1T26BQBhI1a(LhGd-wUib=Ep-{(IK^F>B5BT-SB~ZU;wu%MC#Q z2!Qj8z~bWKw{PD*eE9JC_3N>*vEkw2yLa#Q^z>Z0a^>vVv#qVI_4V}?6%_>q1zA~H zLZL7*G4bHRgM0Su2?+`D^YioY@NjZ+vbD9fva+(UurM|@*4EZmRaM2|Z~y=hiA3#1 z`K>I^ZFV+ptkq`bC~)ai`!~t%Kv+;rSSUR%GA4rV;JC#N(Ebjiu>c(~U3vld*S7)a zMLInvG_oq<#HpyaSGlHxF?*l$PJKxFuqc&q*`{i_eRT)=qpXe(HN`l!`n8R;#NK|N zaBaMu=VDeqINh0WC;HO!xvr$GZGU}OxO`;r!_P&8FGv=qq^60|GcvQXb8^MU^70D` zi;7E1%gQS%tBy;mYijH28ycIMPn>LNJ=NCUar#W>*>mT+E?m5H`O4L6Qd#%)8$CCB z`}%L)9=LONaOmFs2M-?&KOTAV^si^5W6#GYCSSaK^?GW0=FQu8?`J>Eef;!!{>#^I z3*UeI{QKAMMIZpCnbR2z4N$?zjVm3OEk{$$IqeeZ_2oE&txT>vS_T@EBSOXW9)3QE zU8MLp0x9fleODs{n2>=8nlQbFK7QkNx`i`E%;+?@TZu6(TX6gY!!=ATKplAq^pRbX zbJ&a+$Q=!!JlBqM-?Cc)n2DHZ+YUB+?a1r%3%2pDiTL%3=|=@dNvIJggzL`ms@M6Q z!R2~GlgaRjt6vghg`iAf{_s0z+bFLy<_^|hoaRrYLkjAq5se4JWlG161^&A21byu4E!d{iIWid^Ptm!3z zL^mm;^2ecA@N3R8*Wj=?Wwa(6ZOT8K_>F2^lmmRq4lCoWAm|Aefo1-4I}>Sc9KgCY zyYS&*b6CPa|NfQ6N6XW@?lPzbVJNhsM;sqT>sCTytwlzW)MoT1|n_Z< zJE=GsQ1Ou>S>NEHNdlho_+Gw&k+HPEbNdE;MfuR?S4F-C()YTVzKMU}M#|4$R^dl2ye02lB+Lf$tDp z%Ul28S=(mx@1)Ot^S{sB--=VX^U*1&wR7dgRmF^Pr|zfQIANG`R!TEvzNck{`?@#RD%B7Jc5B>zajuO|NEv3H*Qe_k5+=FtNJL+Cb>grcgu&x+2|Ok!N{l^75LRrje`MuhPc`NN6E>!Le)m5{+Gm!C^;NFCb4q2%L0FO=TQnr~UzfjFA+i&E zsFt9X(M1%;`*o6Slb2&UR&!+h#f{0-z6!^KGN%I$wP@xxx2MTsrbAI@!wiM7VvJ$0 z{9U5E9dT@hx$Rz%kjpWV3(0F>Jj4;^VB+Hs@>{T&rX#+c=n~Mum{L)mpbK5#TPnjs`Rzaqa-?k4pPH<+pER8@Sb{(;8-0ow# z+&X3fk=cMVTP}|X7hm$ze!kh@$)WonJEQyTa1emih(UJp)m+5Vc&2BN5)N&SV*z-d zIX)kIM8)PHyKhQ*Q#EkN`-UoHE|#S%G=Jlx3Br16ykcxquK~<#x8bX9=K@Tlm51&r zXV&FE04YS#1XhL8;GDIr?2L=e5xoK_TIEzYKhK^^auv_GJ#zJcEX5#p+@e3-=`$Uy zVHCONschT2PP;cV+p_o7mfhkR?%X z{QpGV4g4$l(jg)rfUN(WeDw;2&*seEm?GIA-!BWJ-2OTQaWf+Jy?eKVwq8LFgF*A+ zy%VFuLlAy)id~>f+F>Tl&q~i>qU`fZpiDlzz0|dmRalf?x23@jRm4Zto@}u@A;G{U zb!m?0&T+uDcA+nXDtB&U)wUjQzsQb>y~M#p?`Unx>aoMgkK_88PLFM0Z$0g02W%fK zdb5*`l_Pv5;9q>2u7}PXX!7KnyM3s-l9V#J;d@;>Lx9G-UuikiN>~nrUu6{-&1$t8 z%&%MRBW8G3W%$seJ?ZVvRUpZ*=Go~z&QOlrXGSpUOkMAy_1X)af3qo$lu&lQ&W^R8 zag_|0`N}ND*%MwTh%|MaUyMlD#|2%_GQhE$B(4?ih!uw{k-7>%xPHt3t$ z<~H0{m2po<$1mT+n$zKN06Tj~Dnlt-FzWf}<9iK-fXyBLR$Zk}AO@sT7Bn$9x&;7j z4qNTK0yIae`6N+S#-3Kh96+1Jiuus(z1m(|Z3JQ|W;T9K<3RL#hY1zMB=H31)3M3t zq6+`W+h~>_$DekP9Z{dbf`_CzbNXUO9ivm}B9dvWBph?Vs-`k%%jQNIR^5NdaHXTd zS_CEA#CR3te>P+!2=queR__-@M(QeJ-^?`TVZi^ZTrI%#A3H`bjvFp@xiVSvQkTmS zT3(I`Sf1MYA!$+WRQKTHjKgwg^4rmRRso>xtYhobyzRAL(l^DP+&St|H+tmORoe%q zYCpSo%%6OBq|I4yF&eN$V~{wLZH53h97ZRY8yld~F=#k@Rhso~14wL%$zPGFRiIa8 zni`seuBfOpOgD*x1*YzMjy9jLWY_2c=gbaUNz1w}bVyeK5Gp~q$^HC^Jm}JyvV@0g zfuV|vy=#w#6|I5pp};ZORjp}jkNfYe`{Bvw9V5&sukTTRd;c=QLUQUnx(C^J(VoDO zwpZJw%99Z%%gJh%2s7*cH}~G8AZzcsJfD${Af|SI!6N9_zgnye!Xfq<`lojpm0Pdz zjpPDT3V0&T&3Aaf5yZ3gt=-05nC^z4x*khSCR3S@Rp#` zeM^%|2O$&}WG}9pjGLQSt?AF(QXQ^6b15KcCOBY$3}B7augyss#y^d)a1req2UFl* zxF8+y`JH<&Xbh>nW^KvPPQ0AYxY|ApwdKp84mJk@k&a&vcHl{QZqEeDyxvsKBQU&5 zSJ6mh6BlK4+BQ{B9RSf3#vElc^suWNt?{x+rciDA)|An}6f*Q!bmx7xN{Y~3f0u$!76BW&O{u*PM6&C%p4^Bq!$l{%UJa=bdg?fA6lH5 zxMN3q#={5ni^I(R0lzlqJU;q{9SU$gWFI;1GismKiT=wOD1&atZ2eaBBmgyN_vx8F z`EkRjnfB|Jp+EZA&nu1wL+AF>QnPPt4z(7$@cD!ryEr~T(&$_bMo3zpXm=RTuNuz zG}wagDrGMnrc4(bqJC_0v-_rEZ)wm4%;sol-8XCw4^8SK|{~ z5rK?*Z?n70OC%NREoV8NxPXky0{5?7t;4a!DlVsb9-~)-qy*gN-Yr9)eb=GYt*3tj z;NVI|i?0KF+>9IeG#KY^`M%l?Gike;eZDh(-7md-9etPHvVK$*vP4EvsVO7|{Cei54XP72GPWGUL^Mzu z+U+(+DRbI&)rq!nI}l4$m%3|1ZbQd0^3Oh1YoZuP<(>x9A$kIt_<3>p_yH%wFKx_B`;93!;wK#&YgWr(Mhu|5kxOzvjBA>;^3 zW|roLH_eSUOVjax2H{{JWGVDF{y$yz#{Y?ZVbFwQs{nF3!AZa4*PQ%*zsVX=Cer4| zo+J0uKi_YUzG##D(JeYl;q#KB+!DgV`8$!Y43ES#kr&9NqjR}QM_E~7yIk*mIjsB& z=OdMp)VkeJ{@(0n+bU528z|2xKHU+!6)v~SV_(?aaF!W!jn|uj1o3O_fS#!1&i!^h zk894Nh8!-k!3TVB)EjlEk6$*WuO7}9hEj6u!%;KfKcrgh1| zIJcP6$LIg1t059_?^6XWI_$JSHG5<@sph{R{yK|YMkb5uC)?U~8g5?^y7FE1b&Q-m zaADh-GvzPZ_UFPJu`K$PB2Asr7c3FL1w1OPkG$%2I6u?Ia{;05OT}RoY^34|DESbI zY|fEL*g*XGLqYEu0oR3aIoZEY`l}nY&KHjAxR`XoL#I-HzE${A7Q0NDmbIMD=V1tx zyLMu!)`Bwp%A#FLnmIJ@t%cX?dP*WhJq|$Gy?gvT{$*jWGJi1r8v*?_h~5pVlbyzo zZ^gitoahSc9t{kYK+`^|Q-u`(a&QU59_urt4fhBwYqp|Ge6lx_VtiyNtG1R154>9I za12tQP9dbtxB6~EppIh(@TJv~Uuf$&^9%&7n&m)cMvo54LDcM+eS4*3NCkG`Ea{Uu zo?Skzis&Ewfs+C-$y%aMN+N4ZLA>TI$Mw+6Cm@T6L>>cBp&7yU3ep8>g}rjM6h&l6 zcQttt5r&{d@`jlT0`#{nox{7|w*DjQe|LhAB~dTQ`ahkZn_aQQciy{Y8Am-2A?Dsh z7Nz%hzf622FhB;!)iN^br5SiuUV-^kqe*v0$?&$bT+d@&TC#VU3MY5^brz{_J?HrG z{?8rZ=wTf{t@sUs!-j!OUbt?0nwiH+q1MsNT*E{y4nIpP=Wwb)$Xa3PdN^#29+J=k zTQyhcw%9ay>K|WuA=4vI=d9?@-@AMFXlO?bXS$WZbgAh~5DhL{Thb<`^9{ zEJgX|wR$qR=0+y{kHDvWA@V3W+M2~EpZ?SJeep*yL>&8!!Il!sgWdGz{FFSHWP<$U zyTF(B;$~+;xVVf}D==!38)EJ2DUo+HNj`M#osS5#Kpl%1`J00{YSWP(w+T=X@@$=^ zzV^5@S#I~q;C7;oO|dugNl;?OZ3f(yu*!|&l*~s}t&xjR#oh^rE+;&(66JXcV44Sk zxndjTbR)d&n=Nle9Y1_%ukFgVVD<&^b|7)rqO9-OX%xzAlBJrC+i zWY@$=E)GJ9fet?6iui-Iiu+Yc5*?)iT$`5I?QT+j*)%HS9EwA~G=;+tCqA#!yVwzn zGM_7h%V!>sts0uxmBX{Fj8FB)zgu}e-4L~~{-KWop|6BbwkK6Z$dglm1cfT%M4b0! z!>30N0}>$puhOpL`19$h%IS{{GU2HN}%v;U-kx)84#)f zdOlH7lsD}iEo{_lmqOq7MyNROoIzf2+hZ@eHI7~;@z>Pt|O@|D2Tg!sVF{~!n%99=^8VfsZ!?9<4Y6|v-#o43DYRjqe*XfR~ z9r@QB&<*xD6)g=7btP>6F^|AI%-aqnb~u`r=35Ol5+=X=o_kyVT~{o1j%p|jgOjCN&rg7F~ zx63JCx9W-O*d&8Ts`PD6$Reb0YQwWRk**eq)e-v7HK~FHK^Q%e`5PzK4Q>Y`M|Y$7 zM0w8jjI%?cBL10(2Lkr>gGjO*ZSq#-iejo!R)VIFsJy!E`8CxDRb@NIs-02<9o}35 zKq+z|x_|X_zrH2wEEx=Zb?d_CeCLzv(n!cSU+A^`k6%$lo9-Ehn7>7-wj2wd?QZeG!{IuSx29?FT%IqQZwuop}<;3qCqI zGwFJ8=E$cBA}us@dpVf=e*AaIiwMf}7u+&NuN?ICNipK(C8~9gu_sBFoGKy?-X~A# z0<4|tUfnd0D}>5ZfC%7|5WrJ-J5|(<^!Wmql0HgC#39Qe6O<8W66DnxIVT+8g$BoO zxXHdnyr>E>4u4&VgowkH@82R`sqhTuFIX4{o7{`!>!IW?uR(I$n5B-O^3$n8(oVTZ zN7Gty!1 z%86R>tZ695N{h0S8SerG*ur2U>#&BVraB>0=$cF~&Z1+extbbOkzI=0zA`$vY{)kvZX}}&O{H_!|*VUR;8i5 zb2!ZobBzhyVW9{VWfGpJsD43xS?1Euigv}2%s5gmC;)ZQCc;a|^liz`nG*n|L>rYV zx6BO9X_q6XCcCW$iPBt05Jy>|z_b%eg^J60+568#v6)1O4Bv2be}!Je;|gFmz-Gsv z+H3Y~Fdjl|oeHU%F+mPJWuU2NwmQ!(h%;D7=c^iV&p1LjD(`Cn@Q%VqD;WhEU8>(P zYzz|CT#+KfGBEB8Zp7)l)5JNE(h3E820s}~)N!sNRKF|%(Mx>GUvCP9m)K=0XjtA3 z@_|G-fy)vsR4Y#S=Em+NKLRm|I@4o!cAR&AfDy=R9cgb6qx$k!{5f|i1DP7CwR2!y zvdVifoD0wpdiD;EuA(VN%F(R7?>VgO#<;pE)}ZK&zvIx=--1ndjz@h6ymm#<{zTa# z4}9^Z7lE*DDgeMONI@s_MB(EQj&M3)-8TQGeqjDd@iE4hC1zEjvn4CELd8K<7Ib*= z*XdENNTdxX|8*w@j*~Y<=!YuPjnp^rHtko^H`HMPS+x=00x5}?E!9^W?^2oM7Qb{T z&zBv09Y;ygSE~6 zifo~SX&Iq3ha3`>he>006D>8?X}UUmo=LbOn2U2UD^?^sp@Z9l&#FC^xS9X;A&`kq zzQFL)_x9bv(?UaA4HIapG%7w+z)eX@H$W?8Ws_n4z8wY-dc_JjrE#Y`wM>N&k|zu? zsY`1*r$s8GQP6tr{vow>4dN4OgVnvOi>fm%(v78DBq7&g z(Oz31cR3t96uNAWvdI zf@mXfz!3=a`5KOwt~}0d(JNtHZ#f7JtT`~x{>&G|?4-{J5g)KJJVM}s1Na972&)n4 zWK_aoSi`S)qE8T`$-MaNtSKUS7$U@AiC>;on=zb=F<+mQJy8zrF$lj$zI13!O^`LWXRRgk{AfiCZ32`1+f0m0A0*KU>k5l-Dbj!X?oHszkxD?nx* zH2u<+bEC^3Onb=f)V-Fcop|p82glyu`q~O!i2v~QSNYjJqur_x4WbSA-dhzBFq!?X z?c$d=Nu_(Pq3I!E?{_^2si)WY2bhA=p`q=S^16crf}E%u@HD7Q{BF`|I-$N@v~qg_4oVw+ZQc%Kaxo4B60hDOFfP=@hk=?rhqLwkzZl4*b792jtpF9-j74p}pyUw4sCm!o* zDlPjwkhje$o#X0$t|UzL&m)$$#V$vl^kjyLefv@dRJo%Kxw1Pio8&S<$Lcujn?|gm#H(HPlfPC|R7lJh>c-Cs7=Gfb48`C1EI%hK_ z|4=tn8R7hBag;6AtNeYm?=un)) zQn=Ttr54y>h~yR$4q#Pf*rP~V8k!pFa!q!yLQ9L{0p@856O>c!x}bXF3M5w|lW(`X znR!)7OY?$O;}tupj0pFn_u7Jl_cGr0|s1gd9cn`b0;MgwC%BZ|ALRzAp1Bub0PGVC z_3zffCvR6>8#}be^KoIv(<9p+Qs{hVR;q+jv7nzD>pCaQh}>&Lst8^8MTG?%+3-=K z#dDw`LG-g4AYjp&a=udFYKiOi!JeL|$t-mF_}s@7|cVXMLdOAQMBkP8NR zKXATP6`QR3LYBw$+G5`wj`5#2A|^R20dw6jywKQ)MnJ_~ zWV06(QTz5EWaEh>5@CBH6D_~A@WLgqxM4yThODAOrQox&bH(zRg~|4if(osbimPVI ziN$!(zUTl8z)@(bsx(Rm6W1xmbT#cJUX!ZqykU2yQx0k@X5p3Z(#ZFj*jh2RfPSHb zjwX$^jWhAR@_f5#JCHyfof!u)F9-&Yc3`@t!f56DdhYjA9j*Q3Js^!EoH zCx|%{3Poiz!Y~?ArdJp}9uPc); zZ?!l3efbZ0p{#hVrO~)@X7I(wUvVSc`0FryRt9$ktfvajl}?d#Rjrp{vb95A Date: Wed, 20 Jan 2021 13:53:39 +0530 Subject: [PATCH 6/6] Model Micro App added Category --- src/constants/apps.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/constants/apps.js b/src/constants/apps.js index 94898b4..b18c470 100644 --- a/src/constants/apps.js +++ b/src/constants/apps.js @@ -277,6 +277,12 @@ export const APP_CATEGORIES = [ path: "/micro-frontends-angular-route", menu: [], }, + { + title: "Model", + icon: appReactIcon, + path: "/model", + menu: [], + }, ], }, ];