From 4096b036947000599ad4bc6722f9b9e5e1e239de Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Fri, 19 Mar 2021 00:31:47 +0100 Subject: [PATCH 01/29] feat(apikey): frontend for api key generation (#454) * feat: implement GUI for generating apikey * fix(apikey): handle loading state, cleanup * fix: copy-to-clipboard button * fix: cleanup * fix: return createdAt from get-endpoint * fix: add warning prop to Noteblock * fix(apikey): minor fixes, use warning background --- client/package.json | 1 + client/src/api/AppHubAPI.js | 2 +- client/src/api/api.js | 26 +++- client/src/components/user/ApiKey.jsx | 174 ++++++++++++++++++++++ client/src/components/user/UserView.jsx | 15 ++ client/src/components/utils/NoteBlock.jsx | 37 +++-- server/src/routes/v2/apikey.js | 2 +- server/src/services/apiKey.js | 2 +- yarn.lock | 5 + 9 files changed, 249 insertions(+), 15 deletions(-) create mode 100644 client/src/components/user/ApiKey.jsx diff --git a/client/package.json b/client/package.json index 431ed7eeb..dab9e10f4 100644 --- a/client/package.json +++ b/client/package.json @@ -15,6 +15,7 @@ "dependencies": { "@auth0/auth0-react": "^1.2.0", "classnames": "^2.2.5", + "copy-text-to-clipboard": "^3.0.1", "core-js": "^3.4.8", "css-loader": "^0.26.1", "debug": "^4.1.1", diff --git a/client/src/api/AppHubAPI.js b/client/src/api/AppHubAPI.js index 8c054404b..39450acf2 100644 --- a/client/src/api/AppHubAPI.js +++ b/client/src/api/AppHubAPI.js @@ -52,7 +52,7 @@ export default class AppHubAPI { const baseUrl = external ? '' : this.apiUrl let url = joinUrlPath(baseUrl, path) - if (Object.keys(params).length > 0) { + if (params && Object.keys(params).length > 0) { url = `${url}?${queryParametersToQueryString(params)}` } diff --git a/client/src/api/api.js b/client/src/api/api.js index 0565e2d7d..092d815d3 100644 --- a/client/src/api/api.js +++ b/client/src/api/api.js @@ -31,8 +31,10 @@ export const apiV2 = new AppHubAPI({ auth: Auth, }) -export const useQuery = (url, params) => - useSWR([url, params], (url, params) => apiV2.request(url, { params })) +export const useQuery = (url, params, requestOpts) => + useSWR([url, params, requestOpts], (url, params, requestOpts) => + apiV2.request(url, { ...requestOpts, params }) + ) export function getAllApps() { return fromApi('v1/apps/all', true) @@ -295,3 +297,23 @@ export function editOrganisation(id, { name, owner, email }) { } ) } + +export function generateApiKey() { + return apiV2.request( + 'key', + { useAuth: true }, + { + method: 'POST', + } + ) +} + +export function deleteApiKey() { + return apiV2.request( + 'key', + { useAuth: true }, + { + method: 'DELETE', + } + ) +} diff --git a/client/src/components/user/ApiKey.jsx b/client/src/components/user/ApiKey.jsx new file mode 100644 index 000000000..d362fb98a --- /dev/null +++ b/client/src/components/user/ApiKey.jsx @@ -0,0 +1,174 @@ +import React, { useState } from 'react' +import { Card, CardText } from 'material-ui/Card' +import Button from 'material-ui/RaisedButton' +import FlatButton from 'material-ui/FlatButton' +import FontIcon from 'material-ui/FontIcon' +import IconButton from 'material-ui/IconButton' +import SubHeader from '../header/SubHeader' +import { useQuery, deleteApiKey, generateApiKey } from '../../api/api' +import NoteBlock from '../utils/NoteBlock' +import Spinner from '../utils/Spinner' +import copyToClipboard from 'copy-text-to-clipboard' + +const requestOpts = { + useAuth: true, +} + +const styles = { + flexCenterDiv: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: '5px', + }, +} + +const ApiKeyView = () => { + return ( +
+ + + +

+ An API key can be used to upload new app versions + through the App Hub API. This can be useful in continous + integration workflows. +

+ +
+
+
+ ) +} + +const GenerateApiKey = props => { + return ( +
+ API keys should be kept confidential} + > + Treat API-keys as passwords, they can be used to upload + arbitrary apps to your organisations. + +
+ No API key active +
+
+ ) +} + +const ApiKeyDisplay = ({ createdAt, onDelete, apiKey, isUpdating }) => { + const handleCopyToClipboard = () => { + copyToClipboard(apiKey) + } + + return ( +
+ {!apiKey && ( + + If you suspect your key is compromised or you lost it, you + can delete it and generate a new one. Be aware that any + scripts or applications using the API key will need to be + updated. + + )} +
+ {apiKey && ( +
+ API key generated} + icon="check_circle" + > + Make sure to copy your new API key below. You won’t + be able to see it again! +
+ {apiKey} + + + content_paste + + +
+
+
+ )} +
+ API is key active. API key was generated at{' '} + {new Date(createdAt).toLocaleString()} + : null} + disabled={isUpdating} + /> +
+
+
+ ) +} + +const ApiKeyStatus = () => { + const [apiKey, setApiKey] = useState(null) + const [isUpdating, setIsUpdating] = useState(false) + const { data, error, mutate } = useQuery('key', null, requestOpts) + + const handleDeleteKey = async () => { + setIsUpdating(true) + await deleteApiKey() + setIsUpdating(false) + mutate({ hasApiKey: false, createdAt: undefined }) + } + + const handleGenerateKey = async () => { + try { + setIsUpdating(true) + const { apiKey } = await generateApiKey() + setIsUpdating(false) + setApiKey(apiKey) + mutate({ hasApiKey: true, createdAt: new Date() }, false) + } catch (e) { + console.error(e) + //TODO: show snackbar? + } + } + + if (error) { + return 'Failed to load API-key status' + } + if (!data) { + return + } + + return data.hasApiKey ? ( + + ) : ( + + ) +} + +export default ApiKeyView diff --git a/client/src/components/user/UserView.jsx b/client/src/components/user/UserView.jsx index 2d50f702c..078a7484c 100644 --- a/client/src/components/user/UserView.jsx +++ b/client/src/components/user/UserView.jsx @@ -16,6 +16,7 @@ import ErrorOrLoading from '../utils/ErrorOrLoading' import ActiveLink from '../utils/ActiveLink' import OrganisationList from './organisation/OrganisationList' import OrganisationView from './organisation/OrganisationView' +import ApiKeyView from './ApiKey' import { ListItemLogoutButton } from '../auth/LogoutButton' class UserView extends Component { @@ -51,6 +52,10 @@ class UserView extends Component { path={`${this.props.match.url}/organisations/:slug`} component={OrganisationView} /> + {/* No-match route - redirect to index */} } /> @@ -109,6 +114,16 @@ class UserView extends Component { } /> + + + vpn_key + + } + /> + diff --git a/client/src/components/utils/NoteBlock.jsx b/client/src/components/utils/NoteBlock.jsx index a1f4af9f7..434f4dfb1 100644 --- a/client/src/components/utils/NoteBlock.jsx +++ b/client/src/components/utils/NoteBlock.jsx @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import React, { Component } from 'react' +import React from 'react' import FontIcon from 'material-ui/FontIcon' const styles = { @@ -8,39 +8,56 @@ const styles = { margin: 0, border: '1px solid #d3e9fc', borderRadius: '3px', - padding: '8px' + padding: '8px', }, blockQuoteContainer: { - // lineHeight: '1.2rem', + // lineHeight: '1.2rem', marginTop: 0, }, iconHeader: { display: 'flex', - alignItems: 'center' + alignItems: 'center', }, iconStyle: { fontSize: '24px', padding: '4px', - marginRight: '8px' + marginRight: '8px', + }, + warningContainerStyle: { + backgroundColor: '#ffecb3', + border: '1px solid #ffe082', + }, + criticalContainerStyle: { + backgroundColor: '#e57373', + border: '1px solid #f44336', }, } export const NoteBlock = props => ( -
+
- info_outline + {props.icon || 'info_outline'} {props.header || Note}
-
- {props.children} -
+
+ {props.children} +
) NoteBlock.propTypes = { children: PropTypes.node, header: PropTypes.node, + icon: PropTypes.string, + warning: PropTypes.bool, } export default NoteBlock diff --git a/server/src/routes/v2/apikey.js b/server/src/routes/v2/apikey.js index 9d50b3aea..379546d3d 100644 --- a/server/src/routes/v2/apikey.js +++ b/server/src/routes/v2/apikey.js @@ -17,6 +17,7 @@ module.exports = [ return { hasApiKey: !!apiKey, + createdAt: apiKey && apiKey.created_at, } }, }, @@ -30,7 +31,6 @@ module.exports = [ handler: async (request, h) => { const { db } = h.context const { id: userId } = await getCurrentUserFromRequest(request, db) - const apiKey = await ApiKey.createApiKeyForUser(userId, db) return { apiKey, diff --git a/server/src/services/apiKey.js b/server/src/services/apiKey.js index c22924bc7..d2d8a30cc 100644 --- a/server/src/services/apiKey.js +++ b/server/src/services/apiKey.js @@ -50,7 +50,7 @@ const getUserIdByApiKey = async (apiKey, knex) => { const getApiKeyByUserId = async (userId, knex) => { return knex(userApiKeyTable) - .select('hashed_api_key') + .select('hashed_api_key', 'created_at') .where({ user_id: userId, }) diff --git a/yarn.lock b/yarn.lock index 3961b9101..4c6c762a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3815,6 +3815,11 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-text-to-clipboard@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" + integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== + copy-webpack-plugin@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" From 64306de88f598b3e8161986a4a1efb518eaf3be0 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Thu, 18 Mar 2021 23:41:54 +0000 Subject: [PATCH 02/29] chore(release): cut 2.15.0 [skip ci] # [2.15.0](https://github.com/dhis2/app-hub/compare/v2.14.0...v2.15.0) (2021-03-18) ### Features * **apikey:** frontend for api key generation ([#454](https://github.com/dhis2/app-hub/issues/454)) ([4096b03](https://github.com/dhis2/app-hub/commit/4096b036947000599ad4bc6722f9b9e5e1e239de)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0c82b333..015da31df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.15.0](https://github.com/dhis2/app-hub/compare/v2.14.0...v2.15.0) (2021-03-18) + + +### Features + +* **apikey:** frontend for api key generation ([#454](https://github.com/dhis2/app-hub/issues/454)) ([4096b03](https://github.com/dhis2/app-hub/commit/4096b036947000599ad4bc6722f9b9e5e1e239de)) + # [2.14.0](https://github.com/dhis2/app-hub/compare/v2.13.1...v2.14.0) (2021-03-12) diff --git a/client/package.json b/client/package.json index dab9e10f4..21544fe33 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.14.0", + "version": "2.15.0", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index a87a2b0ba..d64cae97c 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.14.0" + "version": "2.15.0" } diff --git a/server/package.json b/server/package.json index 50c80a3b2..b19590676 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.14.0", + "version": "2.15.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index a872e40f6..2ac4c328a 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.14.0", + "version": "2.15.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From b5e8aaeae5512b1cbf324d436af0baaed431faf4 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Mon, 22 Mar 2021 12:41:43 +0100 Subject: [PATCH 03/29] feat: add env-var for skipping db-migration (#455) --- server/src/server/migrate-database.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/src/server/migrate-database.js b/server/src/server/migrate-database.js index bd2a064ec..25ddb9872 100644 --- a/server/src/server/migrate-database.js +++ b/server/src/server/migrate-database.js @@ -1,5 +1,9 @@ const debug = require('debug')('apphub:server:boot:database') exports.migrate = async knex => { + if (process.env.SKIP_MIGRATION === 'true') { + debug('SKIP_MIGRATION=true, skipping database migration') + return false + } debug('Running database migrations...') return knex.migrate.latest() } From 5c5deaa972ace86ec75ad94a4741f581b4ca11fa Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Mon, 22 Mar 2021 11:51:25 +0000 Subject: [PATCH 04/29] chore(release): cut 2.16.0 [skip ci] # [2.16.0](https://github.com/dhis2/app-hub/compare/v2.15.0...v2.16.0) (2021-03-22) ### Features * add env-var for skipping db-migration ([#455](https://github.com/dhis2/app-hub/issues/455)) ([b5e8aae](https://github.com/dhis2/app-hub/commit/b5e8aaeae5512b1cbf324d436af0baaed431faf4)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 015da31df..f237a28fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.16.0](https://github.com/dhis2/app-hub/compare/v2.15.0...v2.16.0) (2021-03-22) + + +### Features + +* add env-var for skipping db-migration ([#455](https://github.com/dhis2/app-hub/issues/455)) ([b5e8aae](https://github.com/dhis2/app-hub/commit/b5e8aaeae5512b1cbf324d436af0baaed431faf4)) + # [2.15.0](https://github.com/dhis2/app-hub/compare/v2.14.0...v2.15.0) (2021-03-18) diff --git a/client/package.json b/client/package.json index 21544fe33..b1af64e92 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.15.0", + "version": "2.16.0", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index d64cae97c..0a0903fff 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.15.0" + "version": "2.16.0" } diff --git a/server/package.json b/server/package.json index b19590676..d5843a90b 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.15.0", + "version": "2.16.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 2ac4c328a..f9a4277b6 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.15.0", + "version": "2.16.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 389005710a4fd32632ec66ea154083e52fe65e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Tue, 6 Apr 2021 14:43:30 +0100 Subject: [PATCH 05/29] fix: show query in input when returning from search result (#456) --- client/src/components/apps/Apps.jsx | 1 + client/src/components/apps/Filters.jsx | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/client/src/components/apps/Apps.jsx b/client/src/components/apps/Apps.jsx index 2948d6de4..776c12d2d 100644 --- a/client/src/components/apps/Apps.jsx +++ b/client/src/components/apps/Apps.jsx @@ -75,6 +75,7 @@ const Apps = () => { types={config.ui.appTypeToDisplayName} typesFilter={types} onTypesFilterChange={setTypes} + query={query} onQueryChange={setQuery} /> diff --git a/client/src/components/apps/Filters.jsx b/client/src/components/apps/Filters.jsx index 9891712c1..8120f3c19 100644 --- a/client/src/components/apps/Filters.jsx +++ b/client/src/components/apps/Filters.jsx @@ -50,14 +50,19 @@ ToggleList.propTypes = { onChange: PropTypes.func.isRequired, } -const SearchField = ({ onChange }) => { +const SearchField = ({ initialValue, onChange }) => { + const [value, setValue] = useState(initialValue) const debouncedOnChange = useCallback(debounce(onChange, 300), [onChange]) - const handleChange = (_, value) => debouncedOnChange(value) - return + const handleChange = (_, value) => { + setValue(value) + debouncedOnChange(value) + } + return } SearchField.propTypes = { onChange: PropTypes.func.isRequired, + initialValue: PropTypes.string, } const Filters = ({ @@ -67,6 +72,7 @@ const Filters = ({ types, typesFilter, onTypesFilterChange, + query, onQueryChange, }) => { const [show, setShow] = useState(false) @@ -80,7 +86,7 @@ const Filters = ({ return ( - + @@ -124,6 +130,7 @@ Filters.propTypes = { onChannelsFilterChange: PropTypes.func.isRequired, onQueryChange: PropTypes.func.isRequired, onTypesFilterChange: PropTypes.func.isRequired, + query: PropTypes.string, } export default Filters From 1c901826a1ab011ddc393741c7e25c74b1ff14fe Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 6 Apr 2021 13:54:33 +0000 Subject: [PATCH 06/29] chore(release): cut 2.16.1 [skip ci] ## [2.16.1](https://github.com/dhis2/app-hub/compare/v2.16.0...v2.16.1) (2021-04-06) ### Bug Fixes * show query in input when returning from search result ([#456](https://github.com/dhis2/app-hub/issues/456)) ([3890057](https://github.com/dhis2/app-hub/commit/389005710a4fd32632ec66ea154083e52fe65e1f)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f237a28fd..6c7b28002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [2.16.1](https://github.com/dhis2/app-hub/compare/v2.16.0...v2.16.1) (2021-04-06) + + +### Bug Fixes + +* show query in input when returning from search result ([#456](https://github.com/dhis2/app-hub/issues/456)) ([3890057](https://github.com/dhis2/app-hub/commit/389005710a4fd32632ec66ea154083e52fe65e1f)) + # [2.16.0](https://github.com/dhis2/app-hub/compare/v2.15.0...v2.16.0) (2021-03-22) diff --git a/client/package.json b/client/package.json index b1af64e92..4044ac12a 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.16.0", + "version": "2.16.1", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index 0a0903fff..6a3580f1a 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.16.0" + "version": "2.16.1" } diff --git a/server/package.json b/server/package.json index d5843a90b..cc9523831 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.16.0", + "version": "2.16.1", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index f9a4277b6..3016ba449 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.16.0", + "version": "2.16.1", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 0e8fba33ec6c1ce92eb72a51901ad22bca80b452 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Thu, 15 Apr 2021 13:21:39 +0200 Subject: [PATCH 07/29] feat: validate mimetypes (#461) * feat: validate mimetypes * fix: validate mimeType when uploading images --- .../v1/apps/handlers/uploadImageToApp.js | 3 +- server/src/utils/validateMime.js | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 server/src/utils/validateMime.js diff --git a/server/src/routes/v1/apps/handlers/uploadImageToApp.js b/server/src/routes/v1/apps/handlers/uploadImageToApp.js index 9ac7cdeec..b27e37911 100644 --- a/server/src/routes/v1/apps/handlers/uploadImageToApp.js +++ b/server/src/routes/v1/apps/handlers/uploadImageToApp.js @@ -9,8 +9,8 @@ const { getCurrentUserFromRequest, currentUserIsManager, } = require('../../../../security') - const { addAppMedia, getOrganisationAppsByUserId } = require('../../../../data') +const { validateImageMetadata } = require('../../../../utils/validateMime') module.exports = { method: 'POST', @@ -60,6 +60,7 @@ module.exports = { const imageFile = request.payload.file const imageFileMetadata = imageFile.hapi + validateImageMetadata(request.server.mime, imageFileMetadata) const trx = await knex.transaction() diff --git a/server/src/utils/validateMime.js b/server/src/utils/validateMime.js new file mode 100644 index 000000000..d6a51dc4b --- /dev/null +++ b/server/src/utils/validateMime.js @@ -0,0 +1,37 @@ +const Boom = require('@hapi/boom') +const Joi = require('@hapi/joi') +const Path = require('path') + +const allowedImageMimeTypes = ['image/jpeg', 'image/png', 'image/svg+xml'] +const imageMetadataSchema = Joi.object({ + headers: Joi.object({ + 'content-type': Joi.string().valid(...allowedImageMimeTypes), + }).unknown(), + filename: Joi.string(), +}).unknown() + +const validateImageMetadata = (mimos, imageMetadata) => { + Joi.assert(imageMetadata, imageMetadataSchema) + return validateExtensionForMimeType( + mimos, + imageMetadata.filename, + allowedImageMimeTypes + ) +} + +const validateExtensionForMimeType = (mimos, filePath, mimeTypes) => { + if (!Array.isArray(mimeTypes)) { + mimeTypes = [mimeTypes] + } + const ext = Path.extname(filePath).substring(1) + const mimeExtensions = mimeTypes.flatMap(t => mimos.type(t).extensions) + if (mimeExtensions.includes(ext)) { + return true + } + throw Boom.badRequest(`File extension must be one of [${mimeExtensions}]`) +} + +module.exports = { + validateImageMetadata, + validateExtensionForMimeType, +} From 07d37d2d707afeb17180e7b37cc02c96c88fefc6 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Thu, 15 Apr 2021 11:32:59 +0000 Subject: [PATCH 08/29] chore(release): cut 2.17.0 [skip ci] # [2.17.0](https://github.com/dhis2/app-hub/compare/v2.16.1...v2.17.0) (2021-04-15) ### Features * validate mimetypes ([#461](https://github.com/dhis2/app-hub/issues/461)) ([0e8fba3](https://github.com/dhis2/app-hub/commit/0e8fba33ec6c1ce92eb72a51901ad22bca80b452)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c7b28002..001a2e094 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.17.0](https://github.com/dhis2/app-hub/compare/v2.16.1...v2.17.0) (2021-04-15) + + +### Features + +* validate mimetypes ([#461](https://github.com/dhis2/app-hub/issues/461)) ([0e8fba3](https://github.com/dhis2/app-hub/commit/0e8fba33ec6c1ce92eb72a51901ad22bca80b452)) + ## [2.16.1](https://github.com/dhis2/app-hub/compare/v2.16.0...v2.16.1) (2021-04-06) diff --git a/client/package.json b/client/package.json index 4044ac12a..fd37830be 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.16.1", + "version": "2.17.0", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index 6a3580f1a..bdf5c77ad 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.16.1" + "version": "2.17.0" } diff --git a/server/package.json b/server/package.json index cc9523831..a1918c7a7 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.16.1", + "version": "2.17.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 3016ba449..14bc70a61 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.16.1", + "version": "2.17.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 9059307ececc7da600f0fd8a34a0b10afa952772 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Tue, 20 Apr 2021 11:37:24 +0200 Subject: [PATCH 09/29] fix: remove debug lines that spam logs (#460) --- server/src/utils/filters.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/src/utils/filters.js b/server/src/utils/filters.js index d842b4eaf..f8f522253 100644 --- a/server/src/utils/filters.js +++ b/server/src/utils/filters.js @@ -13,19 +13,15 @@ const filterAppsBySpecificDhis2Version = (apps, dhis2Version) => { const filteredApps = [] const dhis2Semver = semver.coerce(dhis2Version) - debug('dhis2Semver', dhis2Semver) for (let i = 0, n = apps.length; i < n; ++i) { const appRow = apps[i] const maxVersion = semver.coerce(appRow.max_dhis2_version) - debug('maxVersion', maxVersion) const maxVersionValid = semver.valid(maxVersion) - debug('maxVersionValid', maxVersionValid) const minVersion = semver.coerce(appRow.min_dhis2_version) - debug('minVersion', minVersion) if (maxVersionValid) { const maxPatch = maxVersion.patch === 0 ? '*' : maxVersion.patch From 5e9bf00821460d99dc66dc9bb50688f3fe3e984a Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 20 Apr 2021 09:46:21 +0000 Subject: [PATCH 10/29] chore(release): cut 2.17.1 [skip ci] ## [2.17.1](https://github.com/dhis2/app-hub/compare/v2.17.0...v2.17.1) (2021-04-20) ### Bug Fixes * remove debug lines that spam logs ([#460](https://github.com/dhis2/app-hub/issues/460)) ([9059307](https://github.com/dhis2/app-hub/commit/9059307ececc7da600f0fd8a34a0b10afa952772)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 001a2e094..615069b42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [2.17.1](https://github.com/dhis2/app-hub/compare/v2.17.0...v2.17.1) (2021-04-20) + + +### Bug Fixes + +* remove debug lines that spam logs ([#460](https://github.com/dhis2/app-hub/issues/460)) ([9059307](https://github.com/dhis2/app-hub/commit/9059307ececc7da600f0fd8a34a0b10afa952772)) + # [2.17.0](https://github.com/dhis2/app-hub/compare/v2.16.1...v2.17.0) (2021-04-15) diff --git a/client/package.json b/client/package.json index fd37830be..b4d5417f6 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.17.0", + "version": "2.17.1", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index bdf5c77ad..8f8d61642 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.17.0" + "version": "2.17.1" } diff --git a/server/package.json b/server/package.json index a1918c7a7..521eaec81 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.17.0", + "version": "2.17.1", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 14bc70a61..59c908b92 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.17.0", + "version": "2.17.1", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 4cc9e4491e743336fa78342f8b0e4102bc553176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Fri, 30 Apr 2021 10:15:12 +0100 Subject: [PATCH 11/29] feat: backend changes required by redesign (#467) * fix(server): only accept http and https links for source code urls * feat: add v2 create app handler * refactor: simplify v2 create app handler * refactor: create apps service * refactor: move create app handler back to v1 * feat: add mime type validation to create app handler * fix: move v1 create app tests * fix: update yarn.lock * fix: use transaction for v2 app handler * fix: use Joi to verify source URLs * fix: update client usage of createApp * fix: update client usage of createApp * fix: update upload app form to match updated V1 API * fix: typo --- client/src/actions/epics.js | 5 +- client/src/api/api.js | 29 +- .../components/form/UploadAppFormStepper.jsx | 80 ++-- .../form/helpers/OrganisationSelectorField.js | 2 +- server/package.json | 6 +- server/seeds/02_app.js | 13 +- server/src/data/updateApp.js | 5 +- server/src/models/v1/in/CreateAppModel.js | 42 +- server/src/models/v2/in/CreateAppModel.js | 19 + .../src/routes/v1/apps/handlers/createApp.js | 364 ++++-------------- server/src/routes/v2/apps.js | 116 +++++- server/src/services/app.js | 104 +++++ server/src/services/index.js | 1 + server/test/routes/createApp.js | 157 ++++---- server/test/routes/deleteApp.js | 77 ++-- server/test/routes/sample-app.js | 20 + server/test/routes/v2/apps.js | 73 ++++ server/test/sample-app-logo.png | Bin 0 -> 7614 bytes yarn.lock | 302 +++------------ 19 files changed, 625 insertions(+), 790 deletions(-) create mode 100644 server/src/models/v2/in/CreateAppModel.js create mode 100644 server/src/services/app.js create mode 100644 server/test/routes/sample-app.js create mode 100644 server/test/routes/v2/apps.js create mode 100644 server/test/sample-app-logo.png diff --git a/client/src/actions/epics.js b/client/src/actions/epics.js index cbc10734b..42a5fd079 100644 --- a/client/src/actions/epics.js +++ b/client/src/actions/epics.js @@ -160,7 +160,10 @@ const newApp = action$ => ofType(actions.APP_ADD), concatMap(action => { return api - .createApp(action.payload) + .createApp({ + ...action.payload, + logo: action.payload.image, + }) .catch(response => { if (response.status === 400) { return response.json() diff --git a/client/src/api/api.js b/client/src/api/api.js index 092d815d3..5ed4fd8cb 100644 --- a/client/src/api/api.js +++ b/client/src/api/api.js @@ -60,8 +60,16 @@ export function setAppApproval(appId, status) { ) } -export function createApp(payload) { - return fromApi('v1/apps', true, createAppUploadOptions(payload)) +export function createApp({ file, logo, app }) { + const form = new FormData() + form.append('file', file, file.name) + form.append('app', JSON.stringify(app)) + form.append('logo', logo, logo.name) + + return fromApi('v1/apps', true, { + method: 'POST', + body: form, + }) } export function createNewVersion(appId, payload) { @@ -149,23 +157,6 @@ export async function getAuthHeaders() { return headers } -export function createAppUploadOptions(data) { - const fileInput = data.file - const imageInput = data.image - const form = new FormData() - form.append('file', fileInput, fileInput.name) - form.append('app', JSON.stringify(data.app)) - if (imageInput && imageInput.name) { - form.append('imageFile', imageInput, imageInput.name) - } - - const fetchOptions = { - method: 'POST', - body: form, - } - return fetchOptions -} - /** * * @param data - An object containing the data to create optiosn for diff --git a/client/src/components/form/UploadAppFormStepper.jsx b/client/src/components/form/UploadAppFormStepper.jsx index dd14ec7b4..0fddc6ad8 100644 --- a/client/src/components/form/UploadAppFormStepper.jsx +++ b/client/src/components/form/UploadAppFormStepper.jsx @@ -1,5 +1,5 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; +import PropTypes from 'prop-types' +import React, { Component } from 'react' import { connect } from 'react-redux' import config from '../../../config' import MenuItem from 'material-ui/MenuItem' @@ -19,24 +19,26 @@ import * as userSelectors from '../../selectors/userSelectors' import ErrorOrLoading from '../utils/ErrorOrLoading' import DHISVersionItems from '../appVersion/VersionItems' +const { appChannelToDisplayName, appTypeToDisplayName } = config.ui + const FORM_NAME = 'uploadAppForm' -const appTypes = Object.keys(config.ui.appTypeToDisplayName).map(key => ({ +const appTypes = Object.keys(appTypeToDisplayName).map(key => ({ value: key, - label: config.ui.appTypeToDisplayName[key], + label: appTypeToDisplayName[key], })) const requiredFields = { - general: ['appName', 'appType'], + general: ['appName', 'description', 'appType', 'sourceUrl'], version: ['file', 'version', 'channel', 'minVer', 'maxVer'], - developer: ['developerName', 'developerEmail', 'developerOrg'], - image: [], + developer: ['developerName', 'developerEmail', 'developerOrgId'], + image: ['image'], } const varCharFields = { general: ['appName', 'appType', 'sourceUrl'], version: ['version'], - developer: ['developerName', 'developerEmail', 'developerOrg'], - image: ['imageCaption', 'imageDescription'], + developer: ['developerName', 'developerEmail', 'developerOrgId'], + image: [], } const validateSection = (values, section) => { @@ -105,13 +107,13 @@ const AppGeneralSection = props => { fullWidth multiLine rows={1} - label="App Description" + label="App Description *" /> { )) return ( @@ -224,7 +226,7 @@ const AppDeveloperSection = props => { label="Developer Email *" /> { name="image" component={formUtils.renderUploadField} accept="image/*" - label="Upload logo" + label="Upload logo *" validate={validateImageFile} id="imageFile" />
- -
- -
) } @@ -309,34 +297,26 @@ class UploadAppFormStepper extends Component { developer: { name: values.developer.developerName, email: values.developer.developerEmail, - address: values.developer.developerAddress || '', - organisation: values.developer.developerOrg, + organisationId: values.developer.developerOrgId, + }, + version: { + version: values.version.version, + minDhisVersion: values.version.minVer, + maxDhisVersion: values.version.maxVer, + demoUrl: values.version.demoUrl, + channel: values.version.channel, }, - versions: [ - { - version: values.version.version, - minDhisVersion: values.version.minVer, - maxDhisVersion: values.version.maxVer, - demoUrl: values.version.demoUrl, - channel: values.version.channel, - }, - ], - images: [ - { - caption: values.image ? values.image.imageCaption : '', - description: values.image - ? values.image.imageDescription - : '', - }, - ], } + const imageFile = values.image && values.image.image ? values.image.image[0] : null - - data.images = imageFile ? data.images : [] const appFile = values.version.file[0] - this.props.submitted({ data, file: appFile, image: imageFile }) + this.props.submitted({ + data, + file: appFile, + image: imageFile, + }) } render() { diff --git a/client/src/components/form/helpers/OrganisationSelectorField.js b/client/src/components/form/helpers/OrganisationSelectorField.js index 10972613a..a99711918 100644 --- a/client/src/components/form/helpers/OrganisationSelectorField.js +++ b/client/src/components/form/helpers/OrganisationSelectorField.js @@ -68,7 +68,7 @@ class OrganisationSelectorField extends Component { {organisations.map(org => ( ))} diff --git a/server/package.json b/server/package.json index 521eaec81..38e961778 100644 --- a/server/package.json +++ b/server/package.json @@ -36,8 +36,8 @@ "hapi-auth-jwt2": "^10.2.0", "hapi-pino": "^6.3.0", "hapi-swagger": "^12.0.0", - "knex": "^0.21.17", "jwks-rsa": "^1.12.2", + "knex": "^0.21.17", "pg": "^8.4.1", "rimraf": "^3.0.1", "semver": "^7.3.2", @@ -49,10 +49,12 @@ "@hapi/lab": "^20.4.0", "eslint-config-hapi": "^12.0.0", "eslint-plugin-hapi": "^4.1.0", + "form-data": "^4.0.0", "mock-knex": "^0.4.4", "mock-local-storage": "^1.1.8", "nodemon": "^1.19.2", "request-promise": "^4.2.5", - "sinon": "^9.2.1" + "sinon": "^9.2.1", + "stream-to-promise": "^3.0.0" } } diff --git a/server/seeds/02_app.js b/server/seeds/02_app.js index d6c9a184d..ebc6a0758 100644 --- a/server/seeds/02_app.js +++ b/server/seeds/02_app.js @@ -1,13 +1,10 @@ const { AppStatus } = require('../src/enums') - +const { flatten } = require('../src/utils') +const users = require('././mock/users') const apps = require('./mock/apps') const appVersions = require('./mock/appversions') const appVersionsLocalised = require('./mock/appversions_localized') -const { flatten } = require('../src/utils') - -const users = require('././mock/users') - const statuses = [ { id: 'e900f977-9b5d-496d-9576-cc704359bde1', @@ -53,7 +50,7 @@ exports.seed = async knex => { await knex('app').del() await knex('app').insert(apps) - console.log('Seeding app statuses:'.statuses) + // console.log('Seeding app statuses:', statuses) await knex('app_status').del() await knex('app_status').insert(statuses) @@ -63,9 +60,9 @@ exports.seed = async knex => { console.log('Seeding appversions') - console.log(appVersions) + // console.log(appVersions) await knex('app_version').insert(flatten(appVersions)) - console.log(appVersionsLocalised) + // console.log(appVersionsLocalised) await knex('app_version_localised').insert(flatten(appVersionsLocalised)) } diff --git a/server/src/data/updateApp.js b/server/src/data/updateApp.js index e7ceff43e..3524a7c5f 100644 --- a/server/src/data/updateApp.js +++ b/server/src/data/updateApp.js @@ -20,7 +20,10 @@ const paramsSchema = joi sourceUrl: joi .string() .allow('') - .max(500), + .max(500) + .uri({ + scheme: ['http', 'https'], + }), languageCode: joi .string() .max(2) diff --git a/server/src/models/v1/in/CreateAppModel.js b/server/src/models/v1/in/CreateAppModel.js index 6291d8727..122790185 100644 --- a/server/src/models/v1/in/CreateAppModel.js +++ b/server/src/models/v1/in/CreateAppModel.js @@ -1,50 +1,30 @@ const Joi = require('@hapi/joi') -const { isSemver } = require('../../helpers') - const { AppTypes } = require('../../../enums') +const { isSemver } = require('../../helpers') const CreateModelAppData = Joi.object().keys({ name: Joi.string(), - description: Joi.string().allow(''), + description: Joi.string(), appType: Joi.string().valid(...AppTypes), - sourceUrl: Joi.string() - .uri() - .allow(''), + sourceUrl: Joi.string().uri(), developer: Joi.object().keys({ name: Joi.string(), email: Joi.string().email(), - address: Joi.string().allow(''), - organisation: Joi.string(), + organisationId: Joi.string(), }), - versions: Joi.array().items( - Joi.object().keys({ - version: Joi.string().custom(isSemver, 'semver validate'), - minDhisVersion: Joi.string(), - maxDhisVersion: Joi.string().allow(''), - demoUrl: Joi.string() - .uri() - .allow(''), - channel: Joi.string(), - }) - ), - images: Joi.array().items( - Joi.object({ - caption: Joi.string().allow('', null), - description: Joi.string().allow('', null), - }) - ), - owner: Joi.object({ - email: Joi.string() - .email() - .required(), - name: Joi.string().required(), + version: Joi.object().keys({ + version: Joi.string().custom(isSemver, 'semver validate'), + minDhisVersion: Joi.string(), + maxDhisVersion: Joi.string().allow(''), + demoUrl: Joi.string().uri().allow(''), + channel: Joi.string(), }), }) const payloadSchema = Joi.object({ //multipart gets parsed as streams so we have to allow any and manually validate in the handler. app: Joi.any(), - imageFile: Joi.any(), + logo: Joi.any(), file: Joi.any(), }) diff --git a/server/src/models/v2/in/CreateAppModel.js b/server/src/models/v2/in/CreateAppModel.js new file mode 100644 index 000000000..54a6732cd --- /dev/null +++ b/server/src/models/v2/in/CreateAppModel.js @@ -0,0 +1,19 @@ +const Joi = require('@hapi/joi') +const { AppTypes } = require('../../../enums') + +const CreateModelAppData = Joi.object().keys({ + appType: Joi.string().valid(...AppTypes), + developer: Joi.object().keys({ + organisationId: Joi.string(), + }), +}) + +const payloadSchema = Joi.object({ + app: Joi.any(), +}) + +module.exports = { + payloadSchema, + def: CreateModelAppData, + validate: obj => CreateModelAppData.validate(obj), +} diff --git a/server/src/routes/v1/apps/handlers/createApp.js b/server/src/routes/v1/apps/handlers/createApp.js index 417130065..45eafa0fb 100644 --- a/server/src/routes/v1/apps/handlers/createApp.js +++ b/server/src/routes/v1/apps/handlers/createApp.js @@ -1,41 +1,22 @@ -const debug = require('debug')('apphub:server:routes:handlers:v1:createApp') - const Boom = require('@hapi/boom') - -const CreateAppModel = require('../../../../models/v1/in/CreateAppModel') const { AppStatus, MediaType } = require('../../../../enums') - -const defaultFailHandler = require('../../defaultFailHandler') -const { saveFile } = require('../../../../utils') - +const CreateAppModel = require('../../../../models/v1/in/CreateAppModel') const { canCreateApp, getCurrentUserFromRequest, currentUserIsManager, } = require('../../../../security') - -const { - createApp, - createAppStatus, - createAppVersion, - createLocalizedAppVersion, - addAppVersionToChannel, - addAppMedia, - getOrganisationsByName, - createOrganisation, - getUserByEmail, - createUser, - addUserToOrganisation, -} = require('../../../../data') - -const OrganisationService = require('../../../../services/organisation') +const App = require('../../../../services/app') +const Organisation = require('../../../../services/organisation') +const { saveFile } = require('../../../../utils') +const { validateImageMetadata } = require('../../../../utils/validateMime') module.exports = { method: 'POST', path: '/v1/apps', config: { auth: 'token', - tags: ['api', 'v1'], + tags: ['api', 'v2'], payload: { maxBytes: 20 * 1024 * 1024, //20MB allow: 'multipart/form-data', @@ -51,310 +32,115 @@ module.exports = { payloadType: 'form', }, }, - response: { - status: { - //200: CreateAppModel.def, - //400: Joi.any(), - //500: Joi.string() - }, - failAction: defaultFailHandler, - }, }, handler: async (request, h) => { - request.logger.info('In handler %s', request.path) - if (!canCreateApp(request, h)) { throw Boom.unauthorized() } - const app = request.payload.app - const appJsonPayload = JSON.parse(app) + const { db } = h.context + const { id: currentUserId } = await getCurrentUserFromRequest( + request, + db + ) + const isManager = currentUserIsManager(request) + + const { payload } = request + const appJsonPayload = JSON.parse(payload.app) const appJsonValidationResult = CreateAppModel.def.validate( appJsonPayload ) - if (appJsonValidationResult.error !== undefined) { - debug( - 'received json did not pass validation: ', - appJsonValidationResult - ) + if (appJsonValidationResult.error) { throw Boom.badRequest(appJsonValidationResult.error) } - debug(`Received json:`, appJsonPayload) - - const knex = h.context.db - - const imageFile = request.payload.imageFile - const file = request.payload.file - - let currentUser = null - let currentUserId = -1 - let isManager = false - try { - currentUser = await getCurrentUserFromRequest(request, knex) - currentUserId = currentUser.id - - isManager = currentUserIsManager(request) - } catch (err) { - throw Boom.unauthorized('No user found for the request') + const { organisationId } = appJsonPayload.developer + const organisation = await Organisation.findOne( + organisationId, + false, + db + ) + if (!organisation) { + throw Boom.badRequest('Unknown organisation') } - debug('currentUser:', currentUser) - - //Load the organisation, or create it if it doesnt exist. - let appId = null - let versionId = null - let iconId = null - - const trx = await knex.transaction() - - try { - let organisation = null - const organisations = await getOrganisationsByName( - appJsonPayload.developer.organisation, - trx - ) - if (organisations.length === 0) { - debug('organization not found, proceed to create it') - //Create organisation - organisation = await createOrganisation( - { - userId: currentUserId, - name: appJsonPayload.developer.organisation, - }, - trx - ) - await addUserToOrganisation( - { - userId: currentUserId, - organisationId: organisation.id, - }, - trx - ) - } else { - organisation = organisations[0] - - const isMember = await OrganisationService.hasUser( - organisation.id, - currentUserId, - trx - ) - - if (!isMember && !isManager) { - throw Boom.unauthorized( - 'You dont have permission to upload apps to that organisation' - ) - } - } - - //Load developer or create if it doesnt exist - let appDeveloper = await getUserByEmail( - appJsonPayload.developer.email, - knex - ) - if (appDeveloper === null) { - //Create developer - appDeveloper = await createUser(appJsonPayload.developer, trx) - await addUserToOrganisation( - { - userId: appDeveloper.id, - organisationId: organisation.id, - }, - trx - ) - } else { - //TODO: Check if developer previously belongs to the organisation or add the dev to the org? - //TODO: decide business rules for how we should allow someone to be added to an organisation - } - - const organisationId = organisation.id - const requestUserId = currentUserId - const developerUserId = appDeveloper.id - - if (appJsonPayload.owner) { - const { email, name } = appJsonPayload.owner - let appOwner = await getUserByEmail(email, trx) - - //Only automatically add the user to the organisation if, - //1. either it's a manager uploading the app - //2. or the owner e-mail is the same as verified on the request - const shouldAddUserToOrg = - isManager || email === currentUser.email - debug('shouldAddUserToOrg:', shouldAddUserToOrg) - debug('isManager:', isManager) - debug('owner email:', email) - debug('currentUser.email', currentUser.email) - - if (shouldAddUserToOrg && appOwner === null) { - appOwner = await createUser( - { - email, - name, - }, - trx - ) - await addUserToOrganisation( - { - userId: appOwner.id, - organisationId: organisation.id, - }, - trx - ) - } else if (shouldAddUserToOrg) { - const hasUser = await OrganisationService.hasUser( - organisation.id, - appOwner.id, - trx - ) - if (!hasUser) { - await addUserToOrganisation( - { - userId: appOwner.id, - organisationId: organisation.id, - }, - trx - ) - } - } - } - - //Create the basic app - const dbApp = await createApp( - { - userId: requestUserId, - developerUserId, - orgId: organisationId, - appType: appJsonPayload.appType, - }, - trx + const isMember = await Organisation.hasUser( + organisationId, + currentUserId, + db + ) + if (!isMember && !isManager) { + throw Boom.unauthorized( + `You don't have permission to upload apps to that organisation` ) + } - //Set newly uploaded apps as pending - appId = dbApp.id - await createAppStatus( + const app = await db.transaction(async trx => { + const { appType } = appJsonPayload + const app = await App.create( { - userId: requestUserId, //the current user set the status - orgId: organisationId, - appId: dbApp.id, + userId: currentUserId, + organisationId, + appType, status: AppStatus.PENDING, }, trx ) - //Create the version of the app - const { demoUrl, version } = appJsonPayload.versions[0] - const { sourceUrl } = appJsonPayload - const appVersion = await createAppVersion( + const { name, description, sourceUrl } = appJsonPayload + const { + version, + demoUrl, + minDhisVersion, + maxDhisVersion, + channel, + } = appJsonPayload.version + const appVersion = await App.createVersionForApp( + app.id, { - userId: requestUserId, - appId: dbApp.id, + userId: currentUserId, + version, demoUrl, sourceUrl, - version, + minDhisVersion, + maxDhisVersion: maxDhisVersion || '', + channel, + appName: name, + description: description || '', }, trx ) - versionId = appVersion.id - //Add the texts as english language, only supported for now - await createLocalizedAppVersion( - { - userId: requestUserId, - appVersionId: appVersion.id, - description: appJsonPayload.description || '', - name: appJsonPayload.name, - languageCode: 'en', - }, - trx - ) + const { logo } = payload + const logoMetadata = logo.hapi + validateImageMetadata(request.server.mime, logoMetadata) - //Publish the app to stable channel by default - const { - minDhisVersion, - maxDhisVersion, - channel, - } = appJsonPayload.versions[0] - await addAppVersionToChannel( + const { id: logoId } = await App.createMediaForApp( + app.id, { - appVersionId: appVersion.id, - createdByUserId: currentUserId, - channelName: channel, - minDhisVersion, - maxDhisVersion, + userId: currentUserId, + mediaType: MediaType.Logo, + filename: logoMetadata.filename, + mime: logoMetadata.headers['content-type'], + caption: 'App logo', + description: '', }, trx ) - if (imageFile) { - debug( - 'Inserting logo metadata to db and link it to the appVersion' - ) - if (!appJsonPayload.images || !appJsonPayload.images.length) { - throw Boom.badRequest( - 'Missing metadata about logo imagefile' - ) - } - - const imageFileMetadata = imageFile.hapi - const [imageInfo] = appJsonPayload.images - let caption, description - if (imageInfo) { - ;({ caption, description } = imageInfo) - } - const { id: appMedia_id, media_id } = await addAppMedia( - { - userId: requestUserId, - appId: appId, - mediaType: MediaType.Logo, - fileName: imageFileMetadata.filename, - mime: imageFileMetadata.headers['content-type'], - caption: caption, - description: description, - }, - trx - ) - - debug( - `Logo inserted with app_media_id '${appMedia_id}' and media_id: '${media_id}` - ) - iconId = appMedia_id - } - } catch (err) { - debug('ROLLING BACK TRANSACTION') - debug(err) - - await trx.rollback() - throw Boom.badRequest(err.message, err) - } - - if (appId === null || versionId === null) { - await trx.rollback() - throw Boom.internal('Could not create app') - } - - try { - await trx.commit() + const { file } = payload const appUpload = saveFile( - `${appId}/${versionId}`, + `${app.id}/${appVersion.id}`, 'app.zip', file._data ) - if (imageFile) { - const iconUpload = saveFile(appId, iconId, imageFile._data) - await Promise.all([appUpload, iconUpload]) - } else { - await appUpload - } - } catch (ex) { - debug(ex) - await trx.rollback() - throw Boom.internal(ex) - } + const logoUpload = saveFile(app.id, logoId, logo._data) + await Promise.all([appUpload, logoUpload]) - return { - statusCode: 200, - uuid: appId, - } + return app + }) + + return h.response(app).created(`/v2/apps/${app.id}`) }, } diff --git a/server/src/routes/v2/apps.js b/server/src/routes/v2/apps.js index ca272e32c..32424c721 100644 --- a/server/src/routes/v2/apps.js +++ b/server/src/routes/v2/apps.js @@ -1,9 +1,17 @@ -const AppModel = require('../../models/v1/out/App') -const { AppStatus } = require('../../enums') +const Boom = require('@hapi/boom') const { getApps } = require('../../data') -const { convertAppsToApiV1Format } = require('../v1/apps/formatting') -const { filterAppsBySpecificDhis2Version } = require('../../utils/filters') +const { AppStatus } = require('../../enums') +const CreateAppModel = require('../../models/v2/in/CreateAppModel') +const { + canCreateApp, + getCurrentUserFromRequest, + currentUserIsManager, +} = require('../../security') +const App = require('../../services/app') +const Organisation = require('../../services/organisation') const Joi = require('../../utils/CustomJoi') +const { filterAppsBySpecificDhis2Version } = require('../../utils/filters') +const { convertAppsToApiV1Format } = require('../v1/apps/formatting') const CHANNELS = ['stable', 'development', 'canary'] const APPTYPES = ['APP', 'DASHBOARD_WIDGET', 'TRACKER_DASHBOARD_WIDGET'] @@ -19,19 +27,19 @@ module.exports = [ query: Joi.object({ channels: Joi.filter( Joi.stringArray().items(Joi.valid(...CHANNELS)) - ).description( - 'Filter by channel' - ).default(['stable']), + ) + .description('Filter by channel') + .default(['stable']), types: Joi.filter( Joi.stringArray().items(Joi.valid(...APPTYPES)) - ).description( - 'Filter by app type' - ).default(['APP']), + ) + .description('Filter by app type') + .default(['APP']), }).unknown(true), }, plugins: { queryFilter: { - enabled: true + enabled: true, }, pagination: { enabled: true, @@ -39,7 +47,8 @@ module.exports = [ }, }, handler: async (request, h) => { - const channels = request.plugins.queryFilter.getFilter('channels').value + const channels = request.plugins.queryFilter.getFilter('channels') + .value const types = request.plugins.queryFilter.getFilter('types').value const apps = await getApps( @@ -60,8 +69,89 @@ module.exports = [ const result = convertAppsToApiV1Format(filteredApps, request) return h.paginate(pager, { result, - total: result.length + total: result.length, }) }, }, + { + method: 'POST', + path: '/v2/apps', + config: { + auth: 'token', + tags: ['api', 'v2'], + payload: { + maxBytes: 20 * 1024 * 1024, //20MB + allow: 'multipart/form-data', + parse: true, + output: 'stream', + multipart: true, + }, + validate: { + payload: CreateAppModel.payloadSchema, + }, + plugins: { + 'hapi-swagger': { + payloadType: 'form', + }, + }, + }, + handler: async (request, h) => { + if (!canCreateApp(request, h)) { + throw Boom.unauthorized() + } + + const { db } = h.context + const { id: currentUserId } = await getCurrentUserFromRequest( + request, + db + ) + const isManager = currentUserIsManager(request) + + const { payload } = request + const appJsonPayload = JSON.parse(payload.app) + const appJsonValidationResult = CreateAppModel.def.validate( + appJsonPayload + ) + + if (appJsonValidationResult.error) { + throw Boom.badRequest(appJsonValidationResult.error) + } + + const { organisationId } = appJsonPayload.developer + const organisation = await Organisation.findOne( + organisationId, + false, + db + ) + if (!organisation) { + throw Boom.badRequest('Unknown organisation') + } + + const isMember = await Organisation.hasUser( + organisationId, + currentUserId, + db + ) + if (!isMember && !isManager) { + throw Boom.unauthorized( + `You don't have permission to upload apps to that organisation` + ) + } + + const { appType } = appJsonPayload + const app = await db.transaction(trx => + App.create( + { + userId: currentUserId, + organisationId, + appType, + status: AppStatus.PENDING, + }, + trx + ) + ) + + return h.response(app).created(`/v2/apps/${app.id}`) + }, + }, ] diff --git a/server/src/services/app.js b/server/src/services/app.js new file mode 100644 index 000000000..57852ba02 --- /dev/null +++ b/server/src/services/app.js @@ -0,0 +1,104 @@ +const { + createApp, + createAppStatus, + createAppVersion, + createLocalizedAppVersion, + addAppVersionToChannel, + addAppMedia, +} = require('../data') + +exports.create = async ( + { userId: currentUserId, organisationId, appType, status }, + db +) => { + const app = await createApp( + { + userId: currentUserId, + developerUserId: currentUserId, + orgId: organisationId, + appType: appType, + }, + db + ) + + await createAppStatus( + { + userId: currentUserId, + orgId: organisationId, + appId: app.id, + status, + }, + db + ) + + return app +} + +exports.createVersionForApp = async ( + appId, + { + userId, + version, + demoUrl, + sourceUrl, + minDhisVersion, + maxDhisVersion, + channel, + appName, + description, + }, + db +) => { + const appVersion = await createAppVersion( + { + userId, + appId, + sourceUrl, + demoUrl, + version, + }, + db + ) + + await createLocalizedAppVersion( + { + userId, + appVersionId: appVersion.id, + name: appName, + description, + languageCode: 'en', + }, + db + ) + + await addAppVersionToChannel( + { + appVersionId: appVersion.id, + createdByUserId: userId, + channelName: channel, + minDhisVersion, + maxDhisVersion, + }, + db + ) + + return appVersion +} + +exports.createMediaForApp = ( + appId, + { userId, mediaType, filename, mime, caption, description }, + db +) => + addAppMedia( + { + userId, + appId, + mediaType, + fileName: filename, + mime, + caption, + description, + }, + db + ) diff --git a/server/src/services/index.js b/server/src/services/index.js index 98b475c4e..3201c3822 100644 --- a/server/src/services/index.js +++ b/server/src/services/index.js @@ -1,4 +1,5 @@ module.exports = { Organisation: require('./organisation'), ApiKey: require('./apiKey'), + App: require('./app'), } diff --git a/server/test/routes/createApp.js b/server/test/routes/createApp.js index af1c8e4d6..9764a70a0 100644 --- a/server/test/routes/createApp.js +++ b/server/test/routes/createApp.js @@ -1,113 +1,96 @@ -const Lab = require('@hapi/lab') const fs = require('fs') const path = require('path') -const request = require('request-promise') +const Lab = require('@hapi/lab') +const FormData = require('form-data') +const streamToPromise = require('stream-to-promise') -const { it, describe, beforeEach, afterEach } = (exports.lab = Lab.script()) +const { + it, + describe, + afterEach, + beforeEach, + before, +} = (exports.lab = Lab.script()) const { expect } = require('@hapi/code') - const knexConfig = require('../../knexfile') -const db = require('knex')(knexConfig) - -const { init } = require('../../src/server/init-server') - +const dbInstance = require('knex')(knexConfig) const users = require('../../seeds/mock/users') +const { init } = require('../../src/server/init-server') +const { config } = require('../../src/server/noauth-config') +const { sampleApp } = require('./sample-app') -describe('test create app', () => { - const { config } = require('../../src/server/noauth-config') +describe('v1/apps', () => { let server - beforeEach(async () => { + let db + + before(() => { config.auth.noAuthUserIdMapping = users[0].id + }) + + beforeEach(async () => { + db = await dbInstance.transaction() + server = await init(db, config) }) afterEach(async () => { await server.stop() + + await db.rollback() }) - const sampleApp = { - name: 'DHIS2 Sample App', - description: 'A very nice sample description', - appType: 'APP', - sourceUrl: 'http://github.com', - developer: { - name: 'Foo Bar', - email: 'foobar@dhis2.org', - address: '', - organisation: 'The Largest Testing Organization In The World.', - }, - versions: [ - { - version: '1.0.0', - minDhisVersion: '2.25', - maxDhisVersion: '2.33', - demoUrl: 'https://www.dhis2.org', - channel: 'stable', - }, - ], - images: [], + const createFormForApp = app => { + const form = new FormData() + form.append('app', JSON.stringify(app)) + form.append( + 'file', + fs.createReadStream(path.join(__dirname, '../', 'sample-app.zip')) + ) + form.append( + 'logo', + fs.createReadStream( + path.join(__dirname, '../', 'sample-app-logo.png') + ) + ) + return form } - it('should create a test app without any images', async () => { - const form = { - app: JSON.stringify(sampleApp), - file: { - value: fs.createReadStream( - path.join(__dirname, '../', 'sample-app.zip') - ), - options: { - filename: 'sample-app.zip', - contentType: 'application/zip', - }, - }, - } + describe('create app', () => { + it('should create an app', async () => { + const form = createFormForApp(sampleApp) + const request = { + method: 'POST', + url: '/api/v1/apps', + headers: form.getHeaders(), + payload: await streamToPromise(form), + } - const response = await request.post({ - url: `http://${server.settings.host}:${server.settings.port}/api/apps`, - json: true, - formData: form, + const res = await server.inject(request) + expect(res.statusCode).to.equal(201) + const receivedPayload = JSON.parse(res.payload) + expect(receivedPayload).to.include(['id']) + expect(receivedPayload.id).to.be.string() }) - console.log('got response:', response) - - expect(response.statusCode).to.equal(200) - }) - - it('should return 400 bad request if version is not valid', async () => { - const badVersionApp = { - ...sampleApp, - versions: [ - { - version: '2', - minDhisVersion: '2.25', - maxDhisVersion: '2.33', - demoUrl: 'https://www.dhis2.org', - channel: 'stable', - }, - ], - } - const form = { - app: JSON.stringify(badVersionApp), - file: { - value: fs.createReadStream( - path.join(__dirname, '../', 'sample-app.zip') - ), - options: { - filename: 'sample-app.zip', - contentType: 'application/zip', + it('should return 400 bad request if version is not valid', async () => { + const badVersionApp = { + ...sampleApp, + version: { + ...sampleApp.version, + version: 'not a version', }, - }, - } + } + const form = createFormForApp(badVersionApp) + const request = { + method: 'POST', + url: '/api/v1/apps', + headers: form.getHeaders(), + payload: await streamToPromise(form), + } - const response = await expect( - request.post({ - url: `http://${server.settings.host}:${server.settings.port}/api/apps`, - json: true, - formData: form, - }) - ).to.reject() - - expect(response.statusCode).to.equal(400) + const res = await server.inject(request) + expect(res.statusCode).to.equal(400) + }) }) }) diff --git a/server/test/routes/deleteApp.js b/server/test/routes/deleteApp.js index cb17aadf3..b7f328512 100644 --- a/server/test/routes/deleteApp.js +++ b/server/test/routes/deleteApp.js @@ -1,15 +1,17 @@ +const fs = require('fs') +const path = require('path') const Lab = require('@hapi/lab') +const FormData = require('form-data') +const streamToPromise = require('stream-to-promise') const { it, describe, beforeEach, afterEach } = (exports.lab = Lab.script()) const { expect } = require('@hapi/code') - const knexConfig = require('../../knexfile') const db = require('knex')(knexConfig) - -const { init } = require('../../src/server/init-server') - const users = require('../../seeds/mock/users') +const { init } = require('../../src/server/init-server') +const { sampleApp } = require('./sample-app') describe('test delete app', () => { const { config } = require('../../src/server/noauth-config') @@ -23,61 +25,40 @@ describe('test delete app', () => { await server.stop() }) - const sampleApp = { - name: 'DHIS2 Sample App', - description: 'A very nice sample description', - appType: 'APP', - sourceUrl: 'http://github.com', - developer: { - name: 'Foo Bar', - email: 'foobar@dhis2.org', - address: '', - organisation: 'The Largest Testing Organization In The World.', - }, - versions: [ - { - version: '1.0.0', - minDhisVersion: '2.25', - maxDhisVersion: '2.33', - demoUrl: 'https://www.dhis2.org', - channel: 'stable', - }, - ], - images: [], + const createFormForApp = app => { + const form = new FormData() + form.append('app', JSON.stringify(app)) + form.append( + 'file', + fs.createReadStream(path.join(__dirname, '../', 'sample-app.zip')) + ) + form.append( + 'logo', + fs.createReadStream( + path.join(__dirname, '../', 'sample-app-logo.png') + ) + ) + return form } it('should be able to delete an app', async () => { //First upload the app, then delete it - const fs = require('fs') - const path = require('path') - const request = require('request-promise') - - const form = { - app: JSON.stringify(sampleApp), - file: { - value: fs.createReadStream( - path.join(__dirname, '../', 'sample-app.zip') - ), - options: { - filename: 'sample-app.zip', - contentType: 'application/zip', - }, - }, + const form = createFormForApp(sampleApp) + const request = { + method: 'POST', + url: '/api/v1/apps', + headers: form.getHeaders(), + payload: await streamToPromise(form), } - const response = await request.post({ - url: `http://${server.settings.host}:${server.settings.port}/api/apps`, - json: true, - formData: form, - }) - expect(response.statusCode).to.equal(200) + const res = await server.inject(request) + expect(res.statusCode).to.equal(201) + const { id: appId } = JSON.parse(res.payload) - const appId = response.uuid const deleteResponse = await server.inject({ method: 'DELETE', url: '/api/v1/apps/' + appId, }) - expect(deleteResponse.statusCode).to.equal(200) }) }) diff --git a/server/test/routes/sample-app.js b/server/test/routes/sample-app.js new file mode 100644 index 000000000..891fbeb6f --- /dev/null +++ b/server/test/routes/sample-app.js @@ -0,0 +1,20 @@ +const mockOrganisations = require('../../seeds/mock/organisations') + +exports.sampleApp = { + name: 'DHIS2 Sample App', + description: 'A very nice sample description', + appType: 'APP', + sourceUrl: 'http://github.com', + developer: { + name: 'Foo Bar', + email: 'foobar@dhis2.org', + organisationId: mockOrganisations[0].id, + }, + version: { + version: '1.0.0', + minDhisVersion: '2.25', + maxDhisVersion: '2.33', + demoUrl: 'https://www.dhis2.org', + channel: 'stable', + }, +} diff --git a/server/test/routes/v2/apps.js b/server/test/routes/v2/apps.js new file mode 100644 index 000000000..da734651f --- /dev/null +++ b/server/test/routes/v2/apps.js @@ -0,0 +1,73 @@ +const fs = require('fs') +const path = require('path') +const Lab = require('@hapi/lab') +const FormData = require('form-data') +const streamToPromise = require('stream-to-promise') + +const { + it, + describe, + afterEach, + beforeEach, + before, +} = (exports.lab = Lab.script()) + +const { expect } = require('@hapi/code') +const knexConfig = require('../../../knexfile') +const dbInstance = require('knex')(knexConfig) +const organisations = require('../../../seeds/mock/organisations') +const users = require('../../../seeds/mock/users') +const { init } = require('../../../src/server/init-server') +const { config } = require('../../../src/server/noauth-config') + +describe('v2/apps', () => { + let server + let db + + before(() => { + config.auth.noAuthUserIdMapping = users[0].id + }) + + beforeEach(async () => { + db = await dbInstance.transaction() + + server = await init(db, config) + }) + + afterEach(async () => { + await server.stop() + + await db.rollback() + }) + + const sampleApp = { + appType: 'APP', + developer: { + organisationId: organisations[0].id, + }, + } + + const createFormForApp = app => { + const form = new FormData() + form.append('app', JSON.stringify(app)) + return form + } + + describe('create app', () => { + it('should create an app', async () => { + const form = createFormForApp(sampleApp) + const request = { + method: 'POST', + url: '/api/v2/apps', + headers: form.getHeaders(), + payload: await streamToPromise(form), + } + + const res = await server.inject(request) + expect(res.statusCode).to.equal(201) + const receivedPayload = JSON.parse(res.payload) + expect(receivedPayload).to.include(['id']) + expect(receivedPayload.id).to.be.string() + }) + }) +}) diff --git a/server/test/sample-app-logo.png b/server/test/sample-app-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3ab4db19a242586ef19a31a8d0363c28dacd0f GIT binary patch literal 7614 zcmd5>WmHtrza6DvKtK?XmXvOW9FZKlyL)I5hLRKn>68wUlm=;#E@_eO0qIWZcm2Ol z@5B52-kLRY*4#Pg-Zl50z4veL-zQaNSzPRw*dP!H7bYjA4vgRby)mBxpEZ^7R=|L2 zBcUV#0#(Q2+?k;P-)Su5)RjOWA4U);Fa!j;0S*OjgFqf!AkeNU2qc^e0+G06HmivO zKcJf{$V!18|GjeCiV}e%81677X$&Mf5$-c?viomaAP|KKOiDu2YyKe1)0AjxzHe;! z(BViVL;mg45YU&I?`S>PESJU=Gl=qBOjPr0&7^V72;B<9`{ViB3m>!=+GN$YOmV7j zF|p>1Yy7N#K(+t2VkL_4nkjT$-)Gc_h>ZPsH+tK8OVE!c>vEvI=iB0-&Dnbd-Odlb?X#!ODH~EHIQfxII`P=MR+Rckfk@U$ z_sl%KJXLoED=H>(a0m?lR14<_w3368$R_e1+eQEBZbKC1h?_iWF!UY0{F;_hNu5vJ zdwY|o&`uo2Bo{EXs;>rLo>>z)(g}aUC9J2eu4pWxI2Aidd#^!(q4+?owK?_-A|_EB zNK0Ver+Ce!?mkO6`)mK?WA1~z@~Yrg$%_~9-Eyw2l@OM5LDxo<^Zr|kN=*Yiy}P&o z9!*Z4Z*i^sD&>Uh6`=ba|E+HR954NzwRAY=z!TAhMpc5}j!6BMuL~8{`<0W;eJ@3UpssUm zu<$6qZWP1xm;-Gvd?I;4=0sYNl(k2Ggv)J0?aoojb0mh_Vo8=yET)&+ZvS1M{g8?5 zN}Llf{fU7=n-y{4h|(dAp_9Vvt|QX&G@abB3F%oUifT0D^6K|h7>HUrLep9|qR2?x z#9syXG$H4XuBl?bMMNC;_R7jRW&^p!wVI1lTZMIAe^k)?`+D$X~)xUmW)|mFJwenN{x1TZ=%A6%LY@ULLsA-HG=sC&DRvlwP%F}AFH9R6yf^Wyw ziMqlVcd62gl|Em=CM#k;(aG^bDRbbjAXhLi9)0kLP5Q70<#ylzPjo z&RTsSj*PbK1nFs_T+bPuKa*X2g1u|;TMpGTS`Erw;GBxUV#jk1zdp@PO!O8|RT>_d zS>e_G8m)Cuv?S}e=xAbOA2ik;4U11ABCDV*Oro!cr{p3{K@i*1%3_`XSCBv$`wLT@ zEfx}D^1h-z;jj_9ca`{S4I3pSMDa~GJ-D==m}9EE>%YyvpCt^uOQaQ^&QXU^$eoNyunUH*N?al7#}4jL%#;hH z_JQEFjvJPjI<5bbixrGOh~-4F1(gtECQJ}SGe%>qtGLXSxg}URLdoKMd50MG8{atE z&VNcoM`8w-H&?9L_|Mk^yPZo#@%IkSWORG!GweYT*{0 za;|&Kwtbz5;{_RbHp}?4KNrLGx5cqnLIV5W55x|jMMg#VYki7y7Ks-r;DoaUZvj1& z%HO);!ONDP&}Pdh{+QDV(Q2jB%+>sj?B4$(@O!~{856fTC7gg$r1C@ z5;z3s`jMbO>wio&e0csBjL#WJq-w=MHPcrBbn(ADKYw40lY!ARQ<*s#M)-E!Qy zry(}*(485Jthl##ylX|XcU=PvG+XozSnTCoQ<))kA?n0kVN5#@0umWS&`AzFDv|i@yF)mwkEf)dCn8kp*!PTo9*W6mCqrNkaFgef66F>wDk=8teq-wxM`Yw zVXgKeHx(eA8hH&P*0M-eCKs|GkvpOdWBpe>6@yyrER6m6$1vjwaIx5qp1#?`38ur2 zJtxV!Xm}_@k!pA1G4lo)`1~}PXR0Uj^*aLE0Vzj7ma1OU~6Zg+vL|NC#}1!S<4XKFn(fl@{Q6?5J# zS6fD6ZSK(mfWp(_;9z9RKPg$h3{4H7MzELiO*M2bFFj!~9}OTup{@fsvhID=!rHMU zT!FsB8c!|hCGPXdzx0))pxuS{R>_3{)Na>n!P6k(lS?f)z@m##S|{K-VQfKq)B@CX z(wBK3x24Xo2SolB#*vo?X-#d$UI`mMnH305lO&3a{s>!g`j%rZz~7vroeI&;+&d!g z=bdkQdM@irS*e*pUanfW6r#DK(_m@oR++RJvUhc6>(b$9vmtytQ4XOZZv^#F2y|!<4pj?34p7sq-{`r%+C~1g z%=vm65_V8T3ZhHwQQ%bOc+H4Wj7b%naL*X9!%4|n%2w{e8t@6f#jMe1sqFV$69G@Q zUG-|7!}Tl?yq0cuH;N5E{fW|aM-+`bbLx1AtCJgwb%Jl%Bz?F zf>?6V(qzJwhPqL>P1X6#`Lpy?`}V`Bv-8*EwcXIRuRIsFoSbeibeT4Sp*o!Ya2dCf z_+d>+EVV#0A>oN(iUO%{N61ZmElkE4OD-PY&!{B zpEw6jc_DMS13PUX4(-~=&>i){%#5Bd z2g%E1`X>7*^qP`HYBiEDW0u+ZT`@vvBk5Q`+9w42;_IJs0cqCQE{3{_$QrfM3rD= zFxMM2(WQFFlCV$iz-inX)+g$+j;aeb6y1GA^8E$!&75jVRCbP8R-GzEp7qzJ zFQ(OLAI>$qJ-W3floR>}49q~qPA9F$E&u48>ySAnDELXuRv{S&RsQyAouF^AV1t24 zWo`E4-#+d*=$n6pEC6|dVwL58^Fb^|$9`B$6qxk5ZuV<8KlnOy1JEB*@VCekE9X%8>&&9bUZnxk0wz~?#oSnFqibgvcEa|gLy|~zp%+Z!ekEL zboQKW?%iZU1aHfwK(~tk{HaRi@>nEAYU`wg2ZZ2AsR3dU^nRdAK?bL@Hp## ztmnWjG5vrKL0sea)@roGESQ5_t^pUrFmR5e635|u3D$hRRO`5Aeh$Dd>sNBmx`z8z zZ0s0n38aCMq5(r^N_Tn1>ce++-l-lyq_V4DGE@?lLApG&1LXpZ#C6r|_!O064agPl zZnf`-&Xhjv{b4U`qZChF0esC|(@&eimoiMUo+$x8j!}0i$qk2CN8(5@K?Bp_+05fB zV)~RT@A8nGF*pSTy^8+Q{_ERCQ59G)x0XKD{>?u0s2eGCae5(lOiL|PbCoGA4GnrNY*O6r+hdr z{fTvVskWP7?sgn7Hee2#b^Y05841^*OClgf)MuxqyIb9js^*cY&g=pL>iDrjTl3S2 zhzxv_cstC!<*LZ=i(tcJJd`qvO;1#2Ef?YC6MU<0Ug)tAVS7 ztA%K)L{MLhD&Owv^ID$8>a#UEw{8x;_uFR@25NBVuF!Yeb<)&079$5fzzVu^N23s( ztrK|a6*OI{Tx(qC;CY45N%zW8tOz!5JBYqb1ToA+uVC*E`-tV zB;UN>1h3|$VMf>F`&SM78!}~)^V*bwvj^6fofd`tcD~-jBms?N?U>;*3X=r+`??Rx@g4P z6`EeyRF!qz4Odd)Zh{n7iIKBW4%hQ(C7!WU*|ksXZu+5JMDh?AYUQ?N={pKtGv1Fn_pamV++?CVKO4c!m#9y#Y*C}}C5H)~eG2c*-^4b8tDz&(c7_qCzpBqP zhEp)IfY5=VcjMse@8gzE^x6Qcx<9q|c&P|tP@q)!$fy=O(mp%1KgF-A|8RF=F@-Rd z=BMvPv9r~c$6p)2*+pbj6=n)%^y)zHsm-bkhkT zmLeZtC6tmtwTidI&Wn~PecrWP930e#`>tom6pJ_dztNoRoN%^Fz*1?EoQh9ZddoMv zu=e=Jwn#l{E5TejbUg$_p7E-QS;6c=U1@qCZ4Vz8kh*)HG7WZO@Koej(==8JF6Yhl zc`5&AM0gB2C@`wSnYzGOgg1HR6U$oHFQJTi@%g=|MnOiG{lTYh=IKd$r7o{tz^b%$ zwu77v1o@lH{Pkp38=}=YSzd*?G^95QBix?0TYPWM58rpY`828W_%8Oo?xjMHOj~V~ zd;%LAW9628K&A`o%(UKeX@exyTaO)@URgmf&DVFM<9g;v;!vk&;#UU!TNo5^FD|z& z2PZXfXWmdBd%viNp#+&4Mr@?HD!*L8H7=n&H=AM1B*9guTJiUH08>|ONn{{eUe)yKI!g5cMV%!tc zJ=js?A4(`?XiZc1)p`>g##{5pa9z;gh#s1-@t=?;t>-LB9|$D8D%X==;)ND;%bfta z{n?A?b6;)8EV5vE*~v)9CUlYYrR6`POqJDRlM7UJwjR&rk z2aDDd%-;C5RF?fZUos=P6LJCKx-F7jx=o8bsm#)`?qnX$&l&Z6zNXsfV&6w)=;e4b zG8Pqn3W4K96`B*g+-nYlPW1g-WHVxKR*WwB>poj=dsA7c)8j-A*oT#vk1LJc2oQeZ zUvszFz7XEa7(ep?+`G{A4MxAcH~8KGfvTgOwzA?FMy=yBXDVGX!4;~rMK%(co|w(U zVNo_^-nnGKr}AQZ-Iy~A9|;15*luop%~GgOwOe~RHm7f625_1nE&!>s>`4Ly_T0;f z#rO9neaHKvyxzs_M^zP-wOxw*Pi^ehUXYK8%`#uoM?ktV-O)`->wXwGf1ohPE@1>h zla+3DiAi3-B1g9zm{7RzAxbL=kh+EGsad71o|%YziQ%uyEKBza`xn|O})7l(FNR1FwQ zPxR$i$ynC5iFWe&2H)^^R!TJiL4k>lw@nc{GIx&425*U$^Jj#b8Xr9tQw&%CerK}Q z=CjL=3NWB0hS7gHxIkRs4zBTxjOV$j)G>`iEW-u{W(^~+vDfHM#494BQHe1?9VF&I z;4W>36V;U{KRHscPyR)vlB6eU$VRco=II)O8|K*KG#0Ac^(kaOCktBPGOVi#A66h_^6G#nm=I!s0-u=LWH`gT`>)2At`a8;#*`JB-yeG~ zFbLnBV^Hk%oPv>|(jUoXm@OvPeSU0PATcej)E}{nmcDmOh7Nom+ZWK!*FZ9LycfSIJyKiUg%DWq#3z$`(9i2 zOVgtZM=x}KNVr<+Yfd;yCLCM8rU2zM-0f+<^(J$6mK{(L9vrsRLq6Cy=&zKAX&G?t z^$;dL(8X}EkFEmB0r<@M8%bU)qfTd1^Uh4F7BxT3Vyzp;o@i8+?)UX{WuX7(xTw_)mo z&^pmy$x?;sw(l@94&wXeLk9u(Ffg++(xA+CveN({-%D~>2jgEZj-gn!j6sjZ|3%d2 z+{QHo&UFhYM9z`t+jJU&PZo5rsGUb(x;y#~5E7;6q@|ZtISmM@g&zZ2`huvpJe#@C z5MUCUO~=;O-tz<6*~@F_hyQMCP;AL0kiPp8P8T();tT}JT8h;1o~+OIYqAcZBPEcb=4j* z>T2RG+lH1JfbJuMyR@#mrJ1{xu!WlyFo1ZtxFPIZ0_;3on%um?-2B3PLabao!dzSe z7Jozk#{x%ZOSrZ7|Gq$0{EZN>K*vW@*InJrlg7o(*&6O(MdR-6VnqXYakl{WP3HP3 z7}Hgonfa&6&@k+eItYahhruG*W?l-IgeHwVE_Tv%d#=hI=S_Fopu< ca^*QdyCeker*HX_flGj3(#ld5Z%u>$3sl^5od5s; literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index 4c6c762a0..cfa544b14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -133,15 +133,7 @@ "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" - integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== - dependencies: - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.6.0" - -"@babel/helper-create-regexp-features-plugin@^7.8.8": +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== @@ -224,12 +216,7 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-plugin-utils@^7.12.13": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== @@ -252,17 +239,7 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-replace-supers@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" - integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-replace-supers@^7.8.6": +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== @@ -294,16 +271,11 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.12.11": +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.9.0": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -402,7 +374,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.12.13": +"@babel/plugin-proposal-optional-chaining@^7.12.13", "@babel/plugin-proposal-optional-chaining@^7.9.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz#63a7d805bc8ce626f3234ee5421a2a7fb23f66d9" integrity sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q== @@ -411,14 +383,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" - integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" @@ -884,27 +848,13 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.5.4", "@babel/runtime@^7.6.3": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" - integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.8.4": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.7.tgz#8fefce9802db54881ba59f90bb28719b4996324d" - integrity sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -929,16 +879,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.3", "@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.1": +"@babel/types@^7.0.0", "@babel/types@^7.1.3", "@babel/types@^7.12.1", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== @@ -947,24 +888,6 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.4.4", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.8.6", "@babel/types@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" - integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - "@commitlint/cli@^8.3.5": version "8.3.5" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-8.3.5.tgz#6d93a3a8b2437fa978999d3f6a336bcc70be3fd3" @@ -1924,14 +1847,7 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6" - integrity sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.8.1": +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== @@ -2339,17 +2255,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" - integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^6.12.0: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== @@ -2440,6 +2346,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +any-promise@^1.1.0, any-promise@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -3861,12 +3772,7 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.4.8: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== - -core-js@^3.8.0: +core-js@^3.4.8, core-js@^3.8.0: version "3.8.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== @@ -4185,14 +4091,14 @@ debug@3.2.6, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@4.3.1: +debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -4591,12 +4497,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7: - version "1.3.349" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.349.tgz#663f26a69d348a462df47b4d7ab162a2f29bbcb7" - integrity sha512-uEb2zs6EJ6OZIqaMsCSliYVgzE/f7/s1fLWqtvRtHg/v5KBF2xds974fUnyatfxIDgkqzQVwFtam5KExqywx0Q== - -electron-to-chromium@^1.3.363: +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.363: version "1.3.377" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.377.tgz#b49d420b36ee6c48b0cd3137bfc7fec75f369b2e" integrity sha512-cm2WzMKf/3dW5+hNANKm8GAW6SwIWOqLTJ6GPCD0Bbw1qJ9Wzm9nmx9M+byzSsgw8CdCv5fb/wzLFqVS5h6QrA== @@ -4646,7 +4547,7 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@~1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -4751,19 +4652,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.11.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -escodegen@^1.8.1: +escodegen@^1.11.1, escodegen@^1.8.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -5382,12 +5271,7 @@ focus-trap@^2.3.0: dependencies: tabbable "^1.0.3" -follow-redirects@^1.0.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" - integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== - -follow-redirects@^1.10.0: +follow-redirects@^1.0.0, follow-redirects@^1.10.0: version "1.13.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== @@ -5418,6 +5302,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -6389,12 +6282,7 @@ interpret@1.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -interpret@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.0.0.tgz#b783ffac0b8371503e9ab39561df223286aa5433" - integrity sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA== - -interpret@^2.2.0: +interpret@^2.0.0, interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== @@ -7438,12 +7326,7 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.14.2, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - -lodash@^4.17.20: +lodash@^4.14.2, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -7784,12 +7667,7 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - -mime@^2.4.6: +mime@^2.4.4, mime@^2.4.6: version "2.5.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.0.tgz#2b4af934401779806ee98026bb42e8c1ae1876b1" integrity sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag== @@ -7849,12 +7727,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -7990,12 +7863,12 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.2: +ms@^2.1.1, ms@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -9597,16 +9470,11 @@ react-event-listener@^0.6.2: prop-types "^15.6.0" warning "^4.0.1" -react-is@^16.4.2, react-is@^16.6.0, react-is@^16.9.0: +react-is@^16.4.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^16.7.0, react-is@^16.8.1: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== - react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -9742,16 +9610,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" - integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9872,14 +9731,7 @@ redux@^4.0.5: loose-envify "^1.4.0" symbol-observable "^1.2.0" -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== - dependencies: - regenerate "^1.4.0" - -regenerate-unicode-properties@^8.2.0: +regenerate-unicode-properties@^8.1.0, regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== @@ -9901,12 +9753,7 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== @@ -9949,19 +9796,7 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regexpu-core@^4.7.0: +regexpu-core@^4.6.0, regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== @@ -10019,14 +9854,7 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -regjsparser@^0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.2.tgz#fd62c753991467d9d1ffe0a9f67f27a529024b96" - integrity sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q== - dependencies: - jsesc "~0.5.0" - -regjsparser@^0.6.4: +regjsparser@^0.6.0, regjsparser@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== @@ -10409,12 +10237,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" - integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== - -semver@^7.3.2: +semver@^7.1.1, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -10924,6 +10747,22 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-to-array@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" + integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M= + dependencies: + any-promise "^1.1.0" + +stream-to-promise@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-to-promise/-/stream-to-promise-3.0.0.tgz#8934d66dcbc9189394e8b33200da3bb9611db774" + integrity sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA== + dependencies: + any-promise "~1.3.0" + end-of-stream "~1.4.1" + stream-to-array "~2.3.0" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -11612,12 +11451,7 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-match-property-value-ecmascript@^1.2.0: +unicode-match-property-value-ecmascript@^1.1.0, unicode-match-property-value-ecmascript@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== @@ -11861,14 +11695,7 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8flags@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" - integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== - dependencies: - homedir-polyfill "^1.0.1" - -v8flags@^3.2.0: +v8flags@^3.1.3, v8flags@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== @@ -12108,12 +11935,7 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== - -whatwg-fetch@^3.4.1: +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== From 9eb6e2cc5b1c040ae6fdd7f8141f43832fda67f8 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 30 Apr 2021 09:23:24 +0000 Subject: [PATCH 12/29] chore(release): cut 2.18.0 [skip ci] # [2.18.0](https://github.com/dhis2/app-hub/compare/v2.17.1...v2.18.0) (2021-04-30) ### Features * backend changes required by redesign ([#467](https://github.com/dhis2/app-hub/issues/467)) ([4cc9e44](https://github.com/dhis2/app-hub/commit/4cc9e4491e743336fa78342f8b0e4102bc553176)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 615069b42..590458682 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.18.0](https://github.com/dhis2/app-hub/compare/v2.17.1...v2.18.0) (2021-04-30) + + +### Features + +* backend changes required by redesign ([#467](https://github.com/dhis2/app-hub/issues/467)) ([4cc9e44](https://github.com/dhis2/app-hub/commit/4cc9e4491e743336fa78342f8b0e4102bc553176)) + ## [2.17.1](https://github.com/dhis2/app-hub/compare/v2.17.0...v2.17.1) (2021-04-20) diff --git a/client/package.json b/client/package.json index b4d5417f6..073d11270 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.17.1", + "version": "2.18.0", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index 8f8d61642..ce0614415 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.17.1" + "version": "2.18.0" } diff --git a/server/package.json b/server/package.json index 38e961778..7d7618ad1 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.17.1", + "version": "2.18.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 59c908b92..186d2390e 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.17.1", + "version": "2.18.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 26edb4b3c8802c08b8967c0e6e519b3d4f0b4c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Fri, 30 Apr 2021 11:44:06 +0100 Subject: [PATCH 13/29] fix: encode strings with punycode before generating slug (#468) * fix: encode strings with punycode before generating slug * chore: update tests * fix: don't use deprecated punycode core module --- server/package.json | 1 + server/seeds/mock/appversions_localized.js | 12 ++++++------ server/seeds/mock/organisations.js | 7 +++---- server/src/data/createLocalizedAppVersion.js | 4 ++-- server/src/data/createOrganisation.js | 4 ++-- server/src/data/updateApp.js | 5 ++--- server/src/services/organisation.js | 6 +++--- server/src/utils/slugify.js | 7 +++++++ server/test/data/index.js | 2 +- server/test/routes/index.js | 4 ++-- 10 files changed, 29 insertions(+), 23 deletions(-) create mode 100644 server/src/utils/slugify.js diff --git a/server/package.json b/server/package.json index 7d7618ad1..5e8e66056 100644 --- a/server/package.json +++ b/server/package.json @@ -39,6 +39,7 @@ "jwks-rsa": "^1.12.2", "knex": "^0.21.17", "pg": "^8.4.1", + "punycode": "^2.1.1", "rimraf": "^3.0.1", "semver": "^7.3.2", "slugify": "^1.4.0", diff --git a/server/seeds/mock/appversions_localized.js b/server/seeds/mock/appversions_localized.js index 92101ba2c..355f236d8 100644 --- a/server/seeds/mock/appversions_localized.js +++ b/server/seeds/mock/appversions_localized.js @@ -8,7 +8,7 @@ const [ betaOnlyTrackerWidgetVersions, canaryOnlyDashboardWidgetVersions, ] = appVersions -const slugify = require('slugify') +const { slugify } = require('../../src/utils/slugify') const versionuuids = [] @@ -21,7 +21,7 @@ const mockAppVersion = (id, sourceArr, index, languageCode, name, desc) => { created_by_user_id: sourceArr[index].created_by_user_id, name, description: desc, - slug: slugify(name, { lower: true }), + slug: slugify(name), } } @@ -138,7 +138,7 @@ const pendingAppVersionsLocalized = [ created_by_user_id: pendingAppVersions[0].created_by_user_id, name: 'Pending App app', description: 'This app is pending approval.', - slug: slugify('Pending App app', { lower: true }), + slug: slugify('Pending App app'), }, ] @@ -150,7 +150,7 @@ const rejectedAppVersionsLocalized = [ created_by_user_id: rejectedAppVersions[0].created_by_user_id, name: 'Rejected App app', description: 'This app is in state rejected.', - slug: slugify('Rejected App app', { lower: true }), + slug: slugify('Rejected App app'), }, ] @@ -162,7 +162,7 @@ const betaOnlyTrackerWidgetLocalized = [ created_by_user_id: betaOnlyTrackerWidgetVersions[0].created_by_user_id, name: 'Development only app', description: 'This app only got a version in the development channel', - slug: slugify('Development only app', { lower: true }), + slug: slugify('Development only app'), }, ] @@ -175,7 +175,7 @@ const canaryOnlyDashboardWidgetLocalized = [ canaryOnlyDashboardWidgetVersions[0].created_by_user_id, name: 'Canary only app', description: 'This app only got a version in canary channel', - slug: slugify('Canary only app', { lower: true }), + slug: slugify('Canary only app'), }, ] diff --git a/server/seeds/mock/organisations.js b/server/seeds/mock/organisations.js index 44891bbbc..ba3e19c4b 100644 --- a/server/seeds/mock/organisations.js +++ b/server/seeds/mock/organisations.js @@ -1,18 +1,17 @@ -const slugify = require('slugify') - +const { slugify } = require('../../src/utils/slugify') const users = require('./users') module.exports = [ { id: 'cedb4418-2417-4e72-bfcc-35ccd0dc3e41', name: 'DHIS2', - slug: slugify('DHIS2', { lower: true }), + slug: slugify('DHIS2'), created_by_user_id: users[0].id, }, { id: '73dd7dd0-3dbb-4687-b8af-194c5c7be572', name: 'World Health Organization', - slug: slugify('World Health Organization', { lower: true }), + slug: slugify('World Health Organization'), created_by_user_id: users[1].id, }, ] diff --git a/server/src/data/createLocalizedAppVersion.js b/server/src/data/createLocalizedAppVersion.js index f5095a25b..933d00109 100644 --- a/server/src/data/createLocalizedAppVersion.js +++ b/server/src/data/createLocalizedAppVersion.js @@ -1,4 +1,4 @@ -const slugify = require('slugify') +const { slugify } = require('../utils/slugify') /** * @typedef CreateLocalizedAppVersionResult @@ -28,7 +28,7 @@ const createLocalizedAppVersion = async (params, knex) => { created_by_user_id: userId, //todo: change to real id description, name, - slug: slugify(name, { lower: true }), + slug: slugify(name), language_code: languageCode, }) .returning('id') diff --git a/server/src/data/createOrganisation.js b/server/src/data/createOrganisation.js index 4be431a82..0d0c5ae38 100644 --- a/server/src/data/createOrganisation.js +++ b/server/src/data/createOrganisation.js @@ -1,5 +1,5 @@ const joi = require('@hapi/joi') -const slugify = require('slugify') +const { slugify } = require('../utils/slugify') const { ensureUniqueSlug } = require('../services/organisation') const paramsSchema = joi.object().keys({ @@ -39,7 +39,7 @@ const createOrganisation = async (params, knex) => { } const { userId, name } = params - const originalSlug = slugify(name, { lower: true }) + const originalSlug = slugify(name) const slug = await ensureUniqueSlug(originalSlug, knex) try { diff --git a/server/src/data/updateApp.js b/server/src/data/updateApp.js index 3524a7c5f..8bce56fdf 100644 --- a/server/src/data/updateApp.js +++ b/server/src/data/updateApp.js @@ -1,6 +1,5 @@ -const slugify = require('slugify') const joi = require('@hapi/joi') - +const { slugify } = require('../utils/slugify') const { AppTypes } = require('../enums') const paramsSchema = joi @@ -93,7 +92,7 @@ const updateApp = async (params, knex) => { await knex('app_version_localised') .update({ name, - slug: slugify(name, { lower: true }), + slug: slugify(name), description, updated_at: knex.fn.now(), updated_by_user_id: userId, diff --git a/server/src/services/organisation.js b/server/src/services/organisation.js index 5706613f9..c4da14c24 100644 --- a/server/src/services/organisation.js +++ b/server/src/services/organisation.js @@ -1,5 +1,5 @@ -const slugify = require('slugify') const { NotFoundError } = require('../utils/errors') +const { slugify } = require('../utils/slugify') const Organisation = require('../models/v2/Organisation') const Boom = require('@hapi/boom') @@ -45,7 +45,7 @@ const ensureUniqueSlug = async (slug, knex) => { * @param {*} db */ const create = async ({ userId, name }, db) => { - const slug = await ensureUniqueSlug(slugify(name, { lower: true }), db) + const slug = await ensureUniqueSlug(slugify(name), db) const obj = { owner: userId, name, @@ -121,7 +121,7 @@ const update = async (id, updateData, db) => { // update slug if name changed if (updateData.name) { - const slug = slugify(updateData.name, { lower: true }) + const slug = slugify(updateData.name) // check if slug exists, but allow current org's slug to be the same (eg. case of name updated) const slugMatch = await db('organisation') .select('name') diff --git a/server/src/utils/slugify.js b/server/src/utils/slugify.js new file mode 100644 index 000000000..4d6fc5d26 --- /dev/null +++ b/server/src/utils/slugify.js @@ -0,0 +1,7 @@ +// The punycode core module is deprecated but userland modules don't hide core +// modules,so we have to add a forward slash at the end of the import in order +// to specify the userland module. +const punycode = require('punycode/') +const slugify = require('slugify') + +exports.slugify = string => slugify(punycode.encode(string), { lower: true }) diff --git a/server/test/data/index.js b/server/test/data/index.js index 418ab2318..3f124b9c7 100644 --- a/server/test/data/index.js +++ b/server/test/data/index.js @@ -136,7 +136,7 @@ describe('@data::createOrganisation', () => { expect(org.id).to.be.a.string() expect(org.id.length).to.be.equal(36) - expect(org.slug).to.equal('test-create-organisation-aaoee') + expect(org.slug).to.equal('test-create-organisation-9ec0a9f3a20b') expect(org.name).to.equal('Test create organisation åäöèé') const [shouldExist] = await getOrganisationsByName(org.name, db) diff --git a/server/test/routes/index.js b/server/test/routes/index.js index de6476b5f..775d004c9 100644 --- a/server/test/routes/index.js +++ b/server/test/routes/index.js @@ -53,7 +53,7 @@ describe('Get all published apps [v1]', async () => { 'https://play.dhis2.org/2.30/api/apps/Immunization-analysis/index.html#!/report' ) expect(whoApp[0].versions[0].downloadUrl).to.be.equal( - 'http://localhost:3000/api/v1/apps/download/world-health-organization/a-nice-app-by-who_1.0.zip' + 'http://localhost:3000/api/v1/apps/download/world-health-organization-/a-nice-app-by-who-_1.0.zip' ) expect(whoApp[0].sourceUrl).to.be.equal( @@ -194,7 +194,7 @@ describe('Get all published apps [v2]', () => { 'https://play.dhis2.org/2.30/api/apps/Immunization-analysis/index.html#!/report' ) expect(whoApp[0].versions[0].downloadUrl).to.be.equal( - 'http://localhost:3000/api/v1/apps/download/world-health-organization/a-nice-app-by-who_1.0.zip' + 'http://localhost:3000/api/v1/apps/download/world-health-organization-/a-nice-app-by-who-_1.0.zip' ) expect(whoApp[0].sourceUrl).to.be.equal( From 32e86edcc6154355f1445dfdf8334d08e03613b9 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 30 Apr 2021 10:54:10 +0000 Subject: [PATCH 14/29] chore(release): cut 2.18.1 [skip ci] ## [2.18.1](https://github.com/dhis2/app-hub/compare/v2.18.0...v2.18.1) (2021-04-30) ### Bug Fixes * encode strings with punycode before generating slug ([#468](https://github.com/dhis2/app-hub/issues/468)) ([26edb4b](https://github.com/dhis2/app-hub/commit/26edb4b3c8802c08b8967c0e6e519b3d4f0b4c47)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 590458682..158a39185 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [2.18.1](https://github.com/dhis2/app-hub/compare/v2.18.0...v2.18.1) (2021-04-30) + + +### Bug Fixes + +* encode strings with punycode before generating slug ([#468](https://github.com/dhis2/app-hub/issues/468)) ([26edb4b](https://github.com/dhis2/app-hub/commit/26edb4b3c8802c08b8967c0e6e519b3d4f0b4c47)) + # [2.18.0](https://github.com/dhis2/app-hub/compare/v2.17.1...v2.18.0) (2021-04-30) diff --git a/client/package.json b/client/package.json index 073d11270..19e007cf2 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.18.0", + "version": "2.18.1", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index ce0614415..e63e2a69a 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.18.0" + "version": "2.18.1" } diff --git a/server/package.json b/server/package.json index 5e8e66056..31c86534b 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.18.0", + "version": "2.18.1", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 186d2390e..a9bfa49fa 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.18.0", + "version": "2.18.1", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 857a180ba13a80caa70a381f19a3cdbeee9c2b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Tue, 4 May 2021 10:27:08 +0100 Subject: [PATCH 15/29] fix: use punycode.toASCII instead of punycode.encode (#471) * fix: use punycode.toASCII instead of punycode.encode * fix: only use punycode if required --- server/src/utils/slugify.js | 12 +++++++++++- server/test/data/index.js | 2 +- server/test/routes/index.js | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/server/src/utils/slugify.js b/server/src/utils/slugify.js index 4d6fc5d26..8911c7518 100644 --- a/server/src/utils/slugify.js +++ b/server/src/utils/slugify.js @@ -4,4 +4,14 @@ const punycode = require('punycode/') const slugify = require('slugify') -exports.slugify = string => slugify(punycode.encode(string), { lower: true }) +const slugifyOptions = { + lower: true, + strict: true, +} + +exports.slugify = string => { + const slug = slugify(string, slugifyOptions) + return slug.length > 1 + ? slug + : slugify(punycode.toASCII(string), slugifyOptions) +} diff --git a/server/test/data/index.js b/server/test/data/index.js index 3f124b9c7..418ab2318 100644 --- a/server/test/data/index.js +++ b/server/test/data/index.js @@ -136,7 +136,7 @@ describe('@data::createOrganisation', () => { expect(org.id).to.be.a.string() expect(org.id.length).to.be.equal(36) - expect(org.slug).to.equal('test-create-organisation-9ec0a9f3a20b') + expect(org.slug).to.equal('test-create-organisation-aaoee') expect(org.name).to.equal('Test create organisation åäöèé') const [shouldExist] = await getOrganisationsByName(org.name, db) diff --git a/server/test/routes/index.js b/server/test/routes/index.js index 775d004c9..de6476b5f 100644 --- a/server/test/routes/index.js +++ b/server/test/routes/index.js @@ -53,7 +53,7 @@ describe('Get all published apps [v1]', async () => { 'https://play.dhis2.org/2.30/api/apps/Immunization-analysis/index.html#!/report' ) expect(whoApp[0].versions[0].downloadUrl).to.be.equal( - 'http://localhost:3000/api/v1/apps/download/world-health-organization-/a-nice-app-by-who-_1.0.zip' + 'http://localhost:3000/api/v1/apps/download/world-health-organization/a-nice-app-by-who_1.0.zip' ) expect(whoApp[0].sourceUrl).to.be.equal( @@ -194,7 +194,7 @@ describe('Get all published apps [v2]', () => { 'https://play.dhis2.org/2.30/api/apps/Immunization-analysis/index.html#!/report' ) expect(whoApp[0].versions[0].downloadUrl).to.be.equal( - 'http://localhost:3000/api/v1/apps/download/world-health-organization-/a-nice-app-by-who-_1.0.zip' + 'http://localhost:3000/api/v1/apps/download/world-health-organization/a-nice-app-by-who_1.0.zip' ) expect(whoApp[0].sourceUrl).to.be.equal( From 9ada7a4bf0181f09e12f47aa4cde6b7aec2d9f6b Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 4 May 2021 09:37:16 +0000 Subject: [PATCH 16/29] chore(release): cut 2.18.2 [skip ci] ## [2.18.2](https://github.com/dhis2/app-hub/compare/v2.18.1...v2.18.2) (2021-05-04) ### Bug Fixes * use punycode.toASCII instead of punycode.encode ([#471](https://github.com/dhis2/app-hub/issues/471)) ([857a180](https://github.com/dhis2/app-hub/commit/857a180ba13a80caa70a381f19a3cdbeee9c2b41)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 158a39185..bd4ff9b84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [2.18.2](https://github.com/dhis2/app-hub/compare/v2.18.1...v2.18.2) (2021-05-04) + + +### Bug Fixes + +* use punycode.toASCII instead of punycode.encode ([#471](https://github.com/dhis2/app-hub/issues/471)) ([857a180](https://github.com/dhis2/app-hub/commit/857a180ba13a80caa70a381f19a3cdbeee9c2b41)) + ## [2.18.1](https://github.com/dhis2/app-hub/compare/v2.18.0...v2.18.1) (2021-04-30) diff --git a/client/package.json b/client/package.json index 19e007cf2..8b84f97d5 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.18.1", + "version": "2.18.2", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index e63e2a69a..6b321e56a 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.18.1" + "version": "2.18.2" } diff --git a/server/package.json b/server/package.json index 31c86534b..99727f9b5 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.18.1", + "version": "2.18.2", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index a9bfa49fa..1c75b93bb 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.18.1", + "version": "2.18.2", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From dbc2732dba8eb63b93cf9b5731087405da5a65e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Fri, 7 May 2021 09:29:59 +0100 Subject: [PATCH 17/29] feat: add version API (#473) --- server/src/routes/v2/index.js | 1 + server/src/routes/v2/version.js | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 server/src/routes/v2/version.js diff --git a/server/src/routes/v2/index.js b/server/src/routes/v2/index.js index ac765ecee..92f1a24cf 100644 --- a/server/src/routes/v2/index.js +++ b/server/src/routes/v2/index.js @@ -4,4 +4,5 @@ module.exports = [ require('./organisations.js'), require('./me.js'), require('./apikey.js'), + require('./version.js') ] diff --git a/server/src/routes/v2/version.js b/server/src/routes/v2/version.js new file mode 100644 index 000000000..b53f7f715 --- /dev/null +++ b/server/src/routes/v2/version.js @@ -0,0 +1,9 @@ +const { version } = require('../../../../package.json') + +module.exports = [ + { + method: 'GET', + path: '/v2/version', + handler: () => ({ version }), + }, +] From 5a1e1be96bacb7bb4fba24211eeadbeda9ef10d0 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Fri, 7 May 2021 12:29:46 +0200 Subject: [PATCH 18/29] fix(version-api): use server-package.json for version information (#476) --- server/src/routes/v2/version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/routes/v2/version.js b/server/src/routes/v2/version.js index b53f7f715..94f7026ea 100644 --- a/server/src/routes/v2/version.js +++ b/server/src/routes/v2/version.js @@ -1,4 +1,4 @@ -const { version } = require('../../../../package.json') +const { version } = require('../../../package.json') module.exports = [ { From bd40144ef17f25871c7402e00d5295c2227c8eb4 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 7 May 2021 10:39:21 +0000 Subject: [PATCH 19/29] chore(release): cut 2.19.0 [skip ci] # [2.19.0](https://github.com/dhis2/app-hub/compare/v2.18.2...v2.19.0) (2021-05-07) ### Bug Fixes * **version-api:** use server-package.json for version information ([#476](https://github.com/dhis2/app-hub/issues/476)) ([5a1e1be](https://github.com/dhis2/app-hub/commit/5a1e1be96bacb7bb4fba24211eeadbeda9ef10d0)) ### Features * add version API ([#473](https://github.com/dhis2/app-hub/issues/473)) ([dbc2732](https://github.com/dhis2/app-hub/commit/dbc2732dba8eb63b93cf9b5731087405da5a65e7)) --- CHANGELOG.md | 12 ++++++++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd4ff9b84..0acaf9326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [2.19.0](https://github.com/dhis2/app-hub/compare/v2.18.2...v2.19.0) (2021-05-07) + + +### Bug Fixes + +* **version-api:** use server-package.json for version information ([#476](https://github.com/dhis2/app-hub/issues/476)) ([5a1e1be](https://github.com/dhis2/app-hub/commit/5a1e1be96bacb7bb4fba24211eeadbeda9ef10d0)) + + +### Features + +* add version API ([#473](https://github.com/dhis2/app-hub/issues/473)) ([dbc2732](https://github.com/dhis2/app-hub/commit/dbc2732dba8eb63b93cf9b5731087405da5a65e7)) + ## [2.18.2](https://github.com/dhis2/app-hub/compare/v2.18.1...v2.18.2) (2021-05-04) diff --git a/client/package.json b/client/package.json index 8b84f97d5..ffa3ee90a 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.18.2", + "version": "2.19.0", "description": "The App Hub Client", "main": "src/index.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/package.json b/package.json index 6b321e56a..06c9add99 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.18.2" + "version": "2.19.0" } diff --git a/server/package.json b/server/package.json index 99727f9b5..66370c65f 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.18.2", + "version": "2.19.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 1c75b93bb..5bb2d9d0e 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.18.2", + "version": "2.19.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 27e91a5a60014d3f471a12888082732d01531da0 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Wed, 12 May 2021 12:37:20 +0200 Subject: [PATCH 20/29] feat: emailservice and user email migration (#463) * fix(migration): remove developer from user-entity * fix: update mocks * fix: remove developer, refactor to contactEmail * fix: fix tests and seed mocks * fix: remove developer email, use contact_email * feat: emailService initial implementation * fix: org invitation endpoints * fix: verify org client-pages * fix: functioning invitation workflow * fix: redirect if no callback-token * fix: shorter token-expiration * fix: specific error when token expired * chore: update hapi-pino * refactor: refactor emailService initialization * fix: invitation link * refactor: cleanup * fix: check for aws in config * fix: use invitation-API when adding member * fix: add fromName in invitation-email * fix: increase token expiration * refactor: review fixes * fix(emailservice): use jsonTransport for dev-transport * fix: log org-name to console * test: add test for generateInvitationToken --- client/package.json | 1 + client/src/api/api.js | 10 +- client/src/components/AppHub.jsx | 13 ++ .../components/apps/appCards/AppCardItem.jsx | 4 +- .../dialog/AddOrganisationMemberDialog.js | 10 +- client/src/components/dialog/EditAppDialog.js | 7 +- client/src/components/form/EditAppForm.jsx | 23 +-- .../components/form/UploadAppFormStepper.jsx | 18 +-- .../components/user/appList/AppListItem.jsx | 6 +- .../user/userAppView/UserAppView.jsx | 5 +- .../verify/OrganisationInvitation.js | 35 ++++ .../verify/OrganisationInvitationCallback.js | 48 ++++++ client/src/reducers/snackbarReducer.js | 2 +- ...10420135804_user-allow-duplicate-emails.js | 136 ++++++++++++++++ server/package.json | 5 +- server/seeds/02_app.js | 2 +- server/seeds/mock/apps.js | 12 +- server/src/data/createApp.js | 9 +- server/src/data/getAppDeveloperId.js | 19 --- server/src/data/index.js | 1 - server/src/models/v1/in/CreateAppModel.js | 1 - server/src/models/v1/out/User.js | 1 - server/src/plugins/apiRoutes.js | 3 +- .../formatting/convertAppsToApiV1Format.js | 11 +- .../src/routes/v1/apps/handlers/editImage.js | 13 +- server/src/routes/v2/organisations.js | 131 +++++++++++++++ .../src/security/createUserValidationFunc.js | 4 +- server/src/security/index.js | 1 + server/src/server/env-config.js | 4 + server/src/server/init-server.js | 8 +- server/src/services/EmailService.js | 86 ++++++++++ server/src/services/organisation.js | 21 +++ server/test/data/getAppDeveloperId.js | 27 ---- server/test/data/index.js | 6 +- server/test/routes/index.js | 16 +- server/test/routes/sample-app.js | 1 - server/test/services/organisation.js | 24 +++ yarn.lock | 149 +++++++++++------- 38 files changed, 679 insertions(+), 194 deletions(-) create mode 100644 client/src/components/verify/OrganisationInvitation.js create mode 100644 client/src/components/verify/OrganisationInvitationCallback.js create mode 100644 server/migrations/20210420135804_user-allow-duplicate-emails.js delete mode 100644 server/src/data/getAppDeveloperId.js create mode 100644 server/src/services/EmailService.js delete mode 100644 server/test/data/getAppDeveloperId.js diff --git a/client/package.json b/client/package.json index ffa3ee90a..ed88e7b01 100644 --- a/client/package.json +++ b/client/package.json @@ -22,6 +22,7 @@ "file-loader": "^3.0.1", "history": "^4.5.1", "html-webpack-plugin": "^3.2.0", + "jsonwebtoken": "^8.5.1", "jwt-decode": "^2.1.0", "lodash": "^4.17.19", "material-components-web": "^0.16.0", diff --git a/client/src/api/api.js b/client/src/api/api.js index 5ed4fd8cb..1362acad7 100644 --- a/client/src/api/api.js +++ b/client/src/api/api.js @@ -233,7 +233,7 @@ export function getOrganisation(orgId) { export function addOrganisationMember(orgId, email) { return apiV2.request( - `organisations/${orgId}/user`, + `organisations/${orgId}/invitation`, { useAuth: true }, { method: 'POST', @@ -308,3 +308,11 @@ export function deleteApiKey() { } ) } + +export function acceptOrganisationInvitation(token) { + return apiV2.request( + `organisations/invitation/${token}`, + { useAuth: true }, + { method: 'POST' } + ) +} diff --git a/client/src/components/AppHub.jsx b/client/src/components/AppHub.jsx index 8d51a4364..49612dbf2 100644 --- a/client/src/components/AppHub.jsx +++ b/client/src/components/AppHub.jsx @@ -13,6 +13,8 @@ import '../styles/override.css' import Apps from './apps/Apps' import AppView from './appView/AppView' import UserView from './user/UserView' +import OrganisationInvitation from './verify/OrganisationInvitation' +import OrganisationInvitationCallback from './verify/OrganisationInvitationCallback' import Header from './header/Header' import Snackbar from './utils/Snackbar' import DialogRoot from './dialog/DialogRoot' @@ -44,6 +46,17 @@ const AppHub = () => ( auth={Auth} component={UserView} /> + + {/* No-match route - redirect to index */} } /> diff --git a/client/src/components/apps/appCards/AppCardItem.jsx b/client/src/components/apps/appCards/AppCardItem.jsx index 28b973f58..d23127320 100644 --- a/client/src/components/apps/appCards/AppCardItem.jsx +++ b/client/src/components/apps/appCards/AppCardItem.jsx @@ -32,9 +32,7 @@ const AppItem = ({ app }) => { title={{name}} subtitle={ - {developer.organisation || - developer.name || - 'Unspecified'} + {developer.organisation || 'Unspecified'}
{config.ui.appTypeToDisplayName[appType]}{' '}
diff --git a/client/src/components/dialog/AddOrganisationMemberDialog.js b/client/src/components/dialog/AddOrganisationMemberDialog.js index 3a1afaff3..b5f6c65f3 100644 --- a/client/src/components/dialog/AddOrganisationMemberDialog.js +++ b/client/src/components/dialog/AddOrganisationMemberDialog.js @@ -14,7 +14,7 @@ export class AddOrganisationMemberDialog extends Component { submitForm() { //submit form manually as dialog actions work as submit button const res = this.form.submit() - + if (this.form.valid) { return Promise.resolve(res) } else { @@ -36,13 +36,13 @@ export class AddOrganisationMemberDialog extends Component { approveLabel={'Add'} approveAction={this.submitForm.bind(this)} cancelAction={this.props.closeDialog} - contentStyle={{maxWidth: '600px'}} + contentStyle={{ maxWidth: '600px' }} autoCloseOnApprove={false} > - The new member must have logged in with the - email address at least once before being able to be added - to an organisation. + The user will receive an email with an invitation link. If + accepted. the user will be able to upload and manage apps on + behalf of the organisation. { diff --git a/client/src/components/dialog/EditAppDialog.js b/client/src/components/dialog/EditAppDialog.js index a97af9905..01d8be522 100644 --- a/client/src/components/dialog/EditAppDialog.js +++ b/client/src/components/dialog/EditAppDialog.js @@ -1,7 +1,7 @@ // eslint-disable-next-line react/no-deprecated -import PropTypes from 'prop-types'; +import PropTypes from 'prop-types' -import React, { Component } from 'react'; +import React, { Component } from 'react' import { connect } from 'react-redux' import DialogBase from './DialogBase' import { editApp } from '../../actions/actionCreators' @@ -39,8 +39,7 @@ export class EditAppDialog extends Component { description: app.description, appType: app.appType, sourceUrl: app.sourceUrl, - developerName: app.developer.name, - developerEmail: app.developer.email, + contactEmail: app.developer.email, developerAddress: app.developer.address, developerOrg: app.developer.organisation, }} diff --git a/client/src/components/form/EditAppForm.jsx b/client/src/components/form/EditAppForm.jsx index 32ad2fad6..b17cc572e 100644 --- a/client/src/components/form/EditAppForm.jsx +++ b/client/src/components/form/EditAppForm.jsx @@ -1,7 +1,7 @@ // eslint-disable-next-line react/no-deprecated -import PropTypes from 'prop-types'; +import PropTypes from 'prop-types' -import React from 'react'; +import React from 'react' import MenuItem from 'material-ui/MenuItem' import * as formUtils from './ReduxFormUtils' import { Field, reduxForm, Form } from 'redux-form' @@ -19,8 +19,6 @@ const validate = values => { 'appName', 'appType', 'file', - 'developerName', - 'developerEmail', 'developerOrg', 'version', ] @@ -28,8 +26,7 @@ const validate = values => { 'appName', 'sourceUrl', 'appType', - 'developerName', - 'developerEmail', + 'contactEmail', 'developerOrg', ] requiredFields.forEach(field => { @@ -58,8 +55,7 @@ const EditForm = props => { appType: values.appType, description: values.description, developer: { - name: values.developerName, - email: values.developerEmail, + email: values.contactEmail, address: values.developerAddress, organisation: values.developerOrg, }, @@ -114,16 +110,9 @@ const EditForm = props => {

Developer

- diff --git a/client/src/components/form/UploadAppFormStepper.jsx b/client/src/components/form/UploadAppFormStepper.jsx index 0fddc6ad8..53f33fae6 100644 --- a/client/src/components/form/UploadAppFormStepper.jsx +++ b/client/src/components/form/UploadAppFormStepper.jsx @@ -30,14 +30,14 @@ const appTypes = Object.keys(appTypeToDisplayName).map(key => ({ const requiredFields = { general: ['appName', 'description', 'appType', 'sourceUrl'], version: ['file', 'version', 'channel', 'minVer', 'maxVer'], - developer: ['developerName', 'developerEmail', 'developerOrgId'], + developer: ['developerOrgId'], image: ['image'], } const varCharFields = { general: ['appName', 'appType', 'sourceUrl'], version: ['version'], - developer: ['developerName', 'developerEmail', 'developerOrgId'], + developer: ['contactEmail', 'developerOrgId'], image: [], } @@ -213,17 +213,10 @@ const AppDeveloperSection = props => { return ( - { const logo = images.filter(elem => elem.logo)[0] const secondaryText = (

- {developer.name}
+ {developer.organisation}
{config.ui.appTypeToDisplayName[appType]} {!props.manager ? ( diff --git a/client/src/components/user/userAppView/UserAppView.jsx b/client/src/components/user/userAppView/UserAppView.jsx index 8346b5409..e178f4f10 100644 --- a/client/src/components/user/userAppView/UserAppView.jsx +++ b/client/src/components/user/userAppView/UserAppView.jsx @@ -1,7 +1,7 @@ // eslint-disable-next-line react/no-deprecated -import PropTypes from 'prop-types'; +import PropTypes from 'prop-types' -import React, { Component } from 'react'; +import React, { Component } from 'react' import { connect } from 'react-redux' import { Card, CardText, CardTitle, CardHeader } from 'material-ui/Card' import FloatingActionButton from 'material-ui/FloatingActionButton' @@ -275,7 +275,6 @@ const UserAppCardHeader = ({ const subtitle = (

Type: {config.ui.appTypeToDisplayName[app.appType]}
- Author: {app.developer.name}
Organisation: {app.developer.organisation}
{app.status == APP_STATUS_PENDING || app.status == APP_STATUS_REJECTED diff --git a/client/src/components/verify/OrganisationInvitation.js b/client/src/components/verify/OrganisationInvitation.js new file mode 100644 index 000000000..4b012efc8 --- /dev/null +++ b/client/src/components/verify/OrganisationInvitation.js @@ -0,0 +1,35 @@ +import React from 'react' +import { useQueryParams, StringParam } from 'use-query-params' +import JWT from 'jsonwebtoken' +import { useAuth0 } from '@auth0/auth0-react' + +const OrganisationInvitation = () => { + const [queryParams] = useQueryParams({ + invitationToken: StringParam, + }) + const { loginWithRedirect } = useAuth0() + + const { invitationToken } = queryParams + const decoded = JWT.decode(invitationToken) + if (!decoded) { + return 'An error occurred while decoding token' + } + + return ( +
+ {decoded.from.name} has invited you to join organisation{' '} + {decoded.organisation} + +
+ ) +} + +export default OrganisationInvitation diff --git a/client/src/components/verify/OrganisationInvitationCallback.js b/client/src/components/verify/OrganisationInvitationCallback.js new file mode 100644 index 000000000..526579445 --- /dev/null +++ b/client/src/components/verify/OrganisationInvitationCallback.js @@ -0,0 +1,48 @@ +import React, { useEffect, useState } from 'react' +import { Redirect } from 'react-router-dom' +import { useQueryParam, StringParam } from 'use-query-params' +import { acceptOrganisationInvitation } from '../../api/api' + +const OrganisationInvitationCallback = () => { + const [invitationToken] = useQueryParam('invitationToken', StringParam) + + const [invitationData, setInvitationData] = useState(null) + const [error, setError] = useState(null) + + useEffect(() => { + const acceptInvitation = async token => { + try { + const res = await acceptOrganisationInvitation(token) + setInvitationData(res) + } catch (e) { + console.error(e) + setError(e) + } + } + if (invitationToken) { + acceptInvitation(invitationToken) + } + }, []) + + if (!invitationToken) { + console.log('No invitationToken to parse, redirect to index') + return + } + + if (error) { + console.error(error) + return `Failed to join organisation${error.message && + `: ${error.message}`}` + } + + if (!invitationData) { + return 'Joining organisation...' + } + return ( +
+ You've joined {invitationData.organisation.name}! +
+ ) +} + +export default OrganisationInvitationCallback diff --git a/client/src/reducers/snackbarReducer.js b/client/src/reducers/snackbarReducer.js index 701083967..cf15b4c90 100644 --- a/client/src/reducers/snackbarReducer.js +++ b/client/src/reducers/snackbarReducer.js @@ -66,7 +66,7 @@ const snackbarReducer = (state = initialState, action) => { case actionTypes.ORGANISATION_MEMBER_ADD_SUCCESS: { return { ...state, - message: 'Member added', + message: 'Invitation sent', } } diff --git a/server/migrations/20210420135804_user-allow-duplicate-emails.js b/server/migrations/20210420135804_user-allow-duplicate-emails.js new file mode 100644 index 000000000..a96842ddd --- /dev/null +++ b/server/migrations/20210420135804_user-allow-duplicate-emails.js @@ -0,0 +1,136 @@ +exports.up = async knex => { + await knex.schema.table('users', table => { + table.dropUnique('email') + }) + + await knex.schema.table('app', table => { + table.string('contact_email', 255) + }) + + // set contact-email to developer user-email + await knex.raw(` + UPDATE app a + SET contact_email = u.email + from users u + where u.id = a.developer_user_id + `) + + // remove developer-email, add owner-information + await knex.raw('DROP VIEW apps_view') + await knex.raw(` + CREATE VIEW apps_view AS + SELECT app.id AS app_id, + app.type, + appver.version, appver.id AS version_id, appver.created_at AS version_created_at, appver.source_url, appver.demo_url, + media.app_media_id AS media_id, media.original_filename, media.created_at AS media_created_at, media.media_type, + localisedapp.language_code, localisedapp.name, localisedapp.description, localisedapp.slug AS appver_slug, + s.status, s.created_at AS status_created_at, + ac.min_dhis2_version, ac.max_dhis2_version, + c.name AS channel_name, c.id AS channel_id, + app.contact_email AS contact_email, + users.id as owner_id, users.name as owner_name, users.email as owner_email, + org.name AS organisation, org.slug AS organisation_slug, org.email as organisation_email + + FROM app + + INNER JOIN app_status AS s + ON s.app_id = app.id + + INNER JOIN app_version AS appver + ON appver.app_id = s.app_id + + LEFT JOIN app_media_view AS media + ON media.app_id = s.app_id + + INNER JOIN app_version_localised AS localisedapp + ON localisedapp.app_version_id = appver.id + + INNER JOIN app_channel AS ac + ON ac.app_version_id = appver.id + + INNER JOIN channel AS c + ON c.id = ac.channel_id + + INNER JOIN users + ON users.id = app.created_by_user_id + + INNER JOIN organisation AS org + ON org.id = app.organisation_id + `) + + await knex.schema.table('app', table => { + table.dropColumn('developer_user_id') + }) +} + +exports.down = async knex => { + await knex.raw('DROP VIEW apps_view') + await knex.schema.table('users', table => { + table.unique('email') + }) + + await knex.schema.table('app', table => { + table.uuid('developer_user_id') + table + .foreign('developer_user_id') + .references('id') + .inTable('users') + }) + + // if duplicate email, only one will be kept + await knex.raw(` + UPDATE app a + SET developer_user_id = u.id + from users u + where u.email = a.contact_email + `) + + await knex.schema.table('app', table => { + table.dropColumn('contact_email') + table + .uuid('developer_user_id') + .notNullable() + .alter() + }) + + await knex.raw(` + CREATE VIEW apps_view AS + SELECT app.id AS app_id, + app.type, + appver.version, appver.id AS version_id, appver.created_at AS version_created_at, appver.source_url, appver.demo_url, + media.app_media_id AS media_id, media.original_filename, media.created_at AS media_created_at, media.media_type, + localisedapp.language_code, localisedapp.name, localisedapp.description, localisedapp.slug AS appver_slug, + s.status, s.created_at AS status_created_at, + ac.min_dhis2_version, ac.max_dhis2_version, + c.name AS channel_name, c.id AS channel_id, + users.id AS developer_id, users.name AS developer_name, + users.email AS developer_email, + org.name AS organisation, org.slug AS organisation_slug + + FROM app + + INNER JOIN app_status AS s + ON s.app_id = app.id + + INNER JOIN app_version AS appver + ON appver.app_id = s.app_id + + LEFT JOIN app_media_view AS media + ON media.app_id = s.app_id + + INNER JOIN app_version_localised AS localisedapp + ON localisedapp.app_version_id = appver.id + + INNER JOIN app_channel AS ac + ON ac.app_version_id = appver.id + + INNER JOIN channel AS c + ON c.id = ac.channel_id + + INNER JOIN users + ON users.id = app.developer_user_id + + INNER JOIN organisation AS org + ON org.id = app.organisation_id + `) +} diff --git a/server/package.json b/server/package.json index 66370c65f..7fa9b799f 100644 --- a/server/package.json +++ b/server/package.json @@ -26,6 +26,7 @@ "@hapi/inert": "^6.0.1", "@hapi/joi": "^17.1.1", "@hapi/vision": "^6.0.0", + "@hapipal/schmervice": "^2.0.0", "auth0": "^2.32.0", "aws-sdk": "^2.640.0", "blipp": "^4.0.1", @@ -34,10 +35,12 @@ "dotenv": "^6.2.0", "hapi-api-version": "^2.3.1", "hapi-auth-jwt2": "^10.2.0", - "hapi-pino": "^6.3.0", + "hapi-pino": "8", "hapi-swagger": "^12.0.0", + "jsonwebtoken": "^8.5.1", "jwks-rsa": "^1.12.2", "knex": "^0.21.17", + "nodemailer": "^6.5.0", "pg": "^8.4.1", "punycode": "^2.1.1", "rimraf": "^3.0.1", diff --git a/server/seeds/02_app.js b/server/seeds/02_app.js index ebc6a0758..e82eae56a 100644 --- a/server/seeds/02_app.js +++ b/server/seeds/02_app.js @@ -10,7 +10,7 @@ const statuses = [ id: 'e900f977-9b5d-496d-9576-cc704359bde1', app_id: apps[0].id, status: AppStatus.APPROVED, - created_by_user_id: users[0].id, + created_by_user_id: users[1].id, }, { id: '4cb8e2cc-5e92-4b7d-90c4-4ef96e1ea337', diff --git a/server/seeds/mock/apps.js b/server/seeds/mock/apps.js index 5dc2b10f6..88516c283 100644 --- a/server/seeds/mock/apps.js +++ b/server/seeds/mock/apps.js @@ -8,42 +8,42 @@ const dhis2App = { organisation_id: organisations[0].id, created_by_user_id: users[0].id, type: AppType.APP, - developer_user_id: users[1].id, + contact_email: users[1].email, } const whoApp = { id: '600c70ef-032e-4ea8-bb49-8a3bf7d166eb', organisation_id: organisations[1].id, created_by_user_id: users[0].id, type: AppType.APP, - developer_user_id: users[1].id, + contact_email: users[1].email, } const rejectedApp = { id: '384c41f8-b880-42c8-a360-02fc1d80e320', organisation_id: organisations[0].id, created_by_user_id: users[0].id, type: AppType.APP, - developer_user_id: users[1].id, + contact_email: users[1].email, } const pendingApp = { id: '02cb663c-5112-400b-8a93-0353187d337b', organisation_id: organisations[0].id, created_by_user_id: users[1].id, type: AppType.APP, - developer_user_id: users[2].id, + contact_email: users[2].email, } const betaOnlyTrackerWidget = { id: '6d755422-b4f0-4105-b325-3a908f4d4539', organisation_id: organisations[0].id, created_by_user_id: users[0].id, type: AppType.TRACKER_DASHBOARD_WIDGET, - developer_user_id: users[1].id, + contact_email: users[1].email, } const canaryOnlyDashboardWidget = { id: '7a09ad3c-e501-4adc-bffd-0900f7d5aa78', organisation_id: organisations[0].id, created_by_user_id: users[0].id, type: AppType.DASHBOARD_WIDGET, - developer_user_id: users[1].id, + contact_email: users[1].email, } module.exports = [ diff --git a/server/src/data/createApp.js b/server/src/data/createApp.js index 0547272cb..0db5aceba 100644 --- a/server/src/data/createApp.js +++ b/server/src/data/createApp.js @@ -11,10 +11,7 @@ const paramsSchema = joi .string() .uuid() .required(), - developerUserId: joi - .string() - .uuid() - .required(), + contactEmail: joi.string().email(), orgId: joi .string() .uuid() @@ -51,7 +48,7 @@ const createApp = async (params, knex) => { } debug('params: ', params) - const { userId, developerUserId, orgId, appType } = params + const { userId, contactEmail, orgId, appType } = params //generate a new uuid to insert @@ -60,7 +57,7 @@ const createApp = async (params, knex) => { .insert({ created_at: knex.fn.now(), created_by_user_id: userId, - developer_user_id: developerUserId, + contact_email: contactEmail, organisation_id: orgId, type: appType, }) diff --git a/server/src/data/getAppDeveloperId.js b/server/src/data/getAppDeveloperId.js deleted file mode 100644 index 6ccf47f09..000000000 --- a/server/src/data/getAppDeveloperId.js +++ /dev/null @@ -1,19 +0,0 @@ -const getAppById = require('./getAppById') - -const debug = require('debug')('apphub:server:data:getAppDeveloperIp') -/** - * Returns the developer id for the app with specified UUID - * @param {string} id id of the app to fetch developer id for - * @param {object} db Knex instance - */ -const getAppDeveloperId = async (id, db) => { - try { - const apps = await getAppById(id, 'en', db) - debug(`got apps for id ${id}:`, apps) - return apps[0].developer_id - } catch (err) { - return false - } -} - -module.exports = getAppDeveloperId diff --git a/server/src/data/index.js b/server/src/data/index.js index ca5757efc..8be89e18e 100644 --- a/server/src/data/index.js +++ b/server/src/data/index.js @@ -13,7 +13,6 @@ module.exports = { getAllAppsByLanguage: require('./getAllAppsByLanguage'), getAllAppsByDeveloperId: require('./getAllAppsByDeveloperId'), getAppById: require('./getAppById'), - getAppDeveloperId: require('./getAppDeveloperId'), getApps: require('./getApps'), getAppsByIdAndStatus: require('./getAppsByIdAndStatus'), getAppsById: require('./getAppsById'), diff --git a/server/src/models/v1/in/CreateAppModel.js b/server/src/models/v1/in/CreateAppModel.js index 122790185..bcbc070f6 100644 --- a/server/src/models/v1/in/CreateAppModel.js +++ b/server/src/models/v1/in/CreateAppModel.js @@ -8,7 +8,6 @@ const CreateModelAppData = Joi.object().keys({ appType: Joi.string().valid(...AppTypes), sourceUrl: Joi.string().uri(), developer: Joi.object().keys({ - name: Joi.string(), email: Joi.string().email(), organisationId: Joi.string(), }), diff --git a/server/src/models/v1/out/User.js b/server/src/models/v1/out/User.js index 7f8ffb429..a09811cbe 100644 --- a/server/src/models/v1/out/User.js +++ b/server/src/models/v1/out/User.js @@ -3,6 +3,5 @@ const Joi = require('@hapi/joi') module.exports = Joi.object().keys({ address: Joi.string().allow(''), email: Joi.string().email(), - name: Joi.string(), organisation: Joi.string(), }) diff --git a/server/src/plugins/apiRoutes.js b/server/src/plugins/apiRoutes.js index 8caf4ac77..fde4940a6 100644 --- a/server/src/plugins/apiRoutes.js +++ b/server/src/plugins/apiRoutes.js @@ -32,10 +32,11 @@ const defaultNotFoundRoute = { const apiRoutesPlugin = { name: 'DHIS2 App Hub Backend', register: async (server, options) => { - const { knex, auth } = options + const { knex, auth, config } = options const bindContext = { db: knex, + config, } if (auth && auth.useAuth0()) { diff --git a/server/src/routes/v1/apps/formatting/convertAppsToApiV1Format.js b/server/src/routes/v1/apps/formatting/convertAppsToApiV1Format.js index 0a9164ae6..7f9114aa5 100644 --- a/server/src/routes/v1/apps/formatting/convertAppsToApiV1Format.js +++ b/server/src/routes/v1/apps/formatting/convertAppsToApiV1Format.js @@ -23,13 +23,12 @@ const convertDbAppViewRowToAppApiV1Object = app => ({ //TODO: set address developer: { address: '', - email: app.developer_email, + email: app.contact_email, organisation: app.organisation, - name: app.developer_name, }, //TODO: can we use developer_email here ? previous it was oauth token|id - owner: app.developer_email, + owner: app.owner_id, images: [], sourceUrl: app.source_url || '', @@ -57,7 +56,11 @@ const convertAppToV1AppVersion = (app, serverUrl) => { created: +new Date(app.version_created_at), demoUrl: app.demo_url || '', - downloadUrl: `${serverUrl}/v1/apps/download/${encodeURIComponent(app.organisation_slug)}/${encodeURIComponent(app.appver_slug)}_${encodeURIComponent(app.version)}.zip`, + downloadUrl: `${serverUrl}/v1/apps/download/${encodeURIComponent( + app.organisation_slug + )}/${encodeURIComponent(app.appver_slug)}_${encodeURIComponent( + app.version + )}.zip`, id: app.version_id, lastUpdated: +new Date(app.version_created_at), maxDhisVersion: app.max_dhis2_version, diff --git a/server/src/routes/v1/apps/handlers/editImage.js b/server/src/routes/v1/apps/handlers/editImage.js index 79c598ce9..e954bcf61 100644 --- a/server/src/routes/v1/apps/handlers/editImage.js +++ b/server/src/routes/v1/apps/handlers/editImage.js @@ -7,8 +7,8 @@ const { const { updateImageMeta, - getAppDeveloperId, setImageAsLogoForApp, + getOrganisationAppsByUserId, } = require('../../../../data') module.exports = { @@ -36,11 +36,16 @@ module.exports = { const jsonPayload = request.payload const currentUser = await getCurrentUserFromRequest(request, db) - const appDeveloperId = await getAppDeveloperId(appId, db) - + const appsUserCanEdit = await getOrganisationAppsByUserId( + currentUser.id, + db + ) + const userCanEditApp = appsUserCanEdit + .map(app => app.app_id) + .includes(request.params.appId) const isManager = currentUserIsManager(request) - if (isManager || appDeveloperId === currentUser.id) { + if (isManager || userCanEditApp) { //can edit app const transaction = await db.transaction() diff --git a/server/src/routes/v2/organisations.js b/server/src/routes/v2/organisations.js index f66be2d23..db8c90c59 100644 --- a/server/src/routes/v2/organisations.js +++ b/server/src/routes/v2/organisations.js @@ -1,4 +1,6 @@ const Boom = require('@hapi/boom') +const Bounce = require('@hapi/bounce') +const JWT = require('jsonwebtoken') const Joi = require('../../utils/CustomJoi') const { currentUserIsManager, @@ -9,6 +11,7 @@ const { Organisation } = require('../../services') const OrgModel = require('../../models/v2/Organisation') // const debug = require('debug')('apphub:server:routes:handlers:organisations') const { wrapError, UniqueViolationError } = require('db-errors') +const getServerUrl = require('../../utils/getServerUrl') module.exports = [ { @@ -327,4 +330,132 @@ module.exports = [ } }, }, + { + method: 'POST', + path: '/v2/organisations/{orgId}/invitation', + config: { + auth: 'token', + tags: ['api', 'v2'], + validate: { + payload: Joi.object({ + email: Joi.string() + .email() + .required(), + skipSend: Joi.boolean().default(false), + }), + params: Joi.object({ + orgId: OrgModel.definition.extract('id').required(), + }), + }, + }, + handler: async (request, h) => { + const { db } = h.context + const currentUser = await getCurrentUserFromRequest(request) + + const org = await Organisation.findOne( + request.params.orgId, + true, + db + ) + const isMember = await Organisation.hasUser( + org.id, + currentUser.id, + db + ) + const isManager = currentUserIsManager(request) + const canAdd = org.owner === currentUser.id || isMember || isManager + + if (!canAdd) { + throw Boom.forbidden('You do not have permission to add users') + } + + const { emailService } = request.services(true) + const { decoded, token } = Organisation.generateInvitationToken( + { + organisation: org, + user: currentUser, + }, + request.payload.email + ) + + let baseUrl = getServerUrl(request) + if (process.env.NODE_ENV === 'development') { + // use referrer as frontend might be running in webpack + baseUrl = request.info.referrer || baseUrl + } + baseUrl = baseUrl.replace( + /\/(api)*$/, // replace trailing /api and / + '' + ) + const link = `${baseUrl}/verify/org?invitationToken=${token}` + + request.logger.info( + `User ${currentUser.id}: Sending organisation (${org.name}) invitation to ${decoded.emailTo}` + ) + + if (!request.payload.skipSend) { + await emailService.sendOrganisationInvitation( + { + emailTo: decoded.emailTo, + organisation: org.name, + fromName: currentUser.name, + }, + link + ) + } + + return { + token, + link, + } + }, + }, + { + // accept invitation-endpoint + method: 'POST', + path: '/v2/organisations/invitation/{token}', + config: { + auth: 'token', + tags: ['api', 'v2'], + validate: { + params: Joi.object({ + token: Joi.string().required(), + }), + }, + }, + handler: async (request, h) => { + const { id } = await getCurrentUserFromRequest(request) + const { db } = h.context + const { token } = request.params + const secret = h.context.config.server.jwtSecret + let payload + + try { + payload = JWT.verify(token, secret) + } catch (e) { + request.logger.error(e) + if (e instanceof JWT.TokenExpiredError) { + throw Boom.badRequest('Invitation has expired') + } + throw Boom.badRequest('Invalid token') + } + try { + await Organisation.addUserById(payload.sub, id, db) + } catch (e) { + Bounce.ignore(wrapError(e), UniqueViolationError) + throw Boom.conflict( + 'You are already a member of that organisation' + ) + } + + return h + .response({ + organisation: { + id: payload.sub, + name: payload.organisation, + }, + }) + .code(200) + }, + }, ] diff --git a/server/src/security/createUserValidationFunc.js b/server/src/security/createUserValidationFunc.js index b7a56e9c1..f2b54ec8e 100644 --- a/server/src/security/createUserValidationFunc.js +++ b/server/src/security/createUserValidationFunc.js @@ -78,10 +78,11 @@ const createUserValidationFunc = (db, audience, auth0ManagementClient) => { user = await db.transaction(createUserTransaction) } - returnObj.credentials.userId = user.id const roles = returnObj.credentials[getNamespacedClaimKey('roles')] + returnObj.credentials.userId = user.id returnObj.credentials.roles = roles + returnObj.credentials.name = user.name } else if (decoded.sub === `${audience}@clients`) { //If we get here we're dealing with an M2M API authenticated user const [apiUser] = await db('users') @@ -105,6 +106,7 @@ const createUserValidationFunc = (db, audience, auth0ManagementClient) => { returnObj.credentials.roles = [ROLES.MANAGER] //the M2M has full access (all roles) returnObj.credentials.email_verified = true returnObj.credentials.userId = apiUser.id + returnObj.credentials.name = apiUser.name } catch (err) { throw Boom.internal(err) } diff --git a/server/src/security/index.js b/server/src/security/index.js index 73b839ae8..0f8e0a1bd 100644 --- a/server/src/security/index.js +++ b/server/src/security/index.js @@ -78,6 +78,7 @@ const getCurrentUserFromRequest = request => { } const user = { id, + name: request.auth.credentials.name, } resolve(user) } catch (err) { diff --git a/server/src/server/env-config.js b/server/src/server/env-config.js index 7874811f0..a499e1fac 100644 --- a/server/src/server/env-config.js +++ b/server/src/server/env-config.js @@ -17,6 +17,7 @@ const config = { server: { port: process.env.PORT || 3000, host: process.env.HOST || 'localhost', + jwtSecret: getRequiredEnv('INTERNAL_JWT_SECRET'), }, displayRoutesTable: process.env.NODE_ENV !== 'test', logging: { @@ -25,6 +26,9 @@ const config = { level: process.env.NODE_ENV !== 'test' ? 'info' : 'error', prettyPrint: process.env.NODE_ENV !== 'test', }, + aws: { + region: process.env.AWS_REGION || 'eu-west-1', + }, auth: { noAuthUserIdMapping: process.env.NO_AUTH_MAPPED_USER_ID, config: { diff --git a/server/src/server/init-server.js b/server/src/server/init-server.js index 0ece551e3..ae984c306 100644 --- a/server/src/server/init-server.js +++ b/server/src/server/init-server.js @@ -7,7 +7,7 @@ const Vision = require('@hapi/vision') const HapiSwagger = require('hapi-swagger') const Pino = require('hapi-pino') - +const Schmervice = require('@hapipal/schmervice') const options = require('../options/index.js') const staticFrontendRoutes = require('../plugins/staticFrontendRoutes') @@ -15,6 +15,7 @@ const apiRoutes = require('../plugins/apiRoutes') const errorMapper = require('../plugins/errorMapper') const queryFilter = require('../plugins/queryFilter') const pagination = require('../plugins/pagination') +const { createEmailService } = require('../services/EmailService') exports.init = async (knex, config) => { debug('Starting server...') @@ -86,6 +87,10 @@ exports.init = async (knex, config) => { }) } + await server.register(Schmervice) + + await server.registerService(createEmailService) + await server.register({ plugin: staticFrontendRoutes, }) @@ -103,6 +108,7 @@ exports.init = async (knex, config) => { options: { knex, auth: config.auth, + config, }, }, { diff --git a/server/src/services/EmailService.js b/server/src/services/EmailService.js new file mode 100644 index 000000000..0aab4b7d7 --- /dev/null +++ b/server/src/services/EmailService.js @@ -0,0 +1,86 @@ +const Schmervice = require('@hapipal/schmervice') +const Hapi = require('@hapi/hapi') +const Nodemailer = require('nodemailer') +const JWT = require('jsonwebtoken') +const AWS = require('aws-sdk') +const debug = require('debug')('apphub:server:service:EmailService') + +const FROM_INFO = { + name: 'DHIS2 App Hub', + address: 'apphub@dhis2.org', +} +class EmailService extends Schmervice.Service { + constructor(server, schmerviceOptions, serviceOptions) { + super(server, schmerviceOptions) + + if (!serviceOptions.transport) { + server.logger.warn( + ['init', 'EmailService'], + 'EmailService is setup using "JSONTransport", emails will not be sent. Setup AWS-env to use AWS SES.' + ) + this.transporter = Nodemailer.createTransport({ + jsonTransport: true, + }) + } else { + this.transporter = serviceOptions.transport + debug( + `EmailService initialized with transport ${this.transporter.transporter.name}` + ) + } + } + + async sendMail(sendTemplate) { + const res = await this.transporter.sendMail(sendTemplate) + if (this.transporter.transporter.name === 'JSONTransport') { + debug('Send mail', res.message) + } + return res + } + + async sendOrganisationInvitation( + { emailTo, organisation, fromName }, + link + ) { + const sendTemplate = { + from: FROM_INFO, + to: emailTo, + subject: 'You have been invited to an organisation', + text: `Hi!\n +${fromName} has invited you to join the organisation ${organisation} on App Hub. To accept the invitation, click the following link:\n +${link}\n +This invitation expires in 48 hours. If you accept you will be able to upload and manage apps on behalf of the organisation.`, + } + + return this.sendMail(sendTemplate) + } +} + +const createEmailService = (server, schmerviceOptions) => { + const { aws } = server.realm.settings.bind.config + let transport + + if ( + process.env.AWS_ACCESS_KEY_ID && + process.env.AWS_SECRET_ACCESS_KEY && + aws && + aws.region + ) { + const ses = new AWS.SES({ + region: aws.region, + apiVersion: '2010-12-01', + }) + transport = Nodemailer.createTransport({ + SES: { + ses, + aws: AWS, + }, + }) + } + + const service = new EmailService(server, schmerviceOptions, { + transport, + }) + return Schmervice.withName('emailService', service) +} + +module.exports = { EmailService, createEmailService } diff --git a/server/src/services/organisation.js b/server/src/services/organisation.js index c4da14c24..6ea9f253e 100644 --- a/server/src/services/organisation.js +++ b/server/src/services/organisation.js @@ -2,6 +2,7 @@ const { NotFoundError } = require('../utils/errors') const { slugify } = require('../utils/slugify') const Organisation = require('../models/v2/Organisation') const Boom = require('@hapi/boom') +const JWT = require('jsonwebtoken') const getOrganisationQuery = db => db('organisation').select( @@ -177,6 +178,25 @@ const hasUser = async (id, userId, knex) => { return hasUser.length > 0 } +const generateInvitationToken = ({ organisation, user }, emailTo) => { + const secret = process.env.INTERNAL_JWT_SECRET + + const decoded = { + from: { id: user.id, name: user.name }, + emailTo, + sub: organisation.id, + organisation: organisation.name, + } + + const token = JWT.sign(decoded, secret, { + expiresIn: 60 * 60 * 24 * 2, //48 hrs + }) + return { + decoded, + token, + } +} + module.exports = { find, findOne, @@ -188,5 +208,6 @@ module.exports = { removeUser, hasUser, getUsersInOrganisation, + generateInvitationToken, ensureUniqueSlug, } diff --git a/server/test/data/getAppDeveloperId.js b/server/test/data/getAppDeveloperId.js deleted file mode 100644 index 5f9c8e082..000000000 --- a/server/test/data/getAppDeveloperId.js +++ /dev/null @@ -1,27 +0,0 @@ -const Lab = require('@hapi/lab') - -// prepare environment -const { it, describe } = (exports.lab = Lab.script()) - -const { expect } = require('@hapi/code') - -const knexConfig = require('../../knexfile') -const db = require('knex')(knexConfig) - -const users = require('../../seeds/mock/users') -const apps = require('../../seeds/mock/apps') - -describe('@data::getAppDeveloperId', () => { - const getAppDeveloperId = require('../../src/data/getAppDeveloperId') - - it('should return the correct developer id of an app', async () => { - const devId = await getAppDeveloperId(apps[0].id, db) - - expect(devId).to.equal(users[1].id) - }) - - it('should return false if no app/dev is found', async () => { - const devId = await getAppDeveloperId('boo', db) - expect(devId).to.be.false() - }) -}) diff --git a/server/test/data/index.js b/server/test/data/index.js index 418ab2318..a5c098e20 100644 --- a/server/test/data/index.js +++ b/server/test/data/index.js @@ -219,7 +219,7 @@ describe('@data::updateApp', () => { const newData = { id: app_id, - userId: firstApp.developer_id, + userId: firstApp.owner_id, name: 'Changed name', sourceUrl: 'https://some/url', demoUrl: 'http://some/other/url', @@ -266,7 +266,7 @@ describe('@data::updateAppVersion', () => { await updateAppVersion( { id: appVersionIdToUpdate, - userId: app.developer_id, + userId: app.owner_id, minDhisVersion: '123', maxDhisVersion: '456', version: '789', @@ -291,7 +291,7 @@ describe('@data::updateAppVersion', () => { await updateAppVersion( { id: appVersionIdToUpdate, - userId: app.developer_id, + userId: app.owner_id, minDhisVersion: app.minDhisVersion, maxDhisVersion: app.maxDhisVersion, version: app.version, diff --git a/server/test/routes/index.js b/server/test/routes/index.js index de6476b5f..99bb5383d 100644 --- a/server/test/routes/index.js +++ b/server/test/routes/index.js @@ -12,6 +12,7 @@ const { init } = require('../../src/server/init-server') const { flatten } = require('../../src/utils') const { config } = require('../../src/server/env-config') +const appVersionMocks = require('../../seeds/mock/appversions') describe('Get all published apps [v1]', async () => { let server @@ -46,7 +47,6 @@ describe('Get all published apps [v1]', async () => { expect(whoApp[0].developer.organisation).to.be.equal( 'World Health Organization' ) - expect(whoApp[0].developer.name).to.be.equal('Erik Arenhill') expect(whoApp[0].versions[0].version).to.be.equal('1.0') expect(whoApp[0].versions[0].demoUrl).to.be.equal( @@ -187,13 +187,14 @@ describe('Get all published apps [v2]', () => { expect(whoApp[0].developer.organisation).to.be.equal( 'World Health Organization' ) - expect(whoApp[0].developer.name).to.be.equal('Erik Arenhill') - - expect(whoApp[0].versions[0].version).to.be.equal('1.0') - expect(whoApp[0].versions[0].demoUrl).to.be.equal( + const version1App = whoApp[0].versions.find( + ver => ver.id === appVersionMocks[1][0].id + ) + expect(version1App.version).to.be.equal('1.0') + expect(version1App.demoUrl).to.be.equal( 'https://play.dhis2.org/2.30/api/apps/Immunization-analysis/index.html#!/report' ) - expect(whoApp[0].versions[0].downloadUrl).to.be.equal( + expect(version1App.downloadUrl).to.be.equal( 'http://localhost:3000/api/v1/apps/download/world-health-organization/a-nice-app-by-who_1.0.zip' ) @@ -250,7 +251,8 @@ describe('Get all published apps [v2]', () => { it('should only return apps supporting version 2.27', async () => { const injectOptions = { method: 'GET', - url: '/api/v2/apps?channels=stable,development,canary&dhis_version=2.27', + url: + '/api/v2/apps?channels=stable,development,canary&dhis_version=2.27', } const response = await server.inject(injectOptions) diff --git a/server/test/routes/sample-app.js b/server/test/routes/sample-app.js index 891fbeb6f..ddf2eb6a7 100644 --- a/server/test/routes/sample-app.js +++ b/server/test/routes/sample-app.js @@ -6,7 +6,6 @@ exports.sampleApp = { appType: 'APP', sourceUrl: 'http://github.com', developer: { - name: 'Foo Bar', email: 'foobar@dhis2.org', organisationId: mockOrganisations[0].id, }, diff --git a/server/test/services/organisation.js b/server/test/services/organisation.js index 76d18ef2b..410b40e39 100644 --- a/server/test/services/organisation.js +++ b/server/test/services/organisation.js @@ -12,6 +12,7 @@ const { Organisation } = require('../../src/services') const UserMocks = require('../../seeds/mock/users') const OrganisationMocks = require('../../seeds/mock/organisations') const { Filters } = require('../../src/utils/Filter') +const JWT = require('jsonwebtoken') describe('@services::Organisation', () => { let db @@ -457,4 +458,27 @@ describe('@services::Organisation', () => { expect(updatedOrg.email).to.be.equal(email) }) }) + + describe('generateInvitationToken', () => { + it('should generate a JWT token with secret', async () => { + const dhis2Org = OrganisationMocks[0] + const dhis2User = UserMocks[0] + const viktorUser = UserMocks[2] + const prevSecret = process.env.INTERNAL_JWT_SECRET + const secret = (process.env.INTERNAL_JWT_SECRET = + 'S0meSecretIn4T3st') + const { decoded, token } = Organisation.generateInvitationToken( + { organisation: dhis2Org, user: dhis2User }, + viktorUser.email + ) + expect(token).to.be.a.string() + expect(decoded).to.be.an.object() + expect(decoded.sub).to.be.equal(dhis2Org.id) + expect(decoded.organisation).to.be.equal(dhis2Org.name) + + const jwtDecoded = JWT.verify(token, secret) + expect(jwtDecoded).to.be.an.object() + expect(jwtDecoded).to.include(decoded) + }) + }) }) diff --git a/yarn.lock b/yarn.lock index cfa544b14..c37c5b094 100644 --- a/yarn.lock +++ b/yarn.lock @@ -271,7 +271,7 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.9.0": +"@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== @@ -1124,12 +1124,12 @@ "@hapi/boom" "9.x.x" "@hapi/hoek" "9.x.x" -"@hapi/bourne@1.x.x", "@hapi/bourne@^1.3.2": +"@hapi/bourne@1.x.x": version "1.3.2" resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== -"@hapi/bourne@2.x.x": +"@hapi/bourne@2.x.x", "@hapi/bourne@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== @@ -1491,6 +1491,13 @@ "@hapi/bourne" "2.x.x" "@hapi/hoek" "9.x.x" +"@hapipal/schmervice@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapipal/schmervice/-/schmervice-2.0.0.tgz#7b19f0d659f0944c43615a1e7f4de18d310bd6ff" + integrity sha512-EmQLVM4MdPXCw1iijqfG0gQXnawYsPypagdEFMo5c0kf637Sjj7x5DjDOMN2Qmce+tIm2Nv70vrSk6qfrJW3qw== + dependencies: + "@hapi/hoek" "9.x.x" + "@marionebl/sander@^0.6.0": version "0.6.1" resolved "https://registry.yarnpkg.com/@marionebl/sander/-/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b" @@ -2197,10 +2204,10 @@ abortcontroller-polyfill@^1.5.0: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.1.tgz#27084bac87d78a7224c8ee78135d05df430c2d2f" integrity sha512-yml9NiDEH4M4p0G4AcPkg8AAa4mF3nfYF28VQxaokpO67j9H7gWgmsVWJ/f1Rn+PzsnDYvzJzWIQzCqDKRvWlA== -abstract-logging@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-1.0.0.tgz#8b7deafd310559bc28f77724dd1bb30177278c1b" - integrity sha1-i33q/TEFWbwo93ck3RuzAXcnjBs= +abstract-logging@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" + integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" @@ -2560,6 +2567,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + auth0@^2.32.0: version "2.32.0" resolved "https://registry.yarnpkg.com/auth0/-/auth0-2.32.0.tgz#dd6731fb4c6d7a2a1261218ddbe9bc2326f87734" @@ -3233,6 +3245,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + change-case@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/change-case/-/change-case-2.3.1.tgz#2c4fde3f063bb41d00cd68e0d5a09db61cbe894f" @@ -4067,10 +4087,10 @@ date-fns@^1.30.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -dateformat@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dateformat@^4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c" + integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q== db-errors@^0.2.3: version "0.2.3" @@ -5030,10 +5050,10 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-redact@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-2.0.0.tgz#17bb8f5e1f56ecf4a38c8455985e5eab4c478431" - integrity sha512-zxpkULI9W9MNTK2sJ3BpPQrTEXFNESd2X6O1tXMFpK/XM0G5c5Rll2EVYZH2TqI3xRGK/VaJ+eEOt7pnENJpeA== +fast-redact@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.0.tgz#ac2f9e36c9f4976f5db9fb18c6ffbaf308cf316d" + integrity sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w== fast-safe-stringify@^2.0.7: version "2.0.7" @@ -5734,15 +5754,15 @@ hapi-no-var@1.x.x: resolved "https://registry.yarnpkg.com/hapi-no-var/-/hapi-no-var-1.0.1.tgz#e9d87fd4de6149104a3fca797ef5c2ef5c182342" integrity sha512-kk2xyyTzI+eQ/oA1rO4eVdCpYsrPHVERHa6+mTHD08XXFLaAkkaEs6reMg1VyqGh2o5xPt//DO4EhCacLx/cRA== -hapi-pino@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/hapi-pino/-/hapi-pino-6.5.0.tgz#33100f07626e7d8cef2b36965cbfb68cdb39c937" - integrity sha512-262F+AJpNHCCGIPpqugPtVWU2plXyCcjeXkbcrD60LRg/tcobLAHuzR6usNcKCansJbrcCy+/kBXYcKQGae7+g== +hapi-pino@8: + version "8.3.0" + resolved "https://registry.yarnpkg.com/hapi-pino/-/hapi-pino-8.3.0.tgz#1cdcff01e4b61af8aa9bd7ca87c592582c403cd7" + integrity sha512-8Cm1WIs6jp8B9ZzYqPFbCWNKt6F6jNCfLmCIHmPsm35sTOvT/r5+d9KpYR2vigWQRLS23VBXzOqUVESpP7r+jA== dependencies: - "@hapi/hoek" "^8.3.0" - abstract-logging "^1.0.0" - pino "^5.13.5" - pino-pretty "^3.2.2" + "@hapi/hoek" "^9.0.0" + abstract-logging "^2.0.0" + pino "^6.0.0" + pino-pretty "^4.0.0" hapi-scope-start@2.x.x: version "2.1.1" @@ -8034,6 +8054,11 @@ node-releases@^1.1.50: dependencies: semver "^6.3.0" +nodemailer@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.5.0.tgz#d12c28d8d48778918e25f1999d97910231b175d9" + integrity sha512-Tm4RPrrIZbnqDKAvX+/4M+zovEReiKlEXWDzG4iwtpL9X34MJY+D5LnQPH/+eghe8DLlAVshHAJZAZWBGhkguw== + nodemon@^1.19.2: version "1.19.4" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.19.4.tgz#56db5c607408e0fdf8920d2b444819af1aae0971" @@ -8768,39 +8793,39 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pino-pretty@^3.2.2: - version "3.5.0" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-3.5.0.tgz#5e88003fdbaef9d541393eac4498ac9b97c1683b" - integrity sha512-3sg6s7nI5vgjrEBKhLckAfLPjgjm1U/Fw0C6jhoWnIU2D6QqCpF8eAqL+E1A6bBglCGR/APCx8VuxchBxtuMjA== +pino-pretty@^4.0.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-4.7.1.tgz#499cf185e110399deae731221c899915c811bd1a" + integrity sha512-ILE5YBpur88FlZ0cr1BNqVjgG9fOoK+md3peqmcs7AC6oq7SNiaJioIcrykMxfNsuygMYjUJtvAcARRE9aRc9w== dependencies: - "@hapi/bourne" "^1.3.2" + "@hapi/bourne" "^2.0.0" args "^5.0.1" - chalk "^2.4.2" - dateformat "^3.0.3" + chalk "^4.0.0" + dateformat "^4.5.1" fast-safe-stringify "^2.0.7" jmespath "^0.15.0" joycon "^2.2.5" pump "^3.0.0" - readable-stream "^3.4.0" + readable-stream "^3.6.0" split2 "^3.1.1" - strip-json-comments "^3.0.1" + strip-json-comments "^3.1.1" -pino-std-serializers@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz#cb5e3e58c358b26f88969d7e619ae54bdfcc1ae1" - integrity sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ== +pino-std-serializers@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" + integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== -pino@^5.13.5: - version "5.16.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-5.16.0.tgz#94d01cb38b5f4a16dd4d7c47aa489fbfe40c3c06" - integrity sha512-k9cDzHd9S/oYSQ9B9g9+7RXkfsZX78sQXERC8x4p2XArECZXULx9nqNwZvJHsLj779wPCt+ybN+dG8jFR70p6Q== +pino@^6.0.0: + version "6.11.3" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.11.3.tgz#0c02eec6029d25e6794fdb6bbea367247d74bc29" + integrity sha512-drPtqkkSf0ufx2gaea3TryFiBHdNIdXKf5LN0hTM82SXI4xVIve2wLwNg92e1MT6m3jASLu6VO7eGY6+mmGeyw== dependencies: - fast-redact "^2.0.0" + fast-redact "^3.0.0" fast-safe-stringify "^2.0.7" flatstr "^1.0.12" - pino-std-serializers "^2.4.2" - quick-format-unescaped "^3.0.3" - sonic-boom "^0.7.5" + pino-std-serializers "^3.1.0" + quick-format-unescaped "^4.0.3" + sonic-boom "^1.0.2" pirates@^4.0.0: version "4.0.1" @@ -9383,10 +9408,10 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== -quick-format-unescaped@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz#fb3e468ac64c01d22305806c39f121ddac0d1fb9" - integrity sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ== +quick-format-unescaped@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.3.tgz#6d6b66b8207aa2b35eef12be1421bb24c428f652" + integrity sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg== quick-lru@^1.0.0: version "1.1.0" @@ -9610,7 +9635,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9731,7 +9756,7 @@ redux@^4.0.5: loose-envify "^1.4.0" symbol-observable "^1.2.0" -regenerate-unicode-properties@^8.1.0, regenerate-unicode-properties@^8.2.0: +regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== @@ -9753,7 +9778,7 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== @@ -9796,7 +9821,7 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.6.0, regexpu-core@^4.7.0: +regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== @@ -9842,7 +9867,7 @@ regjsgen@^0.2.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= -regjsgen@^0.5.0, regjsgen@^0.5.1: +regjsgen@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== @@ -9854,7 +9879,7 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -regjsparser@^0.6.0, regjsparser@^0.6.4: +regjsparser@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== @@ -10520,11 +10545,12 @@ socks@^2.3.3: ip "^1.1.5" smart-buffer "^4.1.0" -sonic-boom@^0.7.5: - version "0.7.6" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-0.7.6.tgz#c42df6df884a6a3d54fa7a45b11e4e2196818d45" - integrity sha512-k9E2QQ4zxuVRLDW+ZW6ISzJs3wlEorVdmM7ApDgor7wsGKSDG5YGHsGmgLY4XYh4DMlr/2ap2BWAE7yTFJtWnQ== +sonic-boom@^1.0.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" + integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== dependencies: + atomic-sleep "^1.0.0" flatstr "^1.0.12" sort-keys@^1.0.0: @@ -10913,6 +10939,11 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + style-loader@^0.13.1: version "0.13.2" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" @@ -11451,7 +11482,7 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0, unicode-match-property-value-ecmascript@^1.2.0: +unicode-match-property-value-ecmascript@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== From d4621ca3ab58fe5f92f9be00bc17e3e3f3e732c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Wed, 19 May 2021 14:26:50 +0100 Subject: [PATCH 21/29] feat: UI redesign (#458) * feat: enable css modules * chore: add @dhis2/ui dependency * feat: add Header.module.css * chore: format client JS * feat: redesign header * refactor: remove unused CSS styles * refactor: simplify header * feat: redesign app cards container * feat: redesign app filters * feat: redesign app cards * feat: redesign pagination * fix: show query in input when returning from search result * chore: remove unused dependencies * refactor: move api/api.js to api/index.js * feat: add screenshots to app view * feat: redesign versions table * fix: handle development-only and canary-only apps * fix: fix tests * chore: update formatting * feat: add download button to about app section * feat: add dhis version filtering * fix: typo * fix: replace material UI FontIcon with own component * feat: add logout button * feat: make profile dropdown keyboard accessible * feat: highlight current route in header * feat: start work on user view * fix: use semantic
-
- ) -} - -const ApiKeyDisplay = ({ createdAt, onDelete, apiKey, isUpdating }) => { - const handleCopyToClipboard = () => { - copyToClipboard(apiKey) - } - - return ( -
- {!apiKey && ( - - If you suspect your key is compromised or you lost it, you - can delete it and generate a new one. Be aware that any - scripts or applications using the API key will need to be - updated. - - )} -
- {apiKey && ( -
- API key generated} - icon="check_circle" - > - Make sure to copy your new API key below. You won’t - be able to see it again! -
- {apiKey} - - - content_paste - - -
-
-
- )} -
- API is key active. API key was generated at{' '} - {new Date(createdAt).toLocaleString()} - : null} - disabled={isUpdating} - /> -
-
-
- ) -} - -const ApiKeyStatus = () => { - const [apiKey, setApiKey] = useState(null) - const [isUpdating, setIsUpdating] = useState(false) - const { data, error, mutate } = useQuery('key', null, requestOpts) - - const handleDeleteKey = async () => { - setIsUpdating(true) - await deleteApiKey() - setIsUpdating(false) - mutate({ hasApiKey: false, createdAt: undefined }) - } - - const handleGenerateKey = async () => { - try { - setIsUpdating(true) - const { apiKey } = await generateApiKey() - setIsUpdating(false) - setApiKey(apiKey) - mutate({ hasApiKey: true, createdAt: new Date() }, false) - } catch (e) { - console.error(e) - //TODO: show snackbar? - } - } - - if (error) { - return 'Failed to load API-key status' - } - if (!data) { - return - } - - return data.hasApiKey ? ( - - ) : ( - - ) -} - -export default ApiKeyView diff --git a/client/src/components/user/UserView.jsx b/client/src/components/user/UserView.jsx deleted file mode 100644 index 078a7484c..000000000 --- a/client/src/components/user/UserView.jsx +++ /dev/null @@ -1,159 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { connect } from 'react-redux' -import Grid from '../../material/Grid/Grid' -import Col from '../../material/Grid/Col' -import FontIcon from 'material-ui/FontIcon' -import { Link, Route, Redirect, Switch } from 'react-router-dom' -import UserAppView from './userAppView/UserAppView' -import { List, ListItem } from 'material-ui/List' -import AppUploadStepper from './appUpload/AppUploadStepper' -import AppList from './appList/AppList' -import Divider from 'material-ui/Divider' -import { getUserInfo } from '../../selectors/userSelectors' -import { userLoad } from '../../actions/actionCreators' -import ErrorOrLoading from '../utils/ErrorOrLoading' -import ActiveLink from '../utils/ActiveLink' -import OrganisationList from './organisation/OrganisationList' -import OrganisationView from './organisation/OrganisationView' -import ApiKeyView from './ApiKey' -import { ListItemLogoutButton } from '../auth/LogoutButton' - -class UserView extends Component { - componentDidMount() { - this.props.loadUser() - } - - render() { - // const {info, loading, loaded, error} = this.props.user; - const userInfo = this.props.user - const loadOrErr = userInfo.loading || userInfo.error - const contentRoutes = ( - - - - - - - - {/* No-match route - redirect to index */} - } /> - - ) - - return ( - - - - - - home - - } - /> - - - - - list - - } - /> - - - - people - - } - /> - - - - file_upload - - } - /> - - - - vpn_key - - } - /> - - - - - - {loadOrErr ? ( - - ) : ( - contentRoutes - )} - - - ) - } -} - -UserView.PropTypes = { - auth: PropTypes.object, -} - -const mapStateToProps = state => ({ - user: getUserInfo(state), -}) - -const mapDispatchToProps = dispatch => ({ - loadUser() { - dispatch(userLoad()) - }, -}) - -export default connect(mapStateToProps, mapDispatchToProps)(UserView) diff --git a/client/src/components/user/appList/AppList.jsx b/client/src/components/user/appList/AppList.jsx deleted file mode 100644 index 1be0b4f2e..000000000 --- a/client/src/components/user/appList/AppList.jsx +++ /dev/null @@ -1,289 +0,0 @@ -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { List } from 'material-ui/List' -import { Card, CardText } from 'material-ui/Card' -import TextField from 'material-ui/TextField' -import AppListItem from './AppListItem' -import Popover from 'material-ui/Popover' -import { TextFilter, SelectFilter } from '../../utils/Filters' -import { - Toolbar, - ToolbarGroup, - ToolbarSeparator, - ToolbarTitle, -} from 'material-ui/Toolbar' -import Button from 'material-ui/FlatButton' -import IconButton from 'material-ui/IconButton' -import FontIcon from 'material-ui/FontIcon' -import SubHeader from '../../header/SubHeader' -import { - approveApp, - loadAllApps, - setAppApproval, - userAppsLoad, - openDialog, -} from '../../../actions/actionCreators' -import * as dialogTypes from '../../../constants/dialogTypes' -import sortBy from 'lodash/sortBy' -import ErrorOrLoading from '../../utils/ErrorOrLoading' -import * as selectors from '../../../selectors/userSelectors' -import { - APP_STATUS_APPROVED, - APP_STATUS_PENDING, - APP_STATUS_REJECTED, -} from '../../../constants/apiConstants' -import PopoverWithReduxState from '../../../utils/PopoverWithReduxState' - -/** - * Filters an app according to properties defined in valsToFilter. - * @param app to filter - * @param filter a string to check if any of the properties in app contains this. - * @returns {boolean} true if any of the properties matches the filter. - */ -const filterApp = (app, filterVal) => { - if (!filterVal) return true - const filter = filterVal.toLowerCase() - const valsToFilter = ['name', 'appType', 'organisation'] - for (const val of valsToFilter) { - const prop = app[val] || app.developer[val] - if (prop && prop.toLowerCase().includes(filter)) { - return true - } - } - return false -} - -/** - * - * @param app to filter. - * @param filters an redux-form object containing filters to check for app. - * Should be of shape {filters: values}. Values should be of shape {appType: bool}. - * @returns {boolean} true if app has an apptype in filter, otherwise false. - */ -const filterAppType = (app, filters) => { - if (!filters || filters.values.length == 0) { - return true - } - - const filterVal = filters.values - for (const key in filterVal) { - if (filterVal.hasOwnProperty(key)) { - if (key == app.appType && filterVal[key] === true) { - return true - } - } - } - return false -} - -const filterAppStatus = (app, filters) => { - if (!filters || filters.values.length == 0) { - return true - } - - const filterVal = filters.values - for (const key in filterVal) { - if (filterVal.hasOwnProperty(key)) { - if (key == app.status && filterVal[key]) { - return true - } - } - } - return false -} - -class AppList extends Component { - constructor(props) { - super(props) - - this.state = { - open: false, - } - } - - componentDidMount() { - const user = this.props.user - if (user) { - user.manager ? this.props.loadAllApps() : this.props.loadMyApps() - } - } - - handleApproval(app, type) { - switch (type) { - case 'APPROVE': { - this.props.setAppApproval(app, APP_STATUS_APPROVED) - break - } - case 'REJECT': { - this.props.setAppApproval(app, APP_STATUS_REJECTED) - break - } - } - } - - handleOpenFilters(e) { - this.setState({ - ...this.state, - open: !this.state.open, - anchorEl: e.currentTarget, - }) - } - - openDeleteDialog(app) { - this.props.openDeleteDialog({ app }) - } - - renderStatusFilters() { - return ( -
-

App status

- -
- ) - } - - render() { - const { loading, loaded, error, byId: appList } = this.props.appList - const loadOrErr = loading || error - const { - user: { manager }, - match, - appSearchFilter, - } = this.props - const searchFilter = appSearchFilter - ? appSearchFilter.values.searchFilter - : '' - const apps = sortBy(appList, ['name']) - .filter( - app => - filterApp(app, searchFilter) && - filterAppType(app, this.props.appTypeFilter) && - (manager - ? filterAppStatus(app, this.props.appStatusFilter) - : true) - ) - .map((app, i) => ( - - )) - const emptyAppsText = manager - ? "We couldn't find any apps" - : 'You have not uploaded any apps' - const title = manager ? 'All apps' : 'Your apps' - - return ( -
- - - - - filter_list - - - this.setState({ open: false })} - > -
-

App type

- - {manager ? this.renderStatusFilters() : null} -
-
-
- - - {loadOrErr ? ( - - ) : null} - - {loaded && apps.length > 0 ? apps : null} - {loaded && apps.length < 1 ? emptyAppsText : null} - - - -
- ) - } -} - -const mapStateToProps = state => ({ - appList: selectors.getUserAppList(state), - user: selectors.getUserProfile(state), - appTypeFilter: state.form.appTypeFilterUser, - appStatusFilter: state.form.appStatusFilter, - appSearchFilter: state.form.searchFilter, -}) - -const mapDispatchToProps = dispatch => ({ - setAppApproval(app, status) { - dispatch(setAppApproval(app, status)) - }, - - openDeleteDialog(app) { - dispatch(openDialog(dialogTypes.CONFIRM_DELETE_APP, app)) - }, - - loadAllApps() { - dispatch(loadAllApps()) - }, - - loadMyApps() { - dispatch(userAppsLoad()) - }, -}) - -export default connect(mapStateToProps, mapDispatchToProps)(AppList) diff --git a/client/src/components/user/appList/AppListItem.jsx b/client/src/components/user/appList/AppListItem.jsx deleted file mode 100644 index e0e48597b..000000000 --- a/client/src/components/user/appList/AppListItem.jsx +++ /dev/null @@ -1,159 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { Link } from 'react-router-dom' -import { ListItem } from 'material-ui/List' -import FontIcon from 'material-ui/FontIcon' -import AppLogo from '../../appView/AppLogo' -import IconMenu from 'material-ui/IconMenu' -import MenuItem from 'material-ui/MenuItem' -import IconButton from 'material-ui/IconButton' -import { withRouter } from 'react-router' -import config from '../../../../config' - -const appStatusStyle = { - fontSize: '16px', - marginLeft: '10px', -} - -const appStatus = { - APPROVED: { - alt: 'Approved', - elem: ( - - check - - ), - }, - PENDING: { - alt: 'Pending approval', - elem: ( - - priority_high - - ), - }, - NOT_APPROVED: { - alt: 'Rejected', - elem: ( - - do_not_disturb_alt - - ), - }, -} - -const rightIconsStyle = { - position: 'absolute', - top: '0px', - right: '70px', - height: '48px', - display: 'flex', - alignItems: 'center', -} - -const AppListItem = (props, state) => { - const { - id, - name, - developer, - description, - appType, - status, - images, - } = props.app - let menuItems = null - - if (props.isManager) { - const approveItem = ( - - ) - const rejectItem = ( - - ) - const pendingItems = [approveItem, rejectItem] - if (status === 'PENDING') { - menuItems = pendingItems - } else if (status === 'APPROVED') { - menuItems = rejectItem - } else { - menuItems = approveItem - } - } - - const menu = ( - - more_vert - - } - > - {menuItems} - - - ) - const logo = images.filter(elem => elem.logo)[0] - const secondaryText = ( -

- {developer.organisation}
- {config.ui.appTypeToDisplayName[appType]} - {!props.manager ? ( - -
- Status: {appStatus[status].alt} -
- ) : null} -

- ) - const listItemProps = { - primaryText: ( -
- {name} {appStatus[status].elem} -
- ), - leftAvatar: , - secondaryText: secondaryText, - secondaryTextLines: 2, - rightIconButton: props.isManager ? menu : null, - onClick: () => props.history.push(`${props.match.url}/app/${id}`), - } - - return -} - -AppListItem.propTypes = { - app: PropTypes.object.isRequired, - handleApprove: PropTypes.func.isRequired, - handleReject: PropTypes.func, - handleDelete: PropTypes.func, - isManager: PropTypes.bool, -} -export default withRouter(AppListItem) diff --git a/client/src/components/user/appUpload/AppUpload.jsx b/client/src/components/user/appUpload/AppUpload.jsx deleted file mode 100644 index c5f8a917a..000000000 --- a/client/src/components/user/appUpload/AppUpload.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { Card, CardText } from 'material-ui/Card' -import UploadAppFormStepper from '../../form/UploadAppFormStepper' -import SubHeader from '../../header/SubHeader' -import { addApp } from '../../../actions/actionCreators' -import Theme from '../../../styles/theme' - -class AppUpload extends Component { - constructor(props) { - super(props) - - this.handleSubmit = this.handleSubmit.bind(this) - } - - handleSubmit(data) { - this.props.addApp(data.data, data.file, data.image) - } - - render() { - return ( -
- - - - - - -
- ) - } -} - -const mapDispatchToProps = dispatch => ({ - addApp(app, file, image) { - dispatch(addApp(app, file, image)) - }, -}) - -export default connect(null, mapDispatchToProps)(AppUpload) diff --git a/client/src/components/user/appUpload/AppUploadStepper.jsx b/client/src/components/user/appUpload/AppUploadStepper.jsx deleted file mode 100644 index f4990da92..000000000 --- a/client/src/components/user/appUpload/AppUploadStepper.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { Card, CardText } from 'material-ui/Card' -import UploadAppForm from '../../form/UploadAppFormStepper' -import SubHeader from '../../header/SubHeader' -import { addApp } from '../../../actions/actionCreators' -import Theme from '../../../styles/theme' - -class AppUploadStepper extends Component { - constructor(props) { - super(props) - - this.handleSubmit = this.handleSubmit.bind(this) - } - - handleSubmit(data) { - this.props.addApp(data.data, data.file, data.image) - } - - render() { - return ( -
- - - - - - -
- ) - } -} - -const mapDispatchToProps = dispatch => ({ - addApp(app, file, image) { - dispatch(addApp(app, file, image)) - }, -}) - -export default connect(null, mapDispatchToProps)(AppUploadStepper) diff --git a/client/src/components/user/login/LoginView.jsx b/client/src/components/user/login/LoginView.jsx deleted file mode 100644 index 570b93b43..000000000 --- a/client/src/components/user/login/LoginView.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import Grid from '../../../material/Grid/Grid' -import Col from '../../../material/Grid/Col' -import FontIcon from 'material-ui/FontIcon' -import { Card, CardText, CardTitle } from 'material-ui/Card' -import RaisedButton from 'material-ui/RaisedButton' -class LoginView extends Component { - constructor(props) { - super(props) - this.handleLogin = this.handleLogin.bind(this) - } - - componentDidMount() { - if (!this.props.auth.isLoggedIn()) { - this.props.auth.login() - } - } - - handleLogin() { - this.props.auth.login() - } - - render() { - const colStyle = { - margin: '20px auto 0 auto', - } - return null - } -} - -LoginView.propTypes = { - auth: PropTypes.object.isRequired, -} - -export default LoginView diff --git a/client/src/components/user/organisation/OrganisationList.jsx b/client/src/components/user/organisation/OrganisationList.jsx deleted file mode 100644 index 30bcde863..000000000 --- a/client/src/components/user/organisation/OrganisationList.jsx +++ /dev/null @@ -1,155 +0,0 @@ -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' -import { List } from 'material-ui/List' -import { Card, CardText } from 'material-ui/Card' -import { TextFilter } from '../../utils/Filters' -import FontIcon from 'material-ui/FontIcon' -import FloatingActionButton from 'material-ui/FloatingActionButton' - -import SubHeader from '../../header/SubHeader' -import OrganisationListItem from './OrganisationListItem' -import { - loadCurrentUserOrganisations, - loadAllOrganisations, - openDialog, - getMe, -} from '../../../actions/actionCreators' -import ErrorOrLoading from '../../utils/ErrorOrLoading' -import * as userSelectors from '../../../selectors/userSelectors' -import * as organisationSelectors from '../../../selectors/organisationSelectors' -import * as dialogTypes from '../../../constants/dialogTypes' - -const styles = { - containerDiv: { - position: 'relative', - }, - card: { - marginTop: '12px', - position: 'relative', - maxHeight: 750, - overflow: 'auto', - }, - floatingActionButton: { - bottom: -20, - right: 10, - position: 'absolute', - zIndex: 2, - }, -} - -class OrganisationList extends Component { - constructor(props) { - super(props) - - this.state = { - open: false, - } - } - - componentDidMount() { - const userInfo = this.props.user - this.props.getMe() - if (userInfo && userInfo.loaded) { - userInfo.profile.manager - ? this.props.loadAllOrganisations() - : this.props.loadCurrentUserOrganisations() - } - } - - handleOpenFilters(e) { - this.setState({ - ...this.state, - open: !this.state.open, - anchorEl: e.currentTarget, - }) - } - - render() { - const { loading, loaded, error } = this.props.organisationState - const organisationList = this.props.organisationList - const loadOrErr = loading || error - const { - user: { manager }, - match, - searchFilter, - } = this.props - const orgSearchFilter = searchFilter - ? searchFilter.values.orgSearchFilter - : '' - - const orgItems = organisationList - .filter(org => - !orgSearchFilter - ? true - : org.name - .toLowerCase() - .includes(orgSearchFilter.toLowerCase()) - ) - .map(org => ( - - )) - - const emptyOrgsText = manager - ? "We couldn't find any organisations." - : 'You are not a member of any organisations.' - const title = 'Organisations' - - return ( -
- - - - - - {loadOrErr ? ( - - ) : null} - - {loaded && orgItems.length > 0 ? orgItems : null} - {loaded && orgItems.length < 1 - ? emptyOrgsText - : null} - - - - this.props.openNewOrganisationDialog()} - > - add - -
- ) - } -} - -const mapStateToProps = state => { - const userInfo = userSelectors.getUserInfo(state) - return { - organisationList: organisationSelectors.getAuthorizedOrganisationsList( - state - ), - organisationState: state.organisations, - user: userInfo, - searchFilter: state.form.searchFilter, - } -} - -const mapDispatchToProps = dispatch => ({ - openNewOrganisationDialog: () => - dispatch(openDialog(dialogTypes.NEW_ORGANISATION_DIALOG)), - ...bindActionCreators( - { loadAllOrganisations, loadCurrentUserOrganisations, getMe }, - dispatch - ), -}) - -export default connect(mapStateToProps, mapDispatchToProps)(OrganisationList) diff --git a/client/src/components/user/organisation/OrganisationListItem.jsx b/client/src/components/user/organisation/OrganisationListItem.jsx deleted file mode 100644 index 5f0b459be..000000000 --- a/client/src/components/user/organisation/OrganisationListItem.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import PropTypes from 'prop-types' -import React from 'react' -import { ListItem } from 'material-ui/List' -import { withRouter } from 'react-router' - -const OrganisationListItem = props => { - const { slug, name } = props.organisation - - const listItemProps = { - primaryText: name, - onClick: () => props.history.push(`${props.match.url}/${slug}`), - } - - return -} - -OrganisationListItem.propTypes = { - isManager: PropTypes.bool, - organisation: PropTypes.object, -} -export default withRouter(OrganisationListItem) diff --git a/client/src/components/user/organisation/OrganisationMemberList.jsx b/client/src/components/user/organisation/OrganisationMemberList.jsx deleted file mode 100644 index 86cc18536..000000000 --- a/client/src/components/user/organisation/OrganisationMemberList.jsx +++ /dev/null @@ -1,103 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' -import FontIcon from 'material-ui/FontIcon' -import LogoAvatar from '../../appView/AppLogo' -import IconButton from 'material-ui/IconButton' -import Subheader from '../../header/SubHeader' -import MenuItem from 'material-ui/MenuItem' -import IconMenu from 'material-ui/IconMenu' -import { Card, CardText, CardTitle, CardHeader } from 'material-ui/Card' -import Theme from '../../../styles/theme' -import ErrorOrLoading from '../../utils/ErrorOrLoading' -import * as userSelectors from '../../../selectors/userSelectors' -import * as organisationSelectors from '../../../selectors/organisationSelectors' -import { removeOrganisationMember } from '../../../actions/actionCreators' -import { - Table, - TableBody, - TableHeader, - TableHeaderColumn, - TableRow, - TableRowColumn, -} from 'material-ui/Table' -import { ListItem, List } from 'material-ui/List/' - -class OrganisationMemberList extends Component { - - render() { - const { members, owner, organisation, currentUserId } = this.props - const orgId = organisation.id - return ( - - {members.map(user => ( - this.props.removeOrganisationMember(orgId, user.id)} - onChangeOwner={() => this.props.changeOwner(orgId, user.id)} - canChangeOwner={this.props.canChangeOwner} - /> - ))} - - ) - } -} - -const mapDispatch = { - removeOrganisationMember, -} - -function MemberListItem(props) { - const { user, isOwner, canChangeOwner, currentUserId } = props - - const memberListItemMenu = ( - - more_vert - - } - > - - {canChangeOwner && } - - ) - return ( - - {user.name} - {isOwner ? ( - - security - - ) : null} - - } - secondaryText={user.email} - rightIconButton={memberListItemMenu} - hoverColor='none' - style={{cursor: 'inherit'}} - /> - ) -} - -export default connect(null, mapDispatch)(OrganisationMemberList) diff --git a/client/src/components/user/organisation/OrganisationView.jsx b/client/src/components/user/organisation/OrganisationView.jsx deleted file mode 100644 index e21ea4d18..000000000 --- a/client/src/components/user/organisation/OrganisationView.jsx +++ /dev/null @@ -1,162 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { bindActionCreators } from 'redux' -import FontIcon from 'material-ui/FontIcon' -import LogoAvatar from '../../appView/AppLogo' -import IconButton from 'material-ui/IconButton' -import Subheader from '../../header/SubHeader' -import MenuItem from 'material-ui/MenuItem' -import IconMenu from 'material-ui/IconMenu' -import { Card, CardText, CardTitle, CardHeader } from 'material-ui/Card' -import Theme from '../../../styles/theme' -import ErrorOrLoading from '../../utils/ErrorOrLoading' -import * as userSelectors from '../../../selectors/userSelectors' -import * as organisationSelectors from '../../../selectors/organisationSelectors' -import { - loadOrganisation, - editOrganisation, - openDialog, -} from '../../../actions/actionCreators' -import * as dialogTypes from '../../../constants/dialogTypes' -import OrganisationMemberList from './OrganisationMemberList' -import RaisedButton from 'material-ui/RaisedButton/RaisedButton' -import FloatingActionButton from 'material-ui/FloatingActionButton' - -const styles = { - rightIconButtonStyle: { - position: 'absolute', - top: 0, - right: '4px', - }, - paddedCard: { - marginTop: '12px', - position: 'relative', - }, - floatingActionButton: { - margin: 0, - right: 10, - top: '-26px', - position: 'absolute', - }, -} -class OrganisationView extends Component { - componentDidMount() { - this.props.loadOrganisation(this.props.match.params.slug) - } - - render() { - const { organisation } = this.props - if (!organisation || !organisation.users) return null - - const subtitle = ( -
- Owner: {organisation.owner.name}
-
- ) - return ( -
- - - - {this.props.canEdit && ( - - this.props.openEditOrganisationDialog( - this.props.organisation - ) - } - > - edit - - )} - - - - All members of an organisation is allowed to upload apps - on behalf of the organisation. Members may add new - members to the organisation. Only the owner of the - organisation is allowed to rename it. - - - - - this.props.openAddMemberDialog( - this.props.organisation - ) - } - > - add - - - - - - - -
- ) - } -} - -const mapStateToProps = (state, ownProps) => { - const slug = ownProps.match.params.slug - const organisation = organisationSelectors.getOrganisationBySlug( - state, - slug - ) - - const sortedOrgMembers = organisation ? organisationSelectors.getSortedOrgMembers(state, organisation.id) : [] - - return { - organisation, - sortedOrgMembers, - currentUserId: userSelectors.getUserInfo(state).userId, - canEdit: - organisation && - organisationSelectors.canEditOrganisation(state, organisation.id), - } -} - -const mapDispatchToProps = dispatch => ({ - openAddMemberDialog: organisation => - dispatch( - openDialog(dialogTypes.ADD_ORGANISATION_MEMBER, { organisation }) - ), - openEditOrganisationDialog: organisation => { - dispatch( - openDialog(dialogTypes.EDIT_ORGANISATION_DIALOG, { organisation }) - ) - }, - changeOwner: (orgId, userId) => { - dispatch(editOrganisation(orgId, { owner: userId })) - }, - ...bindActionCreators({ loadOrganisation }, dispatch), -}) - -export default connect(mapStateToProps, mapDispatchToProps)(OrganisationView) diff --git a/client/src/components/user/userAppView/UserAppView.jsx b/client/src/components/user/userAppView/UserAppView.jsx deleted file mode 100644 index e178f4f10..000000000 --- a/client/src/components/user/userAppView/UserAppView.jsx +++ /dev/null @@ -1,361 +0,0 @@ -// eslint-disable-next-line react/no-deprecated -import PropTypes from 'prop-types' - -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { Card, CardText, CardTitle, CardHeader } from 'material-ui/Card' -import FloatingActionButton from 'material-ui/FloatingActionButton' -import ContentAdd from 'material-ui/svg-icons/content/add' -import { - loadUserApp, - addImageToApp, - openDialog, - deleteAppVersion, - addMultipleImagesToApp, - setAppApproval, -} from '../../../actions/actionCreators' -import * as dialogType from '../../../constants/dialogTypes' -import VersionListEdit from '../../appVersion/VersionListEdit' -import FontIcon from 'material-ui/FontIcon' -import LogoAvatar from '../../appView/AppLogo' -import IconButton from 'material-ui/IconButton' -import Subheader from '../../header/SubHeader' -import MenuItem from 'material-ui/MenuItem' -import IconMenu from 'material-ui/IconMenu' -import Theme from '../../../styles/theme' -import config from '../../../../config' -import * as selectors from '../../../selectors/userSelectors' -import MultipleUploadFileFields from '../../form/MultipleUploadFileFields' -import ImageViewer from '../../appView/ImageViewer' -import { - APP_STATUS_APPROVED, - APP_STATUS_PENDING, - APP_STATUS_REJECTED, -} from '../../../constants/apiConstants' - -class UserAppView extends Component { - constructor(props) { - super(props) - } - - componentDidMount() { - this.props.loadApp({ appId: this.props.match.params.appId }) - } - - handleOpenDialog() { - this.props.openNewVersionDialog({ app: this.props.app }) - } - - handleOpenEditApp() { - this.props.openEditAppDialog({ app: this.props.app }) - } - - handleDeleteAppVersion(version) { - const children = ( -
-

- Are you sure you want to delete version{' '} - {version.version} - for app '{this.props.app.name}'? -

- This cannot be undone. -
- ) - this.props.openConfirmDeleteVersion({ - children, - approveAction: () => - this.props.deleteVersion(version, this.props.app.id), - }) - } - - handleUploadImages(mergedFilesArray) { - const images = mergedFilesArray.map(image => { - const imageObj = { - image: { - caption: '', - description: '', - logo: false, - }, - file: image, - } - return imageObj - }) - if (images.length < 1) { - throw new Error('No images') - } - this.props.addImagesToApp(this.props.app.id, images) - } - - handleEditVersion(version) { - this.props.editVersion({ - appId: this.props.app.id, - appVersion: version, - }) - } - - handleSetAppApproval(status) { - this.props.setAppApproval(this.props.app, status) - } - - render() { - const app = this.props.app - if (!app) { - return null - } - const FABStyle = { - margin: 0, - right: 10, - top: '-26px', - position: 'absolute', - } - - const cardStyle = { - marginTop: '12px', - position: 'relative', - } - - return ( -
- - - - - - {app.description} - - - - - - - - - - - - - - - - - -

Upload images

- -
-
-
- ) - } -} - -UserAppView.propTypes = { - addImagesToApp: PropTypes.func, - app: PropTypes.object, - appLogo: PropTypes.object, - deleteVersion: PropTypes.func, - editVersion: PropTypes.func, - loadApp: PropTypes.func, - match: PropTypes.object, - openConfirmDeleteVersion: PropTypes.func, - openEditAppDialog: PropTypes.func, - openNewVersionDialog: PropTypes.func, - setAppApproval: PropTypes.func, - user: PropTypes.object, -} - -const mapStateToProps = (state, ownProps) => ({ - app: selectors.getApp(state, ownProps.match.params.appId), - user: selectors.getUserProfile(state), - appLogo: selectors.getAppLogo(state, ownProps.match.params.appId), -}) - -const mapDispatchToProps = dispatch => ({ - loadApp(appid) { - dispatch(loadUserApp(appid)) - }, - - addImageToApp(appid, image) { - dispatch(addImageToApp(appid, image)) - }, - - addImagesToApp(appId, images) { - dispatch(addMultipleImagesToApp(appId, images)) - }, - - deleteVersion(version, appId) { - dispatch(deleteAppVersion(version, appId)) - }, - - openNewVersionDialog(dialogProps) { - dispatch(openDialog(dialogType.NEW_VERSION, dialogProps)) - }, - - openEditAppDialog(dialogProps) { - dispatch(openDialog(dialogType.EDIT_APP, dialogProps)) - }, - editVersion(dialogProps) { - dispatch(openDialog(dialogType.EDIT_VERSION, dialogProps)) - }, - - openConfirmDeleteVersion(dialogProps) { - dispatch(openDialog(dialogType.CONFIRM_GENERIC, dialogProps)) - }, - - setAppApproval(app, status) { - dispatch(setAppApproval(app, status)) - }, -}) - -const UserAppCardHeader = ({ - app, - onOpenEditApp, - isManager, - appLogo, - onAppApproval, -}) => { - const rightIconButtonStyle = { - position: 'absolute', - top: 0, - right: '4px', - } - - const cardHeaderRightStyle = { - display: 'inline-flex', - alignItems: 'center', - marginLeft: '-5px', - color: Theme.card.subtitleColor, - } - - const statusAlertPending = 'This app is pending approval' - const statusAlertRejected = 'This app has been rejected' - - const statusAlertText = ( -

- - priority_high - - {app.status == APP_STATUS_PENDING - ? statusAlertPending - : statusAlertRejected} -

- ) - - const subtitle = ( -
- Type: {config.ui.appTypeToDisplayName[app.appType]}
- Organisation: {app.developer.organisation}
- {app.status == APP_STATUS_PENDING || - app.status == APP_STATUS_REJECTED - ? statusAlertText - : null} -
- ) - - const editIconButton = ( - - edit - - ) - - if (isManager) { - //Render a menu instead for managers - - let menuItems = null - const approveItem = ( - onAppApproval(APP_STATUS_APPROVED)} - key="approve" - primaryText="Approve" - /> - ) - const rejectItem = ( - onAppApproval(APP_STATUS_REJECTED)} - key="reject" - primaryText="Reject" - /> - ) - const pendingItems = [approveItem, rejectItem] - - if (app.status === APP_STATUS_PENDING) { - menuItems = pendingItems - } else if (app.status === APP_STATUS_APPROVED) { - menuItems = rejectItem - } else { - menuItems = approveItem - } - - var menu = ( - - - more_vert - - - } - > - {menuItems} - - - ) - } - - return ( - } - subtitle={subtitle} - titleStyle={{ fontSize: '2em' }} - > - {isManager ? menu : editIconButton} - - ) -} - -UserAppCardHeader.propTypes = { - app: PropTypes.object.isRequired, - onOpenEditApp: PropTypes.func.isRequired, - appLogo: PropTypes.object, - isManager: PropTypes.bool, - onAppApproval: PropTypes.func, -} - -export default connect(mapStateToProps, mapDispatchToProps)(UserAppView) diff --git a/client/src/components/utils/ActiveLink.jsx b/client/src/components/utils/ActiveLink.jsx deleted file mode 100644 index 8d60ad347..000000000 --- a/client/src/components/utils/ActiveLink.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import React, { Component } from 'react' -import { BrowserRouter as Router, Route, Link } from 'react-router-dom' -import Theme from '../../styles/theme' - -/** - * - * @param {} param0 - */ -export const ActiveLink = ({ children, to, activeOnlyWhenExact }) => ( - ( -
- {children} -
- )} - /> -) - -export default ActiveLink diff --git a/client/src/components/utils/Animate.jsx b/client/src/components/utils/Animate.jsx deleted file mode 100644 index 37b6ad0b5..000000000 --- a/client/src/components/utils/Animate.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import PropTypes from 'prop-types' -import React from 'react' -import TransitionGroup from 'react-transition-group/TransitionGroup' -import Transition from 'react-transition-group/Transition' -import CSSTransition from 'react-transition-group/CSSTransition' -import '../../styles/utils/animations.css' - -const duration = 300 - -export const FadeAnimation = ({ children: child, ...rest }) => { - return ( - - {child} - - ) -} - -const defaultStyle = { - transition: `opacity ${duration}ms linear`, - opacity: 0, -} - -const transitionStyles = { - entering: { opacity: 1 }, - entered: { opacity: 1 }, -} - -const getStylesForTransitionState = state => { - return { - ...defaultStyle, - ...transitionStyles[state], - } -} - -const onEnter = (html, isAppearing) => { - console.log('ENTER ' + isAppearing) -} - -const onEntering = (html, isAppearing) => { - console.log('ENTERING DONE ' + isAppearing) -} - -const onEntered = (html, isAppearing) => { - console.log('ENTERED ' + isAppearing) -} - -export const FadeAnimationBasic = ({ - component, - children: child, - ...props -}) => ( - - {state => - React.cloneElement(child, { - style: { - ...child.props.style, - ...getStylesForTransitionState(state), - }, - }) - } - -) - -export const FadeAnimationList = ({ component, children, ...rest }) => { - return ( - - {React.Children.map(children, (child, i) => { - return ( - - {child} - - ) - })} - - ) -} diff --git a/client/src/components/utils/Error.jsx b/client/src/components/utils/Error.jsx deleted file mode 100644 index 731f3b93c..000000000 --- a/client/src/components/utils/Error.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import FontIcon from 'material-ui/FontIcon' -import Button from 'material-ui/FlatButton' -const SizeType = PropTypes.oneOf(['small', 'medium', 'large']) - -const style = { - containerStyle: { - margin: '0 auto 0 auto', - width: '100%', - display: 'flex', - flexWrap: 'wrap', - flexDirection: 'column', - alignItems: 'center', - }, - iconStyle: { - color: 'rgb(117, 117, 117)', - fontSize: '56px', - }, - retryButtonStyle: {}, - errorTextStyle: { - color: 'rgb(117, 117, 117)', - }, -} -export const Error = props => ( -
- - error - -

An error occurred: {props.message}

- {props.retry ? ( -
-) - -Error.propTypes = { - size: SizeType, - style: PropTypes.object, - message: PropTypes.string, - retry: PropTypes.func, -} - -Error.defaultProps = { - message: '', -} - -export default Error diff --git a/client/src/components/utils/ErrorOrLoading.jsx b/client/src/components/utils/ErrorOrLoading.jsx deleted file mode 100644 index 2223a00ab..000000000 --- a/client/src/components/utils/ErrorOrLoading.jsx +++ /dev/null @@ -1,28 +0,0 @@ -// eslint-disable-next-line react/no-deprecated -import PropTypes from 'prop-types' - -import React from 'react' -import { Error } from './Error' -//import { Spinner } from './Loader'; -import Spinner from './Spinner' - -export const ErrorOrLoading = props => { - const loading = - return loading - if (!props.error && !props.loading) { - return null - } - const error = - - return props.error ? error : loading -} - -ErrorOrLoading.propTypes = { - error: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]).isRequired, - loading: PropTypes.bool.isRequired, - errorMessage: PropTypes.string, - errorObject: PropTypes.object, - retry: PropTypes.func, -} - -export default ErrorOrLoading diff --git a/client/src/components/utils/Filters.jsx b/client/src/components/utils/Filters.jsx deleted file mode 100644 index ca523e464..000000000 --- a/client/src/components/utils/Filters.jsx +++ /dev/null @@ -1,171 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { connect } from 'react-redux' -import { Field, reduxForm } from 'redux-form' -import { - renderTextField, - renderTextFieldWithClearButton, - renderToggle, -} from '../form/ReduxFormUtils' - -class Textfilter extends Component { - constructor(props) { - super(props) - } - - render() { - const { style, hintText, clearButton, ...props } = this.props - - return ( - - ) - } -} - -Textfilter.propTypes = { - style: PropTypes.object, - hintText: PropTypes.string, - form: PropTypes.string, - clearButton: PropTypes.bool, -} - -Textfilter.defaultProps = { - form: 'searchFilter', - clearButton: true, - destroyOnUnmount: false, - initialValues: { - searchFilter: '', - appSearchFilter: '', - orgSearchFilter: '', - }, -} - -export const TextFilter = reduxForm({ - ...Textfilter.defaultProps, -})(Textfilter) - -/** - * Renders a list of toggle buttons, with props.filters as base. - * - * A redux-form connected component. Connected to the store at state.. - * Where mountedReduxForm is the value where redux-form is connected at app-start. - * And props.form is a prop to this component (default: filters). - * All values can be retrieved from redux with filterName: value. - * So a filter with name "APP_STANDARD" can be retrieved from the state with: - * state.form.filter.values['APP_STANDARD']. - */ -class Selectfilter extends Component { - constructor(props) { - super(props) - } - - toggleAll(toggled) { - //props.form holds the name of the form, where the values exists - Object.keys(this.props.filterState[this.props.form].values).map( - (key, i) => { - this.props.change(key, toggled) - } - ) - } - - render() { - const { - style, - elementStyle, - labelStyle, - filters, - onFilterChange, - destroyOnUnmount, - } = this.props - const toggles = filters.map(filter => ( - - )) - return ( -
- {toggles} - {this.props.renderAllToggle ? ( - - ) : null} -
- ) - } -} -Selectfilter.propTypes = { - //The redux-form to use for mounting the values of the filter. - form: PropTypes.string.isRequired, - //style of the root element - style: PropTypes.object, - //style of the filter input elements - elementStyle: PropTypes.object, - //style of the label of the input elements - labelStyle: PropTypes.object, - value: PropTypes.string, - filters: PropTypes.arrayOf( - PropTypes.shape({ - //Label to show next to the toggle - label: PropTypes.string.isRequired, - //default toggled? - toggled: PropTypes.bool.isRequired, - //The name of the filter-field. State will be fieldValue: toggled - value: PropTypes.string.isRequired, - }) - ), - //Renders a component which toggles all buttons in this group. - renderAllToggle: PropTypes.bool, - destroyOnUnmount: PropTypes.bool, -} -Selectfilter.defaultProps = { - form: 'filters', - destroyOnUnmount: false, -} -//handle default with connect -export const SelectedFilterForm = reduxForm({ - ...Selectfilter.defaultProps, -})(Selectfilter) - -//Convert filter props to initialValues to reduxForm -const mapStateToProps = (state, ownProps) => { - const init = {} - ownProps.filters.map((elem, i) => { - return (init[elem.value] = elem.toggled) - }) - if (ownProps.renderAllToggle) { - //default toggle all - init['all'] = true - } - return { - initialValues: init, - filterState: state.form, - } -} - -export const SelectFilter = connect(mapStateToProps, null)(SelectedFilterForm) diff --git a/client/src/components/utils/NoteBlock.jsx b/client/src/components/utils/NoteBlock.jsx deleted file mode 100644 index 434f4dfb1..000000000 --- a/client/src/components/utils/NoteBlock.jsx +++ /dev/null @@ -1,63 +0,0 @@ -import PropTypes from 'prop-types' -import React from 'react' -import FontIcon from 'material-ui/FontIcon' - -const styles = { - containerStyle: { - backgroundColor: '#f5fbff', - margin: 0, - border: '1px solid #d3e9fc', - borderRadius: '3px', - padding: '8px', - }, - blockQuoteContainer: { - // lineHeight: '1.2rem', - marginTop: 0, - }, - iconHeader: { - display: 'flex', - alignItems: 'center', - }, - iconStyle: { - fontSize: '24px', - padding: '4px', - marginRight: '8px', - }, - warningContainerStyle: { - backgroundColor: '#ffecb3', - border: '1px solid #ffe082', - }, - criticalContainerStyle: { - backgroundColor: '#e57373', - border: '1px solid #f44336', - }, -} -export const NoteBlock = props => ( -
-
- - {props.icon || 'info_outline'} - - {props.header || Note} -
-
- {props.children} -
-
-) - -NoteBlock.propTypes = { - children: PropTypes.node, - header: PropTypes.node, - icon: PropTypes.string, - warning: PropTypes.bool, -} - -export default NoteBlock diff --git a/client/src/components/utils/Snackbar.jsx b/client/src/components/utils/Snackbar.jsx deleted file mode 100644 index 6f2e0dc65..000000000 --- a/client/src/components/utils/Snackbar.jsx +++ /dev/null @@ -1,62 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import SnackbarUI from 'material-ui/Snackbar' -import { connect } from 'react-redux' -import { emptySnackbar } from '../../actions/actionCreators' - -const styles = { - root: { - minHeight: '48px', - }, - body: { - lineHeight: 'initial', - height: 'auto', - padding: '12px 24px', - display: 'flex', - alignItems: 'center', - }, -} -export class Snackbar extends Component { - render() { - const { message, retryAction } = this.props.snackbar - const retryProps = { - action: 'Retry', - onClick: retryAction, - } - - return ( - this.props.emptySnackbar()} - {...(retryAction ? { ...retryProps } : null)} - /> - ) - } -} - -Snackbar.propTypes = { - snakbar: PropTypes.shape({ - message: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), - retryAction: PropTypes.object, - }), -} - -const mapStateToProps = state => ({ - snackbar: state.snackbar, -}) - -const mapDispatchToProps = dispatch => ({ - emptySnackbar() { - dispatch(emptySnackbar()) - }, - - retryAction(action) { - dispatch(action) - }, -}) - -export default connect(mapStateToProps, mapDispatchToProps)(Snackbar) diff --git a/client/src/components/utils/Spinner.jsx b/client/src/components/utils/Spinner.jsx deleted file mode 100644 index ec3fe6d5b..000000000 --- a/client/src/components/utils/Spinner.jsx +++ /dev/null @@ -1,70 +0,0 @@ -import PropTypes from 'prop-types' -import React from 'react' -import CircularProgress from 'material-ui/CircularProgress' - -const SizeType = PropTypes.oneOf(['small', 'medium', 'large']) -const sizeMap = { - small: 24, - medium: 48, - large: 64, -} - -const styles = { - svgAttributes: { - viewBox: '0 0 66 66', - }, - base: { - padding: '35px', - display: 'block', - margin: '0 auto 0 auto', - }, - large: { - height: '64px', - width: '64px', - }, - small: { - height: '24px', - width: '24px', - }, - medium: { - height: '48px', - width: '48px', - }, - path: { - fill: 'none', - strokeWidth: '6', - strokeLinecap: 'round', - cx: '33', - cy: '33', - r: '30', - }, - inButton: { - display: 'inline-block', - padding: '0', - }, -} - -export const Spinner = props => { - const style = { - ...styles.base, - ...(props.inButton && styles.inButton), - ...props.style, - } - - const size = props.inButton ? sizeMap['small'] : sizeMap[props.size] - - return -} - -Spinner.propTypes = { - inButton: PropTypes.bool, - size: SizeType, - style: PropTypes.object, -} - -Spinner.defaultProps = { - size: 'small', - inButton: false, -} - -export default Spinner diff --git a/client/src/components/verify/OrganisationInvitation.js b/client/src/components/verify/OrganisationInvitation.js deleted file mode 100644 index 4b012efc8..000000000 --- a/client/src/components/verify/OrganisationInvitation.js +++ /dev/null @@ -1,35 +0,0 @@ -import React from 'react' -import { useQueryParams, StringParam } from 'use-query-params' -import JWT from 'jsonwebtoken' -import { useAuth0 } from '@auth0/auth0-react' - -const OrganisationInvitation = () => { - const [queryParams] = useQueryParams({ - invitationToken: StringParam, - }) - const { loginWithRedirect } = useAuth0() - - const { invitationToken } = queryParams - const decoded = JWT.decode(invitationToken) - if (!decoded) { - return 'An error occurred while decoding token' - } - - return ( -
- {decoded.from.name} has invited you to join organisation{' '} - {decoded.organisation} - -
- ) -} - -export default OrganisationInvitation diff --git a/client/src/components/verify/OrganisationInvitationCallback.js b/client/src/components/verify/OrganisationInvitationCallback.js deleted file mode 100644 index 526579445..000000000 --- a/client/src/components/verify/OrganisationInvitationCallback.js +++ /dev/null @@ -1,48 +0,0 @@ -import React, { useEffect, useState } from 'react' -import { Redirect } from 'react-router-dom' -import { useQueryParam, StringParam } from 'use-query-params' -import { acceptOrganisationInvitation } from '../../api/api' - -const OrganisationInvitationCallback = () => { - const [invitationToken] = useQueryParam('invitationToken', StringParam) - - const [invitationData, setInvitationData] = useState(null) - const [error, setError] = useState(null) - - useEffect(() => { - const acceptInvitation = async token => { - try { - const res = await acceptOrganisationInvitation(token) - setInvitationData(res) - } catch (e) { - console.error(e) - setError(e) - } - } - if (invitationToken) { - acceptInvitation(invitationToken) - } - }, []) - - if (!invitationToken) { - console.log('No invitationToken to parse, redirect to index') - return - } - - if (error) { - console.error(error) - return `Failed to join organisation${error.message && - `: ${error.message}`}` - } - - if (!invitationData) { - return 'Joining organisation...' - } - return ( -
- You've joined {invitationData.organisation.name}! -
- ) -} - -export default OrganisationInvitationCallback diff --git a/client/src/constants/actionTypes.js b/client/src/constants/actionTypes.js index 809ff6add..72cb48bc4 100644 --- a/client/src/constants/actionTypes.js +++ b/client/src/constants/actionTypes.js @@ -1,108 +1,9 @@ -export const APPS_ALL_LOAD = 'APPS_ALL_LOAD' -export const APPS_ALL_LOADED = 'APPS_ALL_LOADED' -export const APPS_ALL_ERROR = 'APPS_ALL_ERROR' - -export const APP_LOAD = 'APP_LOAD' -export const APP_LOADED = 'APP_LOADED' -export const APP_ERROR = 'APP_ERROR' - -export const APP_ADD = 'APP_ADD' -export const APP_ADD_SUCCESS = 'APP_ADD_SUCCESS' -export const APP_ADD_ERROR = 'APP_ADD_ERROR' - -export const SET_APPROVAL_APP = 'SET_APPROVAL_APP' -export const SET_APPROVAL_APP_SUCCESS = 'SET_APPROVAL_APP_SUCCESS' -export const SET_APPROVAL_APP_ERROR = 'SET_APPROVAL_APP_ERROR' - export const USER_LOAD = 'USER_LOAD' export const USER_LOAD_SUCCESS = 'USER_LOAD_SUCCESS' export const USER_LOAD_ERROR = 'USER_LOAD_ERROR' -export const USER_APPS_LOAD = 'USER_APPS_LOAD' -export const USER_APPS_LOADED = 'USER_APPS_LOADED' -export const USER_APPS_ERROR = 'USER_APPS_ERROR' - export const USER_LOGOUT = 'USER_LOGOUT' -export const OPEN_DIALOG = 'OPEN_DIALOG' -export const CLOSE_DIALOG = 'CLOSE_DIALOG' - -export const APP_VERSION_ADD = 'APP_VERSION_ADD' -export const APP_VERSION_ADD_SUCCESS = 'APP_VERSION_ADD_SUCCESS' -export const APP_VERSION_ADD_ERROR = 'APP_VERSION_ADD_ERROR' - -export const APP_VERSION_DELETE = 'APP_VERSION_DELETE' -export const APP_VERSION_DELETE_SUCCESS = 'APP_VERSION_DELETE_SUCCESS' -export const APP_VERSION_DELETE_ERROR = 'APP_VERSION_DELETE_ERROR' - -export const APP_VERSION_EDIT = 'APP_VERSION_EDIT' -export const APP_VERSION_EDIT_SUCCESS = 'APP_VERSION_EDIT_SUCCESS' -export const APP_VERSION_EDIT_ERROR = 'APP_VERSION_EDIT_ERROR' - -export const APP_EDIT = 'APP_EDIT' -export const APP_EDIT_SUCCESS = 'APP_EDIT_SUCCESS' -export const APP_EDIT_ERROR = 'APP_EDIT_ERROR' - -export const APP_DELETE = 'APP_DELETE' -export const APP_DELETE_SUCCESS = 'APP_DELETE_SUCCESS' -export const APP_DELETE_ERROR = 'APP_DELETE_ERROR' - -export const APP_IMAGES_ADD = 'APP_IMAGES_ADD' -export const APP_IMAGES_ADD_SUCCESS = 'APP_IMAGES_ADD_SUCCESS' -export const APP_IMAGES_ADD_ERROR = 'APP_IMAGES_ADD_ERROR' - -export const APP_IMAGE_ADD = 'APP_IMAGE_ADD' -export const APP_IMAGE_ADD_SUCCESS = 'APP_IMAGE_ADD_SUCCESS' -export const APP_IMAGE_ADD_ERROR = 'APP_IMAGE_ADD_ERROR' - -export const APP_IMAGE_EDIT = 'APP_IMAGE_EDIT' -export const APP_IMAGE_EDIT_SUCCESS = 'APP_IMAGE_EDIT_SUCCESS' -export const APP_IMAGE_EDIT_ERROR = 'APP_IMAGE_EDIT_ERROR' - -export const APP_IMAGE_DELETE = 'APP_IMAGE_DELETE' -export const APP_IMAGE_DELETE_SUCCESS = 'APP_IMAGE_DELETE_SUCCESS' -export const APP_IMAGE_DELETE_ERROR = 'APP_IMAGE_DELETE_ERROR' - -export const APP_IMAGE_SET_LOGO = 'APP_IMAGE_SET_LOGO' -export const APP_IMAGE_SET_LOGO_SUCCESS = 'APP_IMAGE_SET_LOGO_SUCCESS' -export const APP_IMAGE_SET_LOGO_ERROR = 'APP_IMAGE_SET_LOGO_ERROR' - -export const SNACKBAR_EMPTY = 'SNACKBAR_EMPTY' - -export const CHANNELS_LOAD_BEGIN = 'CHANNELS_LOAD_BEGIN' -export const CHANNELS_LOAD_SUCCESS = 'CHANNELS_LOAD_SUCCESS' -export const CHANNELS_LOAD_ERROR = 'CHANNELS_LOAD_ERROR' - -export const ORGANISATIONS_SEARCH = 'ORGANISATIONS_SEARCH' -export const ORGANISATIONS_SEARCH_SUCCESS = 'ORGANISATIONS_SEARCH_SUCCESS' -export const ORGANISATIONS_SEARCH_ERROR = 'ORGANISATIONS_SEARCH_ERROR' - -export const ORGANISATIONS_LOAD = 'ORGANISATIONS_LOAD' -export const ORGANISATIONS_LOAD_SUCCESS = 'ORGANISATIONS_LOAD_SUCCESS' -export const ORGANISATIONS_LOAD_ERROR = 'ORGANISATIONS_LOAD_ERROR' - -export const ORGANISATION_LOAD = 'ORGANISATION_LOAD' -export const ORGANISATION_LOAD_SUCCESS = 'ORGANISATION_LOAD_SUCCESS' -export const ORGANISATION_LOAD_ERROR = 'ORGANISATION_LOAD_ERROR' - -export const ORGANISATION_MEMBER_ADD = 'ORGANISATION_MEMBER_ADD' -export const ORGANISATION_MEMBER_ADD_SUCCESS = 'ORGANISATION_MEMBER_ADD_SUCCESS' -export const ORGANISATION_MEMBER_ADD_ERROR = 'ORGANISATION_MEMBER_ADD_ERROR' - -export const ORGANISATION_MEMBER_REMOVE = 'ORGANISATION_MEMBER_REMOVE' -export const ORGANISATION_MEMBER_REMOVE_SUCCESS = - 'ORGANISATION_MEMBER_REMOVE_SUCCESS' -export const ORGANISATION_MEMBER_REMOVE_ERROR = - 'ORGANISATION_MEMBER_REMOVE_ERROR' - -export const ORGANISATION_ADD = 'ORGANISATION_ADD' -export const ORGANISATION_ADD_SUCCESS = 'ORGANISATION_ADD_SUCCESS' -export const ORGANISATION_ADD_ERROR = 'ORGANISATION_ADD_ERROR' - export const ME_LOAD = 'ME_LOAD' export const ME_LOAD_SUCCESS = 'ME_LOAD_SUCCESS' export const ME_LOAD_ERROR = 'ME_LOAD_ERROR' - -export const ORGANISATION_EDIT = 'ORGANISATION_EDIT' -export const ORGANISATION_EDIT_SUCCESS = 'ORGANISATION_EDIT_SUCCESS' -export const ORGANISATION_EDIT_ERROR = 'ORGANISATION_EDIT_ERROR' diff --git a/client/src/constants/apiConstants.js b/client/src/constants/apiConstants.js index 76522922b..5f71a8949 100644 --- a/client/src/constants/apiConstants.js +++ b/client/src/constants/apiConstants.js @@ -1,12 +1,6 @@ -export const APP_STATUS_REJECTED = 'NOT_APPROVED' -export const APP_STATUS_PENDING = 'PENDING' export const APP_STATUS_APPROVED = 'APPROVED' - -export const appStatusToUI = { - NOT_APPROVED: 'Rejected', - PENDING: 'Pending', - APPROVED: 'Approved', -} +export const APP_STATUS_PENDING = 'PENDING' +export const APP_STATUS_REJECTED = 'NOT_APPROVED' // manager roles as defined in Auth0 export const roles = { diff --git a/client/src/constants/dialogTypes.js b/client/src/constants/dialogTypes.js deleted file mode 100644 index c027f005a..000000000 --- a/client/src/constants/dialogTypes.js +++ /dev/null @@ -1,10 +0,0 @@ -export const EDIT_APP = 'EDIT_APP' -export const NEW_VERSION = 'NEW_VERSION' -export const EDIT_VERSION = 'EDIT_VERSION' -export const CONFIRM_DELETE_APP = 'CONFIRM_DELETE_APP' -export const ERROR_DIALOG = 'ERROR_DIALOG' -export const EDIT_IMAGE = 'EDIT_IMAGE' -export const CONFIRM_GENERIC = 'CONFIRM_GENERIC' -export const ADD_ORGANISATION_MEMBER = 'ADD_ORGANISATION_MEMBER' -export const NEW_ORGANISATION_DIALOG = 'NEW_ORGANISATION_DIALOG' -export const EDIT_ORGANISATION_DIALOG = 'EDIT_ORGANISATION_DIALOG' diff --git a/client/src/lib/form-validators/max-dhis-version-validator.js b/client/src/lib/form-validators/max-dhis-version-validator.js new file mode 100644 index 000000000..c2e8b3321 --- /dev/null +++ b/client/src/lib/form-validators/max-dhis-version-validator.js @@ -0,0 +1,13 @@ +import config from 'config' + +const { dhisVersions } = config.ui + +export const maxDhisVersionValidator = (value, allValues) => { + if ( + value && + dhisVersions.indexOf(value) > + dhisVersions.indexOf(allValues['minDhisVersion']) + ) { + return 'Maximum DHIS2 version must be greater than minimum DHIS2 version' + } +} diff --git a/client/src/lib/form-validators/semver-validator.js b/client/src/lib/form-validators/semver-validator.js new file mode 100644 index 000000000..c1f38692e --- /dev/null +++ b/client/src/lib/form-validators/semver-validator.js @@ -0,0 +1,7 @@ +import semver from 'semver' + +export const semverValidator = value => { + if (!semver.valid(value)) { + return 'Not a valid semantic version, adjust the version numbering' + } +} diff --git a/client/src/lib/relative-time-format.js b/client/src/lib/relative-time-format.js new file mode 100644 index 000000000..647de7699 --- /dev/null +++ b/client/src/lib/relative-time-format.js @@ -0,0 +1,25 @@ +const units = { + year: 24 * 60 * 60 * 1000 * 365, + month: (24 * 60 * 60 * 1000 * 365) / 12, + day: 24 * 60 * 60 * 1000, + hour: 60 * 60 * 1000, + minute: 60 * 1000, + second: 1000, +} + +export const relativeTimeFormat = (datetime, from = new Date()) => { + const elapsedMilliseconds = datetime - from + + for (const [unit, valueMilliseconds] of Object.entries(units)) { + if ( + unit === 'second' || + Math.abs(elapsedMilliseconds) > valueMilliseconds + ) { + const diff = elapsedMilliseconds / valueMilliseconds + return new Intl.RelativeTimeFormat('en').format( + Math.round(diff), + unit + ) + } + } +} diff --git a/client/src/lib/render-dhis-versions-compatibility.js b/client/src/lib/render-dhis-versions-compatibility.js new file mode 100644 index 000000000..de7303e7c --- /dev/null +++ b/client/src/lib/render-dhis-versions-compatibility.js @@ -0,0 +1,10 @@ +export const renderDhisVersionsCompatibility = (min, max) => { + if (min && max) { + return `${min}–${max}` + } else if (min && !max) { + return `${min} and above` + } else if (!min && max) { + return `${max} and below` + } + return 'all versions' +} diff --git a/client/src/lib/use-alert.js b/client/src/lib/use-alert.js new file mode 100644 index 000000000..040365f79 --- /dev/null +++ b/client/src/lib/use-alert.js @@ -0,0 +1,38 @@ +import { useContext } from 'react' +import AlertsContext from 'src/components/AlertsProvider/AlertsContext' + +export const useAlert = (message, options = {}) => { + const { addAlert } = useContext(AlertsContext) + + const show = props => { + const resolvedMessage = + typeof message === 'function' ? message(props) : message + const resolvedOptions = + typeof options === 'function' ? options(props) : options + + addAlert({ + message: resolvedMessage, + options: resolvedOptions, + }) + } + + return { show } +} + +export const useSuccessAlert = () => + useAlert( + ({ message }) => message, + options => ({ + ...options, + success: true, + }) + ) + +export const useErrorAlert = () => + useAlert( + ({ error }) => `An error occured: ${error.message}`, + options => ({ + ...options, + critical: true, + }) + ) diff --git a/client/src/lib/use-modal-state.js b/client/src/lib/use-modal-state.js new file mode 100644 index 000000000..4421bcd4e --- /dev/null +++ b/client/src/lib/use-modal-state.js @@ -0,0 +1,8 @@ +import { useState } from 'react' + +export const useModalState = () => { + const [isVisible, setIsVisible] = useState(false) + const show = () => setIsVisible(true) + const hide = () => setIsVisible(false) + return { isVisible, show, hide } +} diff --git a/client/src/material/Grid/Col.jsx b/client/src/material/Grid/Col.jsx deleted file mode 100644 index 49c8318fd..000000000 --- a/client/src/material/Grid/Col.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import classNames from 'classnames' - -const AlignType = PropTypes.oneOf(['top', 'middle', 'bottom']) -const screenTypes = ['phone', 'tablet', 'desktop'] -const modificatorKeys = ['order', 'align', 'span', ...screenTypes] -const baseClassname = 'mdc-layout-grid__cell' - -const propTypes = { - span: PropTypes.number, - tablet: PropTypes.number, - phone: PropTypes.number, - desktop: PropTypes.number, - order: PropTypes.number, - align: AlignType, - additionalClasses: PropTypes.string, - children: PropTypes.node, -} - -const styles = { - maxWidth: 'inherit', -} - -function getClassNames(props) { - const modificators = [] - - for (let i = 0; i < modificatorKeys.length; ++i) { - const key = modificatorKeys[i] - const value = props[key] - if (value) { - let mod = `${baseClassname}--${key}-${value}` - if (screenTypes.includes(key)) { - mod = `${baseClassname}--span-${value}-${key}` - } - modificators.push(mod) - } - } - - return classNames(baseClassname, modificators, props.additionalClasses) -} - -function handleStyleProps(props) { - const style = { ...styles, ...props.style } - if (props.center) { - style.margin = '0 auto' - } - - return style -} - -const Col = ({ children, ...props }) => ( -
- {children} -
-) - -Col.propTypes = propTypes - -export default Col diff --git a/client/src/material/Grid/Grid.jsx b/client/src/material/Grid/Grid.jsx deleted file mode 100644 index 4e9852ab5..000000000 --- a/client/src/material/Grid/Grid.jsx +++ /dev/null @@ -1,70 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import classNames from 'classnames' -import '@material/layout-grid/dist/mdc.layout-grid.css' - -const AlignType = PropTypes.oneOf(['center', 'left']) - -const propTypes = { - children: PropTypes.node, - additionalClasses: PropTypes.string, - nested: PropTypes.bool, - align: AlignType, -} - -const styles = { - inner: { - maxWidth: 'inherit', - }, -} - -function handleStyleProps(props) { - let style = { ...props.style } - if (props.nested) { - style = { ...props.nestedStyle } - } - - if (props.align) { - style.maxWidth = style.maxWidth || '1272px' - switch (props.align) { - case 'center': - style.margin = '0 auto' - break - case 'left': - style.marginLeft = '0' - break - } - } - - return style -} - -const Grid = ({ ...props }) => { - const wrap = ( -
-
- {props.children} -
-
- ) - const nestedElem = ( -
- {props.children} -
- ) - return props.nested ? nestedElem : wrap -} - -Grid.defaultProps = { - style: null, -} - -Grid.propTypes = propTypes - -export default Grid diff --git a/client/src/material/Toolbar/Toolbar.jsx b/client/src/material/Toolbar/Toolbar.jsx deleted file mode 100644 index 24b1c5f61..000000000 --- a/client/src/material/Toolbar/Toolbar.jsx +++ /dev/null @@ -1,40 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import classNames from 'classnames' -import '@material/toolbar/dist/mdc.toolbar.css' -const propTypes = { - fixed: PropTypes.bool, - additionalClasses: PropTypes.string, - children: PropTypes.node, -} - -const baseClassname = 'mdc-toolbar' -const modificatorKeys = ['fixed'] - -const styles = { - padding: '0 24px', -} - -function getClassNames(props) { - const modificators = [] - - for (let i = 0; i < modificatorKeys.length; ++i) { - const key = modificatorKeys[i] - const value = props[key] - if (value) { - const mod = `${baseClassname}--${key}` - modificators.push(mod) - } - } - return classNames(baseClassname, modificators, props.className) -} - -const Toolbar = ({ children, style, ...props }) => ( -
-
{children}
-
-) - -Toolbar.propTypes = propTypes - -export default Toolbar diff --git a/client/src/material/Toolbar/ToolbarSection.jsx b/client/src/material/Toolbar/ToolbarSection.jsx deleted file mode 100644 index a9b73cf24..000000000 --- a/client/src/material/Toolbar/ToolbarSection.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import classNames from 'classnames' - -const AlignType = PropTypes.oneOf(['start', 'end', 'center']) -const modificatorKeys = ['align'] -const baseClassname = 'mdc-toolbar__section' - -const propTypes = { - align: AlignType, - aditionalClasses: PropTypes.string, - children: PropTypes.node, -} - -function getClassNames(props) { - const modificators = [] - - for (let i = 0; i < modificatorKeys.length; ++i) { - const key = modificatorKeys[i] - const value = props[key] - if (value) { - const mod = `${baseClassname}--${key}-${value}` - modificators.push(mod) - } - } - - return classNames(baseClassname, modificators, props.additionalClasses) -} - -const ToolbarSection = ({ children, ...props }) => ( -
- {children} -
-) - -ToolbarSection.propTypes = propTypes - -export default ToolbarSection diff --git a/client/src/material/Toolbar/ToolbarTitle.jsx b/client/src/material/Toolbar/ToolbarTitle.jsx deleted file mode 100644 index 7dc56a00c..000000000 --- a/client/src/material/Toolbar/ToolbarTitle.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import classNames from 'classnames' - -const AlignType = PropTypes.oneOf(['start', 'end', 'center']) -const modificatorKeys = ['align'] -const baseClassname = 'mdc-toolbar__section' - -const propTypes = { - align: AlignType, - additionalClasses: PropTypes.string, - children: PropTypes.node, - style: PropTypes.object, - titleStyle: PropTypes.object, -} - -const defaultProps = { - align: 'start', -} - -function getClassNames(props) { - const modificators = [] - - for (let i = 0; i < modificatorKeys.length; ++i) { - const key = modificatorKeys[i] - const value = props[key] - if (value) { - const mod = `${baseClassname}--${key}-${value}` - modificators.push(mod) - } - } - - return classNames(baseClassname, modificators, props.additionalClasses) -} -const ToolbarTitle = ({ children, ...props }) => ( -
- - {props.text ? props.text : children} - -
-) - -ToolbarTitle.propTypes = propTypes -ToolbarTitle.defaultProps = defaultProps -export default ToolbarTitle diff --git a/client/src/pages/AppView/AppView.js b/client/src/pages/AppView/AppView.js new file mode 100644 index 000000000..d5b7d0428 --- /dev/null +++ b/client/src/pages/AppView/AppView.js @@ -0,0 +1,145 @@ +import { + CenteredContent, + CircularLoader, + NoticeBox, + Card, + Divider, + Button, +} from '@dhis2/ui' +import classnames from 'classnames' +import PropTypes from 'prop-types' +import styles from './AppView.module.css' +import config from 'config' +import { useQueryV1 } from 'src/api' +import AppDescription from 'src/components/AppDescription/AppDescription' +import AppIcon from 'src/components/AppIcon/AppIcon' +import Screenshots from 'src/components/Screenshots/Screenshots' +import Versions from 'src/components/Versions/Versions' +import { renderDhisVersionsCompatibility } from 'src/lib/render-dhis-versions-compatibility' + +const HeaderSection = ({ appName, appDeveloper, appType, logoSrc }) => ( +
+ +
+

{appName}

+ by {appDeveloper} + {appType} +
+
+) + +HeaderSection.propTypes = { + appDeveloper: PropTypes.string.isRequired, + appName: PropTypes.string.isRequired, + appType: PropTypes.string.isRequired, + logoSrc: PropTypes.string, +} + +const AboutSection = ({ appDescription, latestVersion, sourceUrl }) => ( +
+
+

About this app

+ {appDescription ? ( + + ) : ( + + The developer of this app has not provided a description. + + )} +
+
+ + + +

+ {config.ui.appChannelToDisplayName[latestVersion.channel]}{' '} + release v{latestVersion.version}. Compatible with DHIS2{' '} + {renderDhisVersionsCompatibility( + latestVersion.minDhisVersion, + latestVersion.maxDhisVersion + )} +

+ {sourceUrl && ( + <> + + + Source code + + + )} +
+
+) + +const AppView = ({ match }) => { + const { appId } = match.params + const { data: app, error } = useQueryV1(`apps/${appId}`) + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!app) { + return ( + + + + ) + } + + const appDeveloper = app.developer.organisation || 'Unspecified' + const logoSrc = app.images.find(img => img.logo)?.imageUrl + const screenshots = app.images.filter(img => !img.logo) + const versions = app.versions.sort((a, b) => b.created - a.created) + const latestVersion = versions[0] + + return ( + + + + + + {screenshots.length > 0 && ( + <> +
+

Screenshots

+ +
+ + + )} +
+

+ All versions of this application +

+ +
+
+ ) +} + +AppView.propTypes = { + match: PropTypes.object.isRequired, +} + +export default AppView diff --git a/client/src/pages/AppView/AppView.module.css b/client/src/pages/AppView/AppView.module.css new file mode 100644 index 000000000..6bed4edff --- /dev/null +++ b/client/src/pages/AppView/AppView.module.css @@ -0,0 +1,97 @@ +@value m-medium from 'src/styles/breakpoints.css'; + +.appCard { + display: block !important; + max-width: 960px; + margin: auto; +} + +.appCardSection { + padding: var(--spacers-dp12); +} + +@media m-medium { + .appCardSection { + padding: var(--spacers-dp24); + } +} + +.appCardHeader { + display: grid; + grid-template-columns: 72px auto; + grid-gap: var(--spacers-dp12); +} + +.appCardName { + font-size: 24px; + font-weight: 700; + margin-top: var(--spacers-dp8); + margin-bottom: 6px; +} + +.appCardDeveloper { + display: block; + font-size: 16px; + margin-bottom: var(--spacers-dp8); + color: var(--colors-grey800); +} + +.appCardType { + display: block; + font-size: 13px; + color: var(--colors-grey700); +} + +.appCardHeading { + font-weight: 500; + font-size: 16px; + margin-top: 0; + margin-bottom: var(--spacers-dp12); +} + +.appCardParagraph { + font-size: 15px; + line-height: 19px; + margin-top: 0; + margin-bottom: var(--spacers-dp8); +} + +.aboutSection { + display: grid; + grid-template-columns: 1fr; + grid-gap: var(--spacers-dp16); +} + +@media m-medium { + .aboutSection { + grid-template-columns: 60% auto; + grid-gap: var(--spacers-dp96); + } +} + +.latestVersionDescription { + max-width: 168px; + margin-top: var(--spacers-dp8); + margin-bottom: 0; + font-size: 11px; + color: var(--colors-grey700); +} + +.divider { + max-width: 80%; +} + +.sourceUrl:before { + display: block; + content: ""; +} + +.sourceUrl { + font-size: 14px; + color: var(--colors-blue700); + text-decoration: underline; +} + +.sourceUrl:hover, .sourceUrl:focus { + color: var(--colors-grey900); +} diff --git a/client/src/pages/Apps/AppCards/AppCardItem/AppCardItem.js b/client/src/pages/Apps/AppCards/AppCardItem/AppCardItem.js new file mode 100644 index 000000000..21016ae66 --- /dev/null +++ b/client/src/pages/Apps/AppCards/AppCardItem/AppCardItem.js @@ -0,0 +1,53 @@ +import PropTypes from 'prop-types' +import React from 'react' +import { Link } from 'react-router-dom' +import styles from './AppCardItem.module.css' +import config from 'config' +import AppIcon from 'src/components/AppIcon/AppIcon' + +const summarise = text => { + const maxLength = 120 + if (text.length > maxLength) { + return text.slice(0, maxLength) + '…' + } + return text +} + +const AppCardItem = ({ id, name, developer, type, description, images }) => { + const logo = images.find(elem => elem.logo) + + return ( + +
+ +
+

{name}

+ + {developer.organisation || 'Unspecified'} + + + {config.ui.appTypeToDisplayName[type]} + +
+
+ +

+ {summarise(description)} +

+ + ) +} + +AppCardItem.propTypes = { + developer: PropTypes.shape({ + name: PropTypes.string, + organisation: PropTypes.string, + }).isRequired, + id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + type: PropTypes.string.isRequired, + description: PropTypes.string, + images: PropTypes.array, +} + +export default AppCardItem diff --git a/client/src/pages/Apps/AppCards/AppCardItem/AppCardItem.module.css b/client/src/pages/Apps/AppCards/AppCardItem/AppCardItem.module.css new file mode 100644 index 000000000..87b723e91 --- /dev/null +++ b/client/src/pages/Apps/AppCards/AppCardItem/AppCardItem.module.css @@ -0,0 +1,52 @@ +.appCard { + display: block; + background: white; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + transition: box-shadow 100ms; + padding: var(--spacers-dp16); + line-height: 20px; + cursor: pointer; +} + +.appCard:hover, .appCard:focus { + background: inherit; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05), + 0 2px 4px -1px rgba(0, 0, 0, 0.06), + 0 4px 6px -1px rgba(0, 0, 0, 0.10); +} + +.appCardHeader { + display: grid; + grid-template-columns: 72px auto; + grid-gap: var(--spacers-dp12); +} + +.appCardName { + font-size: 18px; + font-weight: 700; + margin-top: 0; + margin-bottom: var(--spacers-dp4); +} + +.appCardDeveloper, .appCardType { + display: block; + margin: var(--spacers-dp4) 0; + font-size: 14px; +} + +.appCardDeveloper { + color: var(--colors-grey800); +} + +.appCardType { + color: var(--colors-grey700) +} + +.appCardDescription { + margin-top: var(--spacers-dp12); + margin-bottom: 0; + min-height: 48px; + color: var(--colors-grey800); + font-size: 15px; + line-height: 21px; +} diff --git a/client/src/pages/Apps/AppCards/AppCards.js b/client/src/pages/Apps/AppCards/AppCards.js new file mode 100644 index 000000000..4c7818836 --- /dev/null +++ b/client/src/pages/Apps/AppCards/AppCards.js @@ -0,0 +1,54 @@ +import { CenteredContent, CircularLoader, NoticeBox } from '@dhis2/ui' +import PropTypes from 'prop-types' +import AppCardItem from './AppCardItem/AppCardItem' +import styles from './AppCards.module.css' + +const AppCards = ({ isLoading, error, apps }) => { + if (error) { + return ( + + {error} + + ) + } + + if (isLoading) { + return ( + + + + ) + } + + if (apps.length == 0) { + return ( +

+ No apps found. Try adjusting your search or filter options. +

+ ) + } + + return ( +
+ {apps.map(app => ( + + ))} +
+ ) +} + +AppCards.propTypes = { + isLoading: PropTypes.bool.isRequired, + apps: PropTypes.arrayOf(PropTypes.object), + error: PropTypes.string, +} + +export default AppCards diff --git a/client/src/pages/Apps/AppCards/AppCards.module.css b/client/src/pages/Apps/AppCards/AppCards.module.css new file mode 100644 index 000000000..9fcb71447 --- /dev/null +++ b/client/src/pages/Apps/AppCards/AppCards.module.css @@ -0,0 +1,20 @@ +@value m-medium from 'src/styles/breakpoints.css'; + +.emptyApps { + margin: 2rem 0; + font-size: 1.8rem; + text-align: center; +} + +.appCards { + display: grid; + grid-template-columns: 1fr; + grid-gap: var(--spacers-dp16); +} + +@media m-medium { + .appCards { + grid-template-columns: 1fr 1fr; + max-width: 992px; + } +} diff --git a/client/src/components/apps/Apps.jsx b/client/src/pages/Apps/Apps.js similarity index 53% rename from client/src/components/apps/Apps.jsx rename to client/src/pages/Apps/Apps.js index 776c12d2d..2c00b91a8 100644 --- a/client/src/components/apps/Apps.jsx +++ b/client/src/pages/Apps/Apps.js @@ -1,4 +1,6 @@ -import React, { useMemo } from 'react' +import { Pagination } from '@dhis2/ui' +import { useMemo } from 'react' +import { useDebounce } from 'use-debounce' import { useQueryParams, StringParam, @@ -7,16 +9,21 @@ import { decodeDelimitedArray, withDefault, } from 'use-query-params' -import { useQuery } from '../../api/api' -import Grid from '../../material/Grid/Grid' -import Col from '../../material/Grid/Col' -import config from '../../../config' -import AppCards from './appCards/AppCards' -import Filters from './Filters' -import Pagination from './Pagination' +import AppCards from './AppCards/AppCards' +import styles from './Apps.module.css' +import Filters from './Filters/Filters' +import config from 'config' +import { useQuery } from 'src/api' -const defaultChannelsFilter = new Set([config.ui.defaultAppChannel]) -const defaultTypesFilter = new Set(Object.keys(config.ui.appTypeToDisplayName)) +const { + defaultAppChannel, + appChannelToDisplayName, + appTypeToDisplayName, + dhisVersions, +} = config.ui + +const defaultChannelsFilter = new Set([defaultAppChannel]) +const defaultTypesFilter = new Set(Object.keys(appTypeToDisplayName)) const SetParam = { encode(set) { @@ -35,16 +42,21 @@ const Apps = () => { const [queryParams, setQueryParams] = useQueryParams({ channels: withDefault(SetParam, defaultChannelsFilter), types: withDefault(SetParam, defaultTypesFilter), - query: StringParam, + dhisVersion: StringParam, + query: withDefault(StringParam, ''), page: withDefault(NumberParam, 1), }) - const { channels, types, query, page } = queryParams + const { channels, types, dhisVersion, query, page } = queryParams + const [debouncedQuery] = useDebounce(query, 300) const setChannels = channels => { setQueryParams({ channels, page: 1 }) } const setTypes = types => { setQueryParams({ types, page: 1 }) } + const setDhisVersion = dhisVersion => { + setQueryParams({ dhisVersion, page: 1 }) + } const setQuery = query => { setQueryParams({ query, page: 1 }, 'replaceIn') } @@ -56,46 +68,50 @@ const Apps = () => { () => ({ channels, types, + dhis_version: dhisVersion, query, page, pageSize: 24, }), - [channels, types, query, page] + [channels, types, dhisVersion, debouncedQuery, page] ) const { data, error } = useQuery('apps', params) const apps = data?.result return ( - - +
+
- - +
+
- - {apps?.length > 0 ? ( - + {apps?.length > 0 ? ( null} onPageChange={setPage} + {...data.pager} /> - - ) : null} - + ) : null} +
+
) } diff --git a/client/src/pages/Apps/Apps.module.css b/client/src/pages/Apps/Apps.module.css new file mode 100644 index 000000000..2c1711ef5 --- /dev/null +++ b/client/src/pages/Apps/Apps.module.css @@ -0,0 +1,51 @@ +@value m-medium, m-large from 'src/styles/breakpoints.css'; + +.container { + display: grid; + grid-template-areas: "filters" "apps"; + padding: var(--spacers-dp16) var(--spacers-dp12); +} + +@media m-medium { + .container { + grid-template-areas: "filters apps"; + grid-template-columns: 224px auto; + grid-gap: var(--spacers-dp24); + padding: 0; + } +} + +@media m-large { + .container { + grid-template-columns: 296px auto; + } +} + +.filters { + grid-area: filters; +} + +.apps { + position: relative; + grid-area: apps; +} + +.pagination { + margin: var(--spacers-dp24) 0; + max-width: 992px; + justify-content: center; +} + +.pagination :global(.spacer) { + display: none; +} + +@media m-medium { + .pagination { + justify-content: normal; + } + + .pagination :global(.spacer) { + display: block; + } +} diff --git a/client/src/pages/Apps/Filters/Filters.js b/client/src/pages/Apps/Filters/Filters.js new file mode 100644 index 000000000..cd4e13b6d --- /dev/null +++ b/client/src/pages/Apps/Filters/Filters.js @@ -0,0 +1,118 @@ +import { + Input, + Checkbox, + Divider, + SingleSelect, + SingleSelectOption, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import styles from './Filters.module.css' + +const CheckboxList = ({ checkboxes, selected, onChange }) => + Object.entries(checkboxes).map(([value, label]) => ( + { + const newSelected = new Set(selected) + if (checked) { + newSelected.add(value) + } else { + newSelected.delete(value) + } + onChange(newSelected) + }} + checked={selected.has(value)} + value={value} + /> + )) + +CheckboxList.propTypes = { + checkboxes: PropTypes.object.isRequired, + selected: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, +} + +const Filters = ({ + channels, + channelsFilter, + onChannelsFilterChange, + types, + typesFilter, + onTypesFilterChange, + dhisVersions, + dhisVersionFilter, + onDhisVersionFilterChange, + query, + onQueryChange, +}) => ( + <> + onQueryChange(value)} + /> +
+ +
+
+
+

App Categories

+ +
+
+

Release Channels

+ +
+
+

DHIS2 Version

+ + onDhisVersionFilterChange(selected) + } + > + {dhisVersions.map(dhisVersion => ( + + ))} + +
+
+ +) + +Filters.propTypes = { + channels: PropTypes.object.isRequired, + channelsFilter: PropTypes.object.isRequired, + dhisVersions: PropTypes.array.isRequired, + types: PropTypes.object.isRequired, + typesFilter: PropTypes.object.isRequired, + onChannelsFilterChange: PropTypes.func.isRequired, + onDhisVersionFilterChange: PropTypes.func.isRequired, + onQueryChange: PropTypes.func.isRequired, + onTypesFilterChange: PropTypes.func.isRequired, + dhisVersionFilter: PropTypes.string, + query: PropTypes.string, +} + +export default Filters diff --git a/client/src/pages/Apps/Filters/Filters.module.css b/client/src/pages/Apps/Filters/Filters.module.css new file mode 100644 index 000000000..351f0ad15 --- /dev/null +++ b/client/src/pages/Apps/Filters/Filters.module.css @@ -0,0 +1,32 @@ +@value m-medium from 'src/styles/breakpoints.css'; + +.dividerContainer { + margin: var(--spacers-dp16) 0; +} + +.filters { + display: grid; + grid-template-columns: 1fr 1fr; +} + +@media m-medium { + .filters { + grid-template-columns: 1fr; + } +} + +.filterWrapper { + margin-bottom: 1.5rem; +} + +.filterName { + margin-top: 0; + margin-bottom: 0.3em; + font-size: 14px; + font-weight: 500; +} + +.dhisVersionSelect { + margin: 0; + max-width: 180px; +} diff --git a/client/src/pages/OrganisationInvitation/OrganisationInvitation.js b/client/src/pages/OrganisationInvitation/OrganisationInvitation.js new file mode 100644 index 000000000..5c7fb1e0c --- /dev/null +++ b/client/src/pages/OrganisationInvitation/OrganisationInvitation.js @@ -0,0 +1,46 @@ +import { useAuth0 } from '@auth0/auth0-react' +import { CenteredContent, NoticeBox, Card, Button } from '@dhis2/ui' +import JWT from 'jsonwebtoken' +import React from 'react' +import { useQueryParams, StringParam } from 'use-query-params' +import styles from './OrganisationInvitation.module.css' + +const OrganisationInvitation = () => { + const [queryParams] = useQueryParams({ + invitationToken: StringParam, + }) + const { loginWithRedirect } = useAuth0() + + const { invitationToken } = queryParams + const decoded = JWT.decode(invitationToken) + if (!decoded) { + return ( + + Your invitation has expired + + ) + } + + const handleAcceptInvitation = () => { + loginWithRedirect({ + redirectUri: `${window.location.protocol}//${window.location.host}/verify/org/callback?invitationToken=${invitationToken}`, + }) + } + + return ( + +

+ {decoded.from.name} + + has invited you to join organisation + + {decoded.organisation} +

+ +
+ ) +} + +export default OrganisationInvitation diff --git a/client/src/pages/OrganisationInvitation/OrganisationInvitation.module.css b/client/src/pages/OrganisationInvitation/OrganisationInvitation.module.css new file mode 100644 index 000000000..74b966bbc --- /dev/null +++ b/client/src/pages/OrganisationInvitation/OrganisationInvitation.module.css @@ -0,0 +1,17 @@ +.card { + display: block !important; + max-width: 480px; + margin: auto; + padding: var(--spacers-dp24); + text-align: center; +} + +.explanation { + margin-top: 0; + margin-bottom: var(--spacers-dp24); +} + +.middle { + display: block; + margin: var(--spacers-dp8) 0; +} diff --git a/client/src/pages/OrganisationInvitationCallback/OrganisationInvitationCallback.js b/client/src/pages/OrganisationInvitationCallback/OrganisationInvitationCallback.js new file mode 100644 index 000000000..e14183a40 --- /dev/null +++ b/client/src/pages/OrganisationInvitationCallback/OrganisationInvitationCallback.js @@ -0,0 +1,60 @@ +import { CenteredContent, NoticeBox, CircularLoader } from '@dhis2/ui' +import React, { useEffect, useState } from 'react' +import { Redirect } from 'react-router-dom' +import { useQueryParam, StringParam } from 'use-query-params' +import * as api from '../../api' +import { useSuccessAlert } from 'src/lib/use-alert' + +const OrganisationInvitationCallback = () => { + const [invitationToken] = useQueryParam('invitationToken', StringParam) + const successAlert = useSuccessAlert() + const [organisationId, setOrganisationId] = useState(null) + const [error, setError] = useState(null) + + useEffect(() => { + const acceptInvitation = async token => { + try { + const { organisation } = await api.acceptOrganisationInvitation( + token + ) + setOrganisationId(organisation.id) + successAlert.show({ + message: `Successfully joined organisation ${organisation.name}`, + }) + } catch (e) { + console.error(e) + setError(e) + } + } + if (invitationToken) { + acceptInvitation(invitationToken) + } + }, []) + + if (!invitationToken) { + console.log('No invitationToken to parse, redirect to index') + return + } + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!organisationId) { + return ( + + + + ) + } + + return +} + +export default OrganisationInvitationCallback diff --git a/client/src/pages/UserApiKey/UserApiKey.js b/client/src/pages/UserApiKey/UserApiKey.js new file mode 100644 index 000000000..8ddb1f671 --- /dev/null +++ b/client/src/pages/UserApiKey/UserApiKey.js @@ -0,0 +1,169 @@ +import { + CenteredContent, + CircularLoader, + NoticeBox, + Card, + Button, +} from '@dhis2/ui' +import classnames from 'classnames' +import copyToClipboard from 'copy-text-to-clipboard' +import { useState } from 'react' +import styles from './UserApiKey.module.css' +import { useQuery, deleteApiKey, generateApiKey } from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const GenerateApiKey = ({ onGenerate, isUpdating }) => ( + <> + + API keys can be used to upload any app to your organisation, so it's + important to keep them secret and secure. + +
+ There is no active API key for this organisation. + +
+ +) + +const ApiKeyDisplay = ({ createdAt, onDelete, apiKey, isUpdating }) => { + const handleCopyToClipboard = () => { + copyToClipboard(apiKey) + } + + return ( + <> + {!apiKey && ( + + If you suspect your key is compromised or lost, you can + delete it and generate a new one. Be aware that any scripts + or applications using the API key will need to be updated. + + )} +
+ {apiKey && ( + + Make sure to copy your new API key below. You won’t be + able to see it again! +
+ {apiKey} + +
+
+ )} +
+ API key is active. API key was generated at{' '} + {new Date(createdAt).toLocaleString()} + +
+
+ + ) +} + +const requestOpts = { + useAuth: true, +} + +const UserApiKey = () => { + const [apiKey, setApiKey] = useState(null) + const [isUpdating, setIsUpdating] = useState(false) + const { data, error, mutate } = useQuery('key', null, requestOpts) + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleDeleteKey = async () => { + setIsUpdating(true) + try { + await deleteApiKey() + mutate({ hasApiKey: false, createdAt: undefined }) + successAlert.show({ message: 'Successfully deleted API key' }) + } catch (error) { + errorAlert.show({ error }) + } + setIsUpdating(false) + } + + const handleGenerateKey = async () => { + setIsUpdating(true) + try { + const { apiKey } = await generateApiKey() + setApiKey(apiKey) + mutate({ hasApiKey: true, createdAt: new Date() }, false) + successAlert.show({ message: 'Successfully generated API key' }) + } catch (error) { + errorAlert.show({ error }) + } + setIsUpdating(false) + } + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!data) { + return ( + + + + ) + } + + return ( + +

Your API key

+

+ An API key can be used to upload new app versions through the + App Hub API. This can be useful in continous integration + workflows. +

+ {data.hasApiKey ? ( + + ) : ( + + )} +
+ ) +} + +export default UserApiKey diff --git a/client/src/pages/UserApiKey/UserApiKey.module.css b/client/src/pages/UserApiKey/UserApiKey.module.css new file mode 100644 index 000000000..5236acd70 --- /dev/null +++ b/client/src/pages/UserApiKey/UserApiKey.module.css @@ -0,0 +1,37 @@ +.card { + display: block !important; + max-width: 680px; + margin: auto; + padding: var(--spacers-dp16); +} + +.header { + font-size: 26px; + font-weight: 400; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp16); +} + +.description { + font-size: 14px; + color: var(--colors-grey700); +} + +.flexCenter { + display: flex; + align-items: center; +} + +.justifyBetween { + justify-content: space-between; +} + +.noticeBox { + margin-top: var(--spacers-dp24); + margin-bottom: var(--spacers-dp24); +} + +.copyToClipboardButton { + margin-left: var(--spacers-dp4); +} diff --git a/client/src/pages/UserApp/DetailsCard/DetailsCard.js b/client/src/pages/UserApp/DetailsCard/DetailsCard.js new file mode 100644 index 000000000..31107cf7c --- /dev/null +++ b/client/src/pages/UserApp/DetailsCard/DetailsCard.js @@ -0,0 +1,134 @@ +import { Card, Button, Divider } from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useState, useRef } from 'react' +import { Link } from 'react-router-dom' +import sharedStyles from '../UserApp.module.css' +import styles from './DetailsCard.module.css' +import config from 'config' +import * as api from 'src/api' +import AppDescription from 'src/components/AppDescription/AppDescription' +import AppIcon from 'src/components/AppIcon/AppIcon' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const { appTypeToDisplayName } = config.ui + +const EditLogo = ({ appId, logo, mutate }) => { + const [isUploading, setIsUploading] = useState(false) + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + const formEl = useRef(null) + const inputEl = useRef(null) + + const handleUploadButtonClick = () => { + inputEl.current.click() + } + const handleUpload = async event => { + setIsUploading(true) + try { + // TODO: Implement backend API to replace logo so that it can be + // done in one request instead of three + if (logo) { + await api.deleteImage(appId, logo.id) + } + const { id: newLogoId } = await api.createNewImage(appId, { + image: {}, + file: event.target.files[0], + }) + await api.updateImage(appId, newLogoId, { logo: true }) + await mutate() + formEl.current.reset() + successAlert.show({ + message: 'Logo updated', + }) + } catch (error) { + errorAlert.show({ error }) + } + setIsUploading(false) + } + + return ( +
+ +
+ +
+ +
+ ) +} + +const DetailsCard = ({ app, mutate }) => { + const logo = app.images.find(img => img.logo) + const appDeveloper = app.developer.organisation || 'Unspecified' + const appType = appTypeToDisplayName[app.appType] + + return ( + +
+
+ +
+
+

{app.name}

+ + by {appDeveloper} + + {appType} +
+
+ +
+

Description

+
+ {app.description ? ( + + ) : ( + No description provided + )} +
+
+ +
+

Source code URL

+ {app.sourceUrl ? ( + + {app.sourceUrl} + + ) : ( + No source code URL provided + )} +
+ + + + +
+ ) +} + +DetailsCard.propTypes = { + app: PropTypes.object.isRequired, + mutate: PropTypes.func.isRequired, +} + +export default DetailsCard diff --git a/client/src/pages/UserApp/DetailsCard/DetailsCard.module.css b/client/src/pages/UserApp/DetailsCard/DetailsCard.module.css new file mode 100644 index 000000000..bc236da6c --- /dev/null +++ b/client/src/pages/UserApp/DetailsCard/DetailsCard.module.css @@ -0,0 +1,52 @@ +.detailsCardHeader { + display: grid; + grid-template-columns: 120px auto; + grid-gap: var(--spacers-dp12); + margin-bottom: var(--spacers-dp8); +} + +.detailsCardName { + display: inline-block; + font-size: 24px; + font-weight: 700; + margin-top: var(--spacers-dp8); + margin-bottom: 6px; +} + +.detailsCardDeveloper { + display: block; + color: var(--colors-grey800); + margin-bottom: var(--spacers-dp8); +} + +.detailsCardType { + color: var(--colors-grey700); +} + +.appDescriptionParagraph { + margin-top: 0; + margin-bottom: var(--spacers-dp8); +} + +.editLogoContainer { + display: flex; + flex-direction: column; + align-items: center; +} + +.editLogoButton { + margin-top: var(--spacers-dp4); +} + +.descriptionContainer { + max-width: 640px; +} + +.sourceUrl { + color: var(--colors-blue700); + text-decoration: underline; +} + +.sourceUrl:hover, .sourceUrl:focus { + color: var(--colors-grey900); +} diff --git a/client/src/pages/UserApp/ScreenshotsCard/DeleteScreenshotModal.js b/client/src/pages/UserApp/ScreenshotsCard/DeleteScreenshotModal.js new file mode 100644 index 000000000..85541f03f --- /dev/null +++ b/client/src/pages/UserApp/ScreenshotsCard/DeleteScreenshotModal.js @@ -0,0 +1,69 @@ +import { + Button, + ButtonStrip, + Modal, + ModalTitle, + ModalContent, + ModalActions, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useState } from 'react' +import * as api from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const DeleteScreenshotModal = ({ appId, imageId, mutate, onClose }) => { + const [isSubmitting, setIsSubmitting] = useState(false) + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleDelete = async () => { + setIsSubmitting(true) + try { + await api.deleteImage(appId, imageId) + mutate(app => ({ + ...app, + images: app.images.filter(img => img.id !== imageId), + })) + successAlert.show({ + message: `Successfully deleted screenshot`, + }) + } catch (error) { + errorAlert.show({ error }) + } + setIsSubmitting(false) + } + + return ( + + Delete screenshot + + Deleting a screenshot cannot be undone. +
+ Are you sure you want to delete this screenshot? +
+ + + + + + +
+ ) +} + +DeleteScreenshotModal.propTypes = { + appId: PropTypes.string.isRequired, + imageId: PropTypes.string.isRequired, + mutate: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default DeleteScreenshotModal diff --git a/client/src/pages/UserApp/ScreenshotsCard/ScreenshotsCard.js b/client/src/pages/UserApp/ScreenshotsCard/ScreenshotsCard.js new file mode 100644 index 000000000..004e7d14d --- /dev/null +++ b/client/src/pages/UserApp/ScreenshotsCard/ScreenshotsCard.js @@ -0,0 +1,81 @@ +import { Card, Button } from '@dhis2/ui' +import PropTypes from 'prop-types' +import sharedStyles from '../UserApp.module.css' +import DeleteScreenshotModal from './DeleteScreenshotModal' +import styles from './ScreenshotsCard.module.css' +import UploadScreenshot from './UploadScreenshot' +import Screenshots from 'src/components/Screenshots/Screenshots' +import { useModalState } from 'src/lib/use-modal-state' + +const DeleteScreenshotButton = ({ appId, imageId, mutate }) => { + const deleteScreenshotModal = useModalState() + + return ( + <> + {deleteScreenshotModal.isVisible && ( + + )} + + + ) +} + +const ScreenshotsCard = ({ app, mutate }) => { + const screenshots = app.images.filter(img => !img.logo) + const renderDeleteScreenshotButton = imageId => ( + + ) + + return ( + +

Screenshots

+ {screenshots.length > 0 ? ( + + ) : ( + <> +

+ Add app screenshots +

+

+ Screenshots help users learn more about your app. Learn + more about the{' '} + + guidelines for App Hub screenshots + + . +

+ + )} + +
+ ) +} + +ScreenshotsCard.propTypes = { + app: PropTypes.object.isRequired, + mutate: PropTypes.func.isRequired, +} + +export default ScreenshotsCard diff --git a/client/src/pages/UserApp/ScreenshotsCard/ScreenshotsCard.module.css b/client/src/pages/UserApp/ScreenshotsCard/ScreenshotsCard.module.css new file mode 100644 index 000000000..dc4a4076b --- /dev/null +++ b/client/src/pages/UserApp/ScreenshotsCard/ScreenshotsCard.module.css @@ -0,0 +1,32 @@ +.addScreenshotHeader { + font-size: 16px; + font-weight: 500; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp4); +} + +.addScreenshotDescription { + margin: 0; +} + +.screenshotsGuidelinesLink { + color: var(--colors-blue700); + text-decoration: underline; +} + +.screenshotsGuidelinesLink:hover, .screenshotsGuidelinesLink:focus { + color: var(--colors-grey900); +} + +.hidden { + display: none; +} + +.uploadButton { + margin-top: var(--spacers-dp16); +} + +.deleteButton { + margin-top: var(--spacers-dp8); +} diff --git a/client/src/pages/UserApp/ScreenshotsCard/UploadScreenshot.js b/client/src/pages/UserApp/ScreenshotsCard/UploadScreenshot.js new file mode 100644 index 000000000..4bb0e561e --- /dev/null +++ b/client/src/pages/UserApp/ScreenshotsCard/UploadScreenshot.js @@ -0,0 +1,78 @@ +import { Button } from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useState, useRef } from 'react' +import styles from './ScreenshotsCard.module.css' +import * as api from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const pluralise = (string, itemsCount) => string + (itemsCount === 1 ? '' : 's') + +const UploadScreenshot = ({ appId, mutate }) => { + const [isUploading, setIsUploading] = useState(false) + const formEl = useRef(null) + const inputEl = useRef(null) + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleUploadButtonClick = () => { + inputEl.current.click() + } + const handleUpload = async event => { + setIsUploading(true) + const files = Array.from(event.target.files) + const payloads = files.map(file => ({ + image: { + caption: '', + description: '', + logo: false, + }, + file, + })) + const requests = payloads.map(payload => + api.createNewImage(appId, payload) + ) + try { + await Promise.all(requests) + await mutate() + formEl.current.reset() + successAlert.show({ + message: `${files.length} ${pluralise( + 'screenshot', + files.length + )} uploaded`, + }) + } catch (error) { + errorAlert.show({ error }) + } + setIsUploading(false) + } + + return ( + <> +
+ +
+
+ +
+ + ) +} + +UploadScreenshot.propTypes = { + appId: PropTypes.string.isRequired, + mutate: PropTypes.func.isRequired, +} + +export default UploadScreenshot diff --git a/client/src/pages/UserApp/UserApp.js b/client/src/pages/UserApp/UserApp.js new file mode 100644 index 000000000..461102229 --- /dev/null +++ b/client/src/pages/UserApp/UserApp.js @@ -0,0 +1,45 @@ +import { CenteredContent, CircularLoader, NoticeBox } from '@dhis2/ui' +import PropTypes from 'prop-types' +import DetailsCard from './DetailsCard/DetailsCard' +import ScreenshotsCard from './ScreenshotsCard/ScreenshotsCard' +import VersionsCard from './VersionsCard/VersionsCard' +import { useQueryV1 } from 'src/api' + +const UserApp = ({ match }) => { + const { appId } = match.params + const { data: app, error, mutate } = useQueryV1(`apps/${appId}`, { + auth: true, + }) + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!app) { + return ( + + + + ) + } + + return ( + <> + + + + + ) +} + +UserApp.propTypes = { + match: PropTypes.object.isRequired, +} + +export default UserApp diff --git a/client/src/pages/UserApp/UserApp.module.css b/client/src/pages/UserApp/UserApp.module.css new file mode 100644 index 000000000..47734b8fd --- /dev/null +++ b/client/src/pages/UserApp/UserApp.module.css @@ -0,0 +1,14 @@ +.card { + display: block !important; + max-width: 960px; + margin: auto; + margin-bottom: var(--spacers-dp24); + padding: var(--spacers-dp16); +} + +.cardHeader { + font-size: 18px; + font-weight: 500; + margin-top: 0; + margin-bottom: var(--spacers-dp12); +} diff --git a/client/src/pages/UserApp/VersionsCard/VersionsCard.js b/client/src/pages/UserApp/VersionsCard/VersionsCard.js new file mode 100644 index 000000000..ae29511cf --- /dev/null +++ b/client/src/pages/UserApp/VersionsCard/VersionsCard.js @@ -0,0 +1,122 @@ +import { + Card, + Button, + ButtonStrip, + Modal, + ModalTitle, + ModalContent, + ModalActions, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useState } from 'react' +import { Link } from 'react-router-dom' +import sharedStyles from '../UserApp.module.css' +import styles from './VersionsCard.module.css' +import * as api from 'src/api' +import Versions from 'src/components/Versions/Versions' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' +import { useModalState } from 'src/lib/use-modal-state' + +const DeleteVersionModal = ({ appId, version, mutate, onClose }) => { + const [isSubmitting, setIsSubmitting] = useState(false) + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleDelete = async () => { + setIsSubmitting(true) + try { + await api.deleteVersion(appId, version.id) + mutate(app => ({ + ...app, + versions: app.versions.filter(v => v.id != version.id), + })) + successAlert.show({ + message: `Successfully deleted version ${version.version}`, + }) + } catch (error) { + errorAlert.show({ error }) + } + setIsSubmitting(false) + } + + return ( + + Delete app version + + Deleting an app version cannot be undone. +
+ Are you sure you want to delete app version {version.version}? +
+ + + + + + +
+ ) +} + +const DeleteVersionButton = ({ appId, version, mutate }) => { + const deleteVersionModal = useModalState() + + return ( + <> + {deleteVersionModal.isVisible && ( + + )} + + + ) +} + +const VersionsCard = ({ app, mutate }) => { + const versions = app.versions.sort((a, b) => b.created - a.created) + const renderDeleteVersionButton = version => ( + + ) + + return ( + +

Versions

+ + + + +
+ ) +} + +VersionsCard.propTypes = { + app: PropTypes.object.isRequired, + mutate: PropTypes.func.isRequired, +} + +export default VersionsCard diff --git a/client/src/pages/UserApp/VersionsCard/VersionsCard.module.css b/client/src/pages/UserApp/VersionsCard/VersionsCard.module.css new file mode 100644 index 000000000..912e375ce --- /dev/null +++ b/client/src/pages/UserApp/VersionsCard/VersionsCard.module.css @@ -0,0 +1,8 @@ +.deleteVersionButton { + margin-left: var(--spacers-dp8); +} + +.newVersionButton { + display: inline-block; + margin-top: var(--spacers-dp12); +} diff --git a/client/src/pages/UserAppEdit/UserAppEdit.js b/client/src/pages/UserAppEdit/UserAppEdit.js new file mode 100644 index 000000000..4f2804274 --- /dev/null +++ b/client/src/pages/UserAppEdit/UserAppEdit.js @@ -0,0 +1,122 @@ +import { + CenteredContent, + NoticeBox, + CircularLoader, + Card, + Button, + ReactFinalForm, + InputFieldFF, + TextAreaFieldFF, + hasValue, + url, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useHistory } from 'react-router-dom' +import styles from './UserAppEdit.module.css' +import { useQueryV1 } from 'src/api' +import * as api from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const UserAppEdit = ({ match }) => { + const { appId } = match.params + const { data: app, error } = useQueryV1(`apps/${appId}`, { auth: true }) + const history = useHistory() + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleSubmit = async values => { + try { + await api.updateApp(app.id, values) + successAlert.show({ message: 'App updated successfully' }) + history.push(`/user/app/${app.id}`) + } catch (error) { + errorAlert.show({ error }) + } + } + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!app) { + return ( + + + + ) + } + + return ( + +
+

Edit app

+ + App Hub guidelines + +
+ + + {({ handleSubmit, valid, submitting }) => ( +
+ + + + + + )} +
+
+ ) +} + +UserAppEdit.propTypes = { + match: PropTypes.object.isRequired, +} + +export default UserAppEdit diff --git a/client/src/pages/UserAppEdit/UserAppEdit.module.css b/client/src/pages/UserAppEdit/UserAppEdit.module.css new file mode 100644 index 000000000..0a172aabd --- /dev/null +++ b/client/src/pages/UserAppEdit/UserAppEdit.module.css @@ -0,0 +1,35 @@ +.card { + display: block !important; + max-width: 960px; + margin: auto; + padding: var(--spacers-dp16); +} + +.header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: var(--spacers-dp16); +} + +.headerText { + font-size: 26px; + font-weight: 400; + color: var(--colors-grey800); + margin: 0; +} + +.guidelinesLink { + font-size: 14px; + color: var(--colors-grey700); + text-decoration: underline; +} + +.guidelinesLink:hover, .guidelinesLink:focus { + color: var(--colors-grey900); +} + +.field { + margin-bottom: var(--spacers-dp24); + max-width: 480px; +} diff --git a/client/src/pages/UserAppUpload/CreateOrganisationModal/CreateOrganisationModal.js b/client/src/pages/UserAppUpload/CreateOrganisationModal/CreateOrganisationModal.js new file mode 100644 index 000000000..21f0b127d --- /dev/null +++ b/client/src/pages/UserAppUpload/CreateOrganisationModal/CreateOrganisationModal.js @@ -0,0 +1,91 @@ +import { + Button, + Modal, + ModalTitle, + ModalContent, + ReactFinalForm, + InputFieldFF, + composeValidators, + hasValue, + email, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import styles from './CreateOrganisationModal.module.css' +import * as api from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const CreateOrganisationModal = ({ + mutate, + setDeveloperOrganisation, + onClose, +}) => { + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleSubmit = async ({ name, email }) => { + try { + const organisation = await api.addOrganisation({ name, email }) + mutate(organisations => [...organisations, organisation]) + // Ensure data returned by useQuery in parent component has been + // updated to include new organisation before setting select input + // value + setTimeout(() => { + setDeveloperOrganisation(organisation.id) + }, 0) + successAlert.show({ + message: `Successfully created organisation ${name}`, + }) + onClose() + } catch (error) { + errorAlert.show({ error }) + } + } + + return ( + + Create organisation + + + {({ handleSubmit, valid, submitting }) => ( +
+ + + + + )} +
+
+
+ ) +} + +CreateOrganisationModal.propTypes = { + mutate: PropTypes.func.isRequired, + setDeveloperOrganisation: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default CreateOrganisationModal diff --git a/client/src/pages/UserAppUpload/CreateOrganisationModal/CreateOrganisationModal.module.css b/client/src/pages/UserAppUpload/CreateOrganisationModal/CreateOrganisationModal.module.css new file mode 100644 index 000000000..e9d6b36f9 --- /dev/null +++ b/client/src/pages/UserAppUpload/CreateOrganisationModal/CreateOrganisationModal.module.css @@ -0,0 +1,4 @@ +.field { + margin-bottom: var(--spacers-dp24); + max-width: 480px; +} diff --git a/client/src/pages/UserAppUpload/UserAppUpload.js b/client/src/pages/UserAppUpload/UserAppUpload.js new file mode 100644 index 000000000..b495e941d --- /dev/null +++ b/client/src/pages/UserAppUpload/UserAppUpload.js @@ -0,0 +1,437 @@ +import { + CenteredContent, + CircularLoader, + Card, + Button, + NoticeBox, + ReactFinalForm, + InputFieldFF, + TextAreaFieldFF, + SingleSelectFieldFF, + FileInputFieldFF, + composeValidators, + hasValue, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useMemo } from 'react' +import { Link, useHistory } from 'react-router-dom' +import CreateOrganisationModal from './CreateOrganisationModal/CreateOrganisationModal' +import styles from './UserAppUpload.module.css' +import config from 'config' +import { useQuery } from 'src/api' +import * as api from 'src/api' +import { maxDhisVersionValidator } from 'src/lib/form-validators/max-dhis-version-validator' +import { semverValidator } from 'src/lib/form-validators/semver-validator' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' +import { useModalState } from 'src/lib/use-modal-state' + +const { + defaultAppType, + appTypeToDisplayName, + defaultAppChannel, + appChannelToDisplayName, + dhisVersions, +} = config.ui +const oldestSupportedDhisVersion = dhisVersions[2] + +const dhisVersionOptions = dhisVersions.map(v => ({ + label: v, + value: v, +})) + +const appTypeOptions = Object.entries(appTypeToDisplayName).map( + ([value, label]) => ({ + value, + label, + }) +) + +const channelOptions = Object.entries(appChannelToDisplayName).map( + ([value, label]) => ({ + value, + label, + }) +) + +const requestOpts = { + useAuth: true, +} + +const UserAppUpload = ({ user }) => { + const { data: organisations, error, mutate } = useQuery( + 'organisations', + useMemo( + () => ({ + user: user.isManager ? null : user.id, + }), + [user.isManager, user.id] + ), + requestOpts + ) + const createOrganisationModal = useModalState() + const history = useHistory() + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!organisations) { + return ( + + + + ) + } + + if (organisations.length === 0) { + return ( + + +

+ Before uploading an app, you must first create an + organisation to associate it with. +

+ + + +
+
+ ) + } + + const organisationOptions = organisations.map(organisation => ({ + label: organisation.name, + value: organisation.id, + })) + const handleSubmit = async ({ + name, + description, + appType, + sourceUrl, + file, + logo, + contactEmail, + developerOrganisation, + version, + minDhisVersion, + maxDhisVersion, + demoUrl, + channel, + }) => { + try { + const { id: appId } = await api.createApp({ + file: file[0], + logo: logo[0], + app: { + name, + description, + appType, + sourceUrl, + developer: { + email: contactEmail, + organisationId: developerOrganisation, + }, + version: { + version, + minDhisVersion, + maxDhisVersion, + demoUrl, + channel, + }, + }, + }) + successAlert.show({ message: `Successfully uploaded app ${name}` }) + history.push(`/user/app/${appId}`) + } catch (error) { + errorAlert.show({ error }) + } + } + + return ( + +

Create a new app

+

+ A good app name, description and images are important. Make sure + to describe clearly what your app does and provide helpful + information for potential users. All submitted apps must be + approved by the core DHIS2 team. Check the{' '} + + App Hub submission guidelines + {' '} + to learn more. +

+

+ Fields marked with * are required. +

+ + { + utils.changeValue( + state, + 'developerOrganisation', + () => organisationId + ) + }, + }} + onSubmit={handleSubmit} + > + {({ form, handleSubmit, valid, submitting }) => ( +
+
+

+ Basic information +

+

+ This information will be shown to all potential + users on the DHIS2 App Hub. +

+ + + + + + + App versions must follow semantic + versioning.{' '} + + Read more about semantic versioning. + + + } + component={InputFieldFF} + className={styles.field} + validate={composeValidators( + hasValue, + semverValidator + )} + /> + +
+ +
+

Compatibility

+

+ It's important to let App Hub users know what + versions of DHIS2 can use this app. +

+ + +
+ +
+

+ Developer information +

+

+ This information can help users get in touch + with feedback, bug reports and suggestions. +

+ +
+ {createOrganisationModal.isVisible && ( + + )} + + +
+
+ +
+

+ Upload app file (Required) +

+

+ Upload your app as a single .zip file. +

+ +
+ +
+

+ Upload logo (Required) +

+

+ A logo will be displayed in the App Hub + listings. Use your app icon to help users find + and recognize your app. +

+ +
+ + +
+ )} +
+
+ ) +} + +UserAppUpload.propTypes = { + user: PropTypes.object.isRequired, +} + +export default UserAppUpload diff --git a/client/src/pages/UserAppUpload/UserAppUpload.module.css b/client/src/pages/UserAppUpload/UserAppUpload.module.css new file mode 100644 index 000000000..0a8d9d192 --- /dev/null +++ b/client/src/pages/UserAppUpload/UserAppUpload.module.css @@ -0,0 +1,81 @@ +.card { + display: block !important; + max-width: 960px; + margin: auto; + padding: var(--spacers-dp16); +} + +.smallCard { + composes: card; + max-width: 680px; +} + +.header { + font-size: 26px; + font-weight: 400; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp16); +} + +.subheader { + font-size: 20px; + font-weight: 500; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp8); +} + +.description { + font-size: 14px; + color: var(--colors-grey800); + line-height: 19px; + max-width: 600px; + margin: 0; + margin-bottom: var(--spacers-dp8); +} + +.subheader + .description { + margin-bottom: var(--spacers-dp24); +} + +.formSection { + margin-top: var(--spacers-dp48); +} + +.field { + margin-bottom: var(--spacers-dp24); + max-width: 480px; +} + +.organisationFieldGroup { + composes: field; + display: flex; + align-items: end; +} + +.organisationFieldGroup button { + /* Match height of input */ + min-height: 40px; + margin-left: var(--spacers-dp16); +} + +.organisationField { + flex: 1; +} + +.createOrganisationLink { + margin-top: var(--spacers-dp16); +} + +.helpTextLink { + text-decoration: underline; +} + +.helpTextLink:hover, .helpTextLink:focus { + color: var(--colors-grey900); +} + +.submitButton { + margin-top: var(--spacers-dp24); +} diff --git a/client/src/pages/UserAppVersionNew/UserAppVersionNew.js b/client/src/pages/UserAppVersionNew/UserAppVersionNew.js new file mode 100644 index 000000000..3d38c4dcf --- /dev/null +++ b/client/src/pages/UserAppVersionNew/UserAppVersionNew.js @@ -0,0 +1,172 @@ +import { + CenteredContent, + NoticeBox, + CircularLoader, + Card, + Button, + ReactFinalForm, + InputFieldFF, + SingleSelectFieldFF, + FileInputFieldFF, + composeValidators, + hasValue, +} from '@dhis2/ui' +import { useHistory } from 'react-router-dom' +import styles from './UserAppVersionNew.module.css' +import config from 'config' +import { useQueryV1 } from 'src/api' +import * as api from 'src/api' +import { maxDhisVersionValidator } from 'src/lib/form-validators/max-dhis-version-validator' +import { semverValidator } from 'src/lib/form-validators/semver-validator' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const { dhisVersions, defaultAppChannel, appChannelToDisplayName } = config.ui +const oldestSupportedDhisVersion = dhisVersions[2] + +const dhisVersionOptions = dhisVersions.map(v => ({ + label: v, + value: v, +})) + +const channelOptions = Object.entries(appChannelToDisplayName).map( + ([value, label]) => ({ + value, + label, + }) +) + +const UserAppVersionNew = ({ match }) => { + const { appId } = match.params + const { data: app, error } = useQueryV1(`apps/${appId}`, { auth: true }) + const history = useHistory() + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleSubmit = async values => { + try { + await api.createNewVersion(appId, { + file: values.file[0], + version: values, + }) + successAlert.show({ + message: `Successfully created app version ${values.version}`, + }) + history.push(`/user/app/${appId}`) + } catch (error) { + errorAlert.show({ error }) + } + } + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!app) { + return ( + + + + ) + } + + return ( + +

Create app version: {app.name}

+ + + {({ handleSubmit, valid, submitting }) => ( +
+ + App versions must follow semantic + versioning.{' '} + + Read more about semantic versioning. + + + } + component={InputFieldFF} + className={styles.field} + validate={composeValidators( + hasValue, + semverValidator + )} + /> + + + + + + + + )} +
+
+ ) +} + +export default UserAppVersionNew diff --git a/client/src/pages/UserAppVersionNew/UserAppVersionNew.module.css b/client/src/pages/UserAppVersionNew/UserAppVersionNew.module.css new file mode 100644 index 000000000..d9da7e24d --- /dev/null +++ b/client/src/pages/UserAppVersionNew/UserAppVersionNew.module.css @@ -0,0 +1,27 @@ +.card { + display: block !important; + max-width: 960px; + margin: auto; + padding: var(--spacers-dp16); +} + +.header { + font-size: 26px; + font-weight: 400; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp16); +} + +.field { + margin-bottom: var(--spacers-dp24); + max-width: 480px; +} + +.helpTextLink { + text-decoration: underline; +} + +.helpTextLink:hover, .helpTextLink:focus { + color: var(--colors-grey900); +} diff --git a/client/src/pages/UserApps/AppCard/AppCard.js b/client/src/pages/UserApps/AppCard/AppCard.js new file mode 100644 index 000000000..0c222fd39 --- /dev/null +++ b/client/src/pages/UserApps/AppCard/AppCard.js @@ -0,0 +1,102 @@ +import { Tag, Button } from '@dhis2/ui' +import PropTypes from 'prop-types' +import { Link } from 'react-router-dom' +import styles from './AppCard.module.css' +import AppIcon from 'src/components/AppIcon/AppIcon' +import { + APP_STATUS_APPROVED, + APP_STATUS_PENDING, + APP_STATUS_REJECTED, +} from 'src/constants/apiConstants' +import { relativeTimeFormat } from 'src/lib/relative-time-format' + +const appCardActionForStatus = appStatus => { + switch (appStatus) { + case APP_STATUS_APPROVED: + return 'Updated' + case APP_STATUS_PENDING: + return 'Uploaded' + case APP_STATUS_REJECTED: + return 'Reviewed' + } +} + +const appStatusToCardText = appStatus => { + switch (appStatus) { + case APP_STATUS_APPROVED: + return 'Available' + case APP_STATUS_PENDING: + return 'Waiting for approval' + case APP_STATUS_REJECTED: + return 'Rejected' + } +} + +const AppCard = ({ app, showUploadButton, onApprove, onReject, onDelete }) => { + const logo = app.images.find(i => i.logo) + const actionForStatus = appCardActionForStatus(app.status) + const actionTime = new Date(Math.max(...app.versions.map(v => v.created))) + const actionRelativeTime = relativeTimeFormat(actionTime) + + return ( +
+ +
+ +
+
+

{app.name}

+
+ {`${actionForStatus} `} + {actionRelativeTime} +
+
+ + {appStatusToCardText(app.status)} + +
+
+ +
+ {showUploadButton && + (app.status === APP_STATUS_APPROVED || + app.status === APP_STATUS_REJECTED) && ( + + + + )} + {onApprove && ( + + )} + {onReject && ( + + )} + {onDelete && ( + + )} +
+
+ ) +} + +AppCard.propTypes = { + app: PropTypes.object.isRequired, + showUploadButton: PropTypes.bool, + onApprove: PropTypes.func, + onDelete: PropTypes.func, + onReject: PropTypes.func, +} + +export default AppCard diff --git a/client/src/pages/UserApps/AppCard/AppCard.module.css b/client/src/pages/UserApps/AppCard/AppCard.module.css new file mode 100644 index 000000000..6c1106e0d --- /dev/null +++ b/client/src/pages/UserApps/AppCard/AppCard.module.css @@ -0,0 +1,50 @@ +.appCard { + display: grid; + grid-template-columns: 1fr auto; + grid-gap: var(--spacers-dp12); + max-width: 620px; + margin-bottom: var(--spacers-dp16); + background: white; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05); +} + +.appCardLink, .appCardActions { + padding: var(--spacers-dp16); +} + +.appCardLink { + display: grid; + grid-template-columns: 72px auto; + grid-gap: var(--spacers-dp12); + padding-right: 0; +} + +.appCardActions { + padding-left: 0; +} + +.appCardLink:focus { + background: var(--colors-grey200); +} + +.appCardName { + font-weight: bold; + font-size: 18px; + margin-top: 0; + margin-bottom: var(--spacers-dp4); +} + +.appCardAction { + margin-bottom: var(--spacers-dp4); + font-size: 13px; + color: var(--colors-grey700); +} + +.appCardActions { + display: flex; + flex-direction: column; +} + +.appCardActions button { + margin-bottom: var(--spacers-dp4); +} diff --git a/client/src/pages/UserApps/UserApps.js b/client/src/pages/UserApps/UserApps.js new file mode 100644 index 000000000..dce080c44 --- /dev/null +++ b/client/src/pages/UserApps/UserApps.js @@ -0,0 +1,279 @@ +import { + CenteredContent, + NoticeBox, + CircularLoader, + Button, + Input, +} from '@dhis2/ui' +import classnames from 'classnames' +import PropTypes from 'prop-types' +import { useState } from 'react' +import { Link } from 'react-router-dom' +import AppCard from './AppCard/AppCard' +import styles from './UserApps.module.css' +import config from 'config' +import * as api from 'src/api' +import { useQueryV1 } from 'src/api' +import { + APP_STATUS_APPROVED, + APP_STATUS_PENDING, + APP_STATUS_REJECTED, +} from 'src/constants/apiConstants' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const { appStatusToDisplayName } = config.ui + +const sortApps = apps => + apps.sort((a, b) => { + if (a.name < b.name) { + return -1 + } else if (a.name > b.name) { + return 1 + } + return 0 + }) + +const filterApps = (apps, query) => { + if (!query) { + return apps + } + return apps.filter(app => + [app.name, app.appType, app.developer.organisation].some(prop => + prop.toLowerCase().includes(query.toLowerCase()) + ) + ) +} + +const UserApps = ({ user }) => { + const [query, setQuery] = useState('') + const { data: appsById, error, mutate } = useQueryV1( + user.isManager ? 'apps/all' : 'apps/myapps', + { + auth: true, + } + ) + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!appsById) { + return ( + + + + ) + } + + const apps = sortApps(Object.values(appsById)) + const filteredApps = filterApps(apps, query) + const approvedApps = filteredApps.filter( + app => app.status === APP_STATUS_APPROVED + ) + const pendingApps = filteredApps + .filter(app => app.status === APP_STATUS_PENDING) + .sort((a, b) => { + const aLatestVersion = Math.max(...a.versions.map(v => v.created)) + const bLatestVersion = Math.max(...b.versions.map(v => v.created)) + return bLatestVersion - aLatestVersion + }) + const rejectedApps = filteredApps.filter( + app => app.status === APP_STATUS_REJECTED + ) + + const setAppStatus = async (app, status) => { + try { + await api.setAppApproval(app.id, status) + mutate( + apps.map(a => { + if (a.id === app.id) { + return { ...a, status } + } + return a + }) + ) + successAlert.show({ + message: `Status for ${app.name} was updated to ${appStatusToDisplayName[status]}`, + // Handle notification of status change undoing + actions: + app.status !== status + ? [ + { + label: 'Undo', + onClick: () => setAppStatus(app, app.status), + }, + ] + : null, + }) + } catch (error) { + errorAlert.show({ error }) + } + } + + const handleApprove = app => { + setAppStatus(app, APP_STATUS_APPROVED) + } + const handleReject = app => { + setAppStatus(app, APP_STATUS_REJECTED) + } + const handleDelete = async app => { + if (!window.confirm(`Are you sure you want to delete ${app.name}?`)) { + return + } + + try { + await api.deleteApp(app.id) + mutate(apps.filter(a => a.id !== app.id)) + successAlert.show({ + message: `${app.name} has been deleted`, + }) + } catch (error) { + errorAlert.show({ error }) + } + } + + return ( +
+
+
+ + + +
+ setQuery(value)} + /> +
+ {apps.length === 0 && ( +
+

+ You don't have any apps on the App Hub yet +

+ + + + +
+ )} + {apps.length > 0 && filteredApps.length === 0 && ( +
+ No apps found. Try adjusting your search. +
+ )} + {rejectedApps.length > 0 && ( +
+

+ Rejected +

+

+ Apps can be rejected if they don't meet the{' '} + + App Hub guidelines + + . Upload a new version to resubmit your app for + approval. +

+ + {rejectedApps.map(app => ( + handleApprove(app)) + } + onDelete={ + user.isManager && (() => handleDelete(app)) + } + /> + ))} +
+ )} + {pendingApps.length > 0 && ( +
+

+ Waiting for approval +

+

+ All apps on the DHIS2 App Hub must be approved by the + core team. These apps have been submitted and are + waiting for approval. +

+ + {pendingApps.map(app => ( + handleApprove(app)) + } + onReject={ + user.isManager && (() => handleReject(app)) + } + onDelete={ + user.isManager && (() => handleDelete(app)) + } + /> + ))} +
+ )} + {approvedApps.length > 0 && ( +
+

+ Available on App Hub +

+

+ These apps are available for download from the DHIS2 App + Hub. +

+ + {approvedApps.map(app => ( + handleReject(app)) + } + onDelete={ + user.isManager && (() => handleDelete(app)) + } + /> + ))} +
+ )} +
+ ) +} + +UserApps.propTypes = { + user: PropTypes.object.isRequired, +} + +export default UserApps diff --git a/client/src/pages/UserApps/UserApps.module.css b/client/src/pages/UserApps/UserApps.module.css new file mode 100644 index 000000000..2fec2743e --- /dev/null +++ b/client/src/pages/UserApps/UserApps.module.css @@ -0,0 +1,65 @@ +@value m-medium from 'src/styles/breakpoints.css'; + +@media m-medium { + .container { + padding-left: var(--spacers-dp8); + } +} + +.header { + display: grid; + grid-template-columns: 1fr 1fr; + align-items: center; + margin: var(--spacers-dp16) var(--spacers-dp4); +} + +@media (min-width: 500px) { + .header { + grid-template-columns: auto 1fr; + } + + .searchInput { + margin-left: var(--spacers-dp24); + min-width: 25%; + max-width: 380px; + } +} + +@media m-medium { + .header { + margin: 0; + margin-bottom: var(--spacers-dp24); + } +} + +.statusCard { + max-width: 960px; + margin-bottom: 40px; + padding: var(--spacers-dp16); + background: white; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.rejectedStatusCard { + border: 2px solid var(--colors-red700); + background: var(--colors-red050); +} + +.statusCardHeader { + margin-top: 0; + margin-bottom: var(--spacers-dp12); + font-size: 20px; + font-weight: 500; + color: var(--colors-grey800); +} + +.rejectedStatusCardHeader { + color: var(--colors-red600); +} + +.statusCardDescription { + color: var(--colors-grey800); + font-size: 14px; + margin-top: 0; + margin-bottom: var(--spacers-dp24); +} diff --git a/client/src/pages/UserOrganisation/Modals/EditNameModal.js b/client/src/pages/UserOrganisation/Modals/EditNameModal.js new file mode 100644 index 000000000..dd2e60ac8 --- /dev/null +++ b/client/src/pages/UserOrganisation/Modals/EditNameModal.js @@ -0,0 +1,79 @@ +import { + Button, + ButtonStrip, + Modal, + ModalTitle, + ModalContent, + ReactFinalForm, + InputFieldFF, + hasValue, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import styles from './Modal.module.css' +import * as api from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const EditNameModal = ({ organisation, mutate, onClose }) => { + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleSubmit = async ({ name }) => { + try { + await api.editOrganisation(organisation.id, { name }) + mutate({ + ...organisation, + name, + }) + successAlert.show({ + message: `Successfully updated organisation name to ${name}`, + }) + onClose() + } catch (error) { + errorAlert.show({ error }) + } + } + + return ( + + Edit organisation name + + + {({ handleSubmit, valid, submitting }) => ( +
+ + + + + + + )} +
+
+
+ ) +} + +EditNameModal.propTypes = { + mutate: PropTypes.object.isRequired, + organisation: PropTypes.object.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default EditNameModal diff --git a/client/src/pages/UserOrganisation/Modals/InviteMemberModal.js b/client/src/pages/UserOrganisation/Modals/InviteMemberModal.js new file mode 100644 index 000000000..57b473a9f --- /dev/null +++ b/client/src/pages/UserOrganisation/Modals/InviteMemberModal.js @@ -0,0 +1,82 @@ +import { + NoticeBox, + Button, + ButtonStrip, + Modal, + ModalTitle, + ModalContent, + ReactFinalForm, + InputFieldFF, + hasValue, + email, + composeValidators, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import styles from './Modal.module.css' +import * as api from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const InviteMemberModal = ({ organisation, onClose }) => { + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleSubmit = async ({ email }) => { + try { + await api.inviteOrganisationMember(organisation.id, email) + successAlert.show({ + message: `Successfully invited ${email} to organisation '${organisation.name}'`, + }) + onClose() + } catch (error) { + errorAlert.show({ error }) + } + } + + return ( + + Invite member + + + The user will receive an email with an invitation link. If + accepted, the user will be able to upload and manage apps on + behalf of this organisation. + + + {({ handleSubmit, valid, submitting }) => ( +
+ + + + + + + )} +
+
+
+ ) +} + +InviteMemberModal.propTypes = { + organisation: PropTypes.object.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default InviteMemberModal diff --git a/client/src/pages/UserOrganisation/Modals/Modal.module.css b/client/src/pages/UserOrganisation/Modals/Modal.module.css new file mode 100644 index 000000000..49a0a08c9 --- /dev/null +++ b/client/src/pages/UserOrganisation/Modals/Modal.module.css @@ -0,0 +1,11 @@ +.noticebox { + margin-bottom: var(--spacers-dp16); +} + +.form { + margin-bottom: var(--spacers-dp8); +} + +.field { + margin-bottom: var(--spacers-dp16); +} diff --git a/client/src/pages/UserOrganisation/OrganisationUser/OrganisationUser.js b/client/src/pages/UserOrganisation/OrganisationUser/OrganisationUser.js new file mode 100644 index 000000000..cd05cf1e1 --- /dev/null +++ b/client/src/pages/UserOrganisation/OrganisationUser/OrganisationUser.js @@ -0,0 +1,40 @@ +import { Button, Tag } from '@dhis2/ui' +import PropTypes from 'prop-types' +import styles from './OrganisationUser.module.css' + +const OrganisationUser = ({ user, onPromote, onRemove }) => ( +
+
+
+

{user.name}

+ {user.isOwner && Owner} +
+ {user.email} +
+
+ {!user.isOwner && onPromote && ( + + )} + {!user.isOwner && onRemove && ( + + )} +
+
+) + +OrganisationUser.propTypes = { + user: PropTypes.object.isRequired, + onPromote: PropTypes.func, + onRemove: PropTypes.func, +} + +export default OrganisationUser diff --git a/client/src/pages/UserOrganisation/OrganisationUser/OrganisationUser.module.css b/client/src/pages/UserOrganisation/OrganisationUser/OrganisationUser.module.css new file mode 100644 index 000000000..73683dd7b --- /dev/null +++ b/client/src/pages/UserOrganisation/OrganisationUser/OrganisationUser.module.css @@ -0,0 +1,27 @@ +.container { + display: grid; + grid-template-columns: 1fr auto; + margin-bottom: var(--spacers-dp24); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05); + padding: var(--spacers-dp16); +} + +.header { + margin-bottom: var(--spacers-dp8); +} + +.name { + display: inline-block; + font-size: 16px; + font-weight: 500; + margin: 0; + margin-right: var(--spacers-dp8); +} + +.email { + color: var(--colors-grey800); +} + +.removeButton { + margin-left: var(--spacers-dp8); +} diff --git a/client/src/pages/UserOrganisation/UserOrganisation.js b/client/src/pages/UserOrganisation/UserOrganisation.js new file mode 100644 index 000000000..ed1360928 --- /dev/null +++ b/client/src/pages/UserOrganisation/UserOrganisation.js @@ -0,0 +1,159 @@ +import { + CenteredContent, + NoticeBox, + CircularLoader, + Card, + Button, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import EditNameModal from './Modals/EditNameModal' +import InviteMemberModal from './Modals/InviteMemberModal' +import OrganisationUser from './OrganisationUser/OrganisationUser' +import styles from './UserOrganisation.module.css' +import { useQuery } from 'src/api' +import * as api from 'src/api' +import { relativeTimeFormat } from 'src/lib/relative-time-format' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' +import { useModalState } from 'src/lib/use-modal-state' + +const requestOpts = { + useAuth: true, +} + +const UserOrganisation = ({ match, user }) => { + const { organisationId } = match.params + const { data: organisation, error, mutate } = useQuery( + `organisations/${organisationId}`, + null, + requestOpts + ) + const inviteMemberModal = useModalState() + const editNameModal = useModalState() + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handlePromote = async userId => { + try { + await api.editOrganisation(organisation.id, { owner: userId }) + mutate({ + ...organisation, + owner: userId, + }) + successAlert.show({ + message: 'Successfully promoted organisation member', + }) + } catch (error) { + errorAlert.show({ error }) + } + } + const handleRemove = async userId => { + try { + await api.removeOrganisationMember(organisation.id, userId) + mutate({ + ...organisation, + users: organisation.users.filter(ou => ou.id !== userId), + }) + successAlert.show({ + message: 'Successfully removed organisation member', + }) + } catch (error) { + errorAlert.show({ error }) + } + } + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!organisation) { + return ( + + + + ) + } + + const isOwner = user.isManager || user.id === organisation.owner + + return ( + +
+
+

+ {organisation.name} +

+ {isOwner && ( + <> + {editNameModal.isVisible && ( + + )} + + + )} +
+
+ Created{' '} + + {relativeTimeFormat(organisation.createdAt)} + +
+
+ + + All members of an organisation are allowed to upload apps on + behalf of the organisation. Members may add new members to the + organisation. Only the owner of the organisation is allowed to + rename it. + + +
+ {inviteMemberModal.isVisible && ( + + )} +
+

Members

+ +
+ {organisation.users.map(ou => ( + handlePromote(ou.id))} + onRemove={isOwner && (() => handleRemove(ou.id))} + /> + ))} +
+
+ ) +} + +UserOrganisation.propTypes = { + match: PropTypes.object.isRequired, + user: PropTypes.object.isRequired, +} + +export default UserOrganisation diff --git a/client/src/pages/UserOrganisation/UserOrganisation.module.css b/client/src/pages/UserOrganisation/UserOrganisation.module.css new file mode 100644 index 000000000..aabf1e441 --- /dev/null +++ b/client/src/pages/UserOrganisation/UserOrganisation.module.css @@ -0,0 +1,40 @@ +.card { + display: block !important; + max-width: 680px; + margin: auto; + padding: var(--spacers-dp16); +} + +.header { + margin-bottom: var(--spacers-dp16); +} + +.organisationName { + font-size: 24px; + font-weight: 700; + margin: 0; + margin-right: var(--spacers-dp8); +} + +.createdAt { + margin-top: var(--spacers-dp8); + color: var(--colors-grey800); +} + +.notice { + margin: var(--spacers-dp32) 0; +} + +.subheader { + display: inline-block; + font-size: 18px; + font-weight: 500; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp12); + margin-right: var(--spacers-dp8); +} + +.flex { + display: flex; +} diff --git a/client/src/pages/UserOrganisationNew/UserOrganisationNew.js b/client/src/pages/UserOrganisationNew/UserOrganisationNew.js new file mode 100644 index 000000000..f4087d797 --- /dev/null +++ b/client/src/pages/UserOrganisationNew/UserOrganisationNew.js @@ -0,0 +1,78 @@ +import { + Card, + Button, + ReactFinalForm, + InputFieldFF, + composeValidators, + hasValue, + email, +} from '@dhis2/ui' +import { useHistory } from 'react-router-dom' +import { useQueryParam, StringParam } from 'use-query-params' +import styles from './UserOrganisationNew.module.css' +import * as api from 'src/api' +import { useSuccessAlert, useErrorAlert } from 'src/lib/use-alert' + +const UserOrganisationNew = () => { + const [redirect] = useQueryParam('redirect', StringParam) + const history = useHistory() + const successAlert = useSuccessAlert() + const errorAlert = useErrorAlert() + + const handleSubmit = async ({ name, email }) => { + try { + const { id } = await api.addOrganisation({ name, email }) + successAlert.show({ + message: `Successfully created organisation ${name}`, + }) + if (redirect === 'userAppUpload') { + history.push(`/user/upload`) + } else { + history.push(`/user/organisation/${id}`) + } + } catch (error) { + errorAlert.show({ error }) + } + } + + return ( + +

Create organisation

+ + + {({ handleSubmit, valid, submitting }) => ( +
+ + + + + )} +
+
+ ) +} + +export default UserOrganisationNew diff --git a/client/src/pages/UserOrganisationNew/UserOrganisationNew.module.css b/client/src/pages/UserOrganisationNew/UserOrganisationNew.module.css new file mode 100644 index 000000000..56bfb6dca --- /dev/null +++ b/client/src/pages/UserOrganisationNew/UserOrganisationNew.module.css @@ -0,0 +1,19 @@ +.card { + display: block !important; + max-width: 960px; + margin: auto; + padding: var(--spacers-dp16); +} + +.header { + font-size: 26px; + font-weight: 400; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp16); +} + +.field { + margin-bottom: var(--spacers-dp24); + max-width: 480px; +} diff --git a/client/src/pages/UserOrganisations/UserOrganisations.js b/client/src/pages/UserOrganisations/UserOrganisations.js new file mode 100644 index 000000000..ae3a605c9 --- /dev/null +++ b/client/src/pages/UserOrganisations/UserOrganisations.js @@ -0,0 +1,134 @@ +import { + CenteredContent, + NoticeBox, + CircularLoader, + Card, + Tag, + Button, + Input, +} from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useState, useMemo } from 'react' +import { Link } from 'react-router-dom' +import styles from './UserOrganisations.module.css' +import { useQuery } from 'src/api' +import { relativeTimeFormat } from 'src/lib/relative-time-format' + +const filterOrganisations = (organisations, query) => { + if (!query) { + return organisations + } + return organisations.filter(organisation => + organisation.name.toLowerCase().includes(query.toLowerCase()) + ) +} + +const OrganisationCard = ({ organisation, isOwner }) => ( + +
+

{organisation.name}

+ {isOwner && ( + + Owner + + )} +
+
+ Created {relativeTimeFormat(organisation.createdAt)} +
+ +) + +const requestOpts = { + useAuth: true, +} + +const UserOrganisations = ({ user }) => { + const [query, setQuery] = useState('') + const { data: organisations, error } = useQuery( + 'organisations', + useMemo( + () => ({ + user: user.isManager ? null : user.id, + }), + [user.isManager, user.id] + ), + requestOpts + ) + + if (error) { + return ( + + + {error.message} + + + ) + } + + if (!organisations) { + return ( + + + + ) + } + + const filteredOrganisations = filterOrganisations(organisations, query) + + return ( +
+
+
+ + + +
+ setQuery(value)} + /> +
+ +

Your organisations

+ {organisations.length === 0 && ( + <> + You are not a member of any organisations. +
+ + + +
+ + )} + {organisations.length > 0 && + filteredOrganisations.length === 0 && ( + + No organisations found. Try adjusting your search. + + )} + {filteredOrganisations.map(organisation => ( + + ))} +
+
+ ) +} + +UserOrganisations.propTypes = { + user: PropTypes.object.isRequired, +} + +export default UserOrganisations diff --git a/client/src/pages/UserOrganisations/UserOrganisations.module.css b/client/src/pages/UserOrganisations/UserOrganisations.module.css new file mode 100644 index 000000000..c67acb544 --- /dev/null +++ b/client/src/pages/UserOrganisations/UserOrganisations.module.css @@ -0,0 +1,78 @@ +@value m-medium from 'src/styles/breakpoints.css'; + +@media m-medium { + .container { + margin-left: var(--spacers-dp8); + } +} + +.header { + display: grid; + grid-template-columns: 1fr 1fr; + align-items: center; + margin: var(--spacers-dp16) var(--spacers-dp4); +} + +@media (min-width: 500px) { + .header { + grid-template-columns: auto 1fr; + } + + .searchInput { + margin-left: var(--spacers-dp24); + min-width: 25%; + max-width: 380px; + } +} + +@media m-medium { + .header { + margin: 0; + margin-bottom: var(--spacers-dp24); + } +} + +.card { + max-width: 960px; + padding: var(--spacers-dp16); +} + +.cardHeader { + font-size: 20px; + font-weight: 500; + color: var(--colors-grey800); + margin-top: 0; + margin-bottom: var(--spacers-dp16); +} + +.organisationLink { + display: block; + max-width: 620px; + margin-bottom: var(--spacers-dp16); + padding: var(--spacers-dp16); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05); +} + +.organisationLink:hover, .organisationLink:focus { + background: var(--colors-grey200); +} + +.organisationHeader { + margin-bottom: var(--spacers-dp8); +} + +.organisationName { + display: inline-block; + font-size: 18px; + font-weight: 700; + margin: 0; +} + +.organisationOwner { + margin-left: var(--spacers-dp8); +} + +.organisationCreatedAt { + font-size: 13px; + color: var(--colors-grey700); +} diff --git a/client/src/pages/UserView/UserView.js b/client/src/pages/UserView/UserView.js new file mode 100644 index 000000000..9dd58f11b --- /dev/null +++ b/client/src/pages/UserView/UserView.js @@ -0,0 +1,111 @@ +import { NoticeBox, CenteredContent, CircularLoader } from '@dhis2/ui' +import PropTypes from 'prop-types' +import { useEffect } from 'react' +import { connect } from 'react-redux' +import { Route, Switch } from 'react-router-dom' +import { loadUser } from 'src/actions/actionCreators' +import UserApiKey from 'src/pages/UserApiKey/UserApiKey' +import UserApp from 'src/pages/UserApp/UserApp' +import UserAppEdit from 'src/pages/UserAppEdit/UserAppEdit' +import UserApps from 'src/pages/UserApps/UserApps' +import UserAppUpload from 'src/pages/UserAppUpload/UserAppUpload' +import UserAppVersionNew from 'src/pages/UserAppVersionNew/UserAppVersionNew' +import UserOrganisation from 'src/pages/UserOrganisation/UserOrganisation' +import UserOrganisationNew from 'src/pages/UserOrganisationNew/UserOrganisationNew' +import UserOrganisations from 'src/pages/UserOrganisations/UserOrganisations' +import { getUserInfo } from 'src/selectors/userSelectors' + +const PageNotFound = () => ( + + + +) + +const UserView = ({ loadUser, user, match }) => { + useEffect(() => { + loadUser() + }, []) + + if (user.error) { + return ( + + + + ) + } + + if (user.loading) { + return ( + + + + ) + } + + // eslint-disable-next-line react/display-name + const provideUser = Component => props => ( + + ) + + return ( + + + + + + + + + + + {/* No-match route */} + + + ) +} + +UserView.propTypes = { + loadUser: PropTypes.func.isRequired, + match: PropTypes.object.isRequired, + user: PropTypes.object.isRequired, +} + +const mapStateToProps = state => ({ + user: getUserInfo(state), +}) + +const mapDispatchToProps = { + loadUser, +} + +export default connect(mapStateToProps, mapDispatchToProps)(UserView) diff --git a/client/src/reducers/appListReducer.js b/client/src/reducers/appListReducer.js deleted file mode 100644 index 430e7a1fb..000000000 --- a/client/src/reducers/appListReducer.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as actionTypes from '../constants/actionTypes' - -const initialState = { - byId: {}, -} - -function appsListReducer(state = { ...initialState }, action) { - switch (action.type) { - case actionTypes.APP_LOADED: { - //do not load userApps in this reducer - if (action.payload.status !== 'APPROVED') { - return state - } - const appId = action.payload.id - return { - byId: { - ...state.byId, - [appId]: action.payload, - }, - } - } - } - return state -} - -export default appsListReducer diff --git a/client/src/reducers/channelReducer.js b/client/src/reducers/channelReducer.js deleted file mode 100644 index 424f11dd3..000000000 --- a/client/src/reducers/channelReducer.js +++ /dev/null @@ -1,42 +0,0 @@ -import * as actionTypes from '../constants/actionTypes' - -const initialState = { - loading: false, - loaded: false, - list: [], -} - -const channelReducer = (state = initialState, action) => { - switch (action.type) { - case actionTypes.CHANNELS_LOAD_ERROR: { - return { - ...state, - loaded: false, - loading: false, - error: action.payload, - } - } - - case actionTypes.CHANNELS_LOAD_BEGIN: { - return { - ...state, - loaded: false, - loading: true, - } - } - case actionTypes.CHANNELS_LOAD_SUCCESS: { - return { - ...state, - loaded: true, - loading: false, - list: action.payload, - } - } - - default: { - return state - } - } -} - -export default channelReducer diff --git a/client/src/reducers/dialogReducer.js b/client/src/reducers/dialogReducer.js deleted file mode 100644 index 777400858..000000000 --- a/client/src/reducers/dialogReducer.js +++ /dev/null @@ -1,31 +0,0 @@ -import * as actions from '../constants/actionTypes' - -const emptyDialog = { dialogType: null, dialogProps: {} } -const initialState = { - ...emptyDialog, -} - -const dialog = (state = initialState, action) => { - switch (action.type) { - case actions.OPEN_DIALOG: { - return { - ...state, - dialogType: action.payload.dialogType, - dialogProps: action.payload.dialogprops, - } - } - - case actions.CLOSE_DIALOG: { - return { - ...state, - ...emptyDialog, - } - } - - default: { - return state - } - } -} - -export default dialog diff --git a/client/src/reducers/formReducer.js b/client/src/reducers/formReducer.js deleted file mode 100644 index 31755f738..000000000 --- a/client/src/reducers/formReducer.js +++ /dev/null @@ -1,121 +0,0 @@ -import { reducer as formReducer } from 'redux-form' -import * as actions from '../constants/actionTypes' - -const submittedSuccess = { - submitted: true, - submitting: false, - submitSucceeded: true, -} - -const submittedError = { - submitted: true, - submitting: false, - submitSucceeded: false, - submitFailed: true, -} - -const form = formReducer.plugin({ - imageUpload: (state, action) => { - switch (action.type) { - case actions.APP_IMAGES_ADD: { - return { - ...state, - submitting: true, - } - } - case actions.APP_IMAGES_ADD_SUCCESS: { - return { - ...state, - ...submittedSuccess, - values: state.initial, - anyTouched: false, - } - } - - case actions.APP_IMAGE_ADD_ERROR: { - const { fieldIndex, message, file } = action.payload - const newUploads = Object.assign( - [...state.syncErrors.uploads], - { - [fieldIndex]: { - files: 'Failed to upload file: ' + message, - }, - } - ) - const newValues = { uploads: [{ files: [file] }] } - return { - ...state, - syncErrors: { - ...state.syncErrors, - uploads: newUploads, - }, - values: newValues, - } - } - - case actions.APP_IMAGES_ADD_ERROR: { - return { - ...state, - ...submittedError, - anyTouched: true, - } - } - default: { - return state - } - } - }, - - uploadAppForm: (state, action) => { - switch (action.type) { - case actions.APP_ADD: { - return { - ...state, - submitting: true, - } - } - case actions.APP_ADD_SUCCESS: { - return { - ...state, - ...submittedSuccess, - } - } - - case actions.APP_ADD_ERROR: { - return { - ...state, - ...submittedError, - } - } - - default: { - return state - } - } - }, - - appChannelFilter: (state, action) => { - switch (action.type) { - case actions.CHANNELS_LOAD_SUCCESS: { - if (state && state.values) { - //if we've got old selections in the channel filter, keep them and just return previous state - return state - } - const channels = action.payload - const filterValues = channels.reduce((acc, c) => { - acc[c.name] = c.name === 'stable' - return acc - }, {}) - return { - ...state, - values: filterValues, - } - } - default: { - return state - } - } - }, -}) - -export default form diff --git a/client/src/reducers/organisationReducer.js b/client/src/reducers/organisationReducer.js deleted file mode 100644 index 4120a74d7..000000000 --- a/client/src/reducers/organisationReducer.js +++ /dev/null @@ -1,100 +0,0 @@ -import * as actions from '../constants/actionTypes' - -const initialState = { - loaded: false, - loading: true, - error: false, - byId: {}, -} - -const loadedState = { - loaded: true, - error: false, - loading: false, -} -const errorState = { - loaded: false, - loading: false, - error: true, -} - - -const organisations = (state = initialState, action) => { - switch (action.type) { - case actions.ORGANISATIONS_LOAD_SUCCESS: - case actions.ORGANISATIONS_SEARCH_SUCCESS: { - const byIdList = action.payload.list.reduce((acc, org) => { - const id = org.id - acc[id] = org - return acc - }, {}) - return { - ...state, - ...loadedState, - byId: { - ...state.byId, - ...byIdList, - }, - } - } - - case actions.ORGANISATION_EDIT_SUCCESS : { - const updatedOrg = action.payload - const orgId = updatedOrg.id - - if(updatedOrg.owner !== state.byId[orgId].owner) { - updatedOrg.owner = state.byId[orgId].users.find(u => u.id === updatedOrg.owner) - } - return { - ...state, - byId: { - ...state.byId, - [orgId]: { - ...state.byId[orgId], - ...updatedOrg - } - } - } - } - - case actions.ORGANISATION_LOAD_SUCCESS: { - const response = action.payload; - - if(response.owner && response.users) { - const ownerUser = response.users.find(u => u.id === response.owner) - if(ownerUser) { - response.owner = ownerUser - } - } - return { - ...state, - byId: { - ...state.byId, - [action.payload.id]: action.payload, - }, - } - } - - // dont set error-state - case actions.ORGANISATION_ADD_ERROR: { - return state - } - - default: { - if ( - action.type.startsWith('ORGANISATION') && - action.type.endsWith('_ERROR') - ) { - return { - ...state, - ...errorState, - error: action.payload - } - } else { - return state - } - } - } -} - -export default organisations diff --git a/client/src/reducers/snackbarReducer.js b/client/src/reducers/snackbarReducer.js deleted file mode 100644 index cf15b4c90..000000000 --- a/client/src/reducers/snackbarReducer.js +++ /dev/null @@ -1,117 +0,0 @@ -import * as actionTypes from '../constants/actionTypes' -import { appStatusToUI } from '../constants/apiConstants' -import React from 'react' -const emptySnackbar = { message: '', duration: 4000 } -const initialState = { - ...emptySnackbar, -} - -const snackbarReducer = (state = initialState, action) => { - switch (action.type) { - case actionTypes.APP_VERSION_ADD_SUCCESS: { - return { - ...state, - message: 'New app version has been uploaded', - } - } - case actionTypes.SET_APPROVAL_APP_SUCCESS: { - return { - ...state, - message: - 'Status for ' + - action.payload.app.name + - ' was updated to ' + - appStatusToUI[action.payload.status], - } - } - case actionTypes.APP_ADD_SUCCESS: { - return { - ...state, - message: 'App has been uploaded', - } - } - - case actionTypes.APP_EDIT_SUCCESS: { - return { - ...state, - message: ( - - App {action.payload.app.name} has been updated - - ), - } - } - - case actionTypes.APP_DELETE_SUCCESS: { - return { - ...state, - message: action.payload.app.name + ' has been deleted', - } - } - - case actionTypes.APP_VERSION_DELETE_SUCCESS: { - return { - ...state, - message: `Version ${action.payload.version.version} has been deleted`, - } - } - - case actionTypes.APP_VERSION_EDIT_SUCCESS: { - return { - ...state, - message: 'Version updated', - } - } - - case actionTypes.ORGANISATION_MEMBER_ADD_SUCCESS: { - return { - ...state, - message: 'Invitation sent', - } - } - - case actionTypes.ORGANISATION_ADD_SUCCESS: { - return { - ...state, - message: 'Organisation created', - } - } - - case actionTypes.ORGANISATION_EDIT_SUCCESS: { - return { - ...state, - message: 'Organisation updated', - } - } - - case actionTypes.SNACKBAR_EMPTY: { - return { - ...emptySnackbar, - } - } - - default: - const { payload, meta } = action - if (action.type.endsWith('_ERROR')) { - let message = 'An error occured' - if (payload.message && typeof payload.message === 'string') { - message += `: ${payload.message}` - } - let retryAction = undefined - if (meta && meta.retryAction) { - retryAction = meta.retryAction - } - return { - ...state, - message, - retryAction, - } - } else { - return { - ...state, - } - } - } -} - -export default snackbarReducer diff --git a/client/src/reducers/userReducer.js b/client/src/reducers/userReducer.js index b3baa654d..5a7ffc13d 100644 --- a/client/src/reducers/userReducer.js +++ b/client/src/reducers/userReducer.js @@ -1,6 +1,5 @@ -import * as actionTypes from '../constants/actionTypes' import { combineReducers } from 'redux' -import { optimistic } from 'redux-optimistic-ui' +import * as actionTypes from '../constants/actionTypes' import { roles } from '../constants/apiConstants' const localStorageProfile = localStorage.getItem('profile') @@ -19,7 +18,6 @@ const initialState = { loading: true, error: false, } - const loadedState = { loaded: true, loading: false, @@ -30,206 +28,6 @@ const errorState = { loading: false, error: true, } -function appListReducer(state = { ...initialState, byId: {} }, action) { - switch (action.type) { - case actionTypes.APPS_ALL_LOADED: - case actionTypes.USER_APPS_LOADED: { - const byId = {} - action.payload.map(app => { - byId[app.id] = app - }) - return { - ...state, - ...loadedState, - byId, - } - } - case actionTypes.APP_LOADED: { - const appId = action.payload.id - return { - ...state, - ...loadedState, - byId: { - ...state.byId, - [appId]: action.payload, - }, - } - } - case actionTypes.SET_APPROVAL_APP: { - const appId = action.payload.app.id - const app = state.byId[appId] - return { - ...state, - byId: { - ...state.byId, - [appId]: { - ...app, - status: action.payload.status, - }, - }, - } - } - case actionTypes.APP_VERSION_ADD_SUCCESS: { - const version = action.payload.version - const appId = action.payload.appId - const app = state.byId[appId] - if (!app) { - return state - } - const newVer = [...app.versions, version] - return { - ...state, - byId: { - ...state.byId, - [appId]: { - ...app, - versions: newVer, - }, - }, - } - } - - case actionTypes.APP_VERSION_DELETE: { - const version = action.payload.version - const appId = action.payload.appId - const app = state.byId[appId] - if (!app) { - return state - } - const newVer = app.versions.filter(v => v.id !== version.id) - return { - ...state, - byId: { - ...state.byId, - [appId]: { - ...app, - versions: newVer, - }, - }, - } - } - - case actionTypes.APP_DELETE: { - const list = { ...state.byId } - delete list[action.payload.app.id] - return { - ...state, - byId: list, - } - } - - case actionTypes.APP_EDIT: { - const { app, data } = action.payload - return { - ...state, - byId: { - ...state.byId, - [app.id]: { - ...app, - ...data, - }, - }, - } - } - - case actionTypes.APP_IMAGE_ADD_SUCCESS: { - const { appId, image } = action.payload - const app = state.byId[appId] - const list = app.images.concat(image) - return { - ...state, - byId: { - ...state.byId, - [appId]: { - ...app, - images: list, - }, - }, - } - } - - case actionTypes.APP_IMAGE_EDIT: { - const { appId, imageId, data } = action.payload - const app = state.byId[appId] - const list = app.images.map(elem => { - if (elem.id == imageId) { - return { - ...elem, - ...data, - } - } else if (elem.logo && data.logo) { - //clear prev logo - return { - ...elem, - logo: false, - } - } else return elem - }) - return { - ...state, - byId: { - ...state.byId, - [appId]: { - ...app, - images: list, - }, - }, - } - } - - case actionTypes.APP_IMAGE_DELETE: { - const { appId, imageId } = action.payload - const app = state.byId[appId] - const list = app.images.filter(elem => elem.id !== imageId) - return { - ...state, - byId: { - ...state.byId, - [appId]: { - ...app, - images: list, - }, - }, - } - } - - case actionTypes.APP_VERSION_EDIT: { - const { appId, version } = action.payload - const app = state.byId[appId] - const list = app.versions.map(elem => { - if (elem.id == version.id) { - return { - ...elem, - ...version, - } - } else { - return elem - } - }) - return { - ...state, - byId: { - ...state.byId, - [appId]: { - ...app, - versions: list, - }, - }, - } - } - - default: { - if (action.type && action.type.endsWith('_ERROR')) { - return { - ...state, - ...errorState, - } - } else { - return state - } - } - } -} function userInfoReducer( state = { ...initialState, profile: initialProfile }, @@ -279,29 +77,6 @@ function userInfoReducer( } } -function organisationReducer(state = { ...initialState, list: {} }, action) { - switch (action.type) { - case actionTypes.ORGANISATION_ADD_SUCCESS: { - return { - ...state, - list: [...state.list, action.payload.id], - } - } - case actionTypes.ME_LOAD_SUCCESS: { - return { - ...state, - ...loadedState, - list: action.payload.organisations, - } - } - default: { - return state - } - } -} - export default combineReducers({ - appList: optimistic(appListReducer), userInfo: userInfoReducer, - organisations: organisationReducer, }) diff --git a/client/src/selectors/organisationSelectors.js b/client/src/selectors/organisationSelectors.js deleted file mode 100644 index 6df680a34..000000000 --- a/client/src/selectors/organisationSelectors.js +++ /dev/null @@ -1,73 +0,0 @@ -import { createSelector } from 'reselect' -import { getUserOrganisationIds, getUserId, isManager } from './userSelectors' - -export const getOrganisationMeta = state => { - const { error, loading, loaded } = state.organisations - return { - error, - loading, - loaded, - } -} - -export const getOrganisationById = (state, id) => getOrganisations(state)[id] - -export const getOrganisationBySlug = (state, slug) => - getOrganisationsList(state).find(org => org.slug === slug) - -export const getOrganisations = state => state.organisations.byId - -export const getOrganisationsList = createSelector( - state => getOrganisations(state), - orgs => Object.values(orgs).sort((a, b) => a.name.localeCompare(b.name)) -) - -// list of organisations that user is member of -export const getUserOrganisationsList = createSelector( - getOrganisationsList, - getUserOrganisationIds, - (allOrgs, userOrgIds) => allOrgs.filter(org => userOrgIds.includes(org.id)) -) - -// list of organisations that user have rights to view -// eg. full list of orgs for managers -export const getAuthorizedOrganisationsList = state => { - return isManager(state) - ? getOrganisationsList(state) - : getUserOrganisationsList(state) -} - -export const hasAccessToOrganisation = createSelector( - (_, orgId) => orgId, - getAuthorizedOrganisationsList, - (orgId, orgs) => orgs.findIndex(org => org.id === orgId) -) - -export const isOwner = (state, orgId) => { - const userId = getUserId(state) - return getOrganisationById(state, orgId).owner.id === userId -} - -export const isMember = (state, orgId) => { - return getUserOrganisationIds(state).includes(orgId) -} - -export const canEditOrganisation = (state, orgId) => - isOwner(state, orgId) || isManager(state) - -export const getOrgMembers = (state, orgId) => - getOrganisationById(state, orgId).users || [] - -export const getSortedOrgMembers = createSelector( - (state, orgId) => getOrganisationById(state, orgId).owner, - (state, orgId) => getOrgMembers(state, orgId), - (orgOwner, members) => - [...members].sort((a, b) => { - if (a.id === orgOwner.id) { - return -1 - } - if (b.id === orgOwner.id) { - return 1 - } - }) -) diff --git a/client/src/selectors/userSelectors.js b/client/src/selectors/userSelectors.js index 51939ae02..81cd0ed66 100644 --- a/client/src/selectors/userSelectors.js +++ b/client/src/selectors/userSelectors.js @@ -1,27 +1,10 @@ -import { ensureState as reduxEnsureState } from 'redux-optimistic-ui' - -//Alias this, as the state is only optimistic for appList -const ensureState = state => reduxEnsureState(state.user.appList) - -export const getApp = (state, appId) => ensureState(state).byId[appId] - export const getUserInfo = state => state.user.userInfo export const getUserProfile = state => getUserInfo(state).profile -export const getUserAppList = state => ensureState(state) - export const getUserId = state => getUserInfo(state).userId -export const getAppLogo = (state, appId) => { - const app = ensureState(state).byId[appId] - if (!app) return null - return app.images.filter(image => image.logo)[0] || null -} - -export const getUserOrganisationIds = state => state.user.organisations.list - export const isManager = state => { const userInfo = getUserInfo(state) - return userInfo && userInfo.profile && userInfo.profile.manager + return userInfo?.profile?.manager } diff --git a/client/src/store.js b/client/src/store.js index 7b9ea9c8d..ca2e0c138 100644 --- a/client/src/store.js +++ b/client/src/store.js @@ -1,18 +1,11 @@ -import Epics from './actions/epics' import { createStore, applyMiddleware, combineReducers, compose } from 'redux' -import { createEpicMiddleware } from 'redux-observable' import { createLogger } from 'redux-logger' +import { createEpicMiddleware } from 'redux-observable' +import Epics from './actions/epics' import userReducer from './reducers/userReducer' -import appListReducer from './reducers/appListReducer' -import dialogReducer from './reducers/dialogReducer' -import snackbarReducer from './reducers/snackbarReducer' -import formReducer from './reducers/formReducer' -import channelReducer from './reducers/channelReducer' -import organisationReducer from './reducers/organisationReducer' -import optimisticMiddleware from './store/ReduxOptimisticMiddleware' const epicMiddleware = createEpicMiddleware() -const middlewares = [optimisticMiddleware, epicMiddleware] +const middlewares = [epicMiddleware] if (process.env.NODE_ENV === 'development') { middlewares.push( @@ -24,13 +17,7 @@ if (process.env.NODE_ENV === 'development') { } const reducer = combineReducers({ - appsList: appListReducer, user: userReducer, - dialog: dialogReducer, - snackbar: snackbarReducer, - form: formReducer, - channels: channelReducer, - organisations: organisationReducer, }) const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose diff --git a/client/src/store/ReduxOptimisticMiddleware.js b/client/src/store/ReduxOptimisticMiddleware.js deleted file mode 100644 index afffd6ec2..000000000 --- a/client/src/store/ReduxOptimisticMiddleware.js +++ /dev/null @@ -1,32 +0,0 @@ -import { BEGIN, COMMIT, REVERT } from 'redux-optimistic-ui' - -//All redux action types that are optimistic have the following suffixes -const _SUCCESS = '_SUCCESS' -const _ERROR = '_ERROR' - -//Each optimistic item will need a transaction Id to internally match the BEGIN to the COMMIT/REVERT -let nextTransactionID = 0 - -export default store => next => action => { - // FSA compliant - const { type, meta, error, payload } = action - - // Ignore actions without isOptimistic flag - if (!meta || !meta.isOptimistic) return next(action) - - const isSuccessAction = type.endsWith(_SUCCESS) - const isErrorAction = type.endsWith(_ERROR) - //Response from server, handled in epic-middleware - if (isSuccessAction || isErrorAction) { - return next(action) - } - - // Now that we know we're optimistically updating the item, give it an ID - const transactionID = nextTransactionID++ - // Sending to server; extend the action.meta to let it know we're beginning an optimistic update - return next( - Object.assign({}, action, { - meta: { optimistic: { type: BEGIN, id: transactionID } }, - }) - ) -} diff --git a/client/src/styles/auth0-overrides.css b/client/src/styles/auth0-overrides.css new file mode 100644 index 000000000..29c0ca790 --- /dev/null +++ b/client/src/styles/auth0-overrides.css @@ -0,0 +1,11 @@ +.auth0-lock-header-bg { + background: rgb(39, 102, 150) !important; +} + +.auth0-lock.auth0-lock.auth0-lock-opened .auth0-lock-header-bg .auth0-lock-header-bg-blur { + opacity: 0 !important; +} + +.auth0-lock.auth0-lock .auth0-lock-header { + color: #ffffff !important; +} diff --git a/client/src/styles/breakpoints.css b/client/src/styles/breakpoints.css new file mode 100644 index 000000000..fa69d1f05 --- /dev/null +++ b/client/src/styles/breakpoints.css @@ -0,0 +1,2 @@ +@value m-medium: (min-width: 768px); +@value m-large: (min-width: 992px); diff --git a/client/src/styles/override.css b/client/src/styles/override.css deleted file mode 100644 index 064222d8b..000000000 --- a/client/src/styles/override.css +++ /dev/null @@ -1,221 +0,0 @@ - - -html, body { - background-color: #eeeeee; - height: 100%; - font-family: Roboto, Helvetica, Arial, sans-serif; - font-weight:300; - margin: 0; -} - -.mdc-card { - justify-content: flex-start; - background-color: #ffffff; -} - -.card-text { - height: 80px; - overflow: scroll; -} - -.drawer-below-header { - position: absolute; - height: auto; - -} - -.layout-content { - padding: 10px 10px 10px 30px; - max-width: 750px; -} - -.full-height { - height:100%; - padding: 0; - left:0; - display: flex; - flex-direction: row; -} -.center { - margin-left: auto; - margin-right: auto; -} - -.left-margin { - margin-left: 15px; -} - -a { - color: inherit; - text-decoration: inherit; -} - -.link { - text-decoration: underline; -} - -.paper { - height: 100%; - margin: 0 auto 0 auto; -} - -.ver-list { - list-style: none; -} - -.second-header { - background-color: #ffffff; - color: rgba(0,0,0,0.870588); - box-shadow: 0 1px 0 rgba(0,0,0,0.05); - margin: 5px 0 20px 0; -} - -.customRouterList { - text-decoration: none; -} -.customRouterListActive { - background-color : rgb(238, 238, 238); -} - -.example-enter { - opacity: 0.01; - } - -.example-enter.example-enter-active { - opacity: 1; - transition: opacity 500ms ease-in; -} - -.example-leave { - opacity: 1; -} - -.example-leave.example-leave-active { - opacity: 0.01; - transition: opacity 300ms ease-in; -} - -.example-appear { - max-height: 0px; -} - -.example-appear.example-appear-active { - max-height: 500px; - transition: max-height .5s ease-in; -} - -.example-appear { - opacity: 0.01; -} - -.example-appear.example-appear-active { - opacity: 1; - transition: opacity .5s ease-in; -} - -.slick-next:before, .slick-prev:before { - color: rgba(0,0,0,0.4) -} - -.slick-list { - height: 420px; -} -.slick-active.slick-slide { - opacity: 1; - transform: scale(1.08); - z-index: 10; - -} - -.slick-slide { - margin-top: 10px; - opacity: 0.8; - transition: all .3s ease-in; - position: relative; - height: 400px; -} - -.multiline-content { - white-space: pre-line; - word-wrap: break-word; -} - -.auth0-lock-header-bg { - background: rgb(39, 102, 150) !important; -} - -.auth0-lock.auth0-lock.auth0-lock-opened .auth0-lock-header-bg .auth0-lock-header-bg-blur { - opacity: 0 !important; -} - -.auth0-lock.auth0-lock .auth0-lock-header { - color: #ffffff !important; -} - - -.mdc-toolbar__section { - align-items: center !important; -} - -h1, h2, h3, h4 { - font-weight: inherit -} - -span.error { - clear: both; - display: block; - color: #f00; -} - -tr.hasError { - height: 80px !important; -} - -tr.hasError td { - vertical-align: top; -} - -tr.hasError td:nth-of-type(1), -tr.hasError td:nth-of-type(7) { - padding-top: 18px; -} - -/* Change toolbar-padding according to mdc-layout-grid-margins*/ - -@media (min-width: 840px) { - .mdc-toolbar { - padding: 0 24px; - } -} - -@media (min-width: 480px) and (max-width: 839px) { - .mdc-toolbar { - padding: 0 16px; - } -} - -@media (max-width: 479px) { - .mdc-toolbar { - padding: 0 8px; - } -} - -@media (min-width: 840px) { - .mdc-layout-grid_cell { - max-width: 300px; - } -} - -@media (min-width: 480px) and (max-width: 839px) { - .mdc-layout-grid_cell { - max-width: 300px; - } -} - - -@media (max-width: 479px) { - .mdc-layout-grid_cell { - max-width: initial; - } -} - diff --git a/client/src/styles/react-toolbox/theme.css b/client/src/styles/react-toolbox/theme.css deleted file mode 100644 index 91a4a2cf2..000000000 --- a/client/src/styles/react-toolbox/theme.css +++ /dev/null @@ -1 +0,0 @@ -._3OjJz{background-color:#9e9e9e;border-radius:50%;color:#fff;display:inline-block;font-size:24px;height:40px;overflow:hidden;position:relative;text-align:center;vertical-align:middle;width:40px;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._3OjJz *,._3OjJz ::after,._3OjJz ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._3OjJz>svg{fill:currentColor;height:40px;width:1em}._3OjJz>img{height:auto;max-width:100%}._2Ueo9{background-color:transparent;background-position:center;background-size:cover;border-radius:50%;display:block;height:100%;position:absolute;width:100%}._26GdB{display:block;line-height:40px;width:100%}._3Py1Z{background:#303f9f;color:#fff;font-family:Roboto,Helvetica,Arial,sans-serif;height:64px;padding:0 24px;-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1);box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._3Py1Z *,._3Py1Z ::after,._3Py1Z ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._3Py1Z.PyOfn{-webkit-transform:translateY(-100%);transform:translateY(-100%)}._3Py1Z:not(._1J9he){box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2)}._3Py1Z._2dwFx{left:0;position:fixed;right:0;top:0;z-index:300}._3Py1Z .lGWLJ{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;position:relative;width:100%}._3Py1Z a{color:#fff}@media screen and (max-width:480px) and (orientation:portrait){._3Py1Z{height:56px}}@media screen and (max-width:600px) and (orientation:landscape){._3Py1Z{height:48px}}._37vtt{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;font-size:18px;font-weight:700;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}._37vtt>small{font-size:18px;font-weight:400}._30BcY{margin-left:-12px}._1hv3P{margin-left:auto;margin-right:-12px}._2Agdx{-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:0;cursor:pointer;display:inline-block;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;font-size:14px;font-weight:500;height:36px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;letter-spacing:0;line-height:36px;outline:0;padding:0;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;-webkit-transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._2Agdx *,._2Agdx ::after,._2Agdx ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._2Agdx>input{height:.1px;margin:0;opacity:0;overflow:hidden;padding:0;position:absolute;width:.1px;z-index:0}._2Agdx::-moz-focus-inner{border:0}._2Agdx>span:not([data-react-toolbox=tooltip]){display:inline-block;line-height:36px;vertical-align:middle}._2Agdx>svg{display:inline-block;fill:currentColor;font-size:120%;height:36px;vertical-align:top;width:1em}._2Agdx>*{pointer-events:none}._2Agdx>._3AVBi{overflow:hidden}._2Agdx[disabled]{color:rgba(0,0,0,.26);cursor:auto;pointer-events:none}._2GH_L{border-radius:2px;min-width:90px;padding:0 12px}._2GH_L ._3aBSX{font-size:120%;margin-right:6px;vertical-align:middle}._2GH_L>svg{margin-right:5px}._1ZxqC[disabled]{background-color:rgba(0,0,0,.12);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}._1ZxqC:active{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}._1ZxqC:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36)}._221ic{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}._1jWAQ{background:0 0}._3IRMZ{border-radius:50%;box-shadow:0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);font-size:24px;height:56px;width:56px}._3IRMZ ._3aBSX:not([data-react-toolbox=tooltip]){line-height:56px}._3IRMZ>._3AVBi{border-radius:50%}._3IRMZ._2DCN-{font-size:17.77778px;height:40px;width:40px}._3IRMZ._2DCN- ._3aBSX{line-height:40px}.hC5Z2{background:0 0;border-radius:50%;vertical-align:middle;width:36px}.hC5Z2 svg,.hC5Z2>._3aBSX{font-size:20px;line-height:36px;vertical-align:top}.hC5Z2>._3AVBi{border-radius:50%}._3tTAW:not([disabled])._221ic,._3tTAW:not([disabled])._3IRMZ{background:#3f51b5;color:#fff}._3tTAW:not([disabled])._1jWAQ,._3tTAW:not([disabled]).hC5Z2{color:#3f51b5}._3tTAW:not([disabled])._1jWAQ:focus:not(:active),._3tTAW:not([disabled]).hC5Z2:focus:not(:active){background:rgba(63,81,181,.2)}._3tTAW:not([disabled])._1jWAQ:hover{background:rgba(63,81,181,.2)}._2wp6F:not([disabled])._221ic,._2wp6F:not([disabled])._3IRMZ{background:#448aff;color:#fff}._2wp6F:not([disabled])._1jWAQ,._2wp6F:not([disabled]).hC5Z2{color:#448aff}._2wp6F:not([disabled])._1jWAQ:focus:not(:active),._2wp6F:not([disabled]).hC5Z2:focus:not(:active){background:rgba(68,138,255,.2)}._2wp6F:not([disabled])._1jWAQ:hover{background:rgba(68,138,255,.2)}._2CPs4:not([disabled])._221ic,._2CPs4:not([disabled])._3IRMZ{background-color:#fff;color:#212121}._2CPs4:not([disabled])._1jWAQ,._2CPs4:not([disabled]).hC5Z2{color:#212121}._2CPs4:not([disabled])._1jWAQ:focus:not(:active),._2CPs4:not([disabled]).hC5Z2:focus:not(:active){background:rgba(33,33,33,.2)}._2CPs4:not([disabled])._1jWAQ:hover{background:rgba(33,33,33,.2)}._2CPs4:not([disabled])._2SPZr._221ic,._2CPs4:not([disabled])._2SPZr._3IRMZ{background-color:#212121;color:#fff}._2CPs4:not([disabled])._2SPZr._1jWAQ,._2CPs4:not([disabled])._2SPZr.hC5Z2{color:#fff}._2CPs4:not([disabled])._2SPZr._1jWAQ:focus:not(:active),._2CPs4:not([disabled])._2SPZr.hC5Z2:focus:not(:active){background:rgba(33,33,33,.2)}._2CPs4:not([disabled])._2SPZr._1jWAQ:hover{background:rgba(33,33,33,.2)}._2CPs4._2SPZr[disabled]{background-color:rgba(0,0,0,.08);color:rgba(0,0,0,.54)}._16N7o{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}._3SV_u{background-color:currentColor;border-radius:50%;left:50%;pointer-events:none;position:absolute;top:50%;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition-duration:.8s;transition-duration:.8s;z-index:100}._3SV_u._2OZWa{opacity:.3;-webkit-transition-property:none;transition-property:none}._3SV_u._3O2Ue{opacity:.3;-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}._3SV_u:not(._3O2Ue):not(._2OZWa){opacity:0;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}._8pay8{background:#fff;border-radius:2px;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:14px;overflow:hidden;width:100%;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._8pay8 *,._8pay8 ::after,._8pay8 ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._8pay8._1AHwB{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}._8pay8 [data-react-toolbox=avatar]{display:block}._3Yc6z{background-position:center center;background-repeat:no-repeat;background-size:cover;position:relative}._3Yc6z._1HBxg,._3Yc6z._35NNe{width:100%}._3Yc6z._1HBxg .ewAVM,._3Yc6z._35NNe .ewAVM{height:100%;position:absolute}._3Yc6z._1HBxg .ewAVM>iframe,._3Yc6z._1HBxg .ewAVM>img,._3Yc6z._1HBxg .ewAVM>video,._3Yc6z._35NNe .ewAVM>iframe,._3Yc6z._35NNe .ewAVM>img,._3Yc6z._35NNe .ewAVM>video{max-width:100%}._3Yc6z::after{content:'';display:block;height:0}._3Yc6z._35NNe::after{padding-top:56.25%}._3Yc6z._1HBxg::after{padding-top:100%}._3Yc6z .ewAVM{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;left:0;overflow:hidden;position:relative;top:0;width:100%}._3Yc6z ._1bBKz .K_kzH,._3Yc6z ._1bBKz .ZoLIG,._3Yc6z ._1bBKz ._1dU3o{background-color:rgba(0,0,0,.35)}._3Yc6z ._1dU3o ._3p3mO,._3Yc6z ._1dU3o ._3qCP3{color:#fff}._1dU3o{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}._1dU3o [data-react-toolbox=avatar]{margin-right:13px}._1dU3o ._3qCP3{font-size:20px;font-weight:500;letter-spacing:.02em;line-height:1;margin:0;padding:0}._1dU3o ._3p3mO{color:#757575;font-size:14px;font-weight:400;letter-spacing:0;line-height:24px;margin:0;padding:0}._1dU3o._2iwOK{padding:20px 16px 14px}._1dU3o._2iwOK ._3qCP3{font-size:24px;-moz-osx-font-smoothing:grayscale;font-weight:400;line-height:1.25}._1dU3o._1RHxe{padding:16px}._1dU3o._1RHxe ._3qCP3{font-size:22.4px;font-size:22.4px;font-size:1.4rem;letter-spacing:0;line-height:1.4}._1dU3o._1RHxe ._3p3mO{font-weight:500;line-height:1.4}.K_kzH,._1dU3o{padding:14px 16px}.K_kzH p,._1dU3o p{font-size:14px;font-weight:400;letter-spacing:0;line-height:24px;margin:0}.K_kzH:last-child,._1dU3o:last-child{padding-bottom:20px}.K_kzH+.K_kzH,._1dU3o+.K_kzH{padding-top:0}.ZoLIG{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:8px}.ZoLIG [data-react-toolbox=button]{margin:0 4px;min-width:0;padding:0 8px}.ZoLIG [data-react-toolbox=button]:first-child{margin-left:0}.ZoLIG [data-react-toolbox=button]:last-child{margin-right:0}._2ISvI:not(.Cf3yF)>.x7MhN{cursor:pointer}._2vLUd{background-color:#3f51b5;color:#fff;cursor:pointer;padding:16px 20px}._1VWY-{display:inline-block;font-size:14px;-webkit-transition:opacity,font-size .3s cubic-bezier(.4,0,.2,1);transition:opacity,font-size .3s cubic-bezier(.4,0,.2,1)}._3K2Ws{display:block;font-size:34px;font-weight:400;font-weight:500;line-height:40px;margin:0;text-transform:capitalize;-webkit-transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1)}._1t-4v{padding:10px 5px 0}._2OzvT ._3K2Ws{opacity:.6}._2OzvT ._1VWY-{font-size:16px}._2DDdC ._1VWY-{opacity:.6}._3fCV6{width:330px}._3fCV6>[role=body]{padding:0}._3fCV6>[role=navigation]>._2hL6u{color:#3f51b5}._3fCV6>[role=navigation]>._2hL6u:hover{background:rgba(63,81,181,.2)}._3fCV6>[role=navigation]>._2hL6u:focus:not(:active){background:rgba(63,81,181,.2)}._1X9ls{background:#fff;font-size:14px;height:270px;line-height:30px;overflow:hidden;position:relative;text-align:center}._1X9ls .Nv9Bc,._1X9ls ._3iPkS{cursor:pointer;height:36px;opacity:.7;position:absolute;top:0;z-index:100}._1X9ls .Nv9Bc{left:0}._1X9ls ._3iPkS{right:0}._2ESpD{display:inline-block;font-weight:500;line-height:30px}.zEdgW{font-size:18px;height:100%;list-style:none;margin:0;overflow-y:auto;padding:0}.zEdgW>li{cursor:pointer;line-height:2.4}.zEdgW>li._1pjXb{color:#3f51b5;font-size:2.4;font-weight:500}.PcByv{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;font-size:13px;height:30px;line-height:30px;opacity:.5}.PcByv>span{-webkit-box-flex:0;-ms-flex:0 0 14.28571%;flex:0 0 14.28571%}._1qh3T{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;font-size:13px}._2qF_L{-webkit-box-flex:0;-ms-flex:0 0 14.28571%;flex:0 0 14.28571%;padding:2px 0}._2qF_L>span{border-radius:50%;display:inline-block;height:30px;line-height:30px;width:30px}._2qF_L:hover:not(._1pjXb):not(.Cf3yF)>span{background:rgba(63,81,181,.21);color:#fff}._2qF_L._1pjXb>span{background:#3f51b5;color:#fff}._2qF_L:hover:not(.Cf3yF)>span{cursor:pointer}._2qF_L.Cf3yF{opacity:.25}._1hSm5{background-color:#fff}.Rk89h,._1nam4{position:absolute}._2bZap,.m5B3T{-webkit-transition-duration:350ms;transition-duration:350ms;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out}.Rk89h{opacity:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.Rk89h.m5B3T{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}._1nam4{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}._1nam4._2bZap{opacity:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}._2WGqM,.bGml_{position:absolute;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out}.bGml_{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.bGml_._3Ghls{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}._2WGqM{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}._2WGqM._2WLHG{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.lFVgC{padding:20px 0;position:relative;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}.lFVgC *,.lFVgC ::after,.lFVgC ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}.lFVgC._1nKdf{margin-left:48px}._3ga1V{color:rgba(0,0,0,.26);display:block;font-size:24px!important;height:48px;left:-48px;line-height:48px!important;position:absolute;text-align:center;top:16px;-webkit-transition:color .3s cubic-bezier(.4,0,.2,1);transition:color .3s cubic-bezier(.4,0,.2,1);width:48px}._4bZUj{background-color:transparent;border-bottom:1px solid rgba(0,0,0,.12);border-left:0;border-right:0;border-top:0;color:#212121;display:block;font-size:16px;outline:0;padding:8px 0;width:100%}._4bZUj:focus:not([disabled]):not([readonly])~._3FySS::after,._4bZUj:focus:not([disabled]):not([readonly])~._3FySS::before{width:50%}._4bZUj:focus:not([disabled]):not([readonly])~._34120:not(.GRQEP){color:#3f51b5}._4bZUj:focus:not([disabled]):not([readonly])~._34120>._2G0aY{color:#de3226}._4bZUj:focus:not([disabled]):not([readonly])~.bMyi_{display:block;opacity:1}._4bZUj:focus:not([disabled]):not([readonly])~._3ga1V{color:#3f51b5}._4bZUj:focus:not([disabled]):not([readonly])._34NWn~.bMyi_{opacity:0}._4bZUj._34NWn~._34120:not(.GRQEP),._4bZUj:focus:not([disabled]):not([readonly])~._34120:not(.GRQEP),._4bZUj[type=date]~._34120:not(.GRQEP),._4bZUj[type=time]~._34120:not(.GRQEP){font-size:12px;top:6px}._4bZUj._34NWn~._34120.GRQEP,._4bZUj._34NWn~.bMyi_{display:none}._34120{color:rgba(0,0,0,.26);font-size:16px;left:0;line-height:16px;pointer-events:none;position:absolute;top:32px;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:top,font-size,color;transition-property:top,font-size,color;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}._34120.GRQEP~.bMyi_{display:none}.bMyi_{color:rgba(0,0,0,.26);font-size:16px;left:0;line-height:16px;opacity:1;pointer-events:none;position:absolute;top:32px;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}._3FySS{display:block;position:relative;width:100%}._3FySS::after,._3FySS::before{background-color:#3f51b5;bottom:0;content:'';height:2px;position:absolute;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:width,background-color;transition-property:width,background-color;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);width:0}._3FySS::before{left:50%}._3FySS::after{right:50%}._1oTuT,._2k5Jz{color:#de3226;font-size:12px;line-height:20px;margin-bottom:-20px}._1oTuT{color:rgba(0,0,0,.26);position:absolute;right:0}._3ZfJq>._4bZUj{border-bottom-style:dotted;color:rgba(0,0,0,.26)}._2s74E{padding-bottom:0}._2s74E>._4bZUj{border-bottom-color:#de3226;margin-top:1px}._2s74E>._1oTuT,._2s74E>._34120{color:#de3226}._2s74E>._34120>._2G0aY{color:#de3226}._2gAMv{display:none}._3nrqp{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:100vh;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:fixed;top:0;width:100vw;z-index:200;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._3nrqp *,._3nrqp ::after,._3nrqp ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._3lw90{background-color:#fff;border-radius:2px;box-shadow:0 19px 60px rgba(0,0,0,.3),0 15px 20px rgba(0,0,0,.22);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-height:96vh;max-width:96vw;opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px);-webkit-transition:opacity .3s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);-webkit-transition-delay:60ms;transition-delay:60ms}._3lw90._3ea_1{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}._38VTT{width:30vw}@media screen and (max-width:720px){._38VTT{width:50vw}}@media screen and (max-width:600px){._38VTT{width:75vw}}._1K3iz{width:50vw}@media screen and (max-width:600px){._1K3iz{width:96vw}}._10LcP{width:96vw}._3tLXQ{width:96vw}@media screen and (max-width:600px){._3tLXQ{border-radius:0;max-height:100vh;max-width:100vw;min-height:100vh;width:100vw}}._2J-aP{color:#000;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;font-size:20px;font-weight:500;letter-spacing:.02em;line-height:1;margin:0 0 16px}._1Ivuq{color:#757575;-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;padding:24px}._1Ivuq p{font-size:14px;font-weight:400;letter-spacing:0;line-height:24px;margin:0}.wgwdj{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding:8px;text-align:right}._22_c6{margin-left:8px;min-width:0;padding-left:8px;padding-right:8px}._2LA9x{background-color:#000;bottom:0;height:100vh;left:0;opacity:0;pointer-events:none;position:fixed;top:0;-webkit-transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1);width:100vw}._2LA9x._1mb5R{opacity:.6;pointer-events:all}._3eRY8{position:relative;z-index:200}._1sAOY{background-color:#fafafa;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);color:#424242;display:block;height:100vh;overflow-x:hidden;overflow-y:auto;pointer-events:none;position:fixed;top:0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);-webkit-transition-delay:0s;transition-delay:0s;width:280px;will-change:transform;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._1sAOY *,._1sAOY ::after,._1sAOY ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._1sAOY.EWFXC{pointer-events:all;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition-delay:60ms;transition-delay:60ms}._1sAOY._2-4-H{border-left:1px solid #e0e0e0;right:0}._1sAOY._2-4-H:not(.EWFXC){-webkit-transform:translateX(100%);transform:translateX(100%)}._1sAOY.FKhpR{border-right:1px solid #e0e0e0;left:0}._1sAOY.FKhpR:not(.EWFXC){-webkit-transform:translateX(-100%);transform:translateX(-100%)}@media screen and (min-width:600px){._1sAOY{width:256px}}.ZzBNK{position:relative;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}.ZzBNK *,.ZzBNK ::after,.ZzBNK ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}.ZzBNK:not(._1DQ-E)>._2767w{max-height:0;visibility:hidden}.ZzBNK._1DQ-E>._2KjGM,.ZzBNK._1DQ-E>._6c1D5{opacity:.5}.ZzBNK._1DQ-E>._2767w{box-shadow:0 1px 6px rgba(0,0,0,.12),0 1px 4px rgba(0,0,0,.24);max-height:45vh;visibility:visible}.ZzBNK:not(._1OA-G)>._2767w{bottom:auto;top:0}.ZzBNK._1OA-G>._2767w{bottom:0;top:auto}.ZzBNK._1skVH{cursor:normal;pointer-events:none}._6c1D5>input{cursor:pointer}._6c1D5::after{border-left:5.48571px solid transparent;border-right:5.48571px solid transparent;border-top:5.48571px solid rgba(0,0,0,.12);content:'';height:0;pointer-events:none;position:absolute;right:8px;top:50%;-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);width:0}.d5bru{cursor:pointer;padding:20px 0;position:relative}.d5bru._3dZUG{padding-bottom:0}.d5bru._3dZUG>._2KjGM{color:#de3226}.d5bru._3dZUG>._6dCtT{border-bottom:1px solid #de3226}.d5bru._3dZUG>._2KjGM>._1j4LX{color:#de3226}.d5bru._1skVH{cursor:normal;pointer-events:none}.d5bru._1skVH>._6dCtT{border-bottom-style:dotted;opacity:.7}._6dCtT{background-color:transparent;border-bottom:1px solid rgba(0,0,0,.12);color:#212121;min-height:38.4px;padding:8px 0;position:relative}._2KjGM{color:rgba(0,0,0,.26);font-size:12px;left:0;line-height:16px;position:absolute;top:6px}._2KjGM ._1j4LX{color:#de3226}.fySw3{color:#de3226;font-size:12px;line-height:20px;margin-bottom:-20px}._2767w{background-color:#fff;border-radius:2px;list-style:none;margin:0;overflow-y:auto;padding:0;position:absolute;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:max-height,box-shadow;transition-property:max-height,box-shadow;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%;z-index:100}._2767w>*{cursor:pointer;overflow:hidden;padding:10px;position:relative;cursor:not-allowed}._2767w>._3uiEo{color:#3f51b5}._2767w::-webkit-scrollbar{height:0;width:0}.caNNQ{display:inline-block;list-style:none;margin:0;padding:8px 0;position:relative;text-align:left;white-space:nowrap;width:100%;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}.caNNQ *,.caNNQ ::after,.caNNQ ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}.caNNQ+._2Jg3-{margin-top:-8px}.q2l8C{color:#757575;font-size:14px;font-weight:500;line-height:48px;margin:-8px 0 0;padding-left:16px}._2Jg3-{background-color:#eee;border:0;height:1px;margin:-1px 0 0}._2Jg3-._1HHo_{margin-left:72px;margin-right:16px}.ni6RH{position:relative}.ni6RH>[data-react-toolbox=ripple]{overflow:hidden}.ni6RH ._2mi0Y{color:#757575}.ni6RH~._2Jg3-{margin-bottom:8px;margin-top:8px}._2GtDw{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#212121;display:-webkit-box;display:-ms-flexbox;display:flex;min-height:48px;padding:0 16px;position:relative}._2GtDw._1OoR-:not(._38DD6):hover{background-color:#eee;cursor:pointer}._2GtDw._38DD6{pointer-events:none}._2GtDw._38DD6:not(.OVyge){opacity:.5}._2GtDw._38DD6>._3SG-0>[data-react-toolbox=label]{opacity:.5}.bHOJq [data-react-toolbox=font-icon]{width:18px}.bHOJq :last-child>[data-react-toolbox=font-icon]{margin-right:22px}.OQ3Je>:last-child{margin-right:0}.OQ3Je>:first-child{margin-left:16px}.OQ3Je,.bHOJq{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.VB7pN{display:-webkit-box;display:-ms-flexbox;display:flex;margin:8px 16px 8px 0}.VB7pN>*{padding:0}.VB7pN>[data-react-toolbox=font-icon]{color:#757575;font-size:24px}._2FBCh{display:block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}._2FBCh.EO5bo{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:72px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}._3SG-0{-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;margin:0;min-height:48px;width:100%}._3SG-0>[data-react-toolbox=check]{margin-right:38px}._3SG-0>[data-react-toolbox=label]{padding-left:0}._12FqV{display:block}._12FqV:not(._3SxNr){color:#757575;font-size:14px;padding-top:3px;white-space:normal}._12FqV._3SxNr{color:#212121;font-size:16px}._3Tq32{display:block;height:18px;margin-bottom:15px;position:relative;white-space:nowrap;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._3Tq32 *,._3Tq32 ::after,._3Tq32 ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._3Tq32 ._2NWrZ{background-color:#3f51b5;opacity:.3;-webkit-transition-duration:650ms;transition-duration:650ms}.dXU7C{color:#000;display:inline-block;font-size:14px;line-height:18px;padding-left:10px;vertical-align:top;white-space:nowrap}._271V1{height:0;opacity:0;overflow:hidden;position:absolute;width:0}._271V1:focus~._1CXAo::before{background-color:rgba(0,0,0,.01);border-radius:50%;content:'';height:41.4px;left:50%;margin-left:-20.7px;margin-top:-20.7px;pointer-events:none;position:absolute;top:50%;width:41.4px}._271V1:focus~._1CXAo.nSz7s::before{background-color:rgba(63,81,181,.26)}._1CXAo{border-color:#000;border-radius:2px;border-style:solid;border-width:2px;cursor:pointer;display:inline-block;height:18px;position:relative;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);vertical-align:top;width:18px;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._1CXAo *,._1CXAo ::after,._1CXAo ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._1CXAo.nSz7s{background-color:#3f51b5;border-color:#3f51b5}._1CXAo.nSz7s::after{-webkit-animation:_3GU9D 140ms ease-out forwards;animation:_3GU9D 140ms ease-out forwards;border-bottom-width:2px;border-color:#fff;border-left:0;border-right-width:2px;border-style:solid;border-top:0;content:'';height:12px;left:4px;position:absolute;top:-1px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:7px}._2jVLS>.dXU7C{color:rgba(0,0,0,.26)}._2jVLS>._1CXAo{border-color:rgba(0,0,0,.26);cursor:auto}._2jVLS>._1CXAo.nSz7s{background-color:rgba(0,0,0,.26);border-color:transparent;cursor:auto}@-webkit-keyframes _3GU9D{0%{height:0;left:6px;top:9px;width:0}100%{height:12px;left:4px;top:-1px;width:7px}}@keyframes _3GU9D{0%{height:0;left:6px;top:9px;width:0}100%{height:12px;left:4px;top:-1px;width:7px}}._1-mD4{font-size:18px;margin-right:10px}._1Od3D{-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1.5;position:relative;-webkit-transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1);box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._1Od3D *,._1Od3D ::after,._1Od3D ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._1Od3D:not(._3blKB){opacity:.5}._1Od3D:active,._1Od3D:hover{opacity:1}._1Od3D>*{vertical-align:middle}._1Od3D>abbr{text-transform:capitalize}._1Od3D>small{font-size:12px;margin-left:8px;text-align:center}._2aMxm{display:inline-block;position:relative;text-align:center;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._2aMxm *,._2aMxm ::after,._2aMxm ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._2aMxm ._1b8Ml{cursor:pointer}._1gvr5{display:inline-block;position:relative}._1gvr5.SYeW8{left:0;position:absolute;top:0}._1gvr5.SYeW8>._2PdTB{-webkit-transform-origin:0 0;transform-origin:0 0}._1gvr5.DFQvY{position:absolute;right:0;top:0}._1gvr5.DFQvY>._2PdTB{-webkit-transform-origin:100% 0;transform-origin:100% 0}._1gvr5._3i7lA{bottom:0;left:0;position:absolute}._1gvr5._3i7lA>._2PdTB{-webkit-transform-origin:0 100%;transform-origin:0 100%}._1gvr5._3q-zB{bottom:0;position:absolute;right:0}._1gvr5._3q-zB>._2PdTB{-webkit-transform-origin:100% 100%;transform-origin:100% 100%}._1gvr5:not(._2xf5n){pointer-events:none;z-index:200}._1gvr5:not(._2xf5n)>._2PdTB{opacity:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);will-change:transform}._1gvr5:not(._2xf5n)>._2t8UE{left:0;margin:0;opacity:0;position:absolute;top:0}._1gvr5:not(._2xf5n)._3o1JI:not(._2Cekp)>._2PdTB{-webkit-transition-delay:.3s;transition-delay:.3s}._1gvr5:not(._2xf5n)._3o1JI:not(._2Cekp)>._2t8UE{-webkit-transition-delay:.3s;transition-delay:.3s}._1gvr5:not(._2xf5n)._2Cekp{pointer-events:all}._1gvr5:not(._2xf5n)._2Cekp>._2PdTB{opacity:1;-webkit-transform:scale(1);transform:scale(1)}._1gvr5:not(._2xf5n)._2Cekp>._2t8UE{opacity:1;-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1)}._2PdTB{background-color:#fff;border-radius:2px;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);display:block;left:0;position:absolute;top:0}._2t8UE{display:block;list-style:none;padding:8px 0;position:relative;text-align:left;white-space:nowrap}.lyzBJ{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#212121;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:16px;height:48px;overflow:hidden;padding:0 16px;position:relative}.lyzBJ:not(.zGTpA):hover{background-color:#eee;cursor:pointer}.lyzBJ.zGTpA{opacity:.5;pointer-events:none}.lyzBJ._2-j_P{background-color:transparent;font-weight:500}.lyzBJ ._2m_Cl{color:#757575}.lyzBJ ._1b8Ml{font-size:24px;width:38.4px}._3MsfE{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;font-size:16px}._1anRY{margin-left:16px}.VX5Lv{background-color:#eee;border:0;display:block;height:1px;margin:12px 0;outline:0;padding:0;width:100%}._1MJ9B>[data-react-toolbox=button],._1MJ9B>[data-react-toolbox=link]{display:inline-block;margin:0 5px}.xUlwz>[data-react-toolbox=button],.xUlwz>[data-react-toolbox=link]{display:block;margin:5px}._1MJ9B,.xUlwz{padding:5px;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._1MJ9B *,._1MJ9B ::after,._1MJ9B ::before,.xUlwz *,.xUlwz ::after,.xUlwz ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._1MJ9B>[data-react-toolbox=link],.xUlwz>[data-react-toolbox=link]{color:#000}._3vxHj{background:#eee;display:inline-block;height:4px;overflow:hidden;position:relative;width:100%}._3vxHj._1gPzb .I0PhY{-webkit-animation:_1cU21 1s linear infinite;animation:_1cU21 1s linear infinite;-webkit-transform-origin:center center;transform-origin:center center}.I0PhY,.SzbNd{bottom:0;left:0;position:absolute;right:0;top:0;-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:left center;transform-origin:left center;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.I0PhY{background-color:#3f51b5}.SzbNd{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,#3f51b5,#3f51b5)}._2j3vC{display:inline-block;height:60px;position:relative;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);width:60px}._2j3vC._1gPzb .DlWjM{-webkit-animation:zfZzh 2s linear infinite;animation:zfZzh 2s linear infinite}._2j3vC._1gPzb ._1xZSU{-webkit-animation:_3DSlU 1.5s ease-in-out infinite;animation:_3DSlU 1.5s ease-in-out infinite;stroke-dasharray:1.25,250;stroke-dashoffset:0}._2j3vC._1gPzb._3XHT8 ._1xZSU{-webkit-animation:_3DSlU 1.5s ease-in-out infinite,Z_PDt 6s ease-in-out infinite;animation:_3DSlU 1.5s ease-in-out infinite,Z_PDt 6s ease-in-out infinite}._2j3vC[disabled] .I0PhY,._3vxHj[disabled] .I0PhY{background-color:rgba(0,0,0,.26)}._2j3vC[disabled] .SzbNd,._3vxHj[disabled] .SzbNd{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,rgba(0,0,0,.26),rgba(0,0,0,.26));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,rgba(0,0,0,.26),rgba(0,0,0,.26));background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,rgba(0,0,0,.26),rgba(0,0,0,.26))}.DlWjM{height:100%;width:100%}._1xZSU{fill:none;stroke:#3f51b5;stroke-dasharray:0,250;stroke-dashoffset:0;stroke-linecap:round;stroke-miterlimit:20;stroke-width:4;-webkit-transition:stroke-dasharray .3s cubic-bezier(.4,0,.2,1);transition:stroke-dasharray .3s cubic-bezier(.4,0,.2,1)}@-webkit-keyframes _1cU21{0%{-webkit-transform:translate(-50%) scaleX(0);transform:translate(-50%) scaleX(0)}50%{-webkit-transform:translate(0) scaleX(.3);transform:translate(0) scaleX(.3)}100%{-webkit-transform:translate(50%) scaleX(0);transform:translate(50%) scaleX(0)}}@keyframes _1cU21{0%{-webkit-transform:translate(-50%) scaleX(0);transform:translate(-50%) scaleX(0)}50%{-webkit-transform:translate(0) scaleX(.3);transform:translate(0) scaleX(.3)}100%{-webkit-transform:translate(50%) scaleX(0);transform:translate(50%) scaleX(0)}}@-webkit-keyframes zfZzh{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes zfZzh{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes _3DSlU{0%{stroke-dasharray:1.25,250;stroke-dashoffset:0}50%{stroke-dasharray:111.25,250;stroke-dashoffset:-43.75}100%{stroke-dasharray:111.25,250;stroke-dashoffset:-155}}@keyframes _3DSlU{0%{stroke-dasharray:1.25,250;stroke-dashoffset:0}50%{stroke-dasharray:111.25,250;stroke-dashoffset:-43.75}100%{stroke-dasharray:111.25,250;stroke-dashoffset:-155}}@-webkit-keyframes Z_PDt{0%{stroke:#4285f4}25%{stroke:#de3e35}50%{stroke:#f7c223}75%{stroke:#1b9a59}100%{stroke:#4285f4}}@keyframes Z_PDt{0%{stroke:#4285f4}25%{stroke:#de3e35}50%{stroke:#f7c223}75%{stroke:#1b9a59}100%{stroke:#4285f4}}.zDi3X{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#212121;border-radius:2px;bottom:0;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;left:24px;margin:14px auto 0;padding:14px 24px;position:fixed;right:24px;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1) .3s;transition:all .3s cubic-bezier(.4,0,.2,1) .3s;z-index:200;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}.zDi3X *,.zDi3X ::after,.zDi3X ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}.zDi3X._2Y0Cy ._2pCxU{color:#4caf50}.zDi3X._2li3o ._2pCxU{color:#eeff41}.zDi3X._3731C ._2pCxU{color:#f44336}.zDi3X:not(._38CsO){-webkit-transform:translateY(100%);transform:translateY(100%)}.zDi3X._38CsO{-webkit-transform:translateY(0);transform:translateY(0)}._1JIbY{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;font-size:14px}._2pCxU{margin:-7px -12px -7px 48px;min-width:inherit}.wiKya{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;min-height:100vh;min-width:100%;position:relative;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}.wiKya *,.wiKya ::after,.wiKya ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._3aW3s{left:0;position:absolute;right:0;top:0}._3aW3s:not(._2uzOU){height:100vh;max-height:100vh;overflow-y:scroll}.Cte92,._2kCN0{z-index:100}.Cte92.qf0ha,._2kCN0.qf0ha{box-shadow:none}.Cte92._1y5eh,._2kCN0._1y5eh{height:calc(100vh - 64px);padding-top:5px;top:64px}@media screen and (max-width:480px) and (orientation:portrait){.Cte92._1y5eh,._2kCN0._1y5eh{height:calc(100vh - 56px);top:56px}}@media screen and (max-width:600px) and (orientation:landscape){.Cte92._1y5eh,._2kCN0._1y5eh{height:calc(100vh - 48px);top:48px}}._1S9wz,._3aW3s{-webkit-transition:all .3s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1)}._2Q-xL.F9Fy2{z-index:100}._2Q-xL ._3aW3s{top:64px}._2Q-xL ._3aW3s:not(._2uzOU){height:calc(100vh - 64px);max-height:calc(100vh - 64px);overflow-y:scroll}@media screen and (max-width:480px) and (orientation:portrait){._2Q-xL ._3aW3s{top:56px}}@media screen and (max-width:600px) and (orientation:landscape){._2Q-xL ._3aW3s{top:48px}}._2eOy5 .fZ13o{display:none}._2eOy5 ._3aW3s{left:280px}._2eOy5:not(._2kROG) .F9Fy2{padding-left:304px}@media screen and (min-width:600px){._2eOy5 ._3aW3s{left:256px}._2eOy5:not(._2kROG) .F9Fy2{padding-left:280px}}._2kROG ._2gpOZ{position:relative;z-index:1}._3yo9c .fZ13o{display:none}._3yo9c ._3aW3s{right:280px}._3yo9c:not(._1paQt) .F9Fy2{padding-right:304px}@media screen and (min-width:600px){._3yo9c ._3aW3s{right:256px}._3yo9c:not(._1paQt) .F9Fy2{padding-right:280px}}._1paQt ._1TUxm{position:relative;z-index:1}._1EWpa ._2kCN0{width:100%}@media screen and (min-width:840px){._1EWpa ._2kCN0{width:64px}._1EWpa._3yo9c ._3aW3s{right:64px}._1EWpa._3yo9c:not(._1paQt) .F9Fy2{padding-right:88px}}._37z5O ._2kCN0{width:100%}@media screen and (min-width:840px){._37z5O ._2kCN0{width:128px}._37z5O._3yo9c ._3aW3s{right:128px}._37z5O._3yo9c:not(._1paQt) .F9Fy2{padding-right:152px}}._24Dtc ._2kCN0{width:100%}@media screen and (min-width:840px){._24Dtc ._2kCN0{width:192px}._24Dtc._3yo9c ._3aW3s{right:192px}._24Dtc._3yo9c:not(._1paQt) .F9Fy2{padding-right:216px}}._28mqi ._2kCN0{width:100%}@media screen and (min-width:840px){._28mqi ._2kCN0{width:256px}._28mqi._3yo9c ._3aW3s{right:256px}._28mqi._3yo9c:not(._1paQt) .F9Fy2{padding-right:280px}}.K39iB ._2kCN0{width:100%}@media screen and (min-width:840px){.K39iB ._2kCN0{width:320px}.K39iB._3yo9c ._3aW3s{right:320px}.K39iB._3yo9c:not(._1paQt) .F9Fy2{padding-right:344px}}._2PjBX ._2kCN0{width:100%}@media screen and (min-width:840px){._2PjBX ._2kCN0{width:384px}._2PjBX._3yo9c ._3aW3s{right:384px}._2PjBX._3yo9c:not(._1paQt) .F9Fy2{padding-right:408px}}._16Oxc ._2kCN0{width:100%}@media screen and (min-width:840px){._16Oxc ._2kCN0{width:448px}._16Oxc._3yo9c ._3aW3s{right:448px}._16Oxc._3yo9c:not(._1paQt) .F9Fy2{padding-right:472px}}._3fr9v ._2kCN0{width:100%}@media screen and (min-width:840px){._3fr9v ._2kCN0{width:512px}._3fr9v._3yo9c ._3aW3s{right:512px}._3fr9v._3yo9c:not(._1paQt) .F9Fy2{padding-right:536px}}.iF_4K ._2kCN0{width:100%}@media screen and (min-width:840px){.iF_4K ._2kCN0{width:576px}.iF_4K._3yo9c ._3aW3s{right:576px}.iF_4K._3yo9c:not(._1paQt) .F9Fy2{padding-right:600px}}._3mnwI ._2kCN0{width:100%}@media screen and (min-width:840px){._3mnwI ._2kCN0{width:640px}._3mnwI._3yo9c ._3aW3s{right:640px}._3mnwI._3yo9c:not(._1paQt) .F9Fy2{padding-right:664px}}._2uccf ._2kCN0{width:100%}@media screen and (min-width:840px){._2uccf ._2kCN0{width:704px}._2uccf._3yo9c ._3aW3s{right:704px}._2uccf._3yo9c:not(._1paQt) .F9Fy2{padding-right:728px}}._1pU-9 ._2kCN0{width:100%}@media screen and (min-width:840px){._1pU-9 ._2kCN0{width:768px}._1pU-9._3yo9c ._3aW3s{right:768px}._1pU-9._3yo9c:not(._1paQt) .F9Fy2{padding-right:792px}}@media screen and (min-width:600px) and (orientation:landscape){._1EWpa ._2kCN0{width:56px}._1EWpa._3yo9c ._3aW3s{right:56px}._1EWpa._3yo9c:not(._1paQt) .F9Fy2{padding-right:80px}}@media screen and (min-width:600px) and (orientation:portrait){._1EWpa ._2kCN0{width:64px}._1EWpa._3yo9c ._3aW3s{right:64px}._1EWpa._3yo9c:not(._1paQt) .F9Fy2{padding-right:88px}}@media screen and (min-width:600px) and (orientation:landscape){._37z5O ._2kCN0{width:112px}._37z5O._3yo9c ._3aW3s{right:112px}._37z5O._3yo9c:not(._1paQt) .F9Fy2{padding-right:136px}}@media screen and (min-width:600px) and (orientation:portrait){._37z5O ._2kCN0{width:128px}._37z5O._3yo9c ._3aW3s{right:128px}._37z5O._3yo9c:not(._1paQt) .F9Fy2{padding-right:152px}}@media screen and (min-width:600px) and (orientation:landscape){._24Dtc ._2kCN0{width:168px}._24Dtc._3yo9c ._3aW3s{right:168px}._24Dtc._3yo9c:not(._1paQt) .F9Fy2{padding-right:192px}}@media screen and (min-width:600px) and (orientation:portrait){._24Dtc ._2kCN0{width:192px}._24Dtc._3yo9c ._3aW3s{right:192px}._24Dtc._3yo9c:not(._1paQt) .F9Fy2{padding-right:216px}}@media screen and (min-width:600px) and (orientation:landscape){._28mqi ._2kCN0{width:224px}._28mqi._3yo9c ._3aW3s{right:224px}._28mqi._3yo9c:not(._1paQt) .F9Fy2{padding-right:248px}}@media screen and (min-width:600px) and (orientation:portrait){._28mqi ._2kCN0{width:256px}._28mqi._3yo9c ._3aW3s{right:256px}._28mqi._3yo9c:not(._1paQt) .F9Fy2{padding-right:280px}}@media screen and (min-width:600px) and (orientation:landscape){.K39iB ._2kCN0{width:280px}.K39iB._3yo9c ._3aW3s{right:280px}.K39iB._3yo9c:not(._1paQt) .F9Fy2{padding-right:304px}}@media screen and (min-width:600px) and (orientation:portrait){.K39iB ._2kCN0{width:320px}.K39iB._3yo9c ._3aW3s{right:320px}.K39iB._3yo9c:not(._1paQt) .F9Fy2{padding-right:344px}}@media screen and (min-width:600px) and (orientation:landscape){._2PjBX ._2kCN0{width:336px}._2PjBX._3yo9c ._3aW3s{right:336px}._2PjBX._3yo9c:not(._1paQt) .F9Fy2{padding-right:360px}}@media screen and (min-width:600px) and (orientation:portrait){._2PjBX ._2kCN0{width:384px}._2PjBX._3yo9c ._3aW3s{right:384px}._2PjBX._3yo9c:not(._1paQt) .F9Fy2{padding-right:408px}}@media screen and (min-width:600px) and (orientation:landscape){._16Oxc ._2kCN0{width:392px}._16Oxc._3yo9c ._3aW3s{right:392px}._16Oxc._3yo9c:not(._1paQt) .F9Fy2{padding-right:416px}}@media screen and (min-width:600px) and (orientation:portrait){._16Oxc ._2kCN0{width:448px}._16Oxc._3yo9c ._3aW3s{right:448px}._16Oxc._3yo9c:not(._1paQt) .F9Fy2{padding-right:472px}}@media screen and (min-width:600px) and (orientation:landscape){._3fr9v ._2kCN0{width:448px}._3fr9v._3yo9c ._3aW3s{right:448px}._3fr9v._3yo9c:not(._1paQt) .F9Fy2{padding-right:472px}}@media screen and (min-width:600px) and (orientation:portrait){._3fr9v ._2kCN0{width:512px}._3fr9v._3yo9c ._3aW3s{right:512px}._3fr9v._3yo9c:not(._1paQt) .F9Fy2{padding-right:536px}}@media screen and (min-width:600px) and (orientation:landscape){.iF_4K ._2kCN0{width:504px}.iF_4K._3yo9c ._3aW3s{right:504px}.iF_4K._3yo9c:not(._1paQt) .F9Fy2{padding-right:528px}}@media screen and (min-width:600px) and (orientation:portrait){.iF_4K ._2kCN0{width:576px}.iF_4K._3yo9c ._3aW3s{right:576px}.iF_4K._3yo9c:not(._1paQt) .F9Fy2{padding-right:600px}}@media screen and (min-width:720px){._1EWpa ._2kCN0{width:64px}._1EWpa._3yo9c ._3aW3s{right:64px}._1EWpa._3yo9c:not(._1paQt) .F9Fy2{padding-right:88px}}@media screen and (min-width:720px){._37z5O ._2kCN0{width:128px}._37z5O._3yo9c ._3aW3s{right:128px}._37z5O._3yo9c:not(._1paQt) .F9Fy2{padding-right:152px}}@media screen and (min-width:720px){._24Dtc ._2kCN0{width:192px}._24Dtc._3yo9c ._3aW3s{right:192px}._24Dtc._3yo9c:not(._1paQt) .F9Fy2{padding-right:216px}}@media screen and (min-width:720px){._28mqi ._2kCN0{width:256px}._28mqi._3yo9c ._3aW3s{right:256px}._28mqi._3yo9c:not(._1paQt) .F9Fy2{padding-right:280px}}@media screen and (min-width:720px){.K39iB ._2kCN0{width:320px}.K39iB._3yo9c ._3aW3s{right:320px}.K39iB._3yo9c:not(._1paQt) .F9Fy2{padding-right:344px}}@media screen and (min-width:720px){._2PjBX ._2kCN0{width:384px}._2PjBX._3yo9c ._3aW3s{right:384px}._2PjBX._3yo9c:not(._1paQt) .F9Fy2{padding-right:408px}}@media screen and (min-width:720px){._16Oxc ._2kCN0{width:448px}._16Oxc._3yo9c ._3aW3s{right:448px}._16Oxc._3yo9c:not(._1paQt) .F9Fy2{padding-right:472px}}@media screen and (min-width:720px){._3fr9v ._2kCN0{width:512px}._3fr9v._3yo9c ._3aW3s{right:512px}._3fr9v._3yo9c:not(._1paQt) .F9Fy2{padding-right:536px}}@media screen and (min-width:720px){.iF_4K ._2kCN0{width:576px}.iF_4K._3yo9c ._3aW3s{right:576px}.iF_4K._3yo9c:not(._1paQt) .F9Fy2{padding-right:600px}}@media screen and (min-width:720px){._3mnwI ._2kCN0{width:640px}._3mnwI._3yo9c ._3aW3s{right:640px}._3mnwI._3yo9c:not(._1paQt) .F9Fy2{padding-right:664px}}._10h-v ._2kCN0{width:100%}.BYRr2 ._2kCN0{width:100%}._2L3ft ._2kCN0{width:100%}._31jol ._2kCN0{width:100%}._2Xvmh ._2kCN0{width:100%}._3T7B6 ._2kCN0{width:100%}@media screen and (min-width:720px){._10h-v ._3aW3s{right:25%}._10h-v ._2kCN0{width:25%}._10h-v:not(._1paQt) .F9Fy2{padding-right:calc(25% + 24px)}.BYRr2 ._3aW3s{right:33%}.BYRr2 ._2kCN0{width:33%}.BYRr2:not(._1paQt) .F9Fy2{padding-right:calc(33% + 24px)}._2L3ft ._3aW3s{right:50%}._2L3ft ._2kCN0{width:50%}._2L3ft:not(._1paQt) .F9Fy2{padding-right:calc(50% + 24px)}._31jol ._3aW3s{right:66%}._31jol ._2kCN0{width:66%}._31jol:not(._1paQt) .F9Fy2{padding-right:calc(66% + 24px)}._2Xvmh ._3aW3s{right:75%}._2Xvmh ._2kCN0{width:75%}._2Xvmh:not(._1paQt) .F9Fy2{padding-right:calc(75% + 24px)}._3T7B6 ._3aW3s{right:100%}._3T7B6 ._2kCN0{width:100%}._3T7B6:not(._1paQt) .F9Fy2{padding-right:calc(100% + 24px)}}._1v8bI{display:block;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:10px;font-weight:700;line-height:14px;max-width:170px;padding:5px;pointer-events:none;position:absolute;text-align:center;text-transform:none;-webkit-transform:scale(0) translateX(-50%);transform:scale(0) translateX(-50%);-webkit-transform-origin:top left;transform-origin:top left;-webkit-transition:cubic-bezier(.4,0,.2,1) .2s transform;transition:cubic-bezier(.4,0,.2,1) .2s transform;z-index:200;box-sizing:border-box;font-family:Roboto,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}._1v8bI *,._1v8bI ::after,._1v8bI ::before{box-sizing:border-box;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-touch-callout:none}._1v8bI._2xWjx{-webkit-transform:scale(1) translateX(-50%);transform:scale(1) translateX(-50%)}._1v8bI._1PfOK{-webkit-transform:scale(0) translateX(-50%) translateY(-100%);transform:scale(0) translateX(-50%) translateY(-100%)}._1v8bI._1PfOK._2xWjx{-webkit-transform:scale(1) translateX(-50%) translateY(-100%);transform:scale(1) translateX(-50%) translateY(-100%)}._1v8bI._3uj3d{-webkit-transform:scale(0) translateX(-100%) translateY(-50%);transform:scale(0) translateX(-100%) translateY(-50%)}._1v8bI._3uj3d._2xWjx{-webkit-transform:scale(1) translateX(-100%) translateY(-50%);transform:scale(1) translateX(-100%) translateY(-50%)}._1v8bI._3UQWj{-webkit-transform:scale(0) translateX(0) translateY(-50%);transform:scale(0) translateX(0) translateY(-50%)}._1v8bI._3UQWj._2xWjx{-webkit-transform:scale(1) translateX(0) translateY(-50%);transform:scale(1) translateX(0) translateY(-50%)}._9q2WH{background:rgba(97,97,97,.9);border-radius:2px;color:#fff;display:block;padding:8px} \ No newline at end of file diff --git a/client/src/styles/react-toolbox/theme.js b/client/src/styles/react-toolbox/theme.js deleted file mode 100644 index 1a813d6f4..000000000 --- a/client/src/styles/react-toolbox/theme.js +++ /dev/null @@ -1,256 +0,0 @@ -module.exports = { - RTAvatar: { avatar: '_3OjJz', image: '_2Ueo9', letter: '_26GdB' }, - RTAppBar: { - appBar: '_3Py1Z', - scrollHide: 'PyOfn', - flat: '_1J9he', - fixed: '_2dwFx', - inner: 'lGWLJ', - title: '_37vtt', - leftIcon: '_30BcY', - rightIcon: '_1hv3P', - }, - RTButton: { - button: '_2Agdx', - rippleWrapper: '_3AVBi', - squared: '_2GH_L', - icon: '_3aBSX', - solid: '_1ZxqC', - raised: '_221ic _2Agdx _2GH_L _1ZxqC', - flat: '_1jWAQ _2Agdx _2GH_L', - floating: '_3IRMZ _2Agdx _1ZxqC', - mini: '_2DCN-', - toggle: 'hC5Z2 _2Agdx', - primary: '_3tTAW', - accent: '_2wp6F', - neutral: '_2CPs4', - inverse: '_2SPZr', - }, - RTRipple: { - rippleWrapper: '_16N7o', - ripple: '_3SV_u', - rippleRestarting: '_2OZWa', - rippleActive: '_3O2Ue', - }, - RTCard: { - card: '_8pay8', - raised: '_1AHwB', - cardMedia: '_3Yc6z', - wide: '_35NNe', - square: '_1HBxg', - content: 'ewAVM', - contentOverlay: '_1bBKz', - cardTitle: '_1dU3o', - cardActions: 'ZoLIG', - cardText: 'K_kzH', - title: '_3qCP3', - subtitle: '_3p3mO', - large: '_2iwOK', - small: '_1RHxe', - }, - RTDatePicker: { - input: '_2ISvI', - disabled: 'Cf3yF', - inputElement: 'x7MhN', - header: '_2vLUd', - year: '_1VWY-', - date: '_3K2Ws', - calendarWrapper: '_1t-4v', - yearsDisplay: '_2OzvT', - monthsDisplay: '_2DDdC', - dialog: '_3fCV6', - button: '_2hL6u', - calendar: '_1X9ls', - prev: 'Nv9Bc', - next: '_3iPkS', - title: '_2ESpD', - years: 'zEdgW', - active: '_1pjXb', - week: 'PcByv', - days: '_1qh3T', - day: '_2qF_L', - month: '_1hSm5', - slideRightEnter: 'Rk89h', - slideRightLeave: '_1nam4', - slideRightEnterActive: 'm5B3T', - slideRightLeaveActive: '_2bZap', - slideLeftEnter: 'bGml_', - slideLeftLeave: '_2WGqM', - slideLeftEnterActive: '_3Ghls', - slideLeftLeaveActive: '_2WLHG', - }, - RTInput: { - input: 'lFVgC', - withIcon: '_1nKdf', - icon: '_3ga1V', - inputElement: '_4bZUj', - bar: '_3FySS', - label: '_34120', - fixed: 'GRQEP', - required: '_2G0aY', - hint: 'bMyi_', - filled: '_34NWn', - error: '_2k5Jz', - counter: '_1oTuT', - disabled: '_3ZfJq', - errored: '_2s74E', - hidden: '_2gAMv', - }, - RTDialog: { - wrapper: '_3nrqp', - dialog: '_3lw90', - active: '_3ea_1', - small: '_38VTT', - normal: '_1K3iz', - large: '_10LcP', - fullscreen: '_3tLXQ', - title: '_2J-aP', - body: '_1Ivuq', - navigation: 'wgwdj', - button: '_22_c6', - }, - RTOverlay: { overlay: '_2LA9x', active: '_1mb5R' }, - RTDrawer: { - wrapper: '_3eRY8', - drawer: '_1sAOY', - active: 'EWFXC', - right: '_2-4-H', - left: 'FKhpR', - }, - RTDropdown: { - dropdown: 'ZzBNK', - active: '_1DQ-E', - values: '_2767w', - label: '_2KjGM', - value: '_6c1D5', - up: '_1OA-G', - disabled: '_1skVH', - field: 'd5bru', - errored: '_3dZUG', - templateValue: '_6dCtT', - required: '_1j4LX', - error: 'fySw3', - selected: '_3uiEo', - }, - RTList: { - list: 'caNNQ', - divider: '_2Jg3-', - subheader: 'q2l8C', - inset: '_1HHo_', - listItem: 'ni6RH', - ripple: '_2mi0Y', - item: '_2GtDw', - selectable: '_1OoR-', - disabled: '_38DD6', - checkboxItem: 'OVyge', - checkbox: '_3SG-0', - left: 'bHOJq', - right: 'OQ3Je', - itemAction: 'VB7pN', - itemContentRoot: '_2FBCh', - large: 'EO5bo', - itemText: '_12FqV', - primary: '_3SxNr', - }, - RTCheckbox: { - field: '_3Tq32', - ripple: '_2NWrZ', - text: 'dXU7C', - input: '_271V1', - check: '_1CXAo', - checked: 'nSz7s', - 'checkmark-expand': '_3GU9D', - disabled: '_2jVLS', - }, - RTLink: { icon: '_1-mD4', link: '_1Od3D', active: '_3blKB' }, - RTMenu: { - iconMenu: '_2aMxm', - icon: '_1b8Ml', - menu: '_1gvr5', - topLeft: 'SYeW8', - outline: '_2PdTB', - topRight: 'DFQvY', - bottomLeft: '_3i7lA', - bottomRight: '_3q-zB', - static: '_2xf5n', - menuInner: '_2t8UE', - rippled: '_3o1JI', - active: '_2Cekp', - menuItem: 'lyzBJ', - disabled: 'zGTpA', - selected: '_2-j_P', - ripple: '_2m_Cl', - caption: '_3MsfE', - shortcut: '_1anRY', - menuDivider: 'VX5Lv', - }, - RTNavigation: { horizontal: '_1MJ9B', vertical: 'xUlwz' }, - RTProgressBar: { - linear: '_3vxHj', - 'linear-indeterminate-bar': '_1cU21', - indeterminate: '_1gPzb', - value: 'I0PhY', - buffer: 'SzbNd', - circular: '_2j3vC', - 'circular-indeterminate-bar-rotate': 'zfZzh', - 'circular-indeterminate-bar-dash': '_3DSlU', - colors: 'Z_PDt', - circle: 'DlWjM', - path: '_1xZSU', - multicolor: '_3XHT8', - }, - RTSnackbar: { - snackbar: 'zDi3X', - accept: '_2Y0Cy', - button: '_2pCxU', - warning: '_2li3o', - cancel: '_3731C', - active: '_38CsO', - label: '_1JIbY', - }, - RTLayout: { - layout: 'wiKya', - panel: '_3aW3s', - bodyScroll: '_2uzOU', - sidebarDrawer: '_2kCN0', - navDrawerDrawer: 'Cte92', - pinned: 'qf0ha', - clipped: '_1y5eh', - appbarInner: '_1S9wz', - appbarFixed: '_2Q-xL', - appbarAppBar: 'F9Fy2', - navDrawerPinned: '_2eOy5', - appbarLeftIcon: 'fZ13o', - navDrawerClipped: '_2kROG', - navDrawerWrapper: '_2gpOZ', - sidebarPinned: '_3yo9c', - sidebarClipped: '_1paQt', - sidebarWrapper: '_1TUxm', - sidebarWidth1: '_1EWpa', - sidebarWidth2: '_37z5O', - sidebarWidth3: '_24Dtc', - sidebarWidth4: '_28mqi', - sidebarWidth5: 'K39iB', - sidebarWidth6: '_2PjBX', - sidebarWidth7: '_16Oxc', - sidebarWidth8: '_3fr9v', - sidebarWidth9: 'iF_4K', - sidebarWidth10: '_3mnwI', - sidebarWidth11: '_2uccf', - sidebarWidth12: '_1pU-9', - sidebarWidth25: '_10h-v', - sidebarWidth33: 'BYRr2', - sidebarWidth50: '_2L3ft', - sidebarWidth66: '_31jol', - sidebarWidth75: '_2Xvmh', - sidebarWidth100: '_3T7B6', - }, - RTTooltip: { - tooltip: '_1v8bI', - tooltipActive: '_2xWjx', - tooltipTop: '_1PfOK', - tooltipLeft: '_3uj3d', - tooltipRight: '_3UQWj', - tooltipInner: '_9q2WH', - }, -} diff --git a/client/src/styles/styles.css b/client/src/styles/styles.css new file mode 100644 index 000000000..c44b97998 --- /dev/null +++ b/client/src/styles/styles.css @@ -0,0 +1,9 @@ +body { + color: var(--colors-grey900); + background: var(--colors-grey100); +} + +a { + color: inherit; + text-decoration: inherit; +} diff --git a/client/src/styles/theme.js b/client/src/styles/theme.js deleted file mode 100644 index 77ac6d4d4..000000000 --- a/client/src/styles/theme.js +++ /dev/null @@ -1,47 +0,0 @@ -import getMuiTheme from 'material-ui/styles/getMuiTheme' -import { fade } from 'material-ui/utils/colorManipulator' -import { - blue500, - blue700, - blue900, - pinkA200, - grey100, - grey200, - grey300, - grey500, - white, - darkBlack, - fullBlack, - lightBlack, -} from 'material-ui/styles/colors' - -export default getMuiTheme({ - palette: { - primary1Color: 'rgb(39, 102, 150)', - primary2Color: blue900, - primary3Color: grey200, - accent1Color: blue700, - accent2Color: grey100, - accent3Color: grey500, - textColor: darkBlack, - alternateTextColor: white, - canvasColor: white, - borderColor: grey300, - disabledColor: fade(darkBlack, 0.3), - pickerHeaderColor: blue500, - clockCircleColor: fade(darkBlack, 0.07), - shadowColor: fullBlack, - textHeaderColor: '#4A5768', - }, - - paddedCard: { - padding: ' 16px 35px', - lineHeight: '24px', - }, - - container: { - maxWidth: 1272, //Each card at frontpage is 300px and has space for 4, with 24 px gutter. (300*4 + (24*3) ) = 1272). - margin: '0 auto', - // paddingLeft: 'calc(100vw - 100%)' //Scrollbar-shift fix - }, -}) diff --git a/client/src/styles/utils/animations.css b/client/src/styles/utils/animations.css deleted file mode 100644 index 3cad572f9..000000000 --- a/client/src/styles/utils/animations.css +++ /dev/null @@ -1,22 +0,0 @@ -.fade-enter, -.fade-appear, -.fade-exit { - transition: opacity 300ms; -} -.fade-enter { - opacity: 0; -} -.fade-appear { - opacity: 0; -} -.fade-enter-active, -.fade-appear-active { - opacity: 1 -} -.fade-exit { - transition: opacity 300ms; - opacity: 1; -} -.fade-exit-active { - opacity: 0 -} diff --git a/client/src/utils/AuthService.js b/client/src/utils/AuthService.js index 53507f448..703b2f135 100644 --- a/client/src/utils/AuthService.js +++ b/client/src/utils/AuthService.js @@ -1,7 +1,4 @@ - export default class AuthService { - - setProfile(profile) { localStorage.setItem('profile', JSON.stringify(profile)) } diff --git a/client/src/utils/PopoverWithReduxState.jsx b/client/src/utils/PopoverWithReduxState.jsx deleted file mode 100644 index ef4136c7b..000000000 --- a/client/src/utils/PopoverWithReduxState.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' -import { Provider, ReactReduxContext } from 'react-redux' -import Popover from 'material-ui/Popover' - -export default function PopoverWithReduxState(props) { - return ( - - {ctx => ( - - {props.children} - - )} - - ) -} diff --git a/client/src/utils/jwtHelper.js b/client/src/utils/jwtHelper.js deleted file mode 100644 index 600a8f00c..000000000 --- a/client/src/utils/jwtHelper.js +++ /dev/null @@ -1,21 +0,0 @@ -import decode from 'jwt-decode' - -export function getTokenExpirationDate(token) { - const decoded = decode(token) - if (!decoded.exp) { - return null - } - - const date = new Date(0) // The 0 here is the key, which sets the date to the epoch - date.setUTCSeconds(decoded.exp) - return date -} - -export function isTokenExpired(token) { - const date = getTokenExpirationDate(token) - const offsetSeconds = 0 - if (date === null) { - return false - } - return !(date.valueOf() > new Date().valueOf() + offsetSeconds * 1000) -} diff --git a/client/src/utils/preRender.js b/client/src/utils/preRender.js deleted file mode 100644 index e4f53d11c..000000000 --- a/client/src/utils/preRender.js +++ /dev/null @@ -1,107 +0,0 @@ -import React from 'react' -import { Paper, Popover } from 'material-ui' -import PopoverAnimationDefault from 'material-ui/Popover/PopoverAnimationDefault' - -// This is a fix for material-ui Popover which will flicker to the top-left when opened -// See https://github.com/mui-org/material-ui/issues/8040 - -Popover.prototype.componentWillMount = function() { - this.renderLayer = () => { - const { - animated, - animation, - anchorEl, // eslint-disable-line no-unused-vars - anchorOrigin, // eslint-disable-line no-unused-vars - autoCloseWhenOffScreen, // eslint-disable-line no-unused-vars - canAutoPosition, // eslint-disable-line no-unused-vars - children, - onRequestClose, // eslint-disable-line no-unused-vars - style, - targetOrigin, - useLayerForClickAway, // eslint-disable-line no-unused-vars - scrollableContainer, // eslint-disable-line no-unused-vars - ...other - } = this.props - - let styleRoot = { - ...style, - opacity: this.state.setPlacement ? 1 : 0, // MADE EDIT HERE - } - - if (!animated) { - styleRoot = { - position: 'fixed', - zIndex: this.context.muiTheme.zIndex.popover, - } - - if (!this.state.open) { - return null - } - - return ( - - {children} - - ) - } - - const Animation = animation || PopoverAnimationDefault - - return ( - - {children} - - ) - } -} - -Popover.prototype.componentWillReceiveProps = function(nextProps) { - if (nextProps.open === this.props.open) { - return - } - - if (nextProps.open) { - clearTimeout(this.timeout) - this.timeout = null - this.anchorEl = nextProps.anchorEl || this.props.anchorEl - this.setState( - { - open: true, - closing: false, - setPlacement: false, - }, - () => { - // MADE EDIT HERE - setTimeout(() => { - this.setState({ - setPlacement: true, - }) - }) - } - ) - } else { - if (nextProps.animated) { - if (this.timeout !== null) return - this.setState({ closing: true }) - this.timeout = setTimeout(() => { - this.setState( - { - open: false, - }, - () => { - this.timeout = null - } - ) - }, 500) - } else { - this.setState({ - open: false, - }) - } - } -} diff --git a/client/test/config/configResolver.spec.js b/client/test/config/configResolver.spec.js index 0c0f891b9..f52a09528 100644 --- a/client/test/config/configResolver.spec.js +++ b/client/test/config/configResolver.spec.js @@ -1,7 +1,7 @@ /* eslint-disable no-undef */ +import merge from 'lodash/merge' import ConfigImport, { getConfig } from '../../config/configResolver' import DirectDefaultConfig from '../../default.config.js' -import merge from 'lodash/merge' const defaultConfigPath = '../../config/' const Config = ConfigImport.default @@ -133,9 +133,7 @@ describe('ConfigResolver', () => { ) expect(DirectDefaultConfig).to.not.have.property('another') - expect(conf) - .to.be.an('object') - .that.includes(addition) + expect(conf).to.be.an('object').that.includes(addition) ConfigImport.__ResetDependency__('loadFile') }) diff --git a/client/test/setup.js b/client/test/setup.js index a0645f8ca..f482968b0 100644 --- a/client/test/setup.js +++ b/client/test/setup.js @@ -1,3 +1,5 @@ +/* eslint-disable import/order */ + require('isomorphic-fetch') import { JSDOM } from 'jsdom' diff --git a/client/test/utils/api.spec.js b/client/test/utils/api.spec.js index 42f120df5..55adf77ca 100644 --- a/client/test/utils/api.spec.js +++ b/client/test/utils/api.spec.js @@ -1,4 +1,4 @@ -import __RewireAPI__, * as api from '../../src/api/api.js' +/*import __RewireAPI__, * as api from '../../src/api' let fetchStub const randomToken = 'aRandomBearerToken' @@ -112,3 +112,4 @@ describe('API', () => { }) }) }) +*/ diff --git a/client/webpack.config.js b/client/webpack.config.js index 53cd9f2cc..84da132f2 100644 --- a/client/webpack.config.js +++ b/client/webpack.config.js @@ -1,17 +1,17 @@ -const webpack = require('webpack') +const HtmlWebpackPlugin = require('html-webpack-plugin') const path = require('path') +const webpack = require('webpack') +const config = require('./config/configResolver.js').default const packageJSON = require('./package.json') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const nodeEnv = process.env.NODE_ENV || 'development' +const nodeEnv = process.env.NODE_ENV || 'development' const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false' -const config = require('./config/configResolver.js').default const appEntry = path.join(__dirname, 'src', 'app-hub.js') const webpackConfig = { entry: { - app: ['whatwg-fetch', appEntry], + app: appEntry, }, mode: nodeEnv, output: { @@ -29,10 +29,39 @@ const webpackConfig = { }, { test: /\.css$/, - use: [{ loader: 'style-loader' }, { loader: 'css-loader' }], + use: [ + { loader: 'style-loader' }, + { + loader: 'css-loader', + options: { + modules: true, + // TODO: This option has moved to inside the + // 'modules' config for later versions of css-loader + localIdentName: + nodeEnv === 'development' + ? '[path][name]__[local]' + : '[hash:base64]', + }, + }, + ], + }, + { + test: /\.svg$/, + use: [ + { + loader: '@svgr/webpack', + options: { + svgoConfig: { + plugins: { + removeViewBox: false, + }, + }, + }, + }, + ], }, { - test: /\.(jpe?g|png|gif|svg|woff(2)?|ttf|eot)$/i, + test: /\.(jpe?g|png|gif|woff(2)?|ttf|eot)$/i, use: [ { loader: 'file-loader', @@ -50,7 +79,18 @@ const webpackConfig = { historyApiFallback: true, }, resolve: { - extensions: ['.js', '.jsx'], + extensions: ['.js'], + // If these cause issues with using nodejs for testing, see + // https://stackoverflow.com/questions/33793504/using-webpack-aliases-in-mocha-tests + alias: { + config: path.resolve(__dirname, 'config/'), + src: path.resolve(__dirname, 'src/'), + assets: path.resolve(__dirname, 'assets/'), + '@dhis2/app-runtime': path.resolve( + __dirname, + 'app-runtime-mock.js' + ), + }, }, plugins: [ new webpack.DefinePlugin({ diff --git a/package.json b/package.json index 06c9add99..28be1ef6e 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,12 @@ "format": "yarn format:js && yarn format:text", "format:staged": "yarn format:js --staged && yarn format:text --staged", "format:js": "d2-style js apply", - "format:text": "d2-style text apply" + "format:text": "d2-style text apply", + "format:client": "yarn workspace client format", + "format:server": "yarn workspace client format" }, "devDependencies": { - "@dhis2/cli-style": "^6.0.0", + "@dhis2/cli-style": "^7.3.0", "concurrently": "^4.1.2", "cross-env": "^6.0.3" }, diff --git a/server/src/data/updateApp.js b/server/src/data/updateApp.js index 8bce56fdf..4962af99f 100644 --- a/server/src/data/updateApp.js +++ b/server/src/data/updateApp.js @@ -30,6 +30,15 @@ const paramsSchema = joi }) .options({ allowUnknown: true }) +const isValidSourceUrl = sourceUrl => { + try { + const url = new URL(sourceUrl) + return url.protocol === 'http:' || url.protocol === 'https:' + } catch (error) { + return false + } +} + /** * Updates an app * @@ -83,7 +92,7 @@ const updateApp = async (params, knex) => { await knex('app_version') .update({ - source_url: sourceUrl, + source_url: isValidSourceUrl(sourceUrl) ? sourceUrl : null, updated_at: knex.fn.now(), updated_by_user_id: userId, }) diff --git a/server/src/routes/v1/apps/handlers/createApp.js b/server/src/routes/v1/apps/handlers/createApp.js index 45eafa0fb..4272ecb56 100644 --- a/server/src/routes/v1/apps/handlers/createApp.js +++ b/server/src/routes/v1/apps/handlers/createApp.js @@ -55,7 +55,7 @@ module.exports = { throw Boom.badRequest(appJsonValidationResult.error) } - const { organisationId } = appJsonPayload.developer + const { email: contactEmail, organisationId } = appJsonPayload.developer const organisation = await Organisation.findOne( organisationId, false, @@ -81,6 +81,7 @@ module.exports = { const app = await App.create( { userId: currentUserId, + contactEmail, organisationId, appType, status: AppStatus.PENDING, diff --git a/server/src/routes/v1/apps/handlers/getAllApps.js b/server/src/routes/v1/apps/handlers/getAllApps.js index bc119c7d7..cd814853a 100644 --- a/server/src/routes/v1/apps/handlers/getAllApps.js +++ b/server/src/routes/v1/apps/handlers/getAllApps.js @@ -31,6 +31,7 @@ module.exports = { try { const apps = await getAllAppsByLanguage('en', h.context.db) + return convertAppsToApiV1Format(apps, request) } catch (err) { debug(err) diff --git a/server/src/services/app.js b/server/src/services/app.js index 57852ba02..0ad922c6b 100644 --- a/server/src/services/app.js +++ b/server/src/services/app.js @@ -8,13 +8,13 @@ const { } = require('../data') exports.create = async ( - { userId: currentUserId, organisationId, appType, status }, + { userId: currentUserId, contactEmail, organisationId, appType, status }, db ) => { const app = await createApp( { userId: currentUserId, - developerUserId: currentUserId, + contactEmail, orgId: organisationId, appType: appType, }, diff --git a/yarn.lock b/yarn.lock index c37c5b094..77eb99ecb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,240 +22,229 @@ promise-polyfill "^8.2.0" unfetch "^4.2.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: - "@babel/highlight" "^7.8.3" + "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: - browserslist "^4.9.1" - invariant "^2.2.4" - semver "^5.5.0" + "@babel/highlight" "^7.12.13" -"@babel/core@^7.1.2", "@babel/core@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.7.tgz#b69017d221ccdeb203145ae9da269d72cf102f3b" - integrity sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.7" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.7" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.7" - convert-source-map "^1.7.0" +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.12", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" + integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== + +"@babel/core@7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" + integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.5" + "@babel/types" "^7.4.4" + convert-source-map "^1.1.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" json5 "^2.1.0" - lodash "^4.17.13" + lodash "^4.17.11" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.8.6", "@babel/generator@^7.8.7": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.8.tgz#cdcd58caab730834cee9eeadb729e833b625da3e" - integrity sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg== +"@babel/core@^7.1.2", "@babel/core@^7.12.3", "@babel/core@^7.8.7": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.15.tgz#a6d40917df027487b54312202a06812c4f7792d0" + integrity sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.9" + "@babel/helper-compilation-targets" "^7.13.13" + "@babel/helper-module-transforms" "^7.13.14" + "@babel/helpers" "^7.13.10" + "@babel/parser" "^7.13.15" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.15" + "@babel/types" "^7.13.14" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.13.9", "@babel/generator@^7.4.4": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" + integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== dependencies: - "@babel/types" "^7.8.7" + "@babel/types" "^7.13.0" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== +"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.12.13" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" - integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5" + integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.0" - -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" - -"@babel/helper-call-delegate@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" - integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.7" - -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== - dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" + "@babel/compat-data" "^7.13.12" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.3.0": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" + integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.7.0" + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== +"@babel/helper-define-polyfill-provider@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" + integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" + integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.13.0" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.12.13" -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== +"@babel/helper-hoist-variables@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" + integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g== dependencies: - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== +"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.13.12" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" + "@babel/types" "^7.13.12" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" + integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== dependencies: - "@babel/types" "^7.8.3" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.13" + "@babel/types" "^7.13.14" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" - integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + +"@babel/helper-remap-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" + integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== dependencies: - lodash "^4.17.13" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" + integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.12" + +"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.13.12" "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" @@ -264,560 +253,726 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.12.13" "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helper-wrap-function@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" + integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helpers@^7.13.10", "@babel/helpers@^7.4.4": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8" + integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== dependencies: + "@babel/helper-validator-identifier" "^7.12.11" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.5.0", "@babel/parser@^7.8.6", "@babel/parser@^7.8.7": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.8.tgz#4c3b7ce36db37e0629be1f0d50a571d2f86f6cd4" - integrity sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA== +"@babel/parser@^7.12.13", "@babel/parser@^7.13.15", "@babel/parser@^7.4.5", "@babel/parser@^7.5.0", "@babel/parser@^7.7.0": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.15.tgz#8e66775fb523599acb6a289e12929fa5ab0954d8" + integrity sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ== -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" + integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-proposal-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== +"@babel/plugin-proposal-async-generator-functions@^7.13.15", "@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" + integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-proposal-class-properties@7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd" + integrity sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== +"@babel/plugin-proposal-dynamic-import@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" + integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== +"@babel/plugin-proposal-json-strings@^7.13.8", "@babel/plugin-proposal-json-strings@^7.2.0": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" + integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== +"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" + integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-optional-chaining@^7.12.13", "@babel/plugin-proposal-optional-chaining@^7.9.0": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" + integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz#63a7d805bc8ce626f3234ee5421a2a7fb23f66d9" - integrity sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q== + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== dependencies: "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz#6d1859882d4d778578e41f82cc5d7bf3d5daf6c1" + integrity sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.13.8", "@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" + integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== + dependencies: + "@babel/compat-data" "^7.13.8" + "@babel/helper-compilation-targets" "^7.13.8" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.13.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.13.8", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" + integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.12.13", "@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" + integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" - integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" + integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.8" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-syntax-async-generators@^7.8.0": +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-dynamic-import@^7.8.0": +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-json-strings@^7.8.0": +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": +"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-transform-arrow-functions@^7.13.0", "@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" + integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-transform-async-to-generator@^7.13.0", "@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" + integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-transform-block-scoped-functions@^7.12.13", "@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== +"@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" +"@babel/plugin-transform-classes@^7.13.0", "@babel/plugin-transform-classes@^7.4.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" + integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-computed-properties@^7.13.0", "@babel/plugin-transform-computed-properties@^7.2.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" + integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== +"@babel/plugin-transform-destructuring@^7.13.0", "@babel/plugin-transform-destructuring@^7.4.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" + integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-duplicate-keys@^7.12.13", "@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== +"@babel/plugin-transform-exponentiation-operator@^7.12.13", "@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-for-of@^7.13.0", "@babel/plugin-transform-for-of@^7.4.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" + integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-function-name@^7.12.13", "@babel/plugin-transform-function-name@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-literals@^7.12.13", "@babel/plugin-transform-literals@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-member-expression-literals@^7.12.13", "@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== - dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.2.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" + integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== + dependencies: + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" + integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== + dependencies: + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-simple-access" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.13.8", "@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" + integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== + dependencies: + "@babel/helper-hoist-variables" "^7.13.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-identifier" "^7.12.11" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-modules-umd@^7.13.0", "@babel/plugin-transform-modules-umd@^7.2.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" + integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13", "@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-new-target@^7.12.13", "@babel/plugin-transform-new-target@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-object-super@^7.12.13", "@babel/plugin-transform-object-super@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== +"@babel/plugin-transform-parameters@^7.13.0", "@babel/plugin-transform-parameters@^7.4.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" + integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== +"@babel/plugin-transform-property-literals@^7.12.13", "@babel/plugin-transform-property-literals@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" - integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz#0208b1d942bf939cd4f7aa5b255d42602aa4a920" + integrity sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ== dependencies: - "@babel/helper-call-delegate" "^7.8.7" - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" + integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-display-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== +"@babel/plugin-transform-react-jsx-development@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" + integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.12.17" -"@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" - integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60" + integrity sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb" + integrity sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz#1df5dfaf0f4b784b43e96da6f28d630e775f68b3" + integrity sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.13.12" -"@babel/plugin-transform-react-jsx@^7.9.1": - version "7.9.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.1.tgz#d03af29396a6dc51bfa24eefd8005a9fd381152a" - integrity sha512-+xIZ6fPoix7h57CNO/ZeYADchg1tFyX9NDsnmNFFua8e1JNPln156mzS+8AQe1On2X2GLlANHJWHIXbMCqWDkQ== +"@babel/plugin-transform-react-pure-annotations@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-regenerator@^7.13.15", "@babel/plugin-transform-regenerator@^7.4.5": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" + integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== +"@babel/plugin-transform-reserved-words@^7.12.13", "@babel/plugin-transform-reserved-words@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== +"@babel/plugin-transform-runtime@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" + integrity sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== +"@babel/plugin-transform-shorthand-properties@^7.12.13", "@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== +"@babel/plugin-transform-spread@^7.13.0", "@babel/plugin-transform-spread@^7.2.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" + integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== +"@babel/plugin-transform-sticky-regex@^7.12.13", "@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== +"@babel/plugin-transform-template-literals@^7.13.0", "@babel/plugin-transform-template-literals@^7.4.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" + integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== +"@babel/plugin-transform-typeof-symbol@^7.12.13", "@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/preset-env@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" - "@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.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" - "@babel/plugin-transform-modules-umd" "^7.9.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" - core-js-compat "^3.6.2" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-unicode-regex@^7.12.13", "@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/preset-env@7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" + integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.6.0" + core-js-compat "^3.1.1" invariant "^2.2.2" - levenary "^1.1.1" + js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.9.0": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.15.tgz#c8a6eb584f96ecba183d3d414a83553a599f478f" + integrity sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA== + dependencies: + "@babel/compat-data" "^7.13.15" + "@babel/helper-compilation-targets" "^7.13.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions" "^7.13.15" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-dynamic-import" "^7.13.8" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.13.8" + "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.13.8" + "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.13.0" + "@babel/plugin-transform-async-to-generator" "^7.13.0" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-computed-properties" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.0" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.13.0" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/plugin-transform-modules-systemjs" "^7.13.8" + "@babel/plugin-transform-modules-umd" "^7.13.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.13.15" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.13.0" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.13.0" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.13.14" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + core-js-compat "^3.9.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -825,17 +980,28 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.9.1": - version "7.9.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" - integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ== +"@babel/preset-react@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.9.1" - "@babel/plugin-transform-react-jsx-development" "^7.9.0" - "@babel/plugin-transform-react-jsx-self" "^7.9.0" - "@babel/plugin-transform-react-jsx-source" "^7.9.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.9.1": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.13.13.tgz#fa6895a96c50763fe693f9148568458d5a839761" + integrity sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-transform-react-display-name" "^7.12.13" + "@babel/plugin-transform-react-jsx" "^7.13.12" + "@babel/plugin-transform-react-jsx-development" "^7.12.17" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" "@babel/register@^7.9.0": version "7.9.0" @@ -848,209 +1014,341 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" - integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== +"@babel/runtime@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a" + integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" + integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.5.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" - integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" +"@babel/template@^7.12.13", "@babel/template@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.0", "@babel/traverse@^7.7.0": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.15.tgz#c38bf7679334ddd4028e8e1f7b3aa5019f0dada7" + integrity sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.9" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.15" + "@babel/types" "^7.13.14" debug "^4.1.0" globals "^11.1.0" + +"@babel/types@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" lodash "^4.17.13" + to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.1.3", "@babel/types@^7.12.1", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" - integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== +"@babel/types@^7.1.3", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.6", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" + integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== dependencies: "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" to-fast-properties "^2.0.0" -"@commitlint/cli@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-8.3.5.tgz#6d93a3a8b2437fa978999d3f6a336bcc70be3fd3" - integrity sha512-6+L0vbw55UEdht71pgWOE55SRgb+8OHcEwGDB234VlIBFGK9P2QOBU7MHiYJ5cjdjCQ0rReNrGjOHmJ99jwf0w== - dependencies: - "@commitlint/format" "^8.3.4" - "@commitlint/lint" "^8.3.5" - "@commitlint/load" "^8.3.5" - "@commitlint/read" "^8.3.4" - babel-polyfill "6.26.0" - chalk "2.4.2" - get-stdin "7.0.0" - lodash "4.17.15" - meow "5.0.0" +"@commitlint/cli@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-11.0.0.tgz#698199bc52afed50aa28169237758fa14a67b5d3" + integrity sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g== + dependencies: + "@babel/runtime" "^7.11.2" + "@commitlint/format" "^11.0.0" + "@commitlint/lint" "^11.0.0" + "@commitlint/load" "^11.0.0" + "@commitlint/read" "^11.0.0" + chalk "4.1.0" + core-js "^3.6.1" + get-stdin "8.0.0" + lodash "^4.17.19" resolve-from "5.0.0" resolve-global "1.0.0" + yargs "^15.1.0" -"@commitlint/config-conventional@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-8.3.4.tgz#fed13b3711690663b176c1f6b39c205a565618d2" - integrity sha512-w0Yc5+aVAjZgjYqx29igBOnVCj8O22gy3Vo6Fyp7PwoS7+AYS1x3sN7IBq6i7Ae15Mv5P+rEx1pkxXo5zOMe4g== +"@commitlint/config-conventional@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz#3fa300a1b639273946de3c3f15e1cda518333422" + integrity sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA== dependencies: - conventional-changelog-conventionalcommits "4.2.1" + conventional-changelog-conventionalcommits "^4.3.1" -"@commitlint/ensure@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-8.3.4.tgz#6931677e4ca0fde71686ae3b7a367261647a341d" - integrity sha512-8NW77VxviLhD16O3EUd02lApMFnrHexq10YS4F4NftNoErKbKaJ0YYedktk2boKrtNRf/gQHY/Qf65edPx4ipw== +"@commitlint/ensure@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-11.0.0.tgz#3e796b968ab5b72bc6f8a6040076406306c987fb" + integrity sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug== dependencies: - lodash "4.17.15" - -"@commitlint/execute-rule@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz#1b63f0713b197889d90b76f9eea1abc010d256b1" - integrity sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ== - -"@commitlint/format@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-8.3.4.tgz#7cd1f0ba5a3289c8d14d7dac29ee1fc1597fe1d9" - integrity sha512-809wlQ/ND6CLZON+w2Rb3YM2TLNDfU2xyyqpZeqzf2reJNpySMSUAeaO/fNDJSOKIsOsR3bI01rGu6hv28k+Nw== - dependencies: - chalk "^2.0.1" + "@commitlint/types" "^11.0.0" + lodash "^4.17.19" -"@commitlint/is-ignored@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-8.3.5.tgz#e6f59496e1b1ce58020d519cd578ad0f43169199" - integrity sha512-Zo+8a6gJLFDTqyNRx53wQi/XTiz8mncvmWf/4oRG+6WRcBfjSSHY7KPVj5Y6UaLy2EgZ0WQ2Tt6RdTDeQiQplA== - dependencies: - semver "6.3.0" +"@commitlint/execute-rule@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz#3ed60ab7a33019e58d90e2d891b75d7df77b4b4d" + integrity sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ== -"@commitlint/lint@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-8.3.5.tgz#627e75adb1cc803cc723e33cc2ba4aa27cbb9f0c" - integrity sha512-02AkI0a6PU6rzqUvuDkSi6rDQ2hUgkq9GpmdJqfai5bDbxx2939mK4ZO+7apbIh4H6Pae7EpYi7ffxuJgm+3hQ== +"@commitlint/format@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-11.0.0.tgz#ac47b0b9ca46540c0082c721b290794e67bdc51b" + integrity sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg== dependencies: - "@commitlint/is-ignored" "^8.3.5" - "@commitlint/parse" "^8.3.4" - "@commitlint/rules" "^8.3.4" - babel-runtime "^6.23.0" - lodash "4.17.15" + "@commitlint/types" "^11.0.0" + chalk "^4.0.0" -"@commitlint/load@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-8.3.5.tgz#3f059225ede92166ba94cf4c48e3d67c8b08b18a" - integrity sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw== - dependencies: - "@commitlint/execute-rule" "^8.3.4" - "@commitlint/resolve-extends" "^8.3.5" - babel-runtime "^6.23.0" - chalk "2.4.2" - cosmiconfig "^5.2.0" - lodash "4.17.15" +"@commitlint/is-ignored@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz#7b803eda56276dbe7fec51eb1510676198468f39" + integrity sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg== + dependencies: + "@commitlint/types" "^11.0.0" + semver "7.3.2" + +"@commitlint/lint@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-11.0.0.tgz#01e062cd1b0e7c3d756aa2c246462e0b6a3348a4" + integrity sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ== + dependencies: + "@commitlint/is-ignored" "^11.0.0" + "@commitlint/parse" "^11.0.0" + "@commitlint/rules" "^11.0.0" + "@commitlint/types" "^11.0.0" + +"@commitlint/load@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-11.0.0.tgz#f736562f0ffa7e773f8808fea93319042ee18211" + integrity sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg== + dependencies: + "@commitlint/execute-rule" "^11.0.0" + "@commitlint/resolve-extends" "^11.0.0" + "@commitlint/types" "^11.0.0" + chalk "4.1.0" + cosmiconfig "^7.0.0" + lodash "^4.17.19" resolve-from "^5.0.0" -"@commitlint/message@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-8.3.4.tgz#b4e50d14aa6e15a5ad0767b952a7953f3681d768" - integrity sha512-nEj5tknoOKXqBsaQtCtgPcsAaf5VCg3+fWhss4Vmtq40633xLq0irkdDdMEsYIx8rGR0XPBTukqzln9kAWCkcA== +"@commitlint/message@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-11.0.0.tgz#83554c3cbbc884fd07b473593bc3e94bcaa3ee05" + integrity sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA== -"@commitlint/parse@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-8.3.4.tgz#d741f8b9104b35d0f4c10938165b20cbf167f81e" - integrity sha512-b3uQvpUQWC20EBfKSfMRnyx5Wc4Cn778bVeVOFErF/cXQK725L1bYFvPnEjQO/GT8yGVzq2wtLaoEqjm1NJ/Bw== +"@commitlint/parse@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-11.0.0.tgz#d18b08cf67c35d02115207d7009306a2e8e7c901" + integrity sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A== dependencies: - conventional-changelog-angular "^1.3.3" + conventional-changelog-angular "^5.0.0" conventional-commits-parser "^3.0.0" - lodash "^4.17.11" -"@commitlint/read@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-8.3.4.tgz#81a34283d8cd7b2acdf57829a91761e9c7791455" - integrity sha512-FKv1kHPrvcAG5j+OSbd41IWexsbLhfIXpxVC/YwQZO+FR0EHmygxQNYs66r+GnhD1EfYJYM4WQIqd5bJRx6OIw== +"@commitlint/read@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-11.0.0.tgz#f24240548c63587bba139fa5a364cab926077016" + integrity sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g== dependencies: - "@commitlint/top-level" "^8.3.4" - "@marionebl/sander" "^0.6.0" - babel-runtime "^6.23.0" + "@commitlint/top-level" "^11.0.0" + fs-extra "^9.0.0" git-raw-commits "^2.0.0" -"@commitlint/resolve-extends@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz#8fff800f292ac217ae30b1862f5f9a84b278310a" - integrity sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ== +"@commitlint/resolve-extends@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz#158ecbe27d4a2a51d426111a01478e216fbb1036" + integrity sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw== dependencies: import-fresh "^3.0.0" - lodash "4.17.15" + lodash "^4.17.19" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-8.3.4.tgz#41da7e16c6b89af268fe81c87a158c1fd2ac82b1" - integrity sha512-xuC9dlqD5xgAoDFgnbs578cJySvwOSkMLQyZADb1xD5n7BNcUJfP8WjT9W1Aw8K3Wf8+Ym/ysr9FZHXInLeaRg== +"@commitlint/rules@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-11.0.0.tgz#bdb310cc6fc55c9f8d7d917a22b69055c535c375" + integrity sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA== dependencies: - "@commitlint/ensure" "^8.3.4" - "@commitlint/message" "^8.3.4" - "@commitlint/to-lines" "^8.3.4" - babel-runtime "^6.23.0" + "@commitlint/ensure" "^11.0.0" + "@commitlint/message" "^11.0.0" + "@commitlint/to-lines" "^11.0.0" + "@commitlint/types" "^11.0.0" -"@commitlint/to-lines@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-8.3.4.tgz#ce24963b6d86dbe51d88d5e3028ab28f38562e2e" - integrity sha512-5AvcdwRsMIVq0lrzXTwpbbG5fKRTWcHkhn/hCXJJ9pm1JidsnidS1y0RGkb3O50TEHGewhXwNoavxW9VToscUA== +"@commitlint/to-lines@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-11.0.0.tgz#86dea151c10eea41e39ea96fa4de07839258a7fe" + integrity sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw== -"@commitlint/top-level@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-8.3.4.tgz#803fc6e8f5be5efa5f3551761acfca961f1d8685" - integrity sha512-nOaeLBbAqSZNpKgEtO6NAxmui1G8ZvLG+0wb4rvv6mWhPDzK1GNZkCd8FUZPahCoJ1iHDoatw7F8BbJLg4nDjg== +"@commitlint/top-level@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-11.0.0.tgz#bb2d1b6e5ed3be56874633b59e1f7de118c32783" + integrity sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA== dependencies: - find-up "^4.0.0" + find-up "^5.0.0" + +"@commitlint/types@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" + integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== + +"@cypress/browserify-preprocessor@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/browserify-preprocessor/-/browserify-preprocessor-3.0.1.tgz#ab86335b0c061d11f5ad7df03f06b1877b836f71" + integrity sha512-sErmFSEr5287bLMRl0POGnyFtJCs/lSk5yxrUIJUIHZ8eDvtTEr0V93xRgLjJVG54gJU4MbpHy1mRPA9VZbtQA== + dependencies: + "@babel/core" "7.4.5" + "@babel/plugin-proposal-class-properties" "7.3.0" + "@babel/plugin-proposal-object-rest-spread" "7.3.2" + "@babel/plugin-transform-runtime" "7.2.0" + "@babel/preset-env" "7.4.5" + "@babel/preset-react" "7.0.0" + "@babel/runtime" "7.3.1" + babel-plugin-add-module-exports "1.0.2" + babelify "10.0.0" + bluebird "3.5.3" + browserify "16.2.3" + coffeeify "3.0.1" + coffeescript "1.12.7" + debug "4.1.1" + fs-extra "9.0.0" + lodash.clonedeep "4.5.0" + through2 "^2.0.0" + watchify "3.11.1" -"@dhis2/cli-helpers-engine@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@dhis2/cli-helpers-engine/-/cli-helpers-engine-1.5.0.tgz#5bce097bcb226842d67cffae716b44f9b037390e" - integrity sha512-g2gQlHRrEb1IUHR2SIgc6RDfe+s8LYpZ+2pHp9QBr5xzWlSCCoVXl0hDdRSn0L46HDlpKgwhfa2pq/YVLjcS1g== +"@dhis2/cli-helpers-engine@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@dhis2/cli-helpers-engine/-/cli-helpers-engine-2.1.1.tgz#34a15866b1bc16ae5c4997d79256ee787b40c11a" + integrity sha512-7HrpYwenDzPFUMRsIuStQRu7SzwVRq6NCy4k8CbZ4/VTFaWnpkncTAz+C8ztkEQQSYTW7mDLLenJ9qpkhXgoTA== dependencies: chalk "^3.0.0" fs-extra "^8.0.1" + inquirer "^7.3.3" request "^2.88.0" tar "^4.4.8" update-notifier "^3.0.0" yargs "^13.1.0" -"@dhis2/cli-style@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@dhis2/cli-style/-/cli-style-6.0.0.tgz#299f0dd0992123e3f8487a561f0c11726ee660ac" - integrity sha512-YDzXgkcrHwLWzO44f8QkmD0LVDqgEWPx3iBrobVd8ucmkhyjCCt9OU0OfbOUPEgoZqMlEVwgrHcpKIy+m7QdeA== - dependencies: - "@commitlint/cli" "^8.3.5" - "@commitlint/config-conventional" "^8.3.4" - "@dhis2/cli-helpers-engine" "1.5.0" - babel-eslint "^10.0.3" - cross-spawn "^7.0.1" - eslint "^6.8.0" - eslint-config-prettier "^6.10.0" - eslint-plugin-prettier "^3.1.2" - eslint-plugin-react "^7.18.0" - fast-glob "^3.1.1" - fs-extra "^8.1.0" - husky "^4.2.1" +"@dhis2/cli-style@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@dhis2/cli-style/-/cli-style-7.3.0.tgz#7c314616f4d42604ba63350274ed93f2fbabdddd" + integrity sha512-wnwCQeYIgx+JrPKApXr5Lrj2gW4HV03whvl3C3odG7WUF1qvlu849lyo8JldxdoWPsR47cT1f/0Dw8Z+gZqHWQ== + dependencies: + "@commitlint/cli" "^11.0.0" + "@commitlint/config-conventional" "^11.0.0" + "@dhis2/cli-helpers-engine" "2.1.1" + babel-eslint "^10.1.0" + cross-spawn "^7.0.3" + eslint "^7.12.1" + eslint-config-prettier "^6.15.0" + eslint-plugin-import "^2.22.1" + eslint-plugin-prettier "^3.1.4" + eslint-plugin-react "^7.21.5" + fast-glob "^3.2.4" + find-up "^5.0.0" + fs-extra "^9.0.1" + husky "^4.3.0" perfy "^1.1.5" - prettier "^1.19.1" - semver "^7.1.1" - yargs "^15.1.0" + prettier "^2.1.2" + semver "^7.3.2" + yargs "^16.1.0" + +"@dhis2/d2-i18n@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@dhis2/d2-i18n/-/d2-i18n-1.1.0.tgz#ec777c5091f747e4c5aa4f9801c62ba4d1ef3d16" + integrity sha512-x3u58goDQsMfBzy50koxNrJjofJTtjRZOfz6f6Py/wMMJfp/T6vZjWMQgcfWH0JrV6d04K1RTt6bI05wqsVQvg== + dependencies: + i18next "^10.3" + moment "^2.24.0" + +"@dhis2/prop-types@^1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@dhis2/prop-types/-/prop-types-1.6.4.tgz#ec4d256c9440d4d00071524422a727c61ddaa6f6" + integrity sha512-qkVj8OuyjDmSxzYDlCWZllvC9hIbrIImMp79/U5CVsIRbjUF0zA/tfbv4rWnsWALmwEHOQFbzl5GnO5D8RNneA== + dependencies: + prop-types "^15" + +"@dhis2/ui-constants@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-6.6.1.tgz#1e06572398991d028a73f5ea41a6608ae29f2ee4" + integrity sha512-0Scy7wPkwA3cEwctSYRcErVTogtTFQ9dhnZR/Y3aaubKyUMwfqWsinPyQZ5Mnj3BJ4nUJQFSBLNn/5UlINq9IQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + +"@dhis2/ui-core@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-core/-/ui-core-6.6.1.tgz#5abc69db828d65e8a04d0e450cb0ac7722b200f6" + integrity sha512-XLwypXif904CeRB+t2pmbC8lzuKC0dSx57CeceLBKX3bZFYgE/aOCdagIoWCs3Dr8zzaQtdlhIUpOmYi7hrEfQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@popperjs/core" "^2.6.0" + classnames "^2.2.6" + react-popper "^2.2.3" + resize-observer-polyfill "^1.5.1" + +"@dhis2/ui-forms@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-6.6.1.tgz#ceb6ede3e49a4602b5ea1e328931fba96a8a4cdb" + integrity sha512-916+Q7sdNfb+oOMqpNOQ+uPr6fG9AI7DBAszo3ninONepZCMoNlCkh3lif5n7MMF9wtr+0/yxoVJ8cCokAHlkQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + classnames "^2.2.6" + final-form "^4.20.1" + react-final-form "^6.5.1" + +"@dhis2/ui-icons@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-6.6.1.tgz#b3d9d0c54634e91e08c3dd802014a5fa82bde4b1" + integrity sha512-gEIp1/losl32+/8mMj6khHl6mapb7Wsg4P0CieqHhxOuOVZq33Mr9mfYwSmziPiTM+FEm+iD8JTSltN1Q9RVPA== + dependencies: + "@dhis2/prop-types" "^1.6.4" + +"@dhis2/ui-widgets@6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-widgets/-/ui-widgets-6.6.1.tgz#05a585b67317d9fe15d029f0b8985d8c143445b5" + integrity sha512-wpBlaE1S84EJmvjDx4tvk8FP2fegQfjAY091a4orpET591h2Agfd9LX2V0cmrFZB7KltU3rmY5f4YGi6qpEPIg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + classnames "^2.2.6" + +"@dhis2/ui@^6.6.1": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-6.6.1.tgz#2fe0af2f4692e23b3554515250bb6961a85fcae2" + integrity sha512-5bJfJAkmd1xSOJLbbkdRjNYAxH5DXqlwur3BMPCAmgeKPGxPNjzczmtedgwLep1/rbdXhqbozbOy1FUw2u9PqQ== + dependencies: + "@dhis2/ui-constants" "6.6.1" + "@dhis2/ui-core" "6.6.1" + "@dhis2/ui-forms" "6.6.1" + "@dhis2/ui-icons" "6.6.1" + "@dhis2/ui-widgets" "6.6.1" + +"@eslint/eslintrc@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" + integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" "@hapi/accept@^5.0.1": version "5.0.1" @@ -1498,356 +1796,31 @@ dependencies: "@hapi/hoek" "9.x.x" -"@marionebl/sander@^0.6.0": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@marionebl/sander/-/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b" - integrity sha1-GViWWHTyS8Ub5Ih1/rUNZC/EH3s= - dependencies: - graceful-fs "^4.1.3" - mkdirp "^0.5.1" - rimraf "^2.5.2" - -"@material/animation@^0.3.0", "@material/animation@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-0.3.1.tgz#229de6927d0590d6d6b20157d778d264ef02229a" - integrity sha1-Ip3mkn0FkNbWsgFX13jSZO8CIpo= - -"@material/animation@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-0.4.1.tgz#bf8b50aedad4cffce8a5b428fdca8f1abbaf176e" - integrity sha1-v4tQrtrUz/zopbQo/cqPGruvF24= - -"@material/auto-init@^0.1.2": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-0.1.4.tgz#46dd5579be93f61050bc4948c7f182420a96d5f4" - integrity sha512-pyq6hTVrYo/Z/yU3vCAaIpo7C9As/Inj49kt7tRPLsCQ5MDhhMTjCZFmqldDss88XQ1QR2gjNoSh7lNkwRlu7A== - -"@material/base@^0.2.3", "@material/base@^0.2.5", "@material/base@^0.2.6": - version "0.2.6" - resolved "https://registry.yarnpkg.com/@material/base/-/base-0.2.6.tgz#3003f3df2c06d172151d4160b8c8b2e6c65e7c01" - integrity sha1-MAPz3ywG0XIVHUFguMiy5sZefAE= - -"@material/button@^0.3.10": - version "0.3.11" - resolved "https://registry.yarnpkg.com/@material/button/-/button-0.3.11.tgz#17ab4cd5d55389e3da3496b1c1626dce4f6a7839" - integrity sha1-F6tM1dVTiePaNJaxwWJtzk9qeDk= - dependencies: - "@material/elevation" "^0.1.11" - "@material/ripple" "^0.8.2" - "@material/theme" "^0.1.7" - "@material/typography" "^0.3.0" - -"@material/button@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@material/button/-/button-0.6.0.tgz#ced420d28b4fd2d5d4b0270646306ece503627b6" - integrity sha1-ztQg0otP0tXUsCcGRjBuzlA2J7Y= - dependencies: - "@material/elevation" "^0.1.11" - "@material/ripple" "^0.8.6" - "@material/theme" "^0.3.0" - "@material/typography" "^0.3.0" - -"@material/card@^0.2.5": - version "0.2.10" - resolved "https://registry.yarnpkg.com/@material/card/-/card-0.2.10.tgz#59a553f445c07a2bd2a6c39390316a1d9c2af2b1" - integrity sha1-WaVT9EXAeivSpsOTkDFqHZwq8rE= - dependencies: - "@material/elevation" "^0.1.13" - "@material/rtl" "^0.1.8" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/checkbox@^0.4.1": - version "0.4.8" - resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-0.4.8.tgz#8ecb12a075bc362502174fadf33096f5877c5110" - integrity sha1-jssSoHW8NiUCF0+t8zCW9Yd8URA= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/ripple" "^0.8.8" - "@material/rtl" "^0.1.8" - "@material/selection-control" "^0.1.3" - "@material/theme" "^0.4.0" - -"@material/dialog@^0.3.4": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-0.3.5.tgz#3f4f724c3e7e244509fd4ffea7b3878f526329f1" - integrity sha1-P09yTD5+JEUJ/U/+p7OHj1JjKfE= - dependencies: - "@material/animation" "^0.3.1" - "@material/base" "^0.2.3" - "@material/elevation" "^0.1.11" - "@material/ripple" "^0.8.2" - "@material/rtl" "^0.1.7" - "@material/theme" "^0.1.7" - "@material/typography" "^0.1.1" - focus-trap "^2.3.0" - -"@material/drawer@^0.5.3": - version "0.5.9" - resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-0.5.9.tgz#81b81df5c8d95e8297ae052cffa66dc997011dbd" - integrity sha1-gbgd9cjZXoKXrgUs/6ZtyZcBHb0= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/elevation" "^0.1.13" - "@material/rtl" "^0.1.8" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/elevation@^0.1.10", "@material/elevation@^0.1.11", "@material/elevation@^0.1.13": - version "0.1.13" - resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-0.1.13.tgz#a38885f3caf4398ca6a7468c308887d70bd4605b" - integrity sha1-o4iF88r0OYymp0aMMIiH1wvUYFs= - dependencies: - "@material/animation" "^0.4.1" - -"@material/fab@^0.3.12": - version "0.3.16" - resolved "https://registry.yarnpkg.com/@material/fab/-/fab-0.3.16.tgz#8695249359d11cf75527e20fd6a3b7705efc5e15" - integrity sha512-xiLEi6L7Ethhr/MJYfW/d6yMSNt7wBHswhZ+GOPBb/MQ7ODT6mSPknoNx9pE2IlQNdEY27+spijTcEpERzzJZg== - dependencies: - "@material/animation" "^0.3.1" - "@material/elevation" "^0.1.11" - "@material/ripple" "^0.8.5" - "@material/theme" "^0.2.0" - -"@material/form-field@^0.2.10": - version "0.2.17" - resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-0.2.17.tgz#7e2a268495160712c0d96d44530820098a5dca55" - integrity sha1-fiomhJUWBxLA2W1EUwggCYpdylU= - dependencies: - "@material/base" "^0.2.6" - "@material/rtl" "^0.1.8" - "@material/selection-control" "^0.1.3" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/grid-list@^0.2.7": - version "0.2.13" - resolved "https://registry.yarnpkg.com/@material/grid-list/-/grid-list-0.2.13.tgz#04ce198d23c710c67316f1ec5f0409829fd6bead" - integrity sha1-BM4ZjSPHEMZzFvHsXwQJgp/Wvq0= - dependencies: - "@material/base" "^0.2.6" - "@material/rtl" "^0.1.8" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/icon-toggle@^0.1.15": - version "0.1.22" - resolved "https://registry.yarnpkg.com/@material/icon-toggle/-/icon-toggle-0.1.22.tgz#c6c449851f6b9ed29ff3799ee55a3410809b890f" - integrity sha1-xsRJhR9rntKf83me5Vo0EICbiQ8= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/ripple" "^0.8.8" - "@material/theme" "^0.4.0" - -"@material/layout-grid@^0.4.1": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-0.4.4.tgz#f87daee5ad45ec27de91c61538d8410bb12d5429" - integrity sha512-HEmngfoEcoonIekSFtBxQiY2QJkjylx3h/ZzipA9aMexP/n0BWvQZrZc+m53C2ntlvaK4kkLAu1at10v5Iry5g== - -"@material/linear-progress@^0.1.5": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-0.1.11.tgz#971d4e015575a4b131e96f0aa0c9440ad5e9e3ef" - integrity sha1-lx1OAVV1pLEx6W8KoMlECtXp4+8= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/theme" "^0.4.0" - -"@material/list@^0.2.13", "@material/list@^0.2.20": - version "0.2.20" - resolved "https://registry.yarnpkg.com/@material/list/-/list-0.2.20.tgz#5ed4b31be3b19c1ac5c2f45b8bd8885bb5737434" - integrity sha1-XtSzG+OxnBrFwvRbi9iIW7VzdDQ= - dependencies: - "@material/ripple" "^0.8.8" - "@material/rtl" "^0.1.8" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/menu@^0.4.2", "@material/menu@^0.4.8": - version "0.4.8" - resolved "https://registry.yarnpkg.com/@material/menu/-/menu-0.4.8.tgz#603b4005d96970e15474f9d2823f4c7ca0f5287b" - integrity sha1-YDtABdlpcOFUdPnSgj9MfKD1KHs= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/elevation" "^0.1.13" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/radio@^0.2.8": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@material/radio/-/radio-0.2.15.tgz#3598f79cbe1c413c2b54ac32b0db12955f93636b" - integrity sha1-NZj3nL4cQTwrVKwysNsSlV+TY2s= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/ripple" "^0.8.8" - "@material/selection-control" "^0.1.3" - "@material/theme" "^0.4.0" - -"@material/ripple@^0.8.1", "@material/ripple@^0.8.2", "@material/ripple@^0.8.5", "@material/ripple@^0.8.6", "@material/ripple@^0.8.8": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-0.8.8.tgz#22b89ed9e63883f17fa4f00d12370e32e0c459b7" - integrity sha1-Irie2eY4g/F/pPANEjcOMuDEWbc= - dependencies: - "@material/base" "^0.2.6" - "@material/theme" "^0.4.0" - -"@material/rtl@^0.1.7", "@material/rtl@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-0.1.8.tgz#2462db15e2d4e041666485559c028382872b01fb" - integrity sha512-NzBobwxvhJg+dch99pVO+Z9HL1DM+esuIy5WYXgM7trfOVh8n9DkVo5vD/NKnDy6F5wCaRnJOI5T19Tev6c9Zw== - -"@material/select@^0.3.11": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@material/select/-/select-0.3.18.tgz#6301de3c77ae749edeedb97dd236b55b30c0a332" - integrity sha1-YwHePHeudJ7e7bl90ja1WzDAozI= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/list" "^0.2.20" - "@material/menu" "^0.4.8" - "@material/rtl" "^0.1.8" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/selection-control@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@material/selection-control/-/selection-control-0.1.3.tgz#4fb7ed1fd7ee2296a32c156cf2c1eb892bfe44c6" - integrity sha1-T7ftH9fuIpajLBVs8sHriSv+RMY= - dependencies: - "@material/ripple" "^0.8.8" - -"@material/slider@^0.2.1": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@material/slider/-/slider-0.2.7.tgz#a40dfb13d2a0e92199aec1cf18a63ab294af5bc8" - integrity sha1-pA37E9Kg6SGZrsHPGKY6spSvW8g= - dependencies: - "@material/animation" "^0.4.1" - "@material/base" "^0.2.6" - "@material/rtl" "^0.1.8" - "@material/theme" "^0.4.0" - -"@material/snackbar@^0.3.1": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-0.3.6.tgz#43eb2458eef4b857d26bd37a6b7eb9b48de79d00" - integrity sha1-Q+skWO70uFfSa9N6a365tI3nnQA= - dependencies: - "@material/animation" "^0.3.1" - "@material/base" "^0.2.5" - "@material/button" "^0.6.0" - "@material/rtl" "^0.1.7" - "@material/theme" "^0.3.0" - "@material/typography" "^0.3.0" - -"@material/switch@^0.1.10": - version "0.1.15" - resolved "https://registry.yarnpkg.com/@material/switch/-/switch-0.1.15.tgz#6f2b1f1ef7c3dc96e32a68a3101498b562914619" - integrity sha1-bysfHvfD3JbjKmijEBSYtWKRRhk= - dependencies: - "@material/animation" "^0.4.1" - "@material/elevation" "^0.1.13" - "@material/theme" "^0.4.0" - -"@material/tabs@^0.2.4": - version "0.2.9" - resolved "https://registry.yarnpkg.com/@material/tabs/-/tabs-0.2.9.tgz#e512d248a62b37e5ed57090c52e6619960ebddb3" - integrity sha1-5RLSSKYrN+XtVwkMUuZhmWDr3bM= - dependencies: - "@material/animation" "^0.3.1" - "@material/base" "^0.2.5" - "@material/ripple" "^0.8.6" - "@material/rtl" "^0.1.7" - "@material/theme" "^0.3.0" - "@material/typography" "^0.3.0" - -"@material/textfield@^0.3.2": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-0.3.6.tgz#f3a56e9188a2bfdd4c18a2e92fa7df66eb8d58ca" - integrity sha512-JZM1l2sPZbND+StaW/OXB269NOxM5/hHS9of9DvBMEvdQ0gxb27F8caz89mDTb0VcslVTVUbFbYK6oFKUDGJZQ== - dependencies: - "@material/animation" "^0.3.1" - "@material/base" "^0.2.5" - "@material/ripple" "^0.8.5" - "@material/rtl" "^0.1.7" - "@material/theme" "^0.2.0" - "@material/typography" "^0.3.0" - -"@material/theme@^0.1.6", "@material/theme@^0.1.7": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-0.1.7.tgz#d94a7c5099feae9dc318c639802327c7ae82e872" - integrity sha1-2Up8UJn+rp3DGMY5gCMnx66C6HI= - -"@material/theme@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-0.2.0.tgz#f54a62e8bcd2a63818419c02f7ec61d9968eff07" - integrity sha512-JImkTjEPt6LxjU3eTeZQSZVZfCs8ooCC8nYk736bB3IRMYSJCsX5EZ+ZoEehtqRpS++VLQID3raWdGUy2kNJzA== - -"@material/theme@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-0.3.1.tgz#6ff261ff72b3493a5cc6e746da3b472d072aa5a9" - integrity sha512-0PRLqMPCL3mEaUXyc/SWZWDHWjfyS7xXT64h7dT4lwwA0oHpq0OdQaqemYWkI1h+CVHeT0qSwirRNJ0jxBlhtA== - -"@material/theme@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-0.4.0.tgz#0aef1a0279b65c15990584fb8b8eca095c734641" - integrity sha1-Cu8aAnm2XBWZBYT7i47KCVxzRkE= - -"@material/toolbar@^0.4.3": - version "0.4.11" - resolved "https://registry.yarnpkg.com/@material/toolbar/-/toolbar-0.4.11.tgz#284c8a434d9b31603e103ac58d1e76beb18faa7e" - integrity sha1-KEyKQ02bMWA+EDrFjR52vrGPqn4= - dependencies: - "@material/base" "^0.2.6" - "@material/elevation" "^0.1.13" - "@material/rtl" "^0.1.8" - "@material/theme" "^0.4.0" - "@material/typography" "^0.3.0" - -"@material/typography@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-0.1.1.tgz#fb2e3437bd3284d39e9fb91485767ade6b2bd0c1" - integrity sha1-+y40N70yhNOen7kUhXZ63msr0ME= - -"@material/typography@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-0.2.3.tgz#cddf4178098c9c7b4c2e78a33049376b4d6aeb53" - integrity sha1-zd9BeAmMnHtMLnijMEk3a01q61M= - -"@material/typography@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-0.3.0.tgz#f828c2d3215bfd66c58072709b4260c64125390a" - integrity sha1-+CjC0yFb/WbFgHJwm0JgxkElOQo= - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.4" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@scarf/scarf@^1.0.5": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.1.0.tgz#b84b4a91cd938a688d36245b7a7db6fbc476a499" - integrity sha512-b2iE8kjjzzUo2WZ0xuE2N77kfnTds7ClrDxcz3Atz7h2XrNVoAPUoT75i7CY0st5x++70V91Y+c6RpBX9MX7Jg== +"@popperjs/core@^2.6.0": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.1.tgz#7f554e7368c9ab679a11f4a042ca17149d70cf12" + integrity sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA== "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -1907,6 +1880,109 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -1927,11 +2003,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/connect@*": version "3.4.34" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" @@ -1987,6 +2058,16 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json-schema@^7.0.5": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -1997,16 +2078,31 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + "@types/node@*": version "13.7.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.1.tgz#238eb34a66431b71d2aaddeaa7db166f25971a0d" integrity sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + "@types/qs@*": version "6.9.5" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" @@ -2181,7 +2277,7 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -JSONStream@^1.0.4: +JSONStream@^1.0.3, JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -2225,25 +2321,39 @@ acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== +acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + acorn@^6.0.1, acorn@^6.2.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== agent-base@6, agent-base@^6.0.0: version "6.0.2" @@ -2257,25 +2367,30 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= +ajv@^8.0.1: + version "8.0.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.0.5.tgz#f07d6fdeffcdbb80485570ce3f1bc845fcc812b9" + integrity sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" ansi-align@^2.0.0: version "2.0.0" @@ -2301,12 +2416,17 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.8.1" + type-fest "^0.21.3" ansi-html@0.0.7: version "0.0.7" @@ -2346,14 +2466,13 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" -any-promise@^1.1.0, any-promise@~1.3.0: +any-promise@^1.0.0, any-promise@^1.1.0, any-promise@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= @@ -2413,10 +2532,10 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= +array-find@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + integrity sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg= array-flatten@1.1.1: version "1.1.1" @@ -2438,13 +2557,15 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.0.3, array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" is-string "^1.0.5" array-slice@^1.0.0: @@ -2474,16 +2595,30 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +array.prototype.flatmap@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" @@ -2505,7 +2640,7 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assert@^1.1.1: +assert@^1.1.1, assert@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== @@ -2513,6 +2648,15 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" +assertion-error-formatter@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error-formatter/-/assertion-error-formatter-2.0.1.tgz#6bbdffaec8e2fa9e2b0eb158bfe353132d7c0a9b" + integrity sha512-cjC3jUCh9spkroKue5PDSKH5RFQ/KNuZJhk3GwHYmB/8qqETxLOmMdLH+ohi/VukNzxDlMvIe7zScvLoOdhb6Q== + dependencies: + diff "^3.0.0" + pad-right "^0.2.2" + repeat-string "^1.6.1" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -2540,6 +2684,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -2562,6 +2711,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -2586,18 +2740,6 @@ auth0@^2.32.0: rest-facade "^1.13.0" retry "^0.12.0" -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - aws-sdk@^2.640.0: version "2.640.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.640.0.tgz#9162bbdcf9d52b61a0551f6b8c17c7ff666eee36" @@ -2619,9 +2761,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@^0.21.1: version "0.21.1" @@ -2630,7 +2772,7 @@ axios@^0.21.1: dependencies: follow-redirects "^1.10.0" -babel-code-frame@^6.11.0: +babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -2639,15 +2781,15 @@ babel-code-frame@^6.11.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-eslint@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" - integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" eslint-visitor-keys "^1.0.0" resolve "^1.12.0" @@ -2662,18 +2804,54 @@ babel-loader@^8.1.0: pify "^4.0.1" schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-add-module-exports@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.2.tgz#96cd610d089af664f016467fc4567c099cce2d9c" + integrity sha512-4paN7RivvU3Rzju1vGSHWPjO8Y0rI6droWvSFKI6dvEQ4mvoV0zGojnlzVRfI6N8zISo6VERXt3coIuVmzuvNg== + optionalDependencies: + chokidar "^2.0.4" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" +babel-plugin-polyfill-corejs2@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" + integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" + integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + core-js-compat "^3.9.1" + +babel-plugin-polyfill-regenerator@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" + integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.0" + babel-plugin-rewire@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz#822562d72ed2c84e47c0f95ee232c920853e9d89" integrity sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ== +babel-plugin-syntax-jsx@6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + babel-plugin-transform-imports@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-imports/-/babel-plugin-transform-imports-1.5.1.tgz#b3756696aea907719d0d63b0e67c88fba963adb0" @@ -2686,16 +2864,7 @@ babel-plugin-transform-imports@^1.5.1: lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" -babel-polyfill@6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-runtime@^6.23.0, babel-runtime@^6.26.0: +babel-runtime@^6.11.6, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -2713,20 +2882,20 @@ babel-types@^6.6.0: lodash "^4.17.4" to-fast-properties "^1.0.3" -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= +babelify@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" + integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" @@ -2753,6 +2922,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +becke-ch--regex--s0-0-v1--base--pl--lib@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz#429ceebbfa5f7e936e78d73fbdc7da7162b20e20" + integrity sha1-Qpzuu/pffpNueNc/vcfacWKyDiA= + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -2785,6 +2959,11 @@ blipp@^4.0.1: chalk "2.x.x" easy-table "1.x.x" +bluebird@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== + bluebird@^3.4.1, bluebird@^3.5.0, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -2823,16 +3002,11 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bowser@^1.7.3: - version "1.9.4" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" - integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== - boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -2896,11 +3070,37 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-pack@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + browser-process-hrtime@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-resolve@^1.11.0: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -2963,29 +3163,131 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@^0.2.0: +browserify-zlib@^0.2.0, browserify-zlib@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" +browserify@16.2.3: + version "16.2.3" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" + integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp "^0.5.0" + module-deps "^6.0.0" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" -browserslist@^4.8.3, browserslist@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.9.1.tgz#01ffb9ca31a1aef7678128fc6a2253316aa7287c" - integrity sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw== +browserify@^16.1.0: + version "16.5.2" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.2.tgz#d926835e9280fa5fd57f5bc301f2ef24a972ddfe" + integrity sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^2.0.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.2.3" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.6.0: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== dependencies: - caniuse-lite "^1.0.30001030" - electron-to-chromium "^1.3.363" - node-releases "^1.1.50" + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" buffer-equal-constant-time@1.0.1: version "1.0.1" @@ -3030,6 +3332,22 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.0.2: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -3094,30 +3412,24 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" + integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3139,21 +3451,21 @@ camel-case@^1.1.1: sentence-case "^1.1.1" upper-case "^1.1.1" -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" camelcase@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -camelcase@^4.0.0, camelcase@^4.1.0: +camelcase@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= @@ -3163,25 +3475,15 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30001027" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001027.tgz#45dce6c61128324c4534e18ceff6e58e8de76694" - integrity sha512-Ublzr9IN2X91lTvJzehRUlK+hREae1Hi+0TIh7rH5fAcsuPWycwBAszhRGF22gf5xbDXXUdYQ6fSfPSQEqQhkw== +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001030: - version "1.0.30001035" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" - integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== +caniuse-lite@^1.0.30001181: + version "1.0.30001208" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz#a999014a35cebd4f98c405930a057a0d75352eb9" + integrity sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA== capture-stack-trace@^1.0.0: version "1.0.1" @@ -3212,11 +3514,6 @@ chai@^4.2.0: pathval "^1.1.0" type-detect "^4.0.5" -chain-function@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc" - integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg== - chalk@2.4.2, chalk@2.x.x, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3226,6 +3523,14 @@ chalk@2.4.2, chalk@2.x.x, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -3245,7 +3550,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -3275,11 +3580,6 @@ change-case@^2.3.0: upper-case "^1.1.1" upper-case-first "^1.1.0" -change-emitter@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" - integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3290,7 +3590,7 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -chokidar@^2.0.2, chokidar@^2.1.8: +chokidar@2.1.8, chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.1, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -3339,13 +3639,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -3356,7 +3649,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: +classnames@^2.2.5, classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== @@ -3374,9 +3667,9 @@ cli-boxes@^1.0.0: integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-cursor@^3.1.0: version "3.1.0" @@ -3385,10 +3678,17 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cli-table@^0.3.1: + version "0.3.6" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.6.tgz#e9d6aa859c7fe636981fd3787378c2a20bce92fc" + integrity sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ== + dependencies: + colors "1.0.3" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^4.0.0: version "4.1.0" @@ -3415,7 +3715,16 @@ cliui@^6.0.0: dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" clone-response@^1.0.2: version "1.0.2" @@ -3429,11 +3738,13 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" q "^1.1.2" code-point-at@^1.0.0: @@ -3441,6 +3752,19 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +coffeeify@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/coffeeify/-/coffeeify-3.0.1.tgz#5e2753000c50bd24c693115f33864248dd11136c" + integrity sha512-Qjnr7UX6ldK1PHV7wCnv7AuCd4q19KTUtwJnu/6JRJB4rfm12zvcXtKdacUoePOKr1I4ka/ydKiwWpNAdsQb0g== + dependencies: + convert-source-map "^1.3.0" + through2 "^2.0.0" + +coffeescript@1.12.7: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" + integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3449,7 +3773,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.3.0, color-convert@^1.9.0: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -3468,27 +3792,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - colorette@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" @@ -3499,19 +3807,30 @@ colorette@1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" +colorette@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" @@ -3525,7 +3844,7 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.20.0, commander@^2.7.1, commander@~2.20.3: +commander@^2.20.0, commander@^2.7.1, commander@^2.9.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3550,18 +3869,18 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -compare-func@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" - dot-prop "^3.0.0" + dot-prop "^5.1.0" -compare-versions@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.5.1.tgz#26e1f5cf0d48a77eced5046b9f67b6b61075a393" - integrity sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg== +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== component-emitter@^1.2.1, component-emitter@^1.3.0: version "1.3.0" @@ -3593,7 +3912,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3660,11 +3979,16 @@ constant-case@^1.1.0: snake-case "^1.1.0" upper-case "^1.1.1" -constants-browserify@^1.0.0: +constants-browserify@^1.0.0, constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -3677,43 +4001,48 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -conventional-changelog-angular@^1.3.3: - version "1.6.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" - integrity sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg== +conventional-changelog-angular@^5.0.0: + version "5.0.12" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" -conventional-changelog-conventionalcommits@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.1.tgz#d6cb2e2c5d7bfca044a08b9dba84b4082e1a1bd9" - integrity sha512-vC02KucnkNNap+foDKFm7BVUSDAXktXrUJqGszUuYnt6T0J2azsbYz/w9TDc3VsrW2v6JOtiQWVcgZnporHr4Q== +conventional-changelog-conventionalcommits@^4.3.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz#a02e0b06d11d342fdc0f00c91d78265ed0bc0a62" + integrity sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw== dependencies: - compare-func "^1.3.1" - lodash "^4.2.1" + compare-func "^2.0.0" + lodash "^4.17.15" q "^1.5.1" conventional-commits-parser@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" - integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz#ba44f0b3b6588da2ee9fd8da508ebff50d116ce2" + integrity sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" lodash "^4.17.15" - meow "^5.0.0" - split2 "^2.0.0" - through2 "^3.0.0" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" trim-off-newlines "^1.0.0" -convert-source-map@^1.7.0: +convert-source-map@1.7.0, convert-source-map@^1.1.0, convert-source-map@^1.3.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -3769,12 +4098,12 @@ copy-webpack-plugin@^5.1.1: serialize-javascript "^2.1.2" webpack-log "^2.0.0" -core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== +core-js-compat@^3.1.1, core-js-compat@^3.9.0, core-js-compat@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.10.1.tgz#62183a3a77ceeffcc420d907a3e6fc67d9b27f1c" + integrity sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg== dependencies: - browserslist "^4.8.3" + browserslist "^4.16.3" semver "7.0.0" core-js@^0.8.3: @@ -3782,46 +4111,41 @@ core-js@^0.8.3: resolved "https://registry.yarnpkg.com/core-js/-/core-js-0.8.4.tgz#c22665f1e0d1b9c3c5e1b08dabd1f108695e4fcf" integrity sha1-wiZl8eDRucPF4bCNq9HxCGleT88= -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js@^2.4.0, core-js@^2.5.7: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.4.8, core-js@^3.8.0: - version "3.8.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" - integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== +core-js@^3.4.8, core-js@^3.6.1, core-js@^3.8.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.10.0.tgz#9a020547c8b6879f929306949e31496bbe2ae9b3" + integrity sha512-MQx/7TLgmmDVamSyfE+O+5BHvG1aUGj/gHhLn1wVtm2B5u1eVIPvh7vkfjwWKNCjrTJB8+He99IntSQ1qP+vYQ== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== dependencies: - import-fresh "^2.0.0" is-directory "^0.3.1" - js-yaml "^3.13.1" + js-yaml "^3.9.0" parse-json "^4.0.0" + require-from-string "^2.0.1" -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" + yaml "^1.10.0" create-ecdh@^4.0.0: version "4.0.3" @@ -3888,16 +4212,16 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@^3.11.0: +crypto-browserify@^3.0.0, crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== @@ -3919,36 +4243,28 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-in-js-utils@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" - integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== - dependencies: - hyphenate-style-name "^1.0.2" - isobject "^3.0.1" - -css-loader@^0.26.1: - version "0.26.4" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz#b61e9e30db94303e6ffc892f10ecd09ad025a1fd" - integrity sha1-th6eMNuUMD5v/IkvEOzQmtAlof0= +css-loader@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe" + integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw== dependencies: - babel-code-frame "^6.11.0" + babel-code-frame "^6.26.0" css-selector-tokenizer "^0.7.0" - cssnano ">=2.6.1 <4" + icss-utils "^2.1.0" loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.0.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.0.0" - postcss-modules-local-by-default "^1.0.1" - postcss-modules-scope "^1.0.0" - postcss-modules-values "^1.1.0" - source-list-map "^0.1.7" + lodash "^4.17.11" + postcss "^6.0.23" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== css-select@^1.1.0: version "1.2.0" @@ -3960,70 +4276,61 @@ css-select@^1.1.0: domutils "1.5.1" nth-check "~1.0.1" +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + css-selector-tokenizer@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" - integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" + mdn-data "2.0.14" + source-map "^0.6.1" css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== -"cssnano@>=2.6.1 <4": - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - clap "^1.0.9" - source-map "^0.5.3" + css-tree "^1.1.2" cssom@^0.4.1: version "0.4.4" @@ -4042,24 +4349,100 @@ cssstyle@^2.0.0: dependencies: cssom "~0.3.6" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= +cucumber-expressions@^5.0.13: + version "5.0.18" + resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-5.0.18.tgz#6c70779efd3aebc5e9e7853938b1110322429596" + integrity sha1-bHB3nv0668Xp54U5OLERAyJClZY= + dependencies: + becke-ch--regex--s0-0-v1--base--pl--lib "^1.2.0" + +cucumber-expressions@^6.0.1: + version "6.6.2" + resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-6.6.2.tgz#d89640eccc72a78380b6c210eae36a64e7462b81" + integrity sha512-WcFSVBiWNLJbIcAAC3t/ACU46vaOKfe1UIF5H3qveoq+Y4XQm9j3YwHurQNufRKBBg8nCnpU7Ttsx7egjS3hwA== + dependencies: + becke-ch--regex--s0-0-v1--base--pl--lib "^1.2.0" + +cucumber-tag-expressions@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cucumber-tag-expressions/-/cucumber-tag-expressions-1.1.1.tgz#7f5c7b70009bc2b666591bfe64854578bedee85a" + integrity sha1-f1x7cACbwrZmWRv+ZIVFeL7e6Fo= + +cucumber@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/cucumber/-/cucumber-4.2.1.tgz#64cfff6150bbe6b5e94b173470057353d6206719" + integrity sha512-3gQ0Vv4kSHsvXEFC6b1c+TfLRDzWD1/kU7e5vm8Kh8j35b95k6favan9/4ixcBNqd7UsU1T6FYcawC87+DlNKw== dependencies: - array-find-index "^1.0.1" + assertion-error-formatter "^2.0.1" + babel-runtime "^6.11.6" + bluebird "^3.4.1" + cli-table "^0.3.1" + colors "^1.1.2" + commander "^2.9.0" + cucumber-expressions "^5.0.13" + cucumber-tag-expressions "^1.1.1" + duration "^0.2.0" + escape-string-regexp "^1.0.5" + figures "2.0.0" + gherkin "^5.0.0" + glob "^7.0.0" + indent-string "^3.1.0" + is-generator "^1.0.2" + is-stream "^1.1.0" + knuth-shuffle-seeded "^1.0.6" + lodash "^4.17.4" + mz "^2.4.0" + progress "^2.0.0" + resolve "^1.3.3" + serialize-error "^2.1.0" + stack-chain "^2.0.0" + stacktrace-js "^2.0.0" + string-argv "0.0.2" + title-case "^2.1.1" + util-arity "^1.0.2" + verror "^1.9.0" cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= +cypress-cucumber-preprocessor@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-4.0.3.tgz#98fd6bc9325b93f9b6aac64364786776bc85be64" + integrity sha512-cHWhDU9fuj2XyAuYpbFsTtwEC37CVKNMMeHFc5OQq+tMjKlWBbfzX/2YXsB/Tf7J6Hy5csY8XoOFWUFY1A2oew== + dependencies: + "@cypress/browserify-preprocessor" "^3.0.1" + chai "^4.2.0" + chokidar "2.1.8" + cosmiconfig "^4.0.0" + cucumber "^4.2.1" + cucumber-expressions "^6.0.1" + cucumber-tag-expressions "^1.1.1" + debug "^3.0.1" + gherkin "^5.1.0" + glob "^7.1.2" + js-string-escape "^1.0.1" + minimist "^1.2.5" + through "^2.3.8" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: - number-is-nan "^1.0.0" + es5-ext "^0.10.50" + type "^1.0.1" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== dashdash@^1.12.0: version "1.14.1" @@ -4097,14 +4480,14 @@ db-errors@^0.2.3: resolved "https://registry.yarnpkg.com/db-errors/-/db-errors-0.2.3.tgz#a6a38952e00b20e790f2695a6446b3c65497ffa2" integrity sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: +debug@3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -4125,7 +4508,14 @@ debug@4.1.1: dependencies: ms "^2.1.1" -decamelize-keys@^1.0.0: +debug@^3.0.1, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -4133,7 +4523,7 @@ decamelize-keys@^1.0.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4179,7 +4569,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -4189,6 +4579,11 @@ deepmerge@^3.2.0: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -4275,6 +4670,16 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +deps-sort@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" + integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== + dependencies: + JSONStream "^1.0.3" + shasum-object "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + dequal@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" @@ -4303,7 +4708,16 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -diff@3.5.0, diff@^3.5.0: +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +diff@3.5.0, diff@^3.0.0, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== @@ -4356,6 +4770,14 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -4377,13 +4799,6 @@ dom-converter@^0.2: dependencies: utila "~0.4" -dom-helpers@^3.2.0, dom-helpers@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== - dependencies: - "@babel/runtime" "^7.1.2" - dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -4397,7 +4812,7 @@ dom-walk@^0.1.0: resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= -domain-browser@^1.1.1: +domain-browser@^1.1.1, domain-browser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== @@ -4434,7 +4849,7 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -domutils@^1.5.1: +domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -4449,19 +4864,19 @@ dot-case@^1.1.0: dependencies: sentence-case "^1.1.2" -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= +dot-prop@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: - is-obj "^1.0.0" + is-obj "^2.0.0" dotenv@^6.2.0: version "6.2.0" @@ -4473,6 +4888,13 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -4488,6 +4910,14 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +duration@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.2.tgz#ddf149bc3bc6901150fe9017111d016b3357f529" + integrity sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg== + dependencies: + d "1" + es5-ext "~0.10.46" + easy-table@1.x.x: version "1.1.1" resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.1.1.tgz#c1b9b9ad68a017091a1c235e4bcba277540e143f" @@ -4517,10 +4947,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.363: - version "1.3.377" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.377.tgz#b49d420b36ee6c48b0cd3137bfc7fec75f369b2e" - integrity sha512-cm2WzMKf/3dW5+hNANKm8GAW6SwIWOqLTJ6GPCD0Bbw1qJ9Wzm9nmx9M+byzSsgw8CdCv5fb/wzLFqVS5h6QrA== +electron-to-chromium@^1.3.649: + version "1.3.710" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.710.tgz#b33d316e5d6de92b916e766d8a478d19796ffe11" + integrity sha512-b3r0E2o4yc7mNmBeJviejF1rEx49PUBi+2NPa7jHEX3arkAXnVgLhR0YmV8oi6/Qf3HH2a8xzQmCjHNH0IpXWQ== elliptic@^6.0.0: version "6.5.3" @@ -4560,13 +4990,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" - end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@~1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -4583,6 +5006,15 @@ enhanced-resolve@4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" +enhanced-resolve@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + enhanced-resolve@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" @@ -4592,10 +5024,12 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" -enquire.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814" - integrity sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ= +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" entities@^1.1.1: version "1.1.2" @@ -4614,29 +5048,41 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" es-cookie@^1.3.2: version "1.3.2" @@ -4652,16 +5098,42 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.46: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" es6-promisify@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4689,13 +5161,45 @@ eslint-config-hapi@^12.0.0: resolved "https://registry.yarnpkg.com/eslint-config-hapi/-/eslint-config-hapi-12.0.0.tgz#2bcacc0e050d6734f95df077dc921fa755576d7e" integrity sha512-vHjuIIgbjsBU9y4SLAvxzrP38em32tlmzEJPMRZn2QR2id4bHettmFZdobx5k6P3j25Q9+hPfm0VT+zWDsIEWw== -eslint-config-prettier@^6.10.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz#7b15e303bf9c956875c948f6b21500e48ded6a7f" - integrity sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg== +eslint-config-prettier@^6.15.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-import-resolver-webpack@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.0.tgz#5cb19cf4b6996c8a2514aeb10f909e2c70488dc3" + integrity sha512-hZWGcmjaJZK/WSCYGI/y4+FMGQZT+cwW/1E/P4rDwFj2PbanlQHISViw4ccDJ+2wxAqjgwBfxwy3seABbVKDEw== + dependencies: + array-find "^1.0.0" + debug "^2.6.9" + enhanced-resolve "^0.9.1" + find-root "^1.1.0" + has "^1.0.3" + interpret "^1.2.0" + lodash "^4.17.15" + node-libs-browser "^1.0.0 || ^2.0.0" + resolve "^1.13.1" + semver "^5.7.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + eslint-plugin-hapi@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-hapi/-/eslint-plugin-hapi-4.1.0.tgz#ca6b97b7621ae45cf70ab92f8c847a85414a56c9" @@ -4707,28 +5211,49 @@ eslint-plugin-hapi@^4.1.0: hapi-scope-start "2.x.x" no-arrowception "1.x.x" -eslint-plugin-prettier@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" - integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== +eslint-plugin-import@^2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-prettier@^3.1.4: + version "3.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz#7079cfa2497078905011e6f82e8dd8453d1371b7" + integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react@^7.18.0: - version "7.18.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.18.3.tgz#8be671b7f6be095098e79d27ac32f9580f599bc8" - integrity sha512-Bt56LNHAQCoou88s8ViKRjMB2+36XRejCQ1VoLj716KI1MoE99HpTVvIThJ0rvFmG4E4Gsq+UgToEjn+j044Bg== +eslint-plugin-react@^7.21.5: + version "7.23.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.23.1.tgz#f1a2e844c0d1967c822388204a8bc4dee8415b11" + integrity sha512-MvFGhZjI8Z4HusajmSw0ougGrq3Gs4vT/0WgwksZgf5RrLrRa2oYAw56okU4tZJl8+j7IYNuTM+2RnFEuTSdRQ== dependencies: - array-includes "^3.1.1" + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" doctrine "^2.1.0" has "^1.0.3" - jsx-ast-utils "^2.2.3" - object.entries "^1.1.1" - object.fromentries "^2.0.2" - object.values "^1.1.1" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.3" + object.fromentries "^2.0.4" + object.values "^1.1.3" prop-types "^15.7.2" - resolve "^1.14.2" - string.prototype.matchall "^4.0.2" + resolve "^2.0.0-next.3" + string.prototype.matchall "^4.0.4" eslint-scope@^4.0.3: version "4.0.3" @@ -4738,12 +5263,12 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" eslint-utils@^1.4.3: @@ -4753,12 +5278,24 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@6.x.x, eslint@^6.8.0: +eslint@6.x.x: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== @@ -4801,49 +5338,101 @@ eslint@6.x.x, eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^7.12.1: + version "7.23.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.23.0.tgz#8d029d252f6e8cf45894b4bee08f5493f8e94325" + integrity sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.21" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== espree@6.x.x, espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" + acorn "^7.1.1" + acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== +esquery@^1.0.1, esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -4864,6 +5453,11 @@ events@1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +events@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== + events@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" @@ -4966,6 +5560,13 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -5020,32 +5621,33 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.0.3, fast-glob@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" - integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== +fast-glob@^3.0.3, fast-glob@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.0" merge2 "^1.3.0" micromatch "^4.0.2" + picomatch "^2.2.1" fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -5065,17 +5667,17 @@ fast-text-encoding@^1.0.3: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== -fastparse@^1.1.1: +fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== fastq@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" - integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== dependencies: - reusify "^1.0.0" + reusify "^1.0.4" faye-websocket@^0.10.0: version "0.10.0" @@ -5091,28 +5693,22 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" -fbjs@^0.8.1: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +figures@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -5123,6 +5719,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-loader@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" @@ -5163,6 +5766,13 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= +final-form@^4.20.1: + version "4.20.2" + resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.2.tgz#c820b37d7ebb73d71169480256a36c7e6e6c9155" + integrity sha512-5i0IxqwjjPG1nUNCjWhqPCvQJJ2R+QwTwaAnjPmFnLbyjIHWuBPU8u+Ps4G3TcX2Sjno+O5xCZJzYcMJEzzfCQ== + dependencies: + "@babel/runtime" "^7.10.0" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -5190,6 +5800,11 @@ find-rc@4.x.x: resolved "https://registry.yarnpkg.com/find-rc/-/find-rc-4.0.0.tgz#99e43c5a0c75e9d3887d21ecb31ef74923572aa3" integrity sha512-jvkAF340j/ntR8cBRPLg/ElqWodgjfInY4SwLqDVqrmYDJormOIfM4lbtIcLZ0x8W5xWyrUy+mdoMwyo6OYuaQ== +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -5197,14 +5812,14 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -5212,12 +5827,20 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-versions@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" - integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-versions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" + integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== dependencies: - semver-regex "^2.0.0" + semver-regex "^3.1.2" findup-sync@3.0.0, findup-sync@^3.0.0: version "3.0.0" @@ -5254,6 +5877,14 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + flat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" @@ -5267,14 +5898,14 @@ flatstr@^1.0.12: integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== flush-write-stream@^1.0.0: version "1.1.1" @@ -5284,13 +5915,6 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -focus-trap@^2.3.0: - version "2.4.6" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-2.4.6.tgz#332b475b317cec6a4a129f5307ce7ebc0da90b40" - integrity sha512-vWZTPtBU6pBoyWZDRZJHkXsyP2ZCZBHE3DRVXnSVdQKH/mcDtu9S5Kz8CUDyIqpfZfLEyI9rjKJLnc4Y40BRBg== - dependencies: - tabbable "^1.0.3" - follow-redirects@^1.0.0, follow-redirects@^1.10.0: version "1.13.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" @@ -5375,6 +5999,16 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -5384,6 +6018,16 @@ fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -5432,17 +6076,22 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -5452,10 +6101,19 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-stdin@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stdin@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== get-stdin@^6.0.0: version "6.0.0" @@ -5475,9 +6133,9 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" @@ -5510,16 +6168,21 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gherkin@^5.0.0, gherkin@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/gherkin/-/gherkin-5.1.0.tgz#684bbb03add24eaf7bdf544f58033eb28fb3c6d5" + integrity sha1-aEu7A63STq9731RPWAM+so+zxtU= + git-raw-commits@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.3.tgz#f040e67b8445962d4d168903a9e84c4240c17655" - integrity sha512-SoSsFL5lnixVzctGEi2uykjA7B5I0AhO9x6kdzvGRHbxsa6JSEgrgy1esRKsfOKE1cgyOJ/KDR2Trxu157sb8w== + version "2.0.10" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" + integrity sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ== dependencies: - dargs "^4.0.1" - lodash.template "^4.0.2" - meow "^5.0.0" - split2 "^2.0.0" - through2 "^3.0.0" + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" glob-parent@^3.1.0: version "3.1.0" @@ -5530,9 +6193,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" @@ -5548,7 +6211,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -5617,12 +6280,19 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== dependencies: type-fest "^0.8.1" +globals@^13.6.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.7.0.tgz#aed3bcefd80ad3ec0f0be2cf0c895110c0591795" + integrity sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA== + dependencies: + type-fest "^0.20.2" + globby@10.x.x: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -5694,10 +6364,10 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== growl@1.10.5: version "1.10.5" @@ -5789,13 +6459,18 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -5803,10 +6478,10 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^2.0.0: version "2.0.0" @@ -5823,10 +6498,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-value@^0.3.1: version "0.3.1" @@ -5864,7 +6539,7 @@ has-yarn@^2.1.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -has@^1.0.1, has@^1.0.3: +has@^1.0.0, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -5913,12 +6588,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.3.1: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -5933,9 +6603,16 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" hpack.js@^2.1.6: version "2.1.6" @@ -5947,11 +6624,6 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -5990,6 +6662,11 @@ html-webpack-plugin@^3.2.0: toposort "^1.0.0" util.promisify "1.0.0" +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= + htmlparser2@^3.3.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -6003,9 +6680,9 @@ htmlparser2@^3.3.0: readable-stream "^3.1.1" http-cache-semantics@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#13eeb612424bb113d52172c28a13109c46fa85d7" - integrity sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA== + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== http-deceiver@^1.2.7: version "1.2.7" @@ -6104,28 +6781,28 @@ https-proxy-agent@5, https-proxy-agent@^5.0.0: agent-base "6" debug "4" -husky@^4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.2.tgz#aa858a99ad685f13ab5f99fa71b60e0fe0cd9048" - integrity sha512-RAjZNO74zJyFJuRFESy+3LXTJvYbjGL+jhoSNJNF1DTKq2USrL5fEH70e1cJXEgvLaPyZt1NoGi0oNQQkPs4jA== +husky@^4.3.0: + version "4.3.8" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" + integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== dependencies: - chalk "^3.0.0" + chalk "^4.0.0" ci-info "^2.0.0" - compare-versions "^3.5.1" - cosmiconfig "^6.0.0" - find-versions "^3.2.0" + compare-versions "^3.6.0" + cosmiconfig "^7.0.0" + find-versions "^4.0.0" opencollective-postinstall "^2.0.2" - pkg-dir "^4.2.0" + pkg-dir "^5.0.0" please-upgrade-node "^3.2.0" slash "^3.0.0" which-pm-runs "^1.0.0" -hyphenate-style-name@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" - integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== +i18next@^10.3: + version "10.6.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-10.6.0.tgz#90ffd9f9bc617f34b9a12e037260f524445f7684" + integrity sha1-kP/Z+bxhfzS5oS4DcmD1JERfdoQ= -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6137,11 +6814,23 @@ icss-replace-symbols@^1.1.0: resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= -ieee754@1.1.13, ieee754@^1.1.4: +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= + dependencies: + postcss "^6.0.1" + +ieee754@1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" @@ -6167,18 +6856,10 @@ ignore@^5.1.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -6210,15 +6891,15 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.0.0: +indent-string@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== infer-owner@^1.0.3: version "1.0.4" @@ -6233,7 +6914,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6249,37 +6930,52 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inline-style-prefixer@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534" - integrity sha1-hVG45bTVcyROZqNLBPfTIHaitTQ= +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= dependencies: - bowser "^1.7.3" - css-in-js-utils "^2.0.0" + source-map "~0.5.3" -inquirer@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== +inquirer@^7.0.0, inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" - chalk "^2.4.2" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.19" mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.5.3" + run-async "^2.4.0" + rxjs "^6.6.0" string-width "^4.1.0" - strip-ansi "^5.1.0" + strip-ansi "^6.0.0" through "^2.3.6" +insert-module-globals@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" + integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -6288,26 +6984,31 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - es-abstract "^1.17.0-next.1" + get-intrinsic "^1.1.0" has "^1.0.3" - side-channel "^1.0.2" + side-channel "^1.0.4" interpret@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +interpret@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + interpret@^2.0.0, interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -6339,11 +7040,6 @@ ipaddr.js@^1.9.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - is-absolute-url@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" @@ -6381,6 +7077,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -6388,7 +7089,14 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5: +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + +is-buffer@^1.1.0, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -6398,10 +7106,10 @@ is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-ci@^1.0.10: version "1.2.1" @@ -6417,6 +7125,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6498,6 +7213,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" + integrity sha1-wUwhBX7TbjKNuANHlmxpP4hjifM= + is-glob@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -6541,6 +7261,11 @@ is-lower-case@^1.1.0: dependencies: lower-case "^1.1.0" +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -6551,6 +7276,11 @@ is-npm@^3.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6568,6 +7298,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-path-cwd@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" @@ -6594,7 +7329,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -6606,22 +7341,18 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.4, is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.0.4, is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: - has "^1.0.3" + call-bind "^1.0.2" + has-symbols "^1.0.1" is-relative@^1.0.0: version "1.0.0" @@ -6635,7 +7366,7 @@ is-retry-allowed@^1.0.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -6645,14 +7376,7 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.2: +is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== @@ -6734,13 +7458,13 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" isstream@~0.1.2: version "0.1.2" @@ -6757,10 +7481,15 @@ joycon@^2.2.5: resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615" integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ== -js-base64@^2.1.9: - version "2.5.1" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" - integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -6772,7 +7501,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.13.1, js-yaml@^3.10.0, js-yaml@^3.12.1, js-yaml@^3.13.1: +js-yaml@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -6780,13 +7509,13 @@ js-yaml@3.13.1, js-yaml@^3.10.0, js-yaml@^3.12.1, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= +js-yaml@^3.10.0, js-yaml@^3.12.1, js-yaml@^3.13.1, js-yaml@^3.9.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" - esprima "^2.6.0" + esprima "^4.0.0" jsbn@~0.1.0: version "0.1.1" @@ -6845,6 +7574,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-ref-parser@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-4.1.1.tgz#f7900efc15f693432d4ac6519dc1ee09c01aa40b" @@ -6869,6 +7603,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -6879,18 +7618,18 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= + dependencies: + jsonify "~0.0.0" + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" - integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= - dependencies: - string-convert "^0.2.0" - json3@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" @@ -6908,12 +7647,12 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== +json5@^2.1.0, json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsonfile@^4.0.0: version "4.0.0" @@ -6922,6 +7661,20 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -6953,13 +7706,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" - integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== dependencies: - array-includes "^3.0.3" - object.assign "^4.1.0" + array-includes "^3.1.2" + object.assign "^4.1.2" just-extend@^4.0.2: version "4.0.2" @@ -7004,11 +7757,6 @@ jwt-decode@^2.1.0: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" integrity sha1-fYa9VmefWM5qhHBKZX3TkruoGnk= -keycode@^2.1.8: - version "2.2.0" - resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" - integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= - keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -7040,7 +7788,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7085,6 +7833,21 @@ knex@^0.21.17: tildify "2.0.0" v8flags "^3.2.0" +knuth-shuffle-seeded@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz#01f1b65733aa7540ee08d8b0174164d22081e4e1" + integrity sha1-AfG2VzOqdUDuCNiwF0Fk0iCB5OE= + dependencies: + seed-random "~2.2.0" + +labeled-stream-splicer@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" + integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== + dependencies: + inherits "^2.0.1" + stream-splicer "^2.0.0" + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -7111,18 +7874,6 @@ leven@2.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -7131,6 +7882,14 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + liftoff@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" @@ -7155,14 +7914,14 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" + parse-json "^2.2.0" + pify "^2.0.0" strip-bom "^3.0.0" loader-runner@^2.4.0: @@ -7198,6 +7957,15 @@ loader-utils@^1.0.2, loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -7221,17 +7989,19 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.clonedeep@^4.5.0: +lodash.clonedeep@4.5.0, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= @@ -7246,6 +8016,11 @@ lodash.findkey@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.findkey/-/lodash.findkey-4.6.0.tgz#83058e903b51cbb759d09ccf546dea3ea39c4718" integrity sha1-gwWOkDtRy7dZ0JzPVG3qPqOcRxg= +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.get@^4.0.0, lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -7291,15 +8066,10 @@ lodash.kebabcase@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.merge@^4.6.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= lodash.once@^4.0.0: version "4.1.1" @@ -7316,40 +8086,15 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash.template@^4.0.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.14.2, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.14.2, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@2.2.0: version "2.2.0" @@ -7382,14 +8127,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case-first@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" @@ -7427,6 +8164,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + lru-cache@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" @@ -7487,10 +8231,10 @@ map-obj@^1.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= +map-obj@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.0.tgz#0e8bc823e2aaca8a0942567d12ed14f389eec153" + integrity sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ== map-visit@^1.0.0: version "1.0.0" @@ -7499,68 +8243,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -material-components-web@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/material-components-web/-/material-components-web-0.16.0.tgz#9137f20d89a2638ce762405920fde5f3cc89e71f" - integrity sha1-kTfyDYmiY4znYkBZIP3l88yJ5x8= - dependencies: - "@material/animation" "^0.3.0" - "@material/auto-init" "^0.1.2" - "@material/base" "^0.2.3" - "@material/button" "^0.3.10" - "@material/card" "^0.2.5" - "@material/checkbox" "^0.4.1" - "@material/dialog" "^0.3.4" - "@material/drawer" "^0.5.3" - "@material/elevation" "^0.1.10" - "@material/fab" "^0.3.12" - "@material/form-field" "^0.2.10" - "@material/grid-list" "^0.2.7" - "@material/icon-toggle" "^0.1.15" - "@material/layout-grid" "^0.4.1" - "@material/linear-progress" "^0.1.5" - "@material/list" "^0.2.13" - "@material/menu" "^0.4.2" - "@material/radio" "^0.2.8" - "@material/ripple" "^0.8.1" - "@material/rtl" "^0.1.7" - "@material/select" "^0.3.11" - "@material/slider" "^0.2.1" - "@material/snackbar" "^0.3.1" - "@material/switch" "^0.1.10" - "@material/tabs" "^0.2.4" - "@material/textfield" "^0.3.2" - "@material/theme" "^0.1.6" - "@material/toolbar" "^0.4.3" - "@material/typography" "^0.2.3" - -material-design-icons@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/material-design-icons/-/material-design-icons-3.0.1.tgz#9a71c48747218ebca51e51a66da682038cdcb7bf" - integrity sha1-mnHEh0chjrylHlGmbaaCA4zct78= - -material-ui@0: - version "0.20.2" - resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.20.2.tgz#5fc9b4b62b691d3b16c89d8e54597a0412b52c7d" - integrity sha512-VeqgQkdvtK193w+FFvXDEwlVxI4rWk83eWbpYLeOIHDPWr3rbB9B075JRnJt/8IsI2X8q5Aia5W3+7m4KkleDg== - dependencies: - babel-runtime "^6.23.0" - inline-style-prefixer "^3.0.8" - keycode "^2.1.8" - lodash.merge "^4.6.0" - lodash.throttle "^4.1.1" - prop-types "^15.5.7" - react-event-listener "^0.6.2" - react-transition-group "^1.2.1" - recompose "^0.26.0" - simple-assign "^0.1.0" - warning "^3.0.0" - -math-expression-evaluator@^1.2.14: - version "1.2.22" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz#c14dcb3d8b4d150e5dcea9c68c8dad80309b0d5e" - integrity sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -7570,6 +8252,16 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + media-type@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/media-type/-/media-type-0.3.1.tgz#5d569cdd0c52d9c41c7c6451973edd267fb21bcb" @@ -7589,6 +8281,11 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= + memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -7605,20 +8302,22 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@5.0.0, meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" merge-descriptors@1.0.1: version "1.0.1" @@ -7626,9 +8325,9 @@ merge-descriptors@1.0.1: integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge2@^1.2.3, merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@^1.1.2, methods@~1.1.2: version "1.1.2" @@ -7670,17 +8369,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, mime-db@1.x.x, "mime-db@>= 1.43.0 < 2": - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.47.0, mime-db@1.x.x, "mime-db@>= 1.43.0 < 2": + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.43.0" + mime-db "1.47.0" mime@1.6.0: version "1.6.0" @@ -7709,6 +8408,11 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + mini-create-react-context@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" @@ -7734,20 +8438,21 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" + kind-of "^6.0.3" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -7796,6 +8501,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -7804,9 +8514,9 @@ mkdirp@0.5.1: minimist "0.0.8" mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" - integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" @@ -7856,6 +8566,32 @@ mock-local-storage@^1.1.8: core-js "^0.8.3" global "^4.3.2" +module-deps@^6.0.0, module-deps@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" + integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^2.0.0" + cached-path-relative "^1.0.2" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.2.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +moment@^2.24.0: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -7911,6 +8647,15 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nan@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -7953,6 +8698,11 @@ netmask@^1.0.6: resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -8000,20 +8750,17 @@ node-environment-flags@1.0.5: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-forge@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== -node-libs-browser@^2.2.1: +"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== @@ -8047,12 +8794,10 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-releases@^1.1.50: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== - dependencies: - semver "^6.3.0" +node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== nodemailer@^6.5.0: version "6.5.0" @@ -8082,7 +8827,7 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8092,6 +8837,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" + integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== + dependencies: + hosted-git-info "^4.0.1" + resolve "^1.20.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -8100,24 +8855,9 @@ normalize-path@^2.1.1: remove-trailing-separator "^1.0.1" normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^4.1.0: version "4.5.0" @@ -8131,18 +8871,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -nth-check@~1.0.1: +nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -8158,7 +8893,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -8172,10 +8907,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-is@^1.0.1: version "1.0.2" @@ -8194,7 +8929,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@4.1.0, object.assign@^4.1.0: +object.assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -8204,6 +8939,16 @@ object.assign@4.1.0, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" @@ -8214,33 +8959,34 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" -object.entries@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" - integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== +object.entries@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== dependencies: + 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" -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== +object.fromentries@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.2" object.map@^1.0.0: version "1.0.1" @@ -8257,14 +9003,14 @@ object.pick@^1.2.0, object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" obuf@^1.0.0, obuf@^1.1.2: @@ -8292,9 +9038,9 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: wrappy "1" onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" @@ -8306,9 +9052,9 @@ ono@^4.0.11, ono@^4.0.3: format-util "^1.0.3" opencollective-postinstall@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" - integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== opn@^5.5.0: version "5.5.0" @@ -8337,6 +9083,18 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -8344,7 +9102,7 @@ original@^1.0.0: dependencies: url-parse "^1.4.3" -os-browserify@^0.3.0: +os-browserify@^0.3.0, os-browserify@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= @@ -8363,6 +9121,13 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +outpipe@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= + dependencies: + shell-quote "^1.4.2" + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -8391,12 +9156,19 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -8418,6 +9190,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -8489,6 +9268,13 @@ packet-reader@1.0.0: resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== +pad-right@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" + integrity sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q= + dependencies: + repeat-string "^1.5.2" + pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -8524,6 +9310,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= + dependencies: + path-platform "~0.11.15" + parse-asn1@^5.0.0: version "5.1.5" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" @@ -8545,6 +9338,13 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -8554,13 +9354,13 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-passwd@^1.0.0: @@ -8591,7 +9391,7 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.1: +path-browserify@0.0.1, path-browserify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== @@ -8618,7 +9418,7 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -8643,6 +9443,11 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= + path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" @@ -8667,6 +9472,13 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -8761,10 +9573,10 @@ pgpass@1.x: dependencies: split "^1.0.0" -picomatch@^2.0.5: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== +picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0: version "2.3.0" @@ -8834,6 +9646,13 @@ pirates@^4.0.0: dependencies: node-modules-regexp "^1.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -8841,12 +9660,12 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== dependencies: - find-up "^4.0.0" + find-up "^5.0.0" please-upgrade-node@^3.2.0: version "3.2.0" @@ -8874,152 +9693,14 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== - dependencies: - postcss "^5.0.4" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.0.0: +postcss-modules-extract-imports@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== dependencies: postcss "^6.0.1" -postcss-modules-local-by-default@^1.0.1: +postcss-modules-local-by-default@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= @@ -9027,7 +9708,7 @@ postcss-modules-local-by-default@^1.0.1: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" -postcss-modules-scope@^1.0.0: +postcss-modules-scope@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= @@ -9035,7 +9716,7 @@ postcss-modules-scope@^1.0.0: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" -postcss-modules-values@^1.1.0: +postcss-modules-values@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= @@ -9043,108 +9724,12 @@ postcss-modules-values@^1.1.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-value-parser@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.1: +postcss@^6.0.1, postcss@^6.0.23: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -9175,12 +9760,17 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.0, prepend-http@^1.0.1: +prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= @@ -9197,10 +9787,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== pretty-error@^2.0.2: version "2.1.1" @@ -9220,7 +9810,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: +process@^0.11.10, process@~0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= @@ -9240,14 +9830,7 @@ promise-polyfill@^8.2.0: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.0.tgz#367394726da7561457aba2133c9ceefbd6267da0" integrity sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9294,9 +9877,9 @@ pseudomap@^1.0.1, pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== pstree.remy@^1.1.7: version "1.1.7" @@ -9345,7 +9928,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -9375,14 +9958,6 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - query-string@^6.14.0: version "6.14.0" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.0.tgz#0b7b7ca326f5facf10dd2d45d26645cd287f8c92" @@ -9393,7 +9968,7 @@ query-string@^6.14.0: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -querystring-es3@^0.2.0: +querystring-es3@^0.2.0, querystring-es3@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= @@ -9408,15 +9983,20 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + quick-format-unescaped@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.3.tgz#6d6b66b8207aa2b35eef12be1421bb24c428f652" integrity sha512-MaL/oqh02mhEo5m5J2rwsVL23Iw2PEaGVHgT2vFt8AAsr0lfvQA5dpXo9TPu0rz7tSBdUPgkbam0j/fj5ZM8yg== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" @@ -9468,42 +10048,39 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-animate-height@^2.0.23: - version "2.0.23" - resolved "https://registry.yarnpkg.com/react-animate-height/-/react-animate-height-2.0.23.tgz#2e14ac707b20ae67b87766ccfd581e693e0e7ec7" - integrity sha512-DucSC/1QuxWEFzR9IsHMzrf2nrcZ6qAmLIFoENa2kLK7h72XybcMA9o073z7aHccFzdMEW0/fhAdnQG7a4rDow== - dependencies: - classnames "^2.2.5" - prop-types "^15.6.1" - -react-dom@16: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" + scheduler "^0.20.2" -react-event-listener@^0.6.2: - version "0.6.6" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" - integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== +react-fast-compare@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-final-form@^6.5.1: + version "6.5.3" + resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-6.5.3.tgz#b60955837fe9d777456ae9d9c48e3e2f21547d29" + integrity sha512-FCs6GC0AMWJl2p6YX7kM+a0AvuSLAZUgbVNtRBskOs4g984t/It0qGtx51O+9vgqnqk6JyoxmIzxKMq+7ch/vg== dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - warning "^4.0.1" + "@babel/runtime" "^7.12.1" -react-is@^16.4.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0: +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-popper@^2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" + integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== + dependencies: + react-fast-compare "^3.0.1" + warning "^4.0.2" react-redux@^7.2.1: version "7.2.1" @@ -9529,7 +10106,7 @@ react-router-dom@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.2.0, react-router@^5.2.0: +react-router@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== @@ -9545,63 +10122,46 @@ react-router@5.2.0, react-router@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-slick@^0.28.0: - version "0.28.0" - resolved "https://registry.yarnpkg.com/react-slick/-/react-slick-0.28.0.tgz#b3f8511b0facca41cabe35cbf37771250f8287ea" - integrity sha512-/EZI9FOVFo9PseQKOw08K/lVT/T81rkVJkCDGCQbDGbg4irSMALaoesBMmAZie2YALuMlKHdzDsqioNtkmJKVg== - dependencies: - classnames "^2.2.5" - enquire.js "^2.1.6" - json2mq "^0.2.0" - lodash.debounce "^4.0.8" - resize-observer-polyfill "^1.5.0" - -react-transition-group@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" - integrity sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q== +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: - chain-function "^1.0.0" - dom-helpers "^3.2.0" - loose-envify "^1.3.1" - prop-types "^15.5.6" - warning "^3.0.0" + loose-envify "^1.1.0" + object-assign "^4.1.1" -react-transition-group@^2.2.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= dependencies: - dom-helpers "^3.4.0" - loose-envify "^1.4.0" - prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" + readable-stream "^2.0.2" -react@^16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" + find-up "^2.0.0" + read-pkg "^2.0.0" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: - load-json-file "^4.0.0" + load-json-file "^2.0.0" normalize-package-data "^2.3.2" - path-type "^3.0.0" + path-type "^2.0.0" read-pkg@^4.0.1: version "4.0.1" @@ -9612,6 +10172,16 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -9635,7 +10205,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9670,66 +10240,13 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -recompose@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" - integrity sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog== - dependencies: - change-emitter "^0.1.2" - fbjs "^0.8.1" - hoist-non-react-statics "^2.3.1" - symbol-observable "^1.0.4" - -recompose@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" - integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== - dependencies: - "@babel/runtime" "^7.0.0" - change-emitter "^0.1.2" - fbjs "^0.8.1" - hoist-non-react-statics "^2.3.1" - react-lifecycles-compat "^3.0.2" - symbol-observable "^1.0.4" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" - integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - balanced-match "^1.0.0" - -redux-form@8: - version "8.3.6" - resolved "https://registry.yarnpkg.com/redux-form/-/redux-form-8.3.6.tgz#c098dcd0b9d8c38e2e443dab91033ea0e74d4609" - integrity sha512-PfDdi+9JtNdr29Pv+9123TiojJlFB6+qczCRfP++cVT4nO2tEv4tDJHSV1l/Ol3Qh9z2cRg1QeLMhShNtRZ3+g== - dependencies: - "@babel/runtime" "^7.9.2" - "@scarf/scarf" "^1.0.5" - es6-error "^4.1.1" - hoist-non-react-statics "^3.3.2" - invariant "^2.2.4" - is-promise "^2.1.0" - lodash "^4.17.15" - prop-types "^15.6.1" - react-is "^16.4.2" + indent-string "^4.0.0" + strip-indent "^3.0.0" redux-logger@^3.0.6: version "3.0.6" @@ -9743,11 +10260,6 @@ redux-observable@1: resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-1.2.0.tgz#ff51b6c6be2598e9b5e89fc36639186bb0e669c7" integrity sha512-yeR90RP2WzZzCxxnQPlh2uFzyfFLsfXu8ROh53jGDPXVqj71uNDMmvi/YKQkd9ofiVoO4OYb1snbowO49tCEMg== -redux-optimistic-ui@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/redux-optimistic-ui/-/redux-optimistic-ui-3.1.0.tgz#efd07bb8483185db221b50f3d0ea42ce93b12d6d" - integrity sha512-TYYre7+3GUKhQvzRInzJfP4sRnH6G8N7QtDoEnTMTifAkUg7iP3EtqDaKvYHBfP+dnny5c81IsLzqtbCDw6c0A== - redux@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" @@ -9763,25 +10275,25 @@ regenerate-unicode-properties@^8.2.0: dependencies: regenerate "^1.4.0" -regenerate@^1.2.1, regenerate@^1.4.0: +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regenerator-transform@^0.14.2: version "0.14.3" @@ -9799,32 +10311,28 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^8.2.0" @@ -9842,9 +10350,9 @@ registry-auth-token@^3.0.1: safe-buffer "^5.0.1" registry-auth-token@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" - integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: rc "^1.2.8" @@ -9862,27 +10370,15 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - regjsgen@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== dependencies: jsesc "~0.5.0" @@ -9912,7 +10408,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -9974,6 +10470,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.1, require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -9989,12 +10490,7 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= -reselect@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" - integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== - -resize-observer-polyfill@^1.5.0: +resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== @@ -10046,11 +10542,25 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.3.2: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.8.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" responselike@^1.0.2: @@ -10089,7 +10599,7 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -reusify@^1.0.0: +reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== @@ -10101,14 +10611,14 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@^3.0.1: +rimraf@^3.0.1, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -10123,17 +10633,17 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -10142,10 +10652,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@6, rxjs@^6.5.2, rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== +rxjs@6, rxjs@^6.5.2, rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" @@ -10155,9 +10665,9 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex@^1.1.0: version "1.1.0" @@ -10176,7 +10686,7 @@ sax@1.2.1: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= -sax@>=0.6.0, sax@~1.2.1: +sax@>=0.6.0, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -10188,10 +10698,10 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -10206,12 +10716,18 @@ schema-utils@^1.0.0: ajv-keywords "^3.1.0" schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - ajv "^6.12.0" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +seed-random@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" + integrity sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ= seedrandom@3.x.x: version "3.0.5" @@ -10242,31 +10758,38 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== +semver-regex@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" + integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.3.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^7.1.1, semver@^7.3.2: +semver@7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -10293,6 +10816,11 @@ sentence-case@^1.1.1, sentence-case@^1.1.2: dependencies: lower-case "^1.1.1" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= + serialize-javascript@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" @@ -10341,7 +10869,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4, setimmediate@^1.0.5: +setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -10356,7 +10884,7 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -sha.js@^2.4.0, sha.js@^2.4.8: +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -10364,6 +10892,21 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shasum-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" + integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== + dependencies: + fast-safe-stringify "^2.0.7" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -10388,23 +10931,29 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== +shell-quote@^1.4.2, shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-assign@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/simple-assign/-/simple-assign-0.1.0.tgz#17fd3066a5f3d7738f50321bb0f14ca281cc4baa" - integrity sha1-F/0wZqXz13OPUDIbsPFMooHMS6o= +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== sinon-chai@^3.3.0: version "3.4.0" @@ -10456,10 +11005,14 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -slick-carousel@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/slick-carousel/-/slick-carousel-1.8.1.tgz#a4bfb29014887bb66ce528b90bd0cda262cc8f8d" - integrity sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" slugify@^1.4.0: version "1.4.0" @@ -10553,18 +11106,6 @@ sonic-boom@^1.0.2: atomic-sleep "^1.0.0" flatstr "^1.0.12" -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" - integrity sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY= - source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -10594,12 +11135,17 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.7.x: +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + +source-map@0.7.3, source-map@0.7.x: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -10615,30 +11161,30 @@ spawn-command@^0.0.2-1: integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== spdy-transport@^3.0.0: version "3.0.0" @@ -10675,17 +11221,10 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split2@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.1.1.tgz#c51f18f3e06a8c4469aaab487687d8d956160bb6" - integrity sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q== +split2@^3.0.0, split2@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" @@ -10723,6 +11262,45 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-chain@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-2.0.0.tgz#d73d1172af89565f07438b5bcc086831b6689b2d" + integrity sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg== + +stack-generator@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36" + integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q== + dependencies: + stackframe "^1.1.1" + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +stacktrace-gps@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a" + integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg== + dependencies: + source-map "0.5.6" + stackframe "^1.1.1" + +stacktrace-js@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" + integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== + dependencies: + error-stack-parser "^2.0.6" + stack-generator "^2.0.5" + stacktrace-gps "^3.0.4" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -10741,7 +11319,7 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -stream-browserify@^2.0.1: +stream-browserify@^2.0.0, stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== @@ -10749,6 +11327,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -10757,7 +11343,7 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" -stream-http@^2.7.2: +stream-http@^2.0.0, stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== @@ -10768,11 +11354,29 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-http@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" + integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-splicer@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" + integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + stream-to-array@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" @@ -10789,20 +11393,20 @@ stream-to-promise@^3.0.0: end-of-stream "~1.4.1" stream-to-array "~2.3.0" -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" - integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= +string-argv@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" + integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= + +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= string-width@^1.0.1: version "1.0.2" @@ -10831,41 +11435,42 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== +string.prototype.matchall@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" + integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - function-bind "^1.1.1" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - function-bind "^1.1.1" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -10924,22 +11529,19 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@^3.1.1: +strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -10951,6 +11553,37 @@ style-loader@^0.13.1: dependencies: loader-utils "^1.0.2" +styled-jsx@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.0.tgz#32335c1a3ecfc923ba4f9c056eeb3d4699006b09" + integrity sha512-sh8BI5eGKyJlwL4kNXHjb27/a/GJV8wP4ElRIkRXrGW3sHKOsY9Pa1VZRNxyvf3+lisdPwizD9JDkzVO9uGwZw== + dependencies: + "@babel/types" "7.8.3" + babel-plugin-syntax-jsx "6.18.0" + convert-source-map "1.7.0" + loader-utils "1.2.3" + source-map "0.7.3" + string-hash "1.1.3" + stylis "3.5.4" + stylis-rule-sheet "0.0.10" + +stylis-rule-sheet@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + superagent-proxy@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-2.1.0.tgz#34e91f9024fbace95f0a35c50c69edf2a0d331e2" @@ -10991,9 +11624,9 @@ supports-color@6.1.0, supports-color@^6.1.0: has-flag "^3.0.0" supports-color@7.x.x, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -11002,13 +11635,6 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - supports-color@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" @@ -11028,18 +11654,29 @@ svg-loader@^0.0.2: resolved "https://registry.yarnpkg.com/svg-loader/-/svg-loader-0.0.2.tgz#601ab2fdaa1dadae3ca9975b550de92a07e1d92b" integrity sha1-YBqy/aodra48qZdbVQ3pKgfh2Ss= -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" swagger-methods@^1.0.4: version "1.0.8" @@ -11084,7 +11721,7 @@ swr@^0.4.1: dependencies: dequal "2.0.2" -symbol-observable@^1.0.4, symbol-observable@^1.2.0: +symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -11094,10 +11731,12 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tabbable@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-1.1.3.tgz#0e4ee376f3631e42d7977a074dbd2b3827843081" - integrity sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg== +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" table@^5.2.3: version "5.4.6" @@ -11109,6 +11748,26 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.0.4: + version "6.0.9" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.9.tgz#790a12bf1e09b87b30e60419bafd6a1fd85536fb" + integrity sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ== + dependencies: + ajv "^8.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + lodash.clonedeep "^4.5.0" + lodash.flatten "^4.4.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +tapable@^0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -11178,7 +11837,21 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through2@^2.0.0, through2@^2.0.2: +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -11186,14 +11859,14 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: - readable-stream "2 || 3" + readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11213,6 +11886,13 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= + dependencies: + process "~0.11.0" + timers-browserify@^2.0.4: version "2.0.11" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" @@ -11238,6 +11918,14 @@ title-case@^1.1.0: sentence-case "^1.1.1" upper-case "^1.0.3" +title-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -11354,20 +12042,30 @@ tree-kill@^1.2.1: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== trim-off-newlines@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.1: version "2.1.0" @@ -11379,6 +12077,11 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -11391,6 +12094,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -11403,11 +12113,31 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -11421,6 +12151,16 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -11431,11 +12171,6 @@ typescript@3.6.x: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.5.tgz#dae20114a7b4ff4bd642db9c8c699f2953e8bbdb" integrity sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ== -ua-parser-js@^0.7.18: - version "0.7.21" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" - integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== - uglify-js@3.4.x: version "3.4.10" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" @@ -11452,11 +12187,37 @@ uglify-js@^3.1.4: commander "~2.20.3" source-map "~0.6.1" +umd@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +undeclared-identifiers@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" + integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== + dependencies: + acorn-node "^1.3.0" + dash-ast "^1.0.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" + undefsafe@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" @@ -11502,16 +12263,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -11538,11 +12289,26 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -11608,9 +12374,9 @@ upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1: integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -11649,7 +12415,7 @@ url@0.10.3: punycode "1.3.2" querystring "0.2.0" -url@^0.11.0: +url@^0.11.0, url@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= @@ -11657,6 +12423,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-debounce@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-6.0.0.tgz#972300f9660ddd8fd12fa7cb78a17e0290a6a2c5" + integrity sha512-d4Sy6j8J0kkPXqIUGvIf829HCtyErxG8NMoFOJAvYSZP4Xuar7PURNt9LkvkGYoQw7i4iuez1jo957TL4m772g== + use-query-params@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/use-query-params/-/use-query-params-1.1.9.tgz#4f1b91c5b338107efa7d90dd889c56039108f944" @@ -11669,6 +12440,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +util-arity@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/util-arity/-/util-arity-1.1.0.tgz#59d01af1fdb3fede0ac4e632b0ab5f6ce97c9330" + integrity sha1-WdAa8f2z/t4KxOYysKtfbOl8kzA= + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11682,6 +12458,16 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -11696,6 +12482,13 @@ util@^0.11.0: dependencies: inherits "2.0.3" +util@~0.10.1: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + utila@^0.4.0, utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -11722,9 +12515,9 @@ v8-compile-cache@2.0.3: integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8flags@^3.1.3, v8flags@^3.2.0: version "3.2.0" @@ -11756,12 +12549,7 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -verror@1.10.0: +verror@1.10.0, verror@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= @@ -11770,7 +12558,7 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vm-browserify@^1.0.1: +vm-browserify@^1.0.0, vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== @@ -11791,20 +12579,26 @@ w3c-xmlserializer@^1.1.2: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= - dependencies: - loose-envify "^1.0.0" - -warning@^4.0.1: +warning@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" +watchify@3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.1.tgz#8e4665871fff1ef64c0430d1a2c9d084d9721881" + integrity sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog== + dependencies: + anymatch "^2.0.0" + browserify "^16.1.0" + chokidar "^2.1.1" + defined "^1.0.0" + outpipe "^1.1.0" + through2 "^2.0.0" + xtend "^4.0.0" + watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -11966,10 +12760,10 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" - integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== +whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" @@ -11985,10 +12779,16 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" which-module@^2.0.0: version "2.0.0" @@ -12033,7 +12833,7 @@ will-call@1.x.x: resolved "https://registry.yarnpkg.com/will-call/-/will-call-1.0.1.tgz#9b37561ea7156aaba21b28fdf635b80fe78bf166" integrity sha512-1hEeV8SfBYhNRc/bNXeQfyUBX8Dl9SCYME3qXh99iZP9wJcnhnlBsoBw8Y0lXVZ3YuPsoxImTzBiol1ouNR/hg== -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -12076,6 +12876,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -12142,15 +12951,20 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" @@ -12162,14 +12976,17 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" - integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== - dependencies: - "@babel/runtime" "^7.6.3" +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.1, yargs-parser@^13.1.0, yargs-parser@^13.1.1: +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== @@ -12177,13 +12994,6 @@ yargs-parser@13.1.1, yargs-parser@^13.1.0, yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" @@ -12192,14 +13002,27 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== +yargs-parser@^13.1.0, yargs-parser@^13.1.1, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" @@ -12244,7 +13067,7 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" -yargs@13.3.0, yargs@^13.1.0, yargs@^13.3.0: +yargs@13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== @@ -12260,10 +13083,26 @@ yargs@13.3.0, yargs@^13.1.0, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.1" +yargs@^13.1.0, yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" - integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -12275,7 +13114,25 @@ yargs@^15.1.0: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^16.1.0" + yargs-parser "^18.1.2" + +yargs@^16.1.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== z-schema@^3.19.0: version "3.25.1" From ddba469370d815d05f939c9eab65484922e85a63 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Wed, 19 May 2021 13:34:01 +0000 Subject: [PATCH 22/29] chore(release): cut 2.20.0 [skip ci] # [2.20.0](https://github.com/dhis2/app-hub/compare/v2.19.0...v2.20.0) (2021-05-19) ### Features * emailservice and user email migration ([#463](https://github.com/dhis2/app-hub/issues/463)) ([27e91a5](https://github.com/dhis2/app-hub/commit/27e91a5a60014d3f471a12888082732d01531da0)) * UI redesign ([#458](https://github.com/dhis2/app-hub/issues/458)) ([d4621ca](https://github.com/dhis2/app-hub/commit/d4621ca3ab58fe5f92f9be00bc17e3e3f3e732c5)) --- CHANGELOG.md | 8 ++++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0acaf9326..1e7c6a600 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [2.20.0](https://github.com/dhis2/app-hub/compare/v2.19.0...v2.20.0) (2021-05-19) + + +### Features + +* emailservice and user email migration ([#463](https://github.com/dhis2/app-hub/issues/463)) ([27e91a5](https://github.com/dhis2/app-hub/commit/27e91a5a60014d3f471a12888082732d01531da0)) +* UI redesign ([#458](https://github.com/dhis2/app-hub/issues/458)) ([d4621ca](https://github.com/dhis2/app-hub/commit/d4621ca3ab58fe5f92f9be00bc17e3e3f3e732c5)) + # [2.19.0](https://github.com/dhis2/app-hub/compare/v2.18.2...v2.19.0) (2021-05-07) diff --git a/client/package.json b/client/package.json index 64642830d..b33f569d8 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.19.0", + "version": "2.20.0", "description": "The App Hub Client", "repository": "https://github.com/dhis2/app-hub", "author": "Birk Johansson ", diff --git a/package.json b/package.json index 28be1ef6e..fcb032f01 100644 --- a/package.json +++ b/package.json @@ -36,5 +36,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.19.0" + "version": "2.20.0" } diff --git a/server/package.json b/server/package.json index 7fa9b799f..4fee42766 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.19.0", + "version": "2.20.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 5bb2d9d0e..94889493d 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.19.0", + "version": "2.20.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 196698e68498aea9a2623761135e2c2aa902542b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Thu, 20 May 2021 15:34:30 +0100 Subject: [PATCH 23/29] feat: verify metadata (#466) * chore: add adm-zip dependency * feat: add verifyBundle security util * feat: verify metadata * fix: verify app name * fix: update tests --- server/package.json | 1 + .../src/routes/v1/apps/handlers/createApp.js | 8 ++ .../v1/apps/handlers/createAppVersion.js | 11 ++ server/src/security/index.js | 1 + server/src/security/verifyBundle.js | 111 ++++++++++++++++++ server/test/routes/sample-app.js | 2 +- server/test/sample-app.zip | Bin 648882 -> 2596210 bytes yarn.lock | 5 + 8 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 server/src/security/verifyBundle.js diff --git a/server/package.json b/server/package.json index 4fee42766..554eec826 100644 --- a/server/package.json +++ b/server/package.json @@ -26,6 +26,7 @@ "@hapi/inert": "^6.0.1", "@hapi/joi": "^17.1.1", "@hapi/vision": "^6.0.0", + "adm-zip": "^0.5.5", "@hapipal/schmervice": "^2.0.0", "auth0": "^2.32.0", "aws-sdk": "^2.640.0", diff --git a/server/src/routes/v1/apps/handlers/createApp.js b/server/src/routes/v1/apps/handlers/createApp.js index 4272ecb56..30c9ef414 100644 --- a/server/src/routes/v1/apps/handlers/createApp.js +++ b/server/src/routes/v1/apps/handlers/createApp.js @@ -5,6 +5,7 @@ const { canCreateApp, getCurrentUserFromRequest, currentUserIsManager, + verifyBundle, } = require('../../../../security') const App = require('../../../../services/app') const Organisation = require('../../../../services/organisation') @@ -131,6 +132,13 @@ module.exports = { ) const { file } = payload + verifyBundle({ + buffer: file._data, + appId: app.id, + appName: name, + version, + organisationName: organisation.name, + }) const appUpload = saveFile( `${app.id}/${appVersion.id}`, 'app.zip', diff --git a/server/src/routes/v1/apps/handlers/createAppVersion.js b/server/src/routes/v1/apps/handlers/createAppVersion.js index b370f421a..cc0cd4c44 100644 --- a/server/src/routes/v1/apps/handlers/createAppVersion.js +++ b/server/src/routes/v1/apps/handlers/createAppVersion.js @@ -12,6 +12,7 @@ const { saveFile } = require('../../../../utils') const { getCurrentUserFromRequest, currentUserIsManager, + verifyBundle, } = require('../../../../security') const createAppVersion = require('../../../../data/createAppVersion') @@ -186,6 +187,16 @@ module.exports = { } try { + const organisationId = dbApp.organisation_id + const organisation = Organisation.findOne(organisationId, false, transaction) + verifyBundle({ + buffer: file._data, + appId, + appName: dbApp.name, + version, + organisationName: organisation.name, + }) + await saveFile(`${appId}/${versionId}`, 'app.zip', file._data) } catch (err) { await transaction.rollback() diff --git a/server/src/security/index.js b/server/src/security/index.js index 0f8e0a1bd..a5950aa1c 100644 --- a/server/src/security/index.js +++ b/server/src/security/index.js @@ -98,4 +98,5 @@ module.exports = { getCurrentUserFromRequest, currentUserIsManager, ROLES, + verifyBundle: require('./verifyBundle'), } diff --git a/server/src/security/verifyBundle.js b/server/src/security/verifyBundle.js new file mode 100644 index 000000000..eb4919482 --- /dev/null +++ b/server/src/security/verifyBundle.js @@ -0,0 +1,111 @@ +const AdmZip = require('adm-zip') + +const isValidJSON = json => { + try { + JSON.parse(json) + return true + } catch (error) { + return false + } +} + +const checkManifest = ({ + manifest, + appId, + appName, + version, + organisationName, + canBeCoreApp +}) => { + if (manifest.app_hub_id && manifest.app_hub_id !== appId) { + throw new Error('Manifest App Hub ID does not match app ID') + } + if (manifest.name !== appName) { + throw new Error('Manifest name does not match app name') + } + if (manifest.version !== version) { + throw new Error('Manifest version does not match app version') + } + const manifestDeveloper = manifest.developer?.name + if (manifestDeveloper && manifestDeveloper !== organisationName) { + throw new Error('Manifest developer does not match app organisation') + } + if (!canBeCoreApp && manifest.core_app) { + throw new Error('Manifest incorrectly declares app as core app') + } +} + +const checkD2Config = ({ + d2Config, + appId, + appName, + version, + organisationName, + canBeCoreApp +}) => { + if (d2Config.id && d2Config.id !== appId) { + throw new Error('D2 config App Hub ID does not match app ID') + } + if (d2Config.title !== appName) { + throw new Error('D2 config title does not match app name') + } + if (d2Config.version !== version) { + throw new Error('D2 config version does not match app version') + } + const d2ConfigDeveloper = d2Config.author?.name + if (d2ConfigDeveloper && d2ConfigDeveloper !== organisationName) { + throw new Error('D2 config developer does not match app organisation') + } + if (!canBeCoreApp && d2Config.coreApp) { + throw new Error('D2 config incorrectly declares app as core app') + } +} + +module.exports = ({ + buffer, + appId, + appName, + version, + organisationName, +}) => { + const zip = new AdmZip(buffer) + const entries = zip.getEntries().map(e => e.entryName) + const manifestPath = 'manifest.webapp' + const d2ConfigPath = 'd2.config.json' + const canBeCoreApp = organisationName === 'DHIS2' + + if (!entries.includes(manifestPath)) { + throw new Error('Manifest missing from bundle') + } + const manifestJson = zip.readAsText(manifestPath) + if (!isValidJSON(manifestJson)) { + throw new Error(`${manifestPath} is not valid JSON`) + } + const manifest = JSON.parse(manifestJson) + checkManifest({ + manifest, + appId, + appName, + version, + organisationName, + canBeCoreApp + }) + + // D2 config is optional + if (!entries.includes(d2ConfigPath)) { + return + } + const d2ConfigJson = zip.readAsText(d2ConfigPath) + if (!isValidJSON(d2ConfigJson)) { + throw new Error(`${d2ConfigPath} is not valid JSON`) + } + const d2Config = JSON.parse(d2ConfigJson) + checkD2Config({ + d2Config, + appId, + appName, + version, + organisationName, + canBeCoreApp + }) +} diff --git a/server/test/routes/sample-app.js b/server/test/routes/sample-app.js index ddf2eb6a7..3aba05733 100644 --- a/server/test/routes/sample-app.js +++ b/server/test/routes/sample-app.js @@ -1,7 +1,7 @@ const mockOrganisations = require('../../seeds/mock/organisations') exports.sampleApp = { - name: 'DHIS2 Sample App', + name: 'WHO Data Quality Tool', description: 'A very nice sample description', appType: 'APP', sourceUrl: 'http://github.com', diff --git a/server/test/sample-app.zip b/server/test/sample-app.zip index c5651f7506aa6ff53a367d0c12c1875d47278652..b12f786999f24061f14119e318236ee2879d121b 100644 GIT binary patch delta 10135 zcmeHN2~<=^7On1P>ED1Ni=rYLrCCH4Ba0#mCP+jAqQ)hPffi5}L7>3}9T7EZI1&dj z{wOX<#B8Gn(U^9Oj*htCM%;oLp+OAB7{wSR#zf=1s{gyGY6M#+$(b`Jobze^?|Wap zTHdQ$@3Z5S>yLXjN-U!zWF~e9Avu~HTVy%RMCMi$S3Y`Hm?XBiGAx+f?zDL2SQ6ZS zRVLhPGCgG@6>;f{e4lV& zf*iizTPe2lxUzP#B$lsrmWU1YQc5O8!IODvNeH26_Nyf+li*3;DhXqhKmL+bDM0SN zBwb|#5Nl4_Pk0i-NdtZ0$%AAargw^Tr;!5K zNu?3k*t|hHYUv=U6Q>_tzBWTD4DXsuDU2@PJrjV`aPz~IGH=0+Y^ChDIY44FrTv8` zt23orcfylkPnnnS1m6m(S`vtHitV-S{7B2e{WrvbK%#m3bnU9^q`*a~&E^mLuMMuN{{GU$tJ{Uza;z)~p@Sbwkei6%CAFN(s#na(bdvDJ$osQ9 zX9R#l%Pmn0G8K@;R@()r5ZT_k$X*snLR|bM7mdfO)!xM21#yZPoGwV*_lE`&RxW;I zYKqWD9TDn8q1D-QXC!(7kD=|v>A@XnbR(QdOHgI2p3sUvz+dgr5H>`PkWGJtI@9p9 z#B5b4@VrvgGt=3oaHhdSu&ztc`ijX2#gw-UL2*^3n2&J&!KjHx%h!iQA+!lD{gB>v zmIyEn$x0Y^!){)4^dy89f<<@H6TVO_5krmSsm6dS*^me4-kLh2@g8h#TA# zw`<6IW(Z|KPp4 zDVQ>Y>87>}%#=@GJ;DNd*2T%7IrS_lR4yU2Xvmg@;gwT72CmwP(BF0;)J+G^%!IuU zrx*>{$S{shVqJ8&(Vj9#YJ0;jd)P<$H^HcCtf{d{Pe`2Om6V+}gPnA;17hRBY4$PSakBTq5`Nb(xU2RyKZEZ|RGs>7@-L%_r=e62}!@d-bxT?@zW#VdhyM zu6cKR)A=bM-8)whHRXcG%ET{YOcw9BePh9r4H263i?cP83N5T&Tl_=$e0z&H>zP(b z4ckU+8&aBl=0ZYbu>FYz_XXZExn^QU`lAD-6Z7u)JNwd#UPO4ZMwY;~@v$gg|sxTR)%hm$|8EU-Vl{b)+k zhJ9OBCA>Vo+q}Rx^53^ft*TBsEsHOb+&{V5wfsO#Xu#BNht-`%6<-Qkd+N}+h}^D+ zM>|(F^*nnwZpULOty;xxvdA`&EP>|`ulh}_4e?5U|GSA-%IN>Oc*Q-X#Vg(OKU=&q zK`MyXKOh#LB^2}ifLMH%P|W-9V^Jb?lC>xTRMT5Aap_`6u`f z8dT)bo!?i(^-)6pWwoq8g-nV{^ACgxRIF^nF_hj1++c&z{gmdPDHEX}ZNm-ams}6E zMz@Bg>=B??((+$wIVHBts#w~Its*HSKin@^COTGcnw74!>EHvR z)BChs0QQ1as&xNORtiwituFlFI$`8k$x6fTI7`T&^Lcf`$g!%Gh8C+uC}>z$-nyRa z(|#wzssucdZlsg_z;jl<(w%&Z#%E;nMGc%A?klTZX-4=J(W3zkoIf_sN>v)VyOUJV zC0JNzcB)-Dg_rbs6ND4*(rF14VC8a6iGaY z&_Q_Fv67R9?wTvO!-D{I;7@)d#2B4&y6FAErb|3!LX3eBwdeC1xjxu`R)W$4)Muc8 zPu2@kz5lEPrAe;`i;aLFb>hPsxZXpV-Hb?1nvimtBVM%BnFpvM@L z%PV*%EjIu+M$f9LzA>DQkE~blnOe>RSR24Indt@vzgNo*#4I`;I_p_@?BCv^C_Yu` zN-`lZW9xufCb8fb)Db6-;rqyF3x0)K;zn|sOS?`y{L})qT=@Go#uJ3L8!z{IC8FcwprL=$3easv}|Zc;EN!kR_2n3upxUOn{0 zN^Z$-tmg*6y#iZxu(1@}6;lj$j7~8YjMbwKmi(|QTz_Cs!tB+(MYfnaFq=*ttWOht zEcrY2oDcS#P8Teye28dMOcl^p3Le6^Q1Q8#5a2mkFlCYOTo?8pV47YaI@1W@1#(M- zQXvmke)tB)rGJzq-?5Pk#66(nx-+v@yvJMe8JW_qB&2~lvJt4A6jpq+r>rxHTkHTG zw>k%eiG9b;3K_&KZjg>yM|QxwTk&SWvYsSd0}aEqBZED!u|;i$YT-4m%a9-xgc?9- zh5pkP2C1dIsDz3vJ!&T6$&(y4mxB7%my7WsmyY(fii&iPp6wufyu|0p*;&N6Vj5YGaD% z`Uan?i0)wO)N=S@Pf)_hJo#+^y`$=i+;l0tdh%1cz*Gxy7oM?NsP8pSN~~-X{r(@X z7Sei9H-dbt_bHVOzhuty;6vulqXEL;coJ$)f@AKg5$FkIeym~N1jk{e3l}| z?^@#k;gD0qrNRdY;$-*$A&ft;oZ-*Za-Q%v$lfvVF-A*7D9G6faM!FQIFP6q4$3qI zK78v51j|gmq@LrXMoG-BS0t?^<`OsplkL?giJ1h)UxGG}nBE>zMq&oSNtWP@l9=BO zmNF9ab2yKy4%Rb8NC0FyT-Yj;P>D7G-V&$*8AR;)8%LRK{Z^fx4&>C z!*73y5rtp`t2+MSRnEco(Xa!b_8>>OajyXoD>`y^!-rT_&9yXBn*W=~DROet7uZ-` zM;{jdbw_A{*PSjM`E9kFdHV&RFAJSpYA!|;fNb8T@J1DY&b}uw_@@_uhMl2|8&v>u zzeq8RDgfQPA-ePQ0+6hkGHz4>=<{DGhLHuJWv0rO88E5!r;io`-s=4_T@07nl|e671_s6F7F-uJj%f;keT4!Qawy<`~b4 zD>{1Yf(7&X@-(Zi=&)3NEI@VTTOrQc_kN^_i!jT&b8`FTu@w}YIxFKYusVzO>%2%Z zqC8e@DY#>7d2H_i5pQI9EcArf-PYwXR&&w*=bjZC0R{Gwe#%(gMdNL2Mf}t2;=4Rt r$?)UqJ{Pd)hvVmPeA_x19-PR delta 1369 zcmZ9Mdr(wW9LMk7m%A%y=Dk-3_wtxwIj{l?q>_>?pfTnO(lmerh%`Nxhk_6yq_%?E z@?4ez4zFblsTR^{wudAn!k7#wj{zT*2E|B4VuBi>6I#D}ch??&{Pz6L=l;IG^S$Ss zz4tnr$WI56Q?ynnq6mVJ5(zq-ab|fKCNaC*nyiZ;b=4|L!%x3BNOh!;Ivkv82knRb zgduXN9E1cX9C(v*<0|Qz97+a-@*K*WSGF(Rpp=PmR6ex`aBM#1{_nEte9F&Ob~T^c zB83XqLdObw3#p+5AewOpQ7cJp6p%4rI@G2L@S_vrfs`3&cT$fh%q(R$V4kGy1~k*2 z!S z|IGN?2%KcN9EkF+;{|3Y=ZBoDxCcxyUt`c{gb*SKF@ywS5rni|qmlJAI49~1kpnKd zYHyMte#e?*xJS)RznzP!Z*DVh=z1pl)qTB|)D`c&6^obQ2qbt@QcR7uQq*vXZ% zD|=rXb=sYa2R%<$J>Gvm7Pt)?JsQ_vL24e zYTG7}9}wTFEGTPLdYuf(x#4lPqvht6!4J+i>*pK$$?x{fWUNVO*nQiyzcbNT;L=9s z?fR-{eL&GS66$V*XYcJBpHHO)b;KP@nmmTx`u2Lq>x{lLzv?$_exq#jy2-*L^!qoXTpOuO3+U$D`rVyq5eOvwvEIRdp8& z#}~q^+XXJ!Wrf%3SE>5a`|_?UaNP0M?)uAgT26QEN8M+C>8Y%J)vGXlnRsH`(U+bx zU%1?wcQ9(`NPzU~{;@;ZD%7ct){+8O;gd^r%Yf41L}re&3Y=YpA|dZCLa8uhRv-nA zC`NveJ2%5)Q!!cxc`}#ZEJps2f6V3nB`5^)v=Uyn=LDeH628;(r6|pzxKPR~Lduas zv~!3g@Xl%!1P}E_04d)Bu+|_ofN`i0_WVTRN98CG=F??JAveyDL~7u(8R|FiL?i11 zc$m}02m}OHn^{gb*1{@;BAEa$w6MW2cLV=|%=LI<1ybSe4_WSVmP3uGD;z`t^}NW) z*?B7lz<2`>)X-MolZYdY{NfF;xahZ3c>Y5@>s@2vyTH!82+ht^pzSa$SXhPN Date: Thu, 20 May 2021 14:42:15 +0000 Subject: [PATCH 24/29] chore(release): cut 2.21.0 [skip ci] # [2.21.0](https://github.com/dhis2/app-hub/compare/v2.20.0...v2.21.0) (2021-05-20) ### Features * verify metadata ([#466](https://github.com/dhis2/app-hub/issues/466)) ([196698e](https://github.com/dhis2/app-hub/commit/196698e68498aea9a2623761135e2c2aa902542b)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e7c6a600..10a9147b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.21.0](https://github.com/dhis2/app-hub/compare/v2.20.0...v2.21.0) (2021-05-20) + + +### Features + +* verify metadata ([#466](https://github.com/dhis2/app-hub/issues/466)) ([196698e](https://github.com/dhis2/app-hub/commit/196698e68498aea9a2623761135e2c2aa902542b)) + # [2.20.0](https://github.com/dhis2/app-hub/compare/v2.19.0...v2.20.0) (2021-05-19) diff --git a/client/package.json b/client/package.json index b33f569d8..f196f1c3a 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.20.0", + "version": "2.21.0", "description": "The App Hub Client", "repository": "https://github.com/dhis2/app-hub", "author": "Birk Johansson ", diff --git a/package.json b/package.json index fcb032f01..7dbcff2eb 100644 --- a/package.json +++ b/package.json @@ -36,5 +36,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.20.0" + "version": "2.21.0" } diff --git a/server/package.json b/server/package.json index 554eec826..db615170f 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.20.0", + "version": "2.21.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 94889493d..31ac1c75f 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.20.0", + "version": "2.21.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From a7b27c855df956c319f1a4174dbde4c6f4adc3e3 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Fri, 21 May 2021 15:21:27 +0200 Subject: [PATCH 25/29] feat(apps): add filter-option for core-apps (#482) * feat(apps): add filter-option for core-app * fix: add description for filter * test: add simple test-case --- server/src/data/getApps.js | 9 ++++++++- server/src/routes/v2/apps.js | 11 +++++++--- server/test/routes/v2/apps.js | 38 +++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/server/src/data/getApps.js b/server/src/data/getApps.js index f689dd666..7ed67be28 100644 --- a/server/src/data/getApps.js +++ b/server/src/data/getApps.js @@ -11,7 +11,7 @@ const debug = require('debug')('apphub:server:data:getApps') * @returns {Promise} */ const getApps = ( - { status, languageCode, channels = [], types = [], query }, + { status, languageCode, channels = [], types = [], query, coreApp }, knex ) => { debug('status:', status) @@ -42,6 +42,13 @@ const getApps = ( }) } + if (coreApp) { + builder.where('organisation', 'DHIS2') + } + if (coreApp === false) { + builder.whereNot('organisation', 'DHIS2') + } + if (query) { builder.where(builder => { builder.where('name', 'ilike', `%${query}%`) diff --git a/server/src/routes/v2/apps.js b/server/src/routes/v2/apps.js index 32424c721..7128e48a6 100644 --- a/server/src/routes/v2/apps.js +++ b/server/src/routes/v2/apps.js @@ -30,6 +30,9 @@ module.exports = [ ) .description('Filter by channel') .default(['stable']), + core: Joi.filter(Joi.boolean()).description( + 'Filter by core app' + ), types: Joi.filter( Joi.stringArray().items(Joi.valid(...APPTYPES)) ) @@ -47,9 +50,10 @@ module.exports = [ }, }, handler: async (request, h) => { - const channels = request.plugins.queryFilter.getFilter('channels') - .value - const types = request.plugins.queryFilter.getFilter('types').value + const queryFilter = request.plugins.queryFilter + const channels = queryFilter.getFilter('channels').value + const types = queryFilter.getFilter('types').value + const coreAppFilter = queryFilter.getFilter('core') const apps = await getApps( { @@ -58,6 +62,7 @@ module.exports = [ channels, types, query: request.query.query, + coreApp: coreAppFilter && coreAppFilter.value, }, h.context.db ) diff --git a/server/test/routes/v2/apps.js b/server/test/routes/v2/apps.js index da734651f..11075d8cd 100644 --- a/server/test/routes/v2/apps.js +++ b/server/test/routes/v2/apps.js @@ -16,6 +16,7 @@ const { expect } = require('@hapi/code') const knexConfig = require('../../../knexfile') const dbInstance = require('knex')(knexConfig) const organisations = require('../../../seeds/mock/organisations') +const appsMocks = require('../../../seeds/mock/apps') const users = require('../../../seeds/mock/users') const { init } = require('../../../src/server/init-server') const { config } = require('../../../src/server/noauth-config') @@ -70,4 +71,41 @@ describe('v2/apps', () => { expect(receivedPayload.id).to.be.string() }) }) + + describe('get apps', () => { + it('should get all approved apps', async () => { + const request = { + method: 'GET', + url: '/api/v2/apps', + } + const rejectedApp = appsMocks[2] + + const res = await server.inject(request) + expect(res.statusCode).to.equal(200) + + const apps = res.result.result + expect(apps).to.be.an.array() + expect(apps.length).to.be.min(4) // 4 seeds + expect(apps.find(a => a.id === rejectedApp)).to.be.undefined() + }) + + it('should get apps-only when core=true ', async () => { + const request = { + method: 'GET', + url: '/api/v2/apps?core=true', + } + + const res = await server.inject(request) + expect(res.statusCode).to.equal(200) + + const apps = res.result.result + expect(apps).to.be.an.array() + + const notCore = apps.filter( + a => a.developer.organisation !== 'DHIS2' + ) + + expect(notCore).to.have.length(0) + }) + }) }) From c7c44752bbaae1bd799e54e3e6427e6f8c534f55 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 21 May 2021 13:43:44 +0000 Subject: [PATCH 26/29] chore(release): cut 2.22.0 [skip ci] # [2.22.0](https://github.com/dhis2/app-hub/compare/v2.21.0...v2.22.0) (2021-05-21) ### Features * **apps:** add filter-option for core-apps ([#482](https://github.com/dhis2/app-hub/issues/482)) ([a7b27c8](https://github.com/dhis2/app-hub/commit/a7b27c855df956c319f1a4174dbde4c6f4adc3e3)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10a9147b9..4d47cee8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.22.0](https://github.com/dhis2/app-hub/compare/v2.21.0...v2.22.0) (2021-05-21) + + +### Features + +* **apps:** add filter-option for core-apps ([#482](https://github.com/dhis2/app-hub/issues/482)) ([a7b27c8](https://github.com/dhis2/app-hub/commit/a7b27c855df956c319f1a4174dbde4c6f4adc3e3)) + # [2.21.0](https://github.com/dhis2/app-hub/compare/v2.20.0...v2.21.0) (2021-05-20) diff --git a/client/package.json b/client/package.json index f196f1c3a..6a08f00dd 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.21.0", + "version": "2.22.0", "description": "The App Hub Client", "repository": "https://github.com/dhis2/app-hub", "author": "Birk Johansson ", diff --git a/package.json b/package.json index 7dbcff2eb..ad9128eae 100644 --- a/package.json +++ b/package.json @@ -36,5 +36,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.21.0" + "version": "2.22.0" } diff --git a/server/package.json b/server/package.json index db615170f..75c7e0c83 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.21.0", + "version": "2.22.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 31ac1c75f..98cabb09e 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.21.0", + "version": "2.22.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 47fb951868aafc2c8fd236b38ffeda98437e30e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9di-R=C3=A9mi=20Hashim?= <4295266+mediremi@users.noreply.github.com> Date: Tue, 25 May 2021 13:27:55 +0100 Subject: [PATCH 27/29] feat: more informative user-facing errors regarding metadata verification (#490) --- .../src/routes/v1/apps/handlers/createApp.js | 18 +++++++++++------- .../v1/apps/handlers/createAppVersion.js | 5 +++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/server/src/routes/v1/apps/handlers/createApp.js b/server/src/routes/v1/apps/handlers/createApp.js index 30c9ef414..e0e0f8b9b 100644 --- a/server/src/routes/v1/apps/handlers/createApp.js +++ b/server/src/routes/v1/apps/handlers/createApp.js @@ -132,13 +132,17 @@ module.exports = { ) const { file } = payload - verifyBundle({ - buffer: file._data, - appId: app.id, - appName: name, - version, - organisationName: organisation.name, - }) + try { + verifyBundle({ + buffer: file._data, + appId: app.id, + appName: name, + version, + organisationName: organisation.name, + }) + } catch (error) { + throw Boom.badRequest(error) + } const appUpload = saveFile( `${app.id}/${appVersion.id}`, 'app.zip', diff --git a/server/src/routes/v1/apps/handlers/createAppVersion.js b/server/src/routes/v1/apps/handlers/createAppVersion.js index cc0cd4c44..45e5433b8 100644 --- a/server/src/routes/v1/apps/handlers/createAppVersion.js +++ b/server/src/routes/v1/apps/handlers/createAppVersion.js @@ -196,7 +196,12 @@ module.exports = { version, organisationName: organisation.name, }) + } catch (err) { + await transaction.rollback() + throw Boom.badRequest(err) + } + try { await saveFile(`${appId}/${versionId}`, 'app.zip', file._data) } catch (err) { await transaction.rollback() From 8a1423584d462c29ba7825a230a6920e73009335 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 25 May 2021 12:34:20 +0000 Subject: [PATCH 28/29] chore(release): cut 2.23.0 [skip ci] # [2.23.0](https://github.com/dhis2/app-hub/compare/v2.22.0...v2.23.0) (2021-05-25) ### Features * more informative user-facing errors regarding metadata verification ([#490](https://github.com/dhis2/app-hub/issues/490)) ([47fb951](https://github.com/dhis2/app-hub/commit/47fb951868aafc2c8fd236b38ffeda98437e30e5)) --- CHANGELOG.md | 7 +++++++ client/package.json | 2 +- package.json | 2 +- server/package.json | 2 +- tools/package.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d47cee8a..3d13c7c36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [2.23.0](https://github.com/dhis2/app-hub/compare/v2.22.0...v2.23.0) (2021-05-25) + + +### Features + +* more informative user-facing errors regarding metadata verification ([#490](https://github.com/dhis2/app-hub/issues/490)) ([47fb951](https://github.com/dhis2/app-hub/commit/47fb951868aafc2c8fd236b38ffeda98437e30e5)) + # [2.22.0](https://github.com/dhis2/app-hub/compare/v2.21.0...v2.22.0) (2021-05-21) diff --git a/client/package.json b/client/package.json index 6a08f00dd..8b0a02b37 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "2.22.0", + "version": "2.23.0", "description": "The App Hub Client", "repository": "https://github.com/dhis2/app-hub", "author": "Birk Johansson ", diff --git a/package.json b/package.json index ad9128eae..452b061cd 100644 --- a/package.json +++ b/package.json @@ -36,5 +36,5 @@ "cypress-cucumber-preprocessor": { "nonGlobalStepDefinitions": true }, - "version": "2.22.0" + "version": "2.23.0" } diff --git a/server/package.json b/server/package.json index 75c7e0c83..85731296d 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "2.22.0", + "version": "2.23.0", "description": "The App Hub Server", "main": "src/main.js", "repository": "https://github.com/dhis2/app-hub", diff --git a/tools/package.json b/tools/package.json index 98cabb09e..2b538cb6e 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,6 +1,6 @@ { "name": "tools", - "version": "2.22.0", + "version": "2.23.0", "description": "", "main": "clone.js", "repository": "https://github.com/dhis2/app-hub", From 3136fdeee6243c2f7e3babdf8a6ac89e66a78f09 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Wed, 26 May 2021 10:43:49 +0200 Subject: [PATCH 29/29] chore(workflow): remove redesign-branch publish (#492) --- .github/workflows/docker-publish.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index c44345298..48170fbe5 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -5,7 +5,6 @@ on: branches: - master - next - - feat/ui-redesign env: ECR_REPOSITORY: dhis2/app-hub @@ -60,7 +59,6 @@ jobs: [ "$VERSION" == "master" ] && VERSION=latest [ "$VERSION" == "next" ] && VERSION=staging - [ "$VERSION" == "ui-redesign" ] && VERSION=redesign echo VERSION=$VERSION @@ -108,17 +106,5 @@ jobs: region: ${{ env.AWS_REGION }} deployment_package: deploy.zip - - name: Deploy to Redesign - if: steps.build-image.outputs.version == 'redesign' - uses: einaregilsson/beanstalk-deploy@v6 - with: - aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - application_name: app-hub - environment_name: redesign - version_label: app-hub-redesign-${{ github.run_id }}_${{ github.run_number}} - region: ${{ env.AWS_REGION }} - deployment_package: deploy.zip - - name: Publish to GitHub run: npx @dhis2/cli-utils release