diff --git a/.editorconfig b/.editorconfig index 4fb74f2b88..d4e6ee36ed 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,7 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true -[*.js] +[*.{js,ts}] indent_style = space indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js index 3a0aefe583..8cd8e7c0ce 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,15 +1,18 @@ module.exports = { - parser: "babel-eslint", - extends: "@trbl", + parser: 'babel-eslint', + extends: '@trbl', + ignorePatterns: [ + '/**/*.d.ts' + ], rules: { - "import/no-unresolved": [ + 'import/no-unresolved': [ 2, { ignore: [ 'payload/config', 'payload/unsanitizedConfig', - ] - } + ], + }, ], 'no-underscore-dangle': 'off', }, diff --git a/demo/payload.config.js b/demo/payload.config.js index 0db7c9c9f4..4e81e04cd6 100644 --- a/demo/payload.config.js +++ b/demo/payload.config.js @@ -43,6 +43,7 @@ module.exports = { }, }, email: { + transport: 'mock', fromName: 'Payload', fromAddress: 'hello@payloadcms.com', }, diff --git a/demo/server.js b/demo/server.js index 13ff99eda4..9781723d56 100644 --- a/demo/server.js +++ b/demo/server.js @@ -9,9 +9,6 @@ const expressApp = express(); expressApp.use('/static', express.static(path.resolve(__dirname, 'client/static'))); payload.init({ - email: { - transport: 'mock', - }, secret: 'SECRET_KEY', mongoURL: 'mongodb://localhost/payload', express: expressApp, @@ -39,11 +36,6 @@ exports.start = (cb) => { const server = expressApp.listen(3000, async () => { logger.info(`listening on ${3000}...`); - const creds = await payload.getMockEmailCredentials(); - logger.info(`Mock email account username: ${creds.user}`); - logger.info(`Mock email account password: ${creds.pass}`); - logger.info(`Log in to mock email provider at ${creds.web}`); - if (cb) cb(); }); diff --git a/errors.js b/errors.js index da53a253f3..7a06ef8053 100644 --- a/errors.js +++ b/errors.js @@ -1,5 +1,6 @@ -const { APIError } = require('./src/errors'); +const { APIError, Forbidden } = require('./src/errors'); module.exports = { APIError, + Forbidden, }; diff --git a/package.json b/package.json index 170122d7d0..c7af9d8b42 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,7 @@ "react-router-navigation-prompt": "^1.8.11", "react-select": "^3.0.8", "react-simple-code-editor": "^0.11.0", + "react-toastify": "^6.1.0", "sanitize-filename": "^1.6.3", "sass": "^1.27.0", "sass-loader": "7.1.0", diff --git a/payload.d.ts b/payload.d.ts index c937b0ef2c..85ec54d9aa 100644 --- a/payload.d.ts +++ b/payload.d.ts @@ -130,7 +130,6 @@ declare module "@payloadcms/payload/types" { admin?: { useAsTitle?: string; defaultColumns?: string[]; - disableScrollOnSuccess?: boolean; components?: any; }, hooks?: { @@ -215,3 +214,13 @@ declare module "@payloadcms/payload/types" { webpack?: (config: any) => any; } } + +declare module "@payloadcms/payload/src/utilities/sanitizeConfig" { + import { PayloadConfig } from '@payloadcms/payload/types'; + + export type SanitizeConfig = (config: PayloadConfig) => PayloadConfig; + + const sanitizeConfig: SanitizeConfig; + + export default sanitizeConfig; +} diff --git a/src/admin/components/elements/DeleteDocument/index.js b/src/admin/components/elements/DeleteDocument/index.js index 8016e6290f..3fd192b7ae 100644 --- a/src/admin/components/elements/DeleteDocument/index.js +++ b/src/admin/components/elements/DeleteDocument/index.js @@ -1,5 +1,6 @@ import React, { useState, useCallback } from 'react'; import PropTypes from 'prop-types'; +import { toast } from 'react-toastify'; import { useHistory } from 'react-router-dom'; import { Modal, useModal } from '@faceless-ui/modal'; import { useConfig } from '../../providers/Config'; @@ -8,7 +9,6 @@ import MinimalTemplate from '../../templates/Minimal'; import { useForm } from '../../forms/Form/context'; import useTitle from '../../../hooks/useTitle'; import { requests } from '../../../api'; -import { useStatusList } from '../Status'; import './index.scss'; @@ -30,7 +30,6 @@ const DeleteDocument = (props) => { } = props; const { serverURL, routes: { api, admin } } = useConfig(); - const { replaceStatus } = useStatusList(); const { setModified } = useForm(); const [deleting, setDeleting] = useState(false); const { closeAll, toggle } = useModal(); @@ -41,11 +40,8 @@ const DeleteDocument = (props) => { const modalSlug = `delete-${id}`; const addDefaultError = useCallback(() => { - replaceStatus([{ - message: `There was an error while deleting ${title}. Please check your connection and try again.`, - type: 'error', - }]); - }, [replaceStatus, title]); + toast.error(`There was an error while deleting ${title}. Please check your connection and try again.`); + }, [title]); const handleDelete = useCallback(() => { setDeleting(true); @@ -72,7 +68,7 @@ const DeleteDocument = (props) => { closeAll(); if (json.errors) { - replaceStatus(json.errors); + toast.error(json.errors); } addDefaultError(); return false; @@ -80,7 +76,7 @@ const DeleteDocument = (props) => { return addDefaultError(); } }); - }, [addDefaultError, closeAll, history, id, replaceStatus, singular, slug, title, admin, api, serverURL, setModified]); + }, [addDefaultError, closeAll, history, id, singular, slug, title, admin, api, serverURL, setModified]); if (id) { return ( diff --git a/src/admin/components/elements/GenerateConfirmation/index.js b/src/admin/components/elements/GenerateConfirmation/index.js index 9704d1c6b2..091da4f424 100644 --- a/src/admin/components/elements/GenerateConfirmation/index.js +++ b/src/admin/components/elements/GenerateConfirmation/index.js @@ -1,9 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { toast } from 'react-toastify'; import { Modal, useModal } from '@faceless-ui/modal'; import Button from '../Button'; import MinimalTemplate from '../../templates/Minimal'; -import { useStatusList } from '../Status'; import './index.scss'; @@ -16,17 +16,13 @@ const GenerateConfirmation = (props) => { } = props; const { toggle } = useModal(); - const { replaceStatus } = useStatusList(); const modalSlug = 'generate-confirmation'; const handleGenerate = () => { setKey(); toggle(modalSlug); - replaceStatus([{ - message: 'New API Key Generated.', - type: 'success', - }]); + toast.success('New API Key Generated.', { autoClose: 3000 }); highlightField(true); }; diff --git a/src/admin/components/elements/Status/index.js b/src/admin/components/elements/Status/index.js deleted file mode 100644 index b15c7be7c0..0000000000 --- a/src/admin/components/elements/Status/index.js +++ /dev/null @@ -1,101 +0,0 @@ -import React, { - useReducer, createContext, useContext, useEffect, useCallback, -} from 'react'; -import { useLocation } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import X from '../../icons/X'; -import reducer from './reducer'; -import './index.scss'; - -const baseClass = 'status-list'; - -const Context = createContext({}); - -const useStatusList = () => useContext(Context); - -const StatusListProvider = ({ children }) => { - const [statusList, dispatchStatus] = useReducer(reducer, []); - const { pathname, state } = useLocation(); - - const removeStatus = useCallback((i) => dispatchStatus({ type: 'REMOVE', payload: i }), []); - const addStatus = useCallback((status) => dispatchStatus({ type: 'ADD', payload: status }), []); - const clearStatus = useCallback(() => dispatchStatus({ type: 'CLEAR' }), []); - const replaceStatus = useCallback((status) => dispatchStatus({ type: 'REPLACE', payload: status }), []); - - useEffect(() => { - if (state && state.status) { - if (Array.isArray(state.status)) { - replaceStatus(state.status); - } else { - replaceStatus([state.status]); - } - } else { - clearStatus(); - } - }, [addStatus, replaceStatus, clearStatus, state, pathname]); - - return ( - - {children} - - ); -}; - -StatusListProvider.propTypes = { - children: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.node), - PropTypes.node, - ]).isRequired, -}; - -const StatusList = () => { - const { statusList, removeStatus } = useStatusList(); - - if (statusList.length > 0) { - return ( - - ); - } - - return null; -}; - -export { - StatusListProvider, - useStatusList, -}; - -export default StatusList; diff --git a/src/admin/components/elements/Status/index.scss b/src/admin/components/elements/Status/index.scss deleted file mode 100644 index 883e1c94de..0000000000 --- a/src/admin/components/elements/Status/index.scss +++ /dev/null @@ -1,47 +0,0 @@ -@import '../../../scss/styles.scss'; - -.status-list { - position: relative; - z-index: $z-status; - list-style: none; - padding: 0; - margin: 0; - - li { - background: $color-green; - color: $color-dark-gray; - padding: base(.5) $baseline; - margin-bottom: 1px; - display: flex; - justify-content: space-between; - } - - button { - @extend %btn-reset; - cursor: pointer; - - svg { - width: base(1); - height: base(1); - } - - &:hover { - opacity: .5; - } - - &:active, - &:focus { - outline: none; - border: 0; - } - } - - li.status-list__status--error { - background: $color-red; - color: white; - - button svg { - @include color-svg(white); - } - } -} diff --git a/src/admin/components/elements/Status/reducer.js b/src/admin/components/elements/Status/reducer.js deleted file mode 100644 index 47a05ccbc5..0000000000 --- a/src/admin/components/elements/Status/reducer.js +++ /dev/null @@ -1,32 +0,0 @@ -const statusReducer = (state, action) => { - switch (action.type) { - case 'ADD': { - const newState = [ - ...state, - action.payload, - ]; - - return newState; - } - - - case 'REMOVE': { - const statusList = [...state]; - statusList.splice(action.payload, 1); - return statusList; - } - - case 'CLEAR': { - return []; - } - - case 'REPLACE': { - return action.payload; - } - - default: - return state; - } -}; - -export default statusReducer; diff --git a/src/admin/components/forms/Form/index.js b/src/admin/components/forms/Form/index.js index 9cce82bcf5..66749b033a 100644 --- a/src/admin/components/forms/Form/index.js +++ b/src/admin/components/forms/Form/index.js @@ -4,8 +4,8 @@ import React, { import { objectToFormData } from 'object-to-formdata'; import { useHistory } from 'react-router-dom'; import PropTypes from 'prop-types'; +import { toast } from 'react-toastify'; import { useLocale } from '../../utilities/Locale'; -import { useStatusList } from '../../elements/Status'; import { requests } from '../../../api'; import useThrottledEffect from '../../../hooks/useThrottledEffect'; import { useAuth } from '../../providers/Authentication'; @@ -38,14 +38,12 @@ const Form = (props) => { disableSuccessStatus, initialState, // fully formed initial field state initialData, // values only, paths are required as key - form should build initial state as convenience - disableScrollOnSuccess, waitForAutocomplete, log, } = props; const history = useHistory(); const locale = useLocale(); - const { replaceStatus, addStatus, clearStatus } = useStatusList(); const { refreshCookie } = useAuth(); const [modified, setModified] = useState(false); @@ -111,17 +109,7 @@ const Form = (props) => { // If not valid, prevent submission if (!isValid) { - addStatus({ - message: 'Please correct the fields below.', - type: 'error', - }); - - if (!disableScrollOnSuccess) { - window.scrollTo({ - top: 0, - behavior: 'smooth', - }); - } + toast.error('Please correct invalid fields.'); return false; } @@ -131,13 +119,6 @@ const Form = (props) => { return onSubmit(fields, reduceFieldsToValues(fields)); } - if (!disableScrollOnSuccess) { - window.scrollTo({ - top: 0, - behavior: 'smooth', - }); - } - const formData = contextRef.current.createFormData(); try { @@ -151,7 +132,6 @@ const Form = (props) => { setProcessing(false); - clearStatus(); const contentType = res.headers.get('content-type'); const isJSON = contentType && contentType.indexOf('application/json') !== -1; @@ -182,20 +162,13 @@ const Form = (props) => { history.push(destination); } else if (!disableSuccessStatus) { - replaceStatus([{ - message: json.message || 'Submission successful.', - type: 'success', - disappear: 3000, - }]); + toast.success(json.message || 'Submission successful.', { autoClose: 3000 }); } } else { contextRef.current = { ...contextRef.current }; // triggers rerender of all components that subscribe to form if (json.message) { - addStatus({ - message: json.message, - type: 'error', - }); + toast.error(json.message); return json; } @@ -218,10 +191,7 @@ const Form = (props) => { }); nonFieldErrors.forEach((err) => { - addStatus({ - message: err.message || 'An unknown error occurred.', - type: 'error', - }); + toast.error(err.message || 'An unknown error occurred.'); }); return json; @@ -229,25 +199,17 @@ const Form = (props) => { const message = errorMessages[res.status] || 'An unknown error occurrred.'; - addStatus({ - message, - type: 'error', - }); + toast.error(message); } return json; } catch (err) { setProcessing(false); - return addStatus({ - message: err, - type: 'error', - }); + toast.error(err); } }, [ action, - addStatus, - clearStatus, disableSuccessStatus, disabled, fields, @@ -257,8 +219,6 @@ const Form = (props) => { onSubmit, onSuccess, redirect, - replaceStatus, - disableScrollOnSuccess, waitForAutocomplete, ]); @@ -366,7 +326,6 @@ Form.defaultProps = { disableSuccessStatus: false, disabled: false, initialState: undefined, - disableScrollOnSuccess: false, waitForAutocomplete: false, initialData: undefined, log: false, @@ -387,7 +346,6 @@ Form.propTypes = { redirect: PropTypes.string, disabled: PropTypes.bool, initialState: PropTypes.shape({}), - disableScrollOnSuccess: PropTypes.bool, waitForAutocomplete: PropTypes.bool, initialData: PropTypes.shape({}), log: PropTypes.bool, diff --git a/src/admin/components/forms/field-types/Upload/Add/index.js b/src/admin/components/forms/field-types/Upload/Add/index.js index 6e1580e700..9e6bf941ae 100644 --- a/src/admin/components/forms/field-types/Upload/Add/index.js +++ b/src/admin/components/forms/field-types/Upload/Add/index.js @@ -45,7 +45,6 @@ const AddUploadModal = (props) => { action={`${serverURL}${api}/${collection.slug}`} onSuccess={onSuccess} disableSuccessStatus - disableScrollOnSuccess >

diff --git a/src/admin/components/views/Account/Default.js b/src/admin/components/views/Account/Default.js index f1647b524b..fc78a719b6 100644 --- a/src/admin/components/views/Account/Default.js +++ b/src/admin/components/views/Account/Default.js @@ -29,6 +29,7 @@ const DefaultAccount = (props) => { apiURL, initialState, isLoading, + action, } = props; const { @@ -42,7 +43,7 @@ const DefaultAccount = (props) => { auth, } = collection; - const { serverURL, routes: { api, admin } } = useConfig(); + const { routes: { admin } } = useConfig(); const classes = [ baseClass, @@ -53,7 +54,7 @@ const DefaultAccount = (props) => {
@@ -170,6 +171,7 @@ DefaultAccount.defaultProps = { DefaultAccount.propTypes = { hasSavePermission: PropTypes.bool.isRequired, apiURL: PropTypes.string.isRequired, + action: PropTypes.string.isRequired, collection: PropTypes.shape({ labels: PropTypes.shape({ plural: PropTypes.string, diff --git a/src/admin/components/views/Account/index.js b/src/admin/components/views/Account/index.js index 5dc4847702..b9232e771f 100644 --- a/src/admin/components/views/Account/index.js +++ b/src/admin/components/views/Account/index.js @@ -4,6 +4,7 @@ import { useConfig } from '../../providers/Config'; import { useStepNav } from '../../elements/StepNav'; import { useAuth } from '../../providers/Authentication'; import usePayloadAPI from '../../../hooks/usePayloadAPI'; +import { useLocale } from '../../utilities/Locale'; import DefaultAccount from './Default'; import buildStateFromSchema from '../../forms/Form/buildStateFromSchema'; import RenderCustomComponent from '../../utilities/RenderCustomComponent'; @@ -11,6 +12,7 @@ import { NegativeFieldGutterProvider } from '../../forms/FieldTypeGutter/context const AccountView = () => { const { state: locationState } = useLocation(); + const locale = useLocale(); const { setStepNav } = useStepNav(); const { user, permissions } = useAuth(); const [initialState, setInitialState] = useState({}); @@ -40,6 +42,8 @@ const AccountView = () => { const dataToRender = locationState?.data || data; const apiURL = `${serverURL}${api}/${user.collection}/${data?.id}`; + const action = `${serverURL}${api}/${user.collection}/${data?.id}?locale=${locale}&depth=0`; + useEffect(() => { const nav = [{ label: 'Account', @@ -63,6 +67,7 @@ const AccountView = () => { DefaultComponent={DefaultAccount} CustomComponent={CustomAccount} componentProps={{ + action, data, collection, permissions: collectionPermissions, diff --git a/src/admin/components/views/ForgotPassword/index.js b/src/admin/components/views/ForgotPassword/index.js index e8a49dd4c0..fec30ddd63 100644 --- a/src/admin/components/views/ForgotPassword/index.js +++ b/src/admin/components/views/ForgotPassword/index.js @@ -1,8 +1,8 @@ import React, { useState } from 'react'; import { Link } from 'react-router-dom'; +import { toast } from 'react-toastify'; import { useConfig } from '../../providers/Config'; import MinimalTemplate from '../../templates/Minimal'; -import StatusList, { useStatusList } from '../../elements/Status'; import Form from '../../forms/Form'; import Email from '../../forms/field-types/Email'; import FormSubmit from '../../forms/Submit'; @@ -15,7 +15,6 @@ import './index.scss'; const baseClass = 'forgot-password'; const ForgotPassword = () => { - const { addStatus } = useStatusList(); const [hasSubmitted, setHasSubmitted] = useState(false); const { user } = useAuth(); const { @@ -32,10 +31,7 @@ const ForgotPassword = () => { .then(() => { setHasSubmitted(true); }, () => { - addStatus({ - type: 'error', - message: 'The email provided is not valid.', - }); + toast.error('The email provided is not valid.'); }); }; @@ -81,7 +77,6 @@ const ForgotPassword = () => { return ( - { } = props; const { - slug, fields, preview, label, @@ -122,7 +121,6 @@ DefaultGlobalView.defaultProps = { DefaultGlobalView.propTypes = { global: PropTypes.shape({ label: PropTypes.string.isRequired, - slug: PropTypes.string, fields: PropTypes.arrayOf(PropTypes.shape({})), preview: PropTypes.func, }).isRequired, diff --git a/src/admin/components/views/Global/index.js b/src/admin/components/views/Global/index.js index 5d66b493be..370a85f854 100644 --- a/src/admin/components/views/Global/index.js +++ b/src/admin/components/views/Global/index.js @@ -91,7 +91,7 @@ const GlobalView = (props) => { global, onSave, apiURL: `${serverURL}${api}/globals/${slug}?depth=0`, - action: `${serverURL}${api}/globals/${slug}?locale=${locale}`, + action: `${serverURL}${api}/globals/${slug}?locale=${locale}&depth=0`, }} /> diff --git a/src/admin/components/views/collections/Edit/Auth/index.js b/src/admin/components/views/collections/Edit/Auth/index.js index 9fc9f2a08e..a1a248dcff 100644 --- a/src/admin/components/views/collections/Edit/Auth/index.js +++ b/src/admin/components/views/collections/Edit/Auth/index.js @@ -1,5 +1,6 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; +import { toast } from 'react-toastify'; import Email from '../../../../forms/field-types/Email'; import Password from '../../../../forms/field-types/Password'; import Checkbox from '../../../../forms/field-types/Checkbox'; @@ -7,7 +8,6 @@ import Button from '../../../../elements/Button'; import ConfirmPassword from '../../../../forms/field-types/ConfirmPassword'; import { useFormFields, useFormModified } from '../../../../forms/Form/context'; import { useConfig } from '../../../../providers/Config'; -import { useStatusList } from '../../../../elements/Status'; import APIKey from './APIKey'; @@ -20,7 +20,6 @@ const Auth = (props) => { const [changingPassword, setChangingPassword] = useState(requirePassword); const { getField } = useFormFields(); const modified = useFormModified(); - const { replaceStatus } = useStatusList(); const enableAPIKey = getField('enableAPIKey'); @@ -50,15 +49,9 @@ const Auth = (props) => { }); if (response.status === 200) { - replaceStatus([{ - message: 'Successfully unlocked', - type: 'success', - }]); + toast.success('Successfully unlocked', { autoClose: 3000 }); } else { - replaceStatus([{ - message: 'Unable to unlock', - type: 'error', - }]); + toast.error('Successfully unlocked'); } }, [replaceStatus, serverURL, api, slug, email]); diff --git a/src/admin/components/views/collections/Edit/Default.js b/src/admin/components/views/collections/Edit/Default.js index bd7ee36141..9c73c37eb5 100644 --- a/src/admin/components/views/collections/Edit/Default.js +++ b/src/admin/components/views/collections/Edit/Default.js @@ -46,7 +46,6 @@ const DefaultEditView = (props) => { admin: { useAsTitle, disableDuplicate, - disableScrollOnSuccess, }, timestamps, preview, @@ -68,7 +67,6 @@ const DefaultEditView = (props) => { onSuccess={onSave} disabled={!hasSavePermission} initialState={initialState} - disableScrollOnSuccess={disableScrollOnSuccess} >
{ const { collection, isEditing } = props; @@ -30,6 +31,7 @@ const EditView = (props) => { fields, } = collection; + const locale = useLocale(); const { serverURL, routes: { admin, api } } = useConfig(); const { params: { id } = {} } = useRouteMatch(); const { state: locationState } = useLocation(); @@ -92,11 +94,9 @@ const EditView = (props) => { const collectionPermissions = permissions?.[slug]; const apiURL = `${serverURL}${api}/${slug}/${id}`; - let action = `${serverURL}${api}/${slug}${isEditing ? `/${id}` : ''}`; + const action = `${serverURL}${api}/${slug}${isEditing ? `/${id}` : ''}?locale=${locale}&depth=0`; const hasSavePermission = (isEditing && collectionPermissions?.update?.permission) || (!isEditing && collectionPermissions?.create?.permission); - action += '?depth=0'; - return ( { }; return ( - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + + + ); }; diff --git a/src/admin/scss/app.scss b/src/admin/scss/app.scss index 1165ecfdaa..f9b53ead92 100644 --- a/src/admin/scss/app.scss +++ b/src/admin/scss/app.scss @@ -1,5 +1,6 @@ @import 'fonts'; @import 'styles'; +@import './toastify.scss'; :root { --breakpoint-xs-width : #{$breakpoint-xs-width}; diff --git a/src/admin/scss/toastify.scss b/src/admin/scss/toastify.scss new file mode 100644 index 0000000000..c6dd3a5fe7 --- /dev/null +++ b/src/admin/scss/toastify.scss @@ -0,0 +1,37 @@ +@import 'vars'; +@import '~react-toastify/dist/ReactToastify.css'; + +.Toastify { + .Toastify__toast-container { + left: base(5); + transform: none; + right: base(5); + width: auto; + } + + .Toastify__toast { + padding: base(.5); + border-radius: $style-radius-m; + font-weight: 600; + } + + .Toastify__close-button { + align-self: center; + } + + .Toastify__toast--success { + color: $color-dark-gray; + } + + .Toastify__close-button--success { + color: $color-dark-gray; + } + + .Toastify__toast--success { + background: $color-green; + } + + .Toastify__toast--error { + background: $color-red; + } +} diff --git a/src/email/build.js b/src/email/build.js index f4995a4dd8..070f5b54f6 100644 --- a/src/email/build.js +++ b/src/email/build.js @@ -5,8 +5,13 @@ const mockHandler = require('./mockHandler'); async function buildEmail() { if (!this.config.email.transport || this.config.email.transport === 'mock') { logger.info('E-mail configured with mock configuration'); - // TODO: Log mock e-mail credentials here as well? const mockAccount = await mockHandler(this.config.email); + if (this.config.email.transport === 'mock') { + const { account: { web, user, pass } } = mockAccount; + logger.info(`Log into mock email provider at ${web}`); + logger.info(`Mock email account username: ${user}`); + logger.info(`Mock email account password: ${pass}`); + } return mockAccount; } diff --git a/src/errors/InvalidConfiguration.js b/src/errors/InvalidConfiguration.js new file mode 100644 index 0000000000..9943aa9543 --- /dev/null +++ b/src/errors/InvalidConfiguration.js @@ -0,0 +1,10 @@ +const httpStatus = require('http-status'); +const APIError = require('./APIError'); + +class InvalidConfiguration extends APIError { + constructor(message, results) { + super(message, httpStatus.INTERNAL_SERVER_ERROR, results); + } +} + +module.exports = InvalidConfiguration; diff --git a/src/errors/index.js b/src/errors/index.js index 0f3239ab6c..6f2f2443a0 100644 --- a/src/errors/index.js +++ b/src/errors/index.js @@ -7,6 +7,7 @@ const errorHandler = require('../express/middleware/errorHandler'); const FileUploadError = require('./FileUploadError'); const Forbidden = require('./Forbidden'); const LockedAuth = require('./LockedAuth'); +const InvalidConfiguration = require('./InvalidConfiguration'); const InvalidFieldRelationship = require('./InvalidFieldRelationship'); const MissingCollectionLabel = require('./MissingCollectionLabel'); const MissingFieldInputOptions = require('./MissingFieldInputOptions'); @@ -26,6 +27,7 @@ module.exports = { FileUploadError, Forbidden, LockedAuth, + InvalidConfiguration, InvalidFieldRelationship, MissingCollectionLabel, MissingFieldInputOptions, diff --git a/src/fields/accessPromise.js b/src/fields/accessPromise.js index fde7650a05..20af41b0e9 100644 --- a/src/fields/accessPromise.js +++ b/src/fields/accessPromise.js @@ -16,10 +16,19 @@ const accessPromise = async ({ }) => { const resultingData = data; - if (field.access && field.access[operation]) { - const result = overrideAccess ? true : await field.access[operation]({ req, id }); + let accessOperation; - if (!result && operation === 'update' && originalDoc[field.name] !== undefined) { + if (hook === 'afterRead') { + accessOperation = 'read'; + } else if (hook === 'beforeValidate') { + if (operation === 'update') accessOperation = 'update'; + if (operation === 'create') accessOperation = 'create'; + } + + if (field.access && field.access[accessOperation]) { + const result = overrideAccess ? true : await field.access[accessOperation]({ req, id }); + + if (!result && accessOperation === 'update' && originalDoc[field.name] !== undefined) { resultingData[field.name] = originalDoc[field.name]; } else if (!result) { delete resultingData[field.name]; diff --git a/src/fields/hookPromise.js b/src/fields/hookPromise.js index 028d245f7c..eb988c8d32 100644 --- a/src/fields/hookPromise.js +++ b/src/fields/hookPromise.js @@ -23,7 +23,7 @@ const hookPromise = async ({ data: fullData, operation, req, - }); + }) || data[field.name]; if (hookedValue !== undefined) { resultingData[field.name] = hookedValue; diff --git a/src/fields/validationPromise.js b/src/fields/validationPromise.js index ee2d712207..0567c1a66a 100644 --- a/src/fields/validationPromise.js +++ b/src/fields/validationPromise.js @@ -6,7 +6,7 @@ const validationPromise = async ({ field, path, }) => { - if (hook === 'beforeValidate') return true; + if (hook !== 'beforeChange') return true; const hasCondition = field.admin && field.admin.condition; const shouldValidate = field.validate && !hasCondition; diff --git a/src/utilities/sanitizeConfig.js b/src/utilities/sanitizeConfig.js index 314a284520..b6178e9a10 100644 --- a/src/utilities/sanitizeConfig.js +++ b/src/utilities/sanitizeConfig.js @@ -35,6 +35,11 @@ const sanitizeConfig = (config) => { if (!sanitizedConfig.admin.user) { sanitizedConfig.admin.user = 'users'; sanitizedConfig.collections.push(defaultUser); + } else if (!sanitizedConfig.collections + .filter((c) => c.auth !== undefined) + .map((c) => c.slug) + .includes(sanitizedConfig.admin.user)) { + throw new InvalidConfiguration(`${sanitizedConfig.admin.user} is not a valid admin user collection`); } sanitizedConfig.email = config.email || {}; diff --git a/yarn.lock b/yarn.lock index ca132aa016..c1364c23d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -912,7 +912,7 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -1109,10 +1109,10 @@ "@uifabric/set-version" "^7.0.23" tslib "^1.10.0" -"@fluentui/theme@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-1.6.0.tgz#c1c25543438ce3d0098e33840fdfc1edad6ff2cb" - integrity sha512-X+uJx7+9ChfM0SAq+eDLgL9t65ZA8NAc1Ifrw4eek6cS3c1eY95/tgf1EkX+hOE9+oIuEATujM9THzk+4yd1VQ== +"@fluentui/theme@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-1.7.0.tgz#822adcc4b0c9cc057984b4ada21c30856907a8e6" + integrity sha512-pzqDZC2bVD6/S45Bnve4wmrXi4cN7XiCr+OhzvgmoQfDkm5vyXsa82/cVtif/zy1OFU96S9zOTtt3e+QQuGUUg== dependencies: "@uifabric/merge-styles" "^7.19.1" "@uifabric/set-version" "^7.0.23" @@ -1341,9 +1341,9 @@ chalk "^4.0.0" "@microsoft/load-themed-styles@^1.10.26": - version "1.10.126" - resolved "https://registry.yarnpkg.com/@microsoft/load-themed-styles/-/load-themed-styles-1.10.126.tgz#5dc92f5be0dcaaa3bc27b5d9fd2f53012301141f" - integrity sha512-6GoapdGJPmWq6WChTaImAZ6UjuPb2FWHeP/pTEHw6Dz+d4/4TnyWcVR9uDLx+8n6xn3ZpU6OtW0FEGzNNa+TUw== + version "1.10.136" + resolved "https://registry.yarnpkg.com/@microsoft/load-themed-styles/-/load-themed-styles-1.10.136.tgz#67ee0a4a7787b83baf63c0f6a5db8c4e61663e7f" + integrity sha512-D8wWUiW7HQKFp4Qgy5GsDvEymKew/4uK+4dSWSO/+6LfSI15kqDNS7g4Nf/VxL5FBmjwXqQV1d59ucgWiKUjJg== "@npmcli/move-file@^1.0.1": version "1.0.1" @@ -1364,24 +1364,24 @@ dependencies: type-detect "4.0.8" -"@testing-library/dom@^7.26.4": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.26.5.tgz#804a74fc893bf6da1a7970dbca7b94c2bbfe983d" - integrity sha512-2v/fv0s4keQjJIcD4bjfJMFtvxz5icartxUWdIZVNJR539WD9oxVrvIAPw+3Ydg4RLgxt0rvQx3L9cAjCci0Kg== +"@testing-library/dom@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.27.1.tgz#b760182513357e4448a8461f9565d733a88d71d0" + integrity sha512-AF56RoeUU8bO4DOvLyMI44H3O1LVKZQi2D/m5fNDr+iR4drfOFikTr26hT6IY7YG+l8g69FXsHERa+uThaYYQg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.10.3" + "@babel/runtime" "^7.12.5" "@types/aria-query" "^4.2.0" aria-query "^4.2.2" chalk "^4.1.0" - dom-accessibility-api "^0.5.1" + dom-accessibility-api "^0.5.4" lz-string "^1.4.4" - pretty-format "^26.4.2" + pretty-format "^26.6.2" "@testing-library/jest-dom@^5.11.4": - version "5.11.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.5.tgz#44010f37f4b1e15f9d433963b515db0b05182fc8" - integrity sha512-XI+ClHR864i6p2kRCEyhvpVejuer+ObVUF4cjCvRSF88eOMIfqw7RoS9+qoRhyigGswMfT64L6Nt0Ufotxbwtg== + version "5.11.6" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.6.tgz#782940e82e5cd17bc0a36f15156ba16f3570ac81" + integrity sha512-cVZyUNRWwUKI0++yepYpYX7uhrP398I+tGz4zOlLVlUYnZS+Svuxv4fwLeCIy7TnBYKXUaOlQr3vopxL8ZfEnA== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" @@ -1393,12 +1393,12 @@ redent "^3.0.0" "@testing-library/react@^11.0.4": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.1.1.tgz#226d8dc7491b702fcaac2d7d88d42892e655893a" - integrity sha512-DT/P2opE9o4NWCd/oIL73b6VF/Xk9AY8iYSstKfz9cXw0XYPQ5IhA/cuYfoN9nU+mAynW8DpAVfEWdM6e7zF6g== + version "11.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.1.tgz#01b3d2dd5768ac27402b5d7e41c87e605be3c326" + integrity sha512-/rKucr9p/mhMongaeTXwgIRfDnsAUu6LbfN+moNUn2oU0Kw5a7inN5vGvPWv7Ef0YndpERAfODjeseUIlhzRHw== dependencies: - "@babel/runtime" "^7.12.1" - "@testing-library/dom" "^7.26.4" + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^7.27.1" "@tippyjs/react@^4.0.2": version "4.2.0" @@ -1440,9 +1440,9 @@ "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214" - integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1532,9 +1532,9 @@ integrity sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg== "@types/node@*": - version "14.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f" - integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw== + version "14.14.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.8.tgz#2127bd81949a95c8b7d3240f3254352d72563aec" + integrity sha512-z/5Yd59dCKI5kbxauAJgw6dLPzW+TNOItNE00PkpzNwUIEwdj/Lsqwq94H5DdYBX7C13aRA0CY32BK76+neEUA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1584,9 +1584,9 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^15.0.0": - version "15.0.9" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.9.tgz#524cd7998fe810cdb02f26101b699cccd156ff19" - integrity sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g== + version "15.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.10.tgz#0fe3c8173a0d5c3e780b389050140c3f5ea6ea74" + integrity sha512-z8PNtlhrj7eJNLmrAivM7rjBESG6JwC5xP3RVk12i/8HVP7Xnx/sEmERnRImyEuUaJfO942X0qMOYsoupaJbZQ== dependencies: "@types/yargs-parser" "*" @@ -1653,11 +1653,11 @@ tslib "^1.10.0" "@uifabric/styling@^7.12.11": - version "7.16.17" - resolved "https://registry.yarnpkg.com/@uifabric/styling/-/styling-7.16.17.tgz#e4f6441f179200a747621a464557af4fcc8e7d1f" - integrity sha512-9TZP5npZopaQUkb7V418bu2OzqjL+4uov9n59Kh/Ll2Bq9WyWg/kngGUMX793gxjOMy9w2IUEd2LN3odM05OlQ== + version "7.16.18" + resolved "https://registry.yarnpkg.com/@uifabric/styling/-/styling-7.16.18.tgz#e3bcf130f4360ba5dfe078616498164f0423dbdc" + integrity sha512-jINFRMWfSIOZ4H29YNBHtwZU4f8JFprnyBX2E0Wq9rjqRzgcmdYbN2yn88gym6aC3houSDcYM0rdfG4ETjRQSA== dependencies: - "@fluentui/theme" "^1.6.0" + "@fluentui/theme" "^1.7.0" "@microsoft/load-themed-styles" "^1.10.26" "@uifabric/merge-styles" "^7.19.1" "@uifabric/set-version" "^7.0.23" @@ -2115,20 +2115,22 @@ array-unique@^0.3.2: integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + 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.17.0-next.1" + es-abstract "^1.18.0-next.1" array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + 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.17.0-next.1" + es-abstract "^1.18.0-next.1" function-bind "^1.1.1" asap@^2.0.0: @@ -2249,9 +2251,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axe-core@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.0.2.tgz#c7cf7378378a51fcd272d3c09668002a4990b1cb" - integrity sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA== + version "4.1.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.0.tgz#93d395e6262ecdde5cb52a5d06533d0a0c7bb4cd" + integrity sha512-9atDIOTDLsWL+1GbBec6omflaT5Cxh88J0GtJtGfCVIXpI02rXHkju59W5mMqWa7eiC5OR168v3TK3kUKBW98g== axobject-query@^2.2.0: version "2.2.0" @@ -2308,13 +2310,13 @@ babel-jest@^26.3.0: slash "^3.0.0" babel-loader@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + version "8.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.1.tgz#e53313254677e86f27536f5071d807e01d24ec00" + integrity sha512-dMF8sb2KQ8kJl21GUjkW1HWmcsL39GOV5vnzjqrCzEPNY0S0UfMLnumidiwIajDSBmKhYf5iRW+HXaM4cvCKBw== dependencies: find-cache-dir "^2.1.0" loader-utils "^1.4.0" - mkdirp "^0.5.3" + make-dir "^2.1.0" pify "^4.0.1" schema-utils "^2.6.5" @@ -2452,9 +2454,9 @@ balanced-match@^1.0.0: integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2, base64-js@^1.3.1: - 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== + 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" @@ -2552,7 +2554,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== -bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.1.1: version "5.1.3" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== @@ -2681,11 +2683,11 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -2711,14 +2713,15 @@ browserify-zlib@^0.2.0: pako "~1.0.5" browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.6, browserslist@^4.6.4: - version "4.14.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.6.tgz#97702a9c212e0c6b6afefad913d3a1538e348457" - integrity sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A== + version "4.14.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" + integrity sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ== dependencies: - caniuse-lite "^1.0.30001154" - electron-to-chromium "^1.3.585" + caniuse-lite "^1.0.30001157" + colorette "^1.2.1" + electron-to-chromium "^1.3.591" escalade "^3.1.1" - node-releases "^1.1.65" + node-releases "^1.1.66" bser@2.1.1: version "2.1.1" @@ -2933,10 +2936,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001154: - version "1.0.30001156" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz#75c20937b6012fe2b02ab58b30d475bf0718de97" - integrity sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001157: + version "1.0.30001159" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz#bebde28f893fa9594dadcaa7d6b8e2aa0299df20" + integrity sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA== capture-exit@^2.0.0: version "2.0.0" @@ -3171,6 +3174,11 @@ clone-deep@^2.0.1: kind-of "^6.0.0" shallow-clone "^1.0.0" +clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3707,11 +3715,11 @@ css-tree@1.0.0-alpha.37: source-map "^0.6.1" css-tree@^1.0.0, css-tree@^1.0.0-alpha.28: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0.tgz#21993fa270d742642a90409a2c0cb3ac0298adf6" - integrity sha512-CdVYz/Yuqw0VdKhXPBIgi8DO3NicJVYZNWeX9XcIuSp9ZoFT5IcleVRW07O5rMjdcx1mb+MEJPknTTEW7DdsYw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.1.tgz#30b8c0161d9fb4e9e2141d762589b6ec2faebd2e" + integrity sha512-NVN42M2fjszcUNpDbdkvutgQSlFYsr1z7kqeuCagHnNLBfYor6uP1WL1KrkmdYZ5Y1vTBCIOI/C/+8T98fJ71w== dependencies: - mdn-data "2.0.12" + mdn-data "2.0.14" source-map "^0.6.1" css-what@2.1: @@ -3827,9 +3835,9 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.1.0.tgz#1d31193efa99b87aa6bad6c0cef155e543d09e8b" - integrity sha512-h+6w/W1WqXaJA4tb1dk7r5tVbOm97MsKxzwnvOR04UQ6GILroryjMWu3pmCCtL2mLaEStQ0fZgeGiy99mo7iyg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.1.1.tgz#e0cb02d6eb3af1df719222048e4359efd662af13" + integrity sha512-Rvq+e1e0TFB8E8X+8MQjHSY6vtol45s5gxtLI/018UsAn2IBMmwNEZRM/h+HVnAJRHjasLIKKUO3uvoMM28LvA== dependencies: css-tree "^1.0.0" @@ -3851,14 +3859,14 @@ cssstyle@^2.0.0: cssom "~0.3.6" csstype@^2.5.5, csstype@^2.5.7: - version "2.6.13" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f" - integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A== + version "2.6.14" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.14.tgz#004822a4050345b55ad4dcc00be1d9cf2f4296de" + integrity sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A== csstype@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.4.tgz#b156d7be03b84ff425c9a0a4b1e5f4da9c5ca888" - integrity sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8" + integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ== currently-unhandled@^0.4.1: version "0.4.1" @@ -3918,16 +3926,16 @@ debug@3.1.0: ms "2.0.0" debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + 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@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + 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" @@ -4120,7 +4128,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.1: +dom-accessibility-api@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" integrity sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ== @@ -4257,10 +4265,10 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.585: - version "1.3.591" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.591.tgz#a18892bf1acb93f7b6e4da402705d564bc235017" - integrity sha512-ol/0WzjL4NS4Kqy9VD6xXQON91xIihDT36sYCew/G/bnd1v0/4D+kahp26JauQhgFUjrdva3kRSo7URcUmQ+qw== +electron-to-chromium@^1.3.591: + version "1.3.601" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.601.tgz#881824eaef0b2f97c89e1abb5835fdd224997d34" + integrity sha512-ctRyXD9y0mZu8pgeNwBUhLP3Guyr5YuqkfLKYmpTwYx7o9JtCEJme9JVX4xBXPr5ZNvr/iBXUvHLFEVJQThATg== elliptic@^6.5.3: version "6.5.3" @@ -4435,6 +4443,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.11.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -5458,9 +5471,9 @@ graphql-request@^2.0.0: integrity sha512-Ww3Ax+G3l2d+mPT8w7HC9LfrKjutnCKtnDq7ZZp2ghVk5IQDjwAk3/arRF1ix17Ky15rm0hrSKVKxRhIVlSuoQ== graphql-scalars@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.4.1.tgz#d4179af696c8d1420da5e7a14c5e033f434a71a4" - integrity sha512-QCT9sHYkEns9jp3fYqzmoUtS7GiWn+IKrWvSKYDrGOEqlUVP66DDtR0HQmebIbnaSuww239drYnq6JNP0VIDTg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.5.0.tgz#8c2237f71052ea46df5d13bb405e205672933a62" + integrity sha512-gMs+1+NBptdLxrpR/ME/vj6t8M25jqL22aNbu+OYF+Hkm+5+KFk9I/opddVi3troK3r9PHJS9ouahJExJJrbzw== graphql-type-json@^0.3.1: version "0.3.2" @@ -5746,9 +5759,9 @@ http-signature@~1.2.0: sshpk "^1.7.0" http-status@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/http-status/-/http-status-1.4.2.tgz#75406e829dca9bfdf92972c579b47cd6a58ab6c8" - integrity sha512-mBnIohUwRw9NyXMEMMv8/GANnzEYUj0Y8d3uL01zDWFkxUjYyZ6rgCaAI2zZ1Wb34Oqtbx/nFZolPRDc8Xlm5A== + version "1.5.0" + resolved "https://registry.yarnpkg.com/http-status/-/http-status-1.5.0.tgz#2edfb02068d236ba60fd1481ad89219aa96e1677" + integrity sha512-wcGvY31MpFNHIkUcXHHnvrE4IKYlpvitJw5P/1u892gMBAM46muQ+RH7UN1d+Ntnfx5apnOnVY6vcLmrWHOLwg== https-browserify@^1.0.0: version "1.0.0" @@ -6076,7 +6089,7 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.0.0: +is-core-module@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== @@ -7070,9 +7083,9 @@ jws@^3.2.2: safe-buffer "^5.0.1" jwt-decode@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.1.tgz#526710779567c380910139f790da2910c529e49f" - integrity sha512-EaH9dTD9ogCmxZRdiTsIUIJslqjoFfk8nEAi+Bq8u/aUjrVuhZ6eZjhWRH6SC9NBA0Lwr3K35H2zDnWvK/n4vQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== kareem@2.3.1: version "2.3.1" @@ -7456,10 +7469,10 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdn-data@2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.12.tgz#bbb658d08b38f574bbb88f7b83703defdcc46844" - integrity sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q== +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" @@ -7634,9 +7647,9 @@ mini-create-react-context@^0.4.0: tiny-warning "^1.0.3" mini-css-extract-plugin@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.0.tgz#bbcba978b68c39f0a9c75822cfb2874f9cf6b018" - integrity sha512-4DKmPwFd0XKlwoqvrkLi2X8Mlosh2ey/E/OVAucnPUdzGqrSWHgSqed/p4Ue2Q39JjIvcdSDgmZDO6mir5Ovmw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.1.tgz#1375c88b2bc2a9d197670a55761edcd1b5d72f21" + integrity sha512-jIOheqh9EU98rqj6ZaFTYNNDSFqdakNqaUZfkYwaXPjI9batmXVXX+K71NrqRAgtoGefELBMld1EQ7dqSAD5SQ== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" @@ -7817,9 +7830,9 @@ mongoose-paginate-v2@^1.3.6: integrity sha512-J7kK09ZbESv8iZK7oBTtIOrhNOelB5RXZ2F/h/7AKEjYoX7vyfbvopSXARSog1ZYouSLkCGznKDDCJ89g/G4KQ== mongoose@^5.8.9: - version "5.10.13" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.10.13.tgz#abcc9234b735886b19a95bec99140710687b295f" - integrity sha512-lvZzTj449sVWijY76StOuTKt5oP5kyy70VdM3DMgPpKNqZfkAseHxekmqBbd9YQQDVIgrIYDar9vSlxKqc75MQ== + version "5.10.15" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.10.15.tgz#5e559467890e0883d2a1ff0470a7467a1b47e52d" + integrity sha512-3QUWCpMRdFCPIBZkjG/B2OkfMY2WLkR+hv335o4T2mn3ta9kx8qVvXeUDojp3OHMxBZVUyCA+hDyyP4/aKmHuA== dependencies: bson "^1.1.4" kareem "2.3.1" @@ -7960,9 +7973,9 @@ no-case@^2.2.0: lower-case "^1.1.1" node-abi@^2.7.0: - version "2.19.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.1.tgz#6aa32561d0a5e2fdb6810d8c25641b657a8cea85" - integrity sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A== + version "2.19.3" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.3.tgz#252f5dcab12dad1b5503b2d27eddd4733930282d" + integrity sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg== dependencies: semver "^5.4.1" @@ -8047,10 +8060,10 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-releases@^1.1.65: - version "1.1.66" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.66.tgz#609bd0dc069381015cd982300bae51ab4f1b1814" - integrity sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg== +node-releases@^1.1.66: + version "1.1.67" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" + integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== node-sass@^4.14.1: version "4.14.1" @@ -8076,9 +8089,9 @@ node-sass@^4.14.1: "true-case-path" "^1.0.2" nodemailer@^6.4.2: - version "6.4.15" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.15.tgz#da5dbb78b8376e34c232c6aa3d2d65cfe17440e9" - integrity sha512-2/z13dBTWdgTRlxVMAK6C13dCI22GEShET4+jFLlQsxpblxYhojnucfcTZO1QBu5CsHvABsBj2JCGO3vl0HSQA== + version "6.4.16" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.16.tgz#5cb6391b1d79ab7eff32d6f9f48366b5a7117293" + integrity sha512-68K0LgZ6hmZ7PVmwL78gzNdjpj5viqBdFqKrTtr9bZbJYj6BRj5W6WGkxXrEnUl3Co3CBXi3CZBUlpV/foGnOQ== nodemon@^1.19.4: version "1.19.4" @@ -8371,9 +8384,9 @@ osenv@0: os-tmpdir "^1.0.0" p-each-series@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" - integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== p-finally@^1.0.0: version "1.0.0" @@ -9025,9 +9038,9 @@ postcss-lab-function@^2.0.1: postcss-values-parser "^2.0.0" postcss-loader@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.0.4.tgz#b2d005b52e008a44991cf8123bee207e635eb53e" - integrity sha512-pntA9zIR14drQo84yGTjQJg1m7T0DkXR4vXYHBngiRZdJtEeCrojL6lOpqUanMzG375lIJbT4Yug85zC/AJWGw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.1.0.tgz#4647a6c8dad3cb6b253fbfaa21d62201086f6e39" + integrity sha512-vbCkP70F3Q9PIk6d47aBwjqAMI4LfkXCoyxj+7NPNuVIwfTGdzv2KVQes59/RuxMniIgsYQCFSY42P3+ykJfaw== dependencies: cosmiconfig "^7.0.0" klona "^2.0.4" @@ -9488,7 +9501,7 @@ pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" -pretty-format@^26.0.0, pretty-format@^26.4.2, pretty-format@^26.6.2: +pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== @@ -9911,7 +9924,16 @@ react-simple-code-editor@^0.11.0: resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.11.0.tgz#bb57c7c29b570f2ab229872599eac184f5bc673c" integrity sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw== -react-transition-group@^4.3.0: +react-toastify@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-6.1.0.tgz#32ee52477530b9024553586b9072a3326f7618dc" + integrity sha512-Ne+wIoO9A+jZlaqGqgeuXDC/DQfqTuJdyoc7G5SsuCHsr8mNRx7W26417YKtHRH0LcnFFd5ii76tGnmm0cMlLg== + dependencies: + clsx "^1.1.1" + prop-types "^15.7.2" + react-transition-group "^4.4.1" + +react-transition-group@^4.3.0, react-transition-group@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== @@ -10362,11 +10384,11 @@ resolve@1.1.7: integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1, resolve@^1.9.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== dependencies: - is-core-module "^2.0.0" + is-core-module "^2.1.0" path-parse "^1.0.6" restore-cursor@^3.1.0: @@ -11105,9 +11127,11 @@ stack-generator@^2.0.5: stackframe "^1.1.1" stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.3.tgz#db7a475733b5b8bf6521907b18891d29006f7751" + integrity sha512-WldO+YmqhEpjp23eHZRhOT1NQF51STsbxZ+/AdpFD+EhheFxAe5d0WoK4DQVJkSHacPrJJX3OqRAl9CgHf78pg== + dependencies: + escape-string-regexp "^2.0.0" stackframe@^1.1.1: version "1.2.0" @@ -11568,9 +11592,9 @@ terser@^4.1.2: source-map-support "~0.5.12" terser@^5.3.4: - version "5.3.8" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd" - integrity sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ== + version "5.5.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.0.tgz#1406fcb4d4bc517add3b22a9694284c040e33448" + integrity sha512-eopt1Gf7/AQyPhpygdKePTzaet31TvQxXvrf7xYUvD/d8qkCJm4SKPDzu+GHK5ZaYTn8rvttfqaZc3swK21e5g== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -12311,23 +12335,23 @@ warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" + watchpack-chokidar2 "^2.0.1" webidl-conversions@^4.0.2: version "4.0.2"