From e946972336a0ea198ea7ee23cef7a762e8e054f9 Mon Sep 17 00:00:00 2001 From: im683661 Date: Thu, 10 Feb 2022 13:07:39 -0800 Subject: [PATCH 1/4] 5.1 release --- .../ThemedAuthenticationLayout.js | 77 ++++ .../src/handlers/userProfile.js | 65 +++ .../src/dataProvider/userProfiles.js | 90 +++++ packages/layer7-apihub/src/ui/FormDialog.js | 120 ++++++ .../src/userProfiles/UserProfileEdit.js | 374 ++++++++++++++++++ .../src/userProfiles/UserProfileList.js | 20 + .../src/userProfiles/UserProfileShow.js | 42 ++ .../src/userProfiles/UserProfileSubtitle.js | 31 ++ .../src/userProfiles/UserProfileTitle.js | 40 ++ .../layer7-apihub/src/userProfiles/index.js | 9 + 10 files changed, 868 insertions(+) create mode 100644 packages/example/src/authentication/ThemedAuthenticationLayout.js create mode 100644 packages/layer7-apihub-mock/src/handlers/userProfile.js create mode 100644 packages/layer7-apihub/src/dataProvider/userProfiles.js create mode 100644 packages/layer7-apihub/src/ui/FormDialog.js create mode 100644 packages/layer7-apihub/src/userProfiles/UserProfileEdit.js create mode 100644 packages/layer7-apihub/src/userProfiles/UserProfileList.js create mode 100644 packages/layer7-apihub/src/userProfiles/UserProfileShow.js create mode 100644 packages/layer7-apihub/src/userProfiles/UserProfileSubtitle.js create mode 100644 packages/layer7-apihub/src/userProfiles/UserProfileTitle.js create mode 100644 packages/layer7-apihub/src/userProfiles/index.js diff --git a/packages/example/src/authentication/ThemedAuthenticationLayout.js b/packages/example/src/authentication/ThemedAuthenticationLayout.js new file mode 100644 index 000000000..1433086b7 --- /dev/null +++ b/packages/example/src/authentication/ThemedAuthenticationLayout.js @@ -0,0 +1,77 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { Notification } from 'react-admin'; +import { Header, Footer } from '../ui'; +import { SideContent } from './SideContent'; + +// This component exists for theming only. Indeed, we must call the useStyles hook AFTER +// the ThemeProvider has been initialized with the specified theme +export const ThemedAuthenticationLayout = ({ children }) => { + const classes = useStyles(); + + return ( +
+
+
+
{children}
+
+ +
+
+
+ +
+ ); +}; + +const useStyles = makeStyles(theme => ({ + root: { + backgroundColor: theme.palette.background.default, + position: 'fixed', + top: 0, + bottom: 0, + left: 0, + right: 0, + padding: theme.spacing(4), + display: 'flex', + flexDirection: 'column', + overflow: 'auto', + }, + container: { + display: 'flex', + flexWrap: 'wrap', + flexGrow: 1, + }, + columns: { + display: 'flex', + flexDirection: 'column', + padding: theme.spacing(4), + [theme.breakpoints.down('sm')]: { + padding: theme.spacing(3), + }, + '&:first-child': { + minWidth: '250px', + maxWidth: '30%', + [theme.breakpoints.down('sm')]: { + maxWidth: '100%', + width: '100%', + }, + }, + '&:not(:first-child)': { + borderStyle: 'solid', + borderColor: theme.palette.divider, + borderWidth: '0px 0px 0px 1px', + marginLeft: theme.spacing(4), + maxWidth: `calc(50% - ${theme.spacing(4)}px)`, + [theme.breakpoints.down('sm')]: { + borderWidth: '1px 0px 0px 0px', + marginLeft: '0px', + maxWidth: '100%', + width: '100%', + }, + }, + '&:last-child': { + flexGrow: 1, + }, + }, +})); diff --git a/packages/layer7-apihub-mock/src/handlers/userProfile.js b/packages/layer7-apihub-mock/src/handlers/userProfile.js new file mode 100644 index 000000000..981f4d1d8 --- /dev/null +++ b/packages/layer7-apihub-mock/src/handlers/userProfile.js @@ -0,0 +1,65 @@ +import { Response } from 'miragejs'; + +import { getCurrentUser, setCurrentUser } from './currentUser'; +import { promisify } from '../promisify'; + +export function getUserProfile(database) { + return (schema, request) => { + const { userContexts } = getCurrentUser(); + const { userDetails } = userContexts[0]; + const { + uuid, + firstName, + lastName, + email, + username: userName, + } = userDetails; + + return new Response( + 200, + {}, + { + uuid, + firstName, + lastName, + email, + userName, + } + ); + }; +} + +export function putUserProfile(database) { + return async (schema, request) => { + const { firstName, lastName, email } = JSON.parse(request.requestBody); + + const currentUser = getCurrentUser(); + + // Minimongo does not support mongo array search so we fall back + // to retrieving all users (we don't have many) and filter ourselves + const users = await promisify(database.userContexts.find().fetch); + const user = users.find( + u => + u.userContexts[0].userDetails.username === + currentUser.userContexts[0].userDetails.username + ); + + user.userContexts[0].userDetails.firstName = + firstName || user.userContexts[0].userDetails.firstName; + user.userContexts[0].userDetails.lastName = + lastName || user.userContexts[0].userDetails.lastName; + user.userContexts[0].userDetails.email = + email || user.userContexts[0].userDetails.email; + + await promisify( + database.userContexts.upsert.bind(database.userContexts), + user + ); + + setCurrentUser(user); + + return { + status: 200, + }; + }; +} diff --git a/packages/layer7-apihub/src/dataProvider/userProfiles.js b/packages/layer7-apihub/src/dataProvider/userProfiles.js new file mode 100644 index 000000000..561c038fd --- /dev/null +++ b/packages/layer7-apihub/src/dataProvider/userProfiles.js @@ -0,0 +1,90 @@ +import { getErrorMessage } from '../useLayer7Notify'; + +// Fake id used because we can only access the current user context +export const CurrentUserId = 'layer7@currentUser'; + +class UserProfilesValidationError extends Error { + constructor(message) { + super(message); + this.name = 'UserProfilesValidationError'; + this.status = 400; + } +} + +export const userProfilesDataProvider = context => { + const userProfileBasePath = `${context.apiUrl}/userProfile`; + const pwdPolicyPath = `${context.apiUrl}/public/auth/schemes/passwordpolicy`; + + return { + getOne: async () => { + const { json: data } = await context.fetchJson( + userProfileBasePath, + { + credentials: 'include', + } + ); + + return { + data: { ...data, id: CurrentUserId }, + }; + }, + update: async ({ id, data }) => { + // The update method should only be used to update the user details + + const { + firstName, + lastName, + email, + userName, + uuid, + publicKey, + password, + newPassword, + } = data; + try { + const options = { + credentials: 'include', + method: 'PUT', + body: JSON.stringify({ + password, + newPassword, + firstName, + lastName, + email, + userName, + uuid, + }), + }; + if (publicKey) { + options.headers = new Headers({ + Accept: 'application/json', + }); + options.headers.set('Public-Key', publicKey); + } + await context.fetchJson(userProfileBasePath, options); + } catch (error) { + const message = getErrorMessage(error); + throw new UserProfilesValidationError(message); + } + + return { + data: { + id, + ...data, + }, + }; + }, + getPasswordPolicy: async () => { + const { + json: { + authScheme: { passwordPolicies }, + }, + } = await context.fetchJson(pwdPolicyPath, { + credentials: 'include', + }); + return { + data: passwordPolicies, + }; + }, + }; +}; diff --git a/packages/layer7-apihub/src/ui/FormDialog.js b/packages/layer7-apihub/src/ui/FormDialog.js new file mode 100644 index 000000000..ea8f13108 --- /dev/null +++ b/packages/layer7-apihub/src/ui/FormDialog.js @@ -0,0 +1,120 @@ +import React from 'react'; +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + makeStyles, + } from '@material-ui/core'; +import PropTypes from 'prop-types'; +import { get } from 'lodash'; + +const styles = (theme) => ({ + paper: { + backgroundColor: get(theme, 'color.uiBackground'), + }, + title: { + color: get(theme, 'color.bodyText'), + fontSize: get(theme, 'fontSize.title'), + fontFamily: get(theme, 'typography.bodyText'), + fontWeight: 'bold', + }, + cancelButton: { + textTransform: 'none', + color: get(theme, 'color.primaryButtonBackground'), + backgroundColor: get(theme, 'color.primaryButtonText'), + borderColor: get(theme, 'color.primaryButtonBackground'), + }, + saveButton: { + textTransform: 'none', + color: get(theme, 'color.primaryButtonText'), + backgroundColor: get(theme, 'color.primaryButtonBackground'), + borderColor: get(theme, 'color.primaryButtonBackground'), + }, +}); + +export const FormDialog = (props) => { + const useStyles = makeStyles(styles); + const classes = useStyles(); + const { + children, + isOpen, + cancelText, + submitText, + title, + dialogId, + handleClose, + onSubmit, + onCancel, + submitButtonDisabled, + isDialogContentText = true, + } = props; + + return ( + + + {title} + + + {isDialogContentText && + + { children } + + } + {!isDialogContentText && + <> + {children} + + } + + + + + + + ); +} + +FormDialog.propTypes = { + children: PropTypes.node, + isOpen: PropTypes.bool, + cancelText: PropTypes.string, + submitText: PropTypes.string, + title: PropTypes.string, + dialogId: PropTypes.string, + handleClose: PropTypes.func, + onCancel: PropTypes.func, + onSubmit: PropTypes.func, + submitButtonDisabled: PropTypes.bool, + isDialogContentText: PropTypes.bool, +}; diff --git a/packages/layer7-apihub/src/userProfiles/UserProfileEdit.js b/packages/layer7-apihub/src/userProfiles/UserProfileEdit.js new file mode 100644 index 000000000..c87772378 --- /dev/null +++ b/packages/layer7-apihub/src/userProfiles/UserProfileEdit.js @@ -0,0 +1,374 @@ +import React, { useState } from 'react'; +import { + BooleanInput, + EditView, + SimpleForm, + Toolbar, + TextField, + TextInput, + EditButton, + SaveButton, + required, + maxLength, + email, + useEditController, + useTranslate, + FormDataConsumer, + useQuery, +} from 'react-admin'; +import { Link } from 'react-router-dom'; +import { makeStyles, Collapse } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import createDecorator from 'final-form-calculate'; +import get from 'lodash/get'; + +import { FormDialog, ViewTitle, PasswordInput } from '../ui'; +import { usePasswordEncryption, getPwdTooltip } from '../authentication'; +import { regex } from 'ra-core'; +import { UserProfileTitle } from './UserProfileTitle'; +import { UserProfileSubtitle } from './UserProfileSubtitle'; +import { isPortalAdmin, useUserContext } from '../userContexts'; + +export const UserProfileEdit = props => { + const { record, save, ...editControllerProps } = useEditController({ + successMessage: 'resources.userProfiles.notifications.update_success', + ...props, + }); + const translate = useTranslate(); + const [publicKey, encrypt] = usePasswordEncryption(); + const [currentPassword, setCurrentPassword] = useState(''); + const [showFormDialog, setShowFormDialog] = useState(false); + const [savedFormData, setSavedFormData] = useState({}); + const classes = useUserProfileEditFormStyles(); + const [currentPwdError, setCurrentPwdError] = useState(false); + + const handleSave = async formData => { + const { newPassword, ...userProfile } = formData; + // if currentPassword and newPassword are available, then user + // is updating password + // if only currentPassword is available, then user is updating email + if (newPassword && currentPassword) { + if (publicKey) { + userProfile.newPassword = await encrypt(newPassword); + userProfile.password = await encrypt(currentPassword); + userProfile.publicKey = publicKey; + } else { + userProfile.newPassword = newPassword; + userProfile.password = currentPassword; + } + } else if (currentPassword) { + if (publicKey) { + userProfile.password = await encrypt(currentPassword); + userProfile.publicKey = publicKey; + } else { + userProfile.password = await encrypt(currentPassword); + } + } + const result = await save(userProfile, 'show'); + return result; + }; + + const handleSubmit = async formData => { + const { email, newPassword, updatePassword } = formData; + if (get(record, 'email') !== email || (updatePassword && newPassword)) { + setSavedFormData(formData); + setShowFormDialog(true); + } else { + await handleSave(formData); + } + }; + + const handleFormDialogCancel = () => { + setShowFormDialog(false); + setCurrentPwdError(false); + setCurrentPassword(''); + }; + + const handleFormDialogSubmit = async () => { + if (currentPassword) { + setShowFormDialog(false); + await handleSave(savedFormData); + } else { + setCurrentPwdError(true); + } + }; + + const handleFormDialogFormSubmit = async event => { + event.preventDefault(); + if (currentPassword) { + setShowFormDialog(false); + await handleSave(savedFormData); + } else { + setCurrentPwdError(true); + } + }; + + const handleCurrentPasswordChange = event => { + setCurrentPwdError(false); + setCurrentPassword(event.target.value); + }; + + // workaround to hide form toolbar in formdialog + const EmptyDiv = () =>
; + + // specified those props to avoid errors in console + const ToolbarCustomEmptyDiv = ({ + handleSubmit, + handleSubmitWithRedirect, + onSave, + invalid, + pristine, + saving, + submitOnEnter, + ...rest + }) => ; + + const modalFormValidate = ({ currentPassword }) => { + const errors = {}; + if (!currentPassword) { + errors.currentPassword = + 'resources.userProfiles.validation.error_password_empty'; + } + return errors; + }; + + return ( + <> + + } />} + record={record} + save={handleSubmit} + > + + + + } + validate={modalFormValidate} + onSubmit={handleFormDialogFormSubmit} + > + + + + + ); +}; + +const CancelButton = ({ record }) => { + const translate = useTranslate(); + + return ( + + ); +}; + +const useUserProfileEditToolbarStyles = makeStyles( + theme => ({ + toolbar: { + backgroundColor: 'transparent', + display: 'flex', + alignItems: 'center', + justifyContent: 'flex-end', + width: 456, + }, + saveButton: { + marginLeft: theme.spacing(2), + }, + }), + { + name: 'Layer7UserContextEditToolbar', + } +); + +const UserProfileEditToolbar = ({ record, ...rest }) => { + const classes = useUserProfileEditToolbarStyles(); + const [userContext] = useUserContext(); + const isIdpUser = get(userContext, 'userDetails.isIdpUser', false); + return ( + + + + + ); +}; + +const useUserProfileEditFormStyles = makeStyles( + theme => ({ + root: { + padding: `${theme.spacing(2)}px !important`, + width: 480, + }, + field: { + display: 'block', + }, + }), + { + name: 'Layer7UserProfileEditForm', + } +); + +const validateName = [required(), maxLength(60)]; +const validateEmail = [required(), maxLength(256), email()]; + +const pwdResetDecorator = createDecorator({ + field: 'updatePassword', // when updatePassword changes... + updates: { + // ...clear new password and verified password if updatePassword is false + newPassword: (updatePasswordValue, allValues) => + updatePasswordValue ? allValues.newPassword : '', + confirmNewPassword: (updatePasswordValue, allValues) => + updatePasswordValue ? allValues.confirmNewPassword : '', + }, +}); + +export const UserProfileEditForm = ({ record, basePath, save, ...rest }) => { + const classes = useUserProfileEditFormStyles(); + + const validate = ({ newPassword, confirmNewPassword, updatePassword }) => { + const errors = {}; + + if (updatePassword && newPassword) { + if (newPassword !== confirmNewPassword) { + errors.confirmNewPassword = + 'resources.userProfiles.validation.error_password_match'; + } + } + + if (updatePassword && !newPassword) { + errors.newPassword = + 'resources.userProfiles.validation.error_password_empty'; + } + + return errors; + }; + const [userContext] = useUserContext(); + const isAdmin = isPortalAdmin(userContext); + const { data } = useQuery({ + type: 'getPasswordPolicy', + resource: 'userProfiles', + }); + const regexConfig = get(data, 'regexConfig', {}); + const regexStr = get(regexConfig, 'REGEX.value', ''); + const validatePassword = regexStr + ? [ + regex( + new RegExp(regexStr), + 'resources.userProfiles.validation.error_password_not_matching_criteria' + ), + ] + : []; + const translate = useTranslate(); + const passwordTooltip = getPwdTooltip(regexConfig, translate); + const isIdpUser = get(userContext, 'userDetails.isIdpUser', false); + return ( + } + validate={validate} + {...rest} + > + + + + + {!isIdpUser && } + {!isIdpUser && ( + + )} + {!isIdpUser && ( + + {({ formData, className, ...rest }) => ( + + +
+ +
+ )} +
+ )} +
+ ); +}; diff --git a/packages/layer7-apihub/src/userProfiles/UserProfileList.js b/packages/layer7-apihub/src/userProfiles/UserProfileList.js new file mode 100644 index 000000000..64eab8a13 --- /dev/null +++ b/packages/layer7-apihub/src/userProfiles/UserProfileList.js @@ -0,0 +1,20 @@ +import React, { useEffect } from 'react'; +import { useRedirect } from 'react-admin'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +import { CurrentUserId } from '../dataProvider/userProfiles'; + +/** + * The UserContext is a particular resource that cannot be listed, + * and that contains only one element. + * We perform a redirection to the edit page instead of displaying a blank page. + */ +export const UserProfileList = () => { + const redirect = useRedirect(); + + useEffect(() => { + redirect(`/userProfiles/${CurrentUserId}/show`); + }, [redirect]); + + return ; +}; diff --git a/packages/layer7-apihub/src/userProfiles/UserProfileShow.js b/packages/layer7-apihub/src/userProfiles/UserProfileShow.js new file mode 100644 index 000000000..af96d3f4c --- /dev/null +++ b/packages/layer7-apihub/src/userProfiles/UserProfileShow.js @@ -0,0 +1,42 @@ +import React from 'react'; +import { Show, SimpleShowLayout, TextField, EditButton } from 'react-admin'; +import { makeStyles } from '@material-ui/core'; + +import { ViewTitle } from '../ui'; +import { UserProfileTitle } from './UserProfileTitle'; + +export const UserProfileShow = props => { + const classes = useStyles(props); + + return ( + <> + + } {...props} />} + actions={null} + > + + + + + + + + + ); +}; + +const useStyles = makeStyles( + theme => ({ + root: { + padding: `${theme.spacing(4)}px !important`, + }, + field: { + width: 456, + }, + }), + { + name: 'Layer7UserProfileShow', + } +); diff --git a/packages/layer7-apihub/src/userProfiles/UserProfileSubtitle.js b/packages/layer7-apihub/src/userProfiles/UserProfileSubtitle.js new file mode 100644 index 000000000..7fdc44e7c --- /dev/null +++ b/packages/layer7-apihub/src/userProfiles/UserProfileSubtitle.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { useTranslate } from 'react-admin'; +import { makeStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; + +export const UserProfileSubtitle = ({ actions, ...rest }) => { + const classes = useStyles(rest); + const translate = useTranslate(); + + return ( + + {translate('resources.userContexts.fields.userDetails.password')} + + ); +}; + +const useStyles = makeStyles( + theme => ({ + root: { + fontWeight: theme.typography.fontWeightMedium, + marginTop: theme.spacing(4), + marginBottom: theme.spacing(2), + color: theme.palette.getContrastText( + theme.palette.background.default + ), + }, + }), + { + name: 'Layer7UserContextSubtitle', + } +); diff --git a/packages/layer7-apihub/src/userProfiles/UserProfileTitle.js b/packages/layer7-apihub/src/userProfiles/UserProfileTitle.js new file mode 100644 index 000000000..8349f8672 --- /dev/null +++ b/packages/layer7-apihub/src/userProfiles/UserProfileTitle.js @@ -0,0 +1,40 @@ +import React, { cloneElement } from 'react'; +import { useTranslate } from 'react-admin'; +import { makeStyles } from '@material-ui/core'; + +export const UserProfileTitle = ({ + actions, + basePath, + resource, + record, + ...rest +}) => { + const translate = useTranslate(); + const classes = useStyles(rest); + + return ( +
+ {translate('resources.userContexts.title')} + {actions && + cloneElement(actions, { + basePath, + resource, + record, + })} +
+ ); +}; + +const useStyles = makeStyles( + theme => ({ + root: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + width: '100%', + }, + }), + { + name: 'Layer7UserContextTitle', + } +); diff --git a/packages/layer7-apihub/src/userProfiles/index.js b/packages/layer7-apihub/src/userProfiles/index.js new file mode 100644 index 000000000..79cc06e7e --- /dev/null +++ b/packages/layer7-apihub/src/userProfiles/index.js @@ -0,0 +1,9 @@ +import { UserProfileList } from './UserProfileList'; +import { UserProfileEdit } from './UserProfileEdit'; +import { UserProfileShow } from './UserProfileShow'; + +export const userProfiles = { + list: UserProfileList, + edit: UserProfileEdit, + show: UserProfileShow, +}; From 5432ef8c085f4f73faf74cd39d39795dad8c9612 Mon Sep 17 00:00:00 2001 From: im683661 Date: Thu, 10 Feb 2022 13:17:25 -0800 Subject: [PATCH 2/4] 5.1 release --- .gitignore | 2 + README.md | 3 +- cypress/integration/user.js | 194 +++- .../authentication/AuthenticationLayout.js | 85 +- packages/example/src/layout/Layout.js | 7 +- packages/example/src/theme/theme.js | 13 +- packages/healthcare/src/App.js | 4 +- packages/layer7-apihub-mock/package.json | 5 +- .../src/handlers/authentication.js | 59 ++ packages/layer7-apihub-mock/src/index.js | 22 +- packages/layer7-apihub/jest.config.js | 3 +- packages/layer7-apihub/package.json | 5 +- packages/layer7-apihub/src/ApiHubAdmin.js | 9 +- packages/layer7-apihub/src/ApiHubUserMenu.js | 12 +- packages/layer7-apihub/src/apis/ApiList.js | 7 +- .../ApplicationDetailsKeyClient.js | 4 +- .../ApplicationDetailsKeyClient.test.js | 4 +- .../src/applications/ApplicationEditView.js | 10 +- .../src/applications/ApplicationNew.js | 10 +- .../src/authentication/Login/LoginForm.js | 5 +- .../src/authentication/useAuthSchemes.js | 34 +- .../src/authentication/useAuthSchemes.test.js | 8 + .../src/authentication/validatePassword.js | 38 + .../layer7-apihub/src/dataProvider/index.js | 2 + packages/layer7-apihub/src/i18n/en.js | 44 +- packages/layer7-apihub/src/i18n/es.js | 3 +- packages/layer7-apihub/src/i18n/fr.js | 2 +- packages/layer7-apihub/src/i18n/it.js | 3 +- packages/layer7-apihub/src/index.js | 1 + packages/layer7-apihub/src/ui/index.js | 1 + .../src/userContexts/UserContextEdit.js | 264 ------ .../src/userContexts/UserContextEdit.test.js | 347 -------- .../src/userContexts/UserContextList.js | 20 - .../src/userContexts/UserContextShow.js | 61 -- .../layer7-apihub/src/userContexts/index.js | 10 - pom.xml | 2 +- yarn.lock | 840 +++++------------- 37 files changed, 684 insertions(+), 1459 deletions(-) delete mode 100755 packages/layer7-apihub/src/userContexts/UserContextEdit.js delete mode 100755 packages/layer7-apihub/src/userContexts/UserContextEdit.test.js delete mode 100755 packages/layer7-apihub/src/userContexts/UserContextList.js delete mode 100755 packages/layer7-apihub/src/userContexts/UserContextShow.js diff --git a/.gitignore b/.gitignore index 1081bbca2..0fc851f85 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ packages/healthcare/public/config.js # cypress cypress/screenshots +/.idea/ +/apihub.iml diff --git a/README.md b/README.md index 79d9b4b42..b4070a81a 100755 --- a/README.md +++ b/README.md @@ -55,7 +55,8 @@ Use the following commands to set up you local development environment. Before setting up your local development environment, ensure that you have completed the following: - You have installed [Yarn](https://yarnpkg.com/). -- You have installed Make. +- You have installed GNU Make 3.81 or later. +- You have installed Node v12.16.3. ### Install the JavaScript Dependencies diff --git a/cypress/integration/user.js b/cypress/integration/user.js index 68fd95043..6694df400 100755 --- a/cypress/integration/user.js +++ b/cypress/integration/user.js @@ -21,7 +21,7 @@ describe('User', () => { cy.saveLocalStorageCache(); }); - // User Profile + // User Profile update for admin it('should display and edit the user profile', () => { cy.loadData(); @@ -58,6 +58,120 @@ describe('User', () => { // First Name + cy.findByLabelText('First Name *') + .clear() + .type('Borter'); + + cy.findByText('Save').click(); + + // Discard notification + cy.findByText('My Profile').click(); + cy.wait(250); + + // Open the user profile show view + checkUserProfileDetails({ + username: 'portalAdmin', + lastName: 'Hertz', + firstName: 'Borter', + email: 'Porter.Mertz52@example.com', + }); + }); + + // User profile update for non-admin + + it('Non-admin users cannot update email field', () => { + cy.loadData(); + + login('orgPublisher', 'Password@1'); + + openUserProfile(); + + // Open the user profile show view + + checkUserProfileDetails({ + username: 'orgPublisher', + lastName: 'Kulas', + firstName: 'Darby', + email: 'Darby.Kulas@example.com', + }); + + // Open the user profile edit view + + cy.findByText('Edit').click(); + + checkUserProfileEditDetails({ + username: 'orgPublisher', + lastName: 'Kulas', + firstName: 'Darby', + email: 'Darby.Kulas@example.com', + }); + + // Last Name + + cy.findByLabelText('Last Name *') + .clear() + .type('Mertz'); + + // First Name + + cy.findByLabelText('First Name *') + .clear() + .type('Porter'); + + // email field should be in disabled state + cy.findByLabelText('Email *').should('be.disabled'); + + cy.findByText('Save').click(); + + // Discard notification + cy.findByText('My Profile').click(); + cy.wait(250); + + // Open the user profile show view + checkUserProfileDetails({ + username: 'orgPublisher', + lastName: 'Mertz', + firstName: 'Porter', + email: 'Darby.Kulas@example.com', + }); + }); + + // Updating email-id requires password + it('should prompt for password on email update', () => { + cy.loadData(); + + login('portalAdmin', 'Password@1'); + + openUserProfile(); + + // Open the user profile show view + + checkUserProfileDetails({ + username: 'portalAdmin', + lastName: 'Mertz', + firstName: 'Porter', + email: 'Porter.Mertz52@example.com', + }); + + // Open the user profile edit view + + cy.findByText('Edit').click(); + + checkUserProfileEditDetails({ + username: 'portalAdmin', + lastName: 'Mertz', + firstName: 'Porter', + email: 'Porter.Mertz52@example.com', + }); + + // Last Name + + cy.findByLabelText('Last Name *') + .clear() + .type('Hertz'); + + // First Name + cy.findByLabelText('First Name *') .clear() .type('Borter'); @@ -70,6 +184,12 @@ describe('User', () => { cy.findByText('Save').click(); + cy.findByLabelText('Enter Current Password') + .clear() + .type('Password@1'); + + cy.findByText('Submit').click(); + // Discard notification cy.findByText('My Profile').click(); cy.wait(250); @@ -83,6 +203,78 @@ describe('User', () => { }); }); + // Setting new password should prompt for existing password + // admin user + it('admin: should prompt for existing password if user is changing password', () => { + cy.loadData(); + + login('portalAdmin', 'Password@1'); + + openUserProfile(); + + // Open the user profile show view + + checkUserProfileDetails({ + username: 'portalAdmin', + lastName: 'Mertz', + firstName: 'Porter', + email: 'Porter.Mertz52@example.com', + }); + + // Open the user profile edit view + + cy.findByText('Edit').click(); + + checkUserProfileEditDetails({ + username: 'portalAdmin', + lastName: 'Mertz', + firstName: 'Porter', + email: 'Porter.Mertz52@example.com', + }); + + // Last Name + + cy.findByLabelText('Last Name *') + .clear() + .type('Hertz'); + + // First Name + + cy.findByLabelText('First Name *') + .clear() + .type('Borter'); + + cy.findByText('Update password').click(); + + cy.get('[data-testid="new-password"] input') + .clear() + .type('Password@1'); + + cy.get('[data-testid="confirm-new-password"] input') + .clear() + .type('Password@1'); + + cy.findByText('Save').click(); + + cy.findByLabelText('Enter Current Password') + .clear() + .type('Password@1'); + + cy.findByText('Submit').click(); + + // Discard notification + cy.findByText('My Profile').click(); + cy.wait(250); + + // Open the user profile show view + checkUserProfileDetails({ + username: 'portalAdmin', + lastName: 'Hertz', + firstName: 'Borter', + email: 'Porter.Mertz52@example.com', + }); + }); + // User Organization it('should switch the organization and stay on the same page', () => { diff --git a/packages/example/src/authentication/AuthenticationLayout.js b/packages/example/src/authentication/AuthenticationLayout.js index ca0f42aa2..8a66e8db8 100755 --- a/packages/example/src/authentication/AuthenticationLayout.js +++ b/packages/example/src/authentication/AuthenticationLayout.js @@ -1,16 +1,11 @@ import React from 'react'; -import { - ThemeProvider, - createMuiTheme, - makeStyles, -} from '@material-ui/core/styles'; -import { Notification } from 'react-admin'; +import { ThemeProvider, createMuiTheme } from '@material-ui/core/styles'; + import { useTheme } from '../theme'; -import { Header, Footer } from '../ui'; -import { SideContent } from './SideContent'; +import { ThemedAuthenticationLayout } from './ThemedAuthenticationLayout'; export const AuthenticationLayout = props => { - const theme = useTheme(); + const { theme } = useTheme(); return ( @@ -18,75 +13,3 @@ export const AuthenticationLayout = props => { ); }; - -// This component exists for theming only. Indeed, we must call the useStyles hook AFTER -// the ThemeProvider has been initialized with the specified theme -const ThemedAuthenticationLayout = ({ children }) => { - const classes = useStyles(); - - return ( -
-
-
-
{children}
-
- -
-
-
- -
- ); -}; - -const useStyles = makeStyles(theme => ({ - root: { - backgroundColor: theme.palette.background.default, - position: 'fixed', - top: 0, - bottom: 0, - left: 0, - right: 0, - padding: theme.spacing(4), - display: 'flex', - flexDirection: 'column', - overflow: 'auto', - }, - container: { - display: 'flex', - flexWrap: 'wrap', - flexGrow: 1, - }, - columns: { - display: 'flex', - flexDirection: 'column', - padding: theme.spacing(4), - [theme.breakpoints.down('sm')]: { - padding: theme.spacing(3), - }, - '&:first-child': { - minWidth: '250px', - maxWidth: '30%', - [theme.breakpoints.down('sm')]: { - maxWidth: '100%', - width: '100%', - }, - }, - '&:not(:first-child)': { - borderStyle: 'solid', - borderColor: theme.palette.divider, - borderWidth: '0px 0px 0px 1px', - marginLeft: theme.spacing(4), - maxWidth: `calc(50% - ${theme.spacing(4)}px)`, - [theme.breakpoints.down('sm')]: { - borderWidth: '1px 0px 0px 0px', - marginLeft: '0px', - maxWidth: '100%', - width: '100%', - }, - }, - '&:last-child': { - flexGrow: 1, - }, - }, -})); diff --git a/packages/example/src/layout/Layout.js b/packages/example/src/layout/Layout.js index 077533415..7f79e6227 100755 --- a/packages/example/src/layout/Layout.js +++ b/packages/example/src/layout/Layout.js @@ -3,6 +3,7 @@ import { ApiHubLayout, useBranding } from 'layer7-apihub'; import { Helmet } from 'react-helmet'; import get from 'lodash/get'; +import { useTheme } from '../theme'; import { AppBar } from './AppBar'; export const Layout = props => { @@ -18,10 +19,8 @@ export const Layout = props => { const URL = APIHUB_URL || guessApihubUrl(); const API_URL_WITH_TENANT = `${URL}/api/${TENANT}`; - const { favicon, theme } = useBranding( - API_URL_WITH_TENANT, - ORIGIN_HUB_NAME - ); + const { favicon } = useBranding(API_URL_WITH_TENANT, ORIGIN_HUB_NAME); + const { theme } = useTheme(); return ( <> diff --git a/packages/example/src/theme/theme.js b/packages/example/src/theme/theme.js index 6d9df3048..cde223f89 100755 --- a/packages/example/src/theme/theme.js +++ b/packages/example/src/theme/theme.js @@ -86,18 +86,15 @@ export const useTheme = () => { const URL = APIHUB_URL || guessApihubUrl(); const API_URL_WITH_TENANT = `${URL}/api/${TENANT}`; - const { logo, brandingTheme } = useBranding( - API_URL_WITH_TENANT, - ORIGIN_HUB_NAME - ); + const { logo, theme } = useBranding(API_URL_WITH_TENANT, ORIGIN_HUB_NAME); const themeMode = useSelector(state => state.theme); - const theme = useMemo(() => { + const selectedTheme = useMemo(() => { if (USE_BRANDING_THEME) { - return brandingTheme; + return theme; } return themeMode === 'light' ? lightTheme : darkTheme; - }, [USE_BRANDING_THEME, brandingTheme, themeMode]); + }, [USE_BRANDING_THEME, theme, themeMode]); - return { theme, logo }; + return { theme: selectedTheme, logo }; }; diff --git a/packages/healthcare/src/App.js b/packages/healthcare/src/App.js index 174eef23d..ddb8feae3 100755 --- a/packages/healthcare/src/App.js +++ b/packages/healthcare/src/App.js @@ -1,5 +1,5 @@ import React from 'react'; -import { ApiHubAdmin, userContexts } from 'layer7-apihub'; +import { ApiHubAdmin, userProfiles } from 'layer7-apihub'; import { Resource } from 'react-admin'; import { Helmet } from 'react-helmet'; import { Route } from 'react-router-dom'; @@ -46,7 +46,7 @@ const App = () => { > - + ); diff --git a/packages/layer7-apihub-mock/package.json b/packages/layer7-apihub-mock/package.json index 1018d377f..da078747c 100755 --- a/packages/layer7-apihub-mock/package.json +++ b/packages/layer7-apihub-mock/package.json @@ -14,11 +14,10 @@ "test": "kcd-scripts test" }, "dependencies": { - "@stoplight/prism-http": "~3.3.5", "date-fns": "~2.14.0", - "faker": "Marak/faker.js", + "faker": "5.5.3", "kcd-scripts": "6.3.0", - "lodash": "~4.17.15", + "lodash": "~4.17.21", "minimist": "~1.2.5", "minimongo": "~6.5.1", "miragejs": "~0.1.40", diff --git a/packages/layer7-apihub-mock/src/handlers/authentication.js b/packages/layer7-apihub-mock/src/handlers/authentication.js index edece45d3..bc1d09846 100755 --- a/packages/layer7-apihub-mock/src/handlers/authentication.js +++ b/packages/layer7-apihub-mock/src/handlers/authentication.js @@ -380,3 +380,62 @@ export function putUserContexts(database) { }; }; } + +export function getPasswordPolicy() { + return (schema, request) => { + return { + respCode: 200, + respMsg: 'Successfully fetched Password Policies', + authScheme: { + links: [], + passwordPolicies: { + regexConfig: { + UPPERCASE: { + value: 1, + enabled: true, + }, + NUMBER: { + value: 1, + enabled: true, + }, + MAXIMUM_LENGTH: { + value: 60, + enabled: true, + }, + MINIMUM_LENGTH: { + value: 8, + enabled: true, + }, + REGEX: { + value: + '^(?=(.*[A-Z]){1})(?=(.*[a-z]){1})(?=(.*[0-9]){1})(?=(.*[!@#$%^&*-]){1})[ A-Za-z0-9!@#$%^&*-]{8,60}$', + enabled: true, + }, + SUPPORTED_SYMBOLS: { + value: '!@#$%^&*-', + enabled: true, + }, + SYMBOL: { + value: 1, + enabled: true, + }, + LOWERCASE: { + value: 1, + enabled: true, + }, + }, + passwordConfig: { + PASSWORD_HISTORY: { + value: 5, + enabled: false, + }, + PASSWORD_EXPIRY: { + value: 60, + enabled: false, + }, + }, + }, + }, + }; + }; +} diff --git a/packages/layer7-apihub-mock/src/index.js b/packages/layer7-apihub-mock/src/index.js index 8846bb0b2..5cf436d4e 100755 --- a/packages/layer7-apihub-mock/src/index.js +++ b/packages/layer7-apihub-mock/src/index.js @@ -16,7 +16,9 @@ import { putUserContexts, getCmsSettings, getAuthSchemes, + getPasswordPolicy, } from './handlers/authentication'; +import { getUserProfile, putUserProfile } from './handlers/userProfile'; import { getTheme } from './handlers/branding'; import { listApis, @@ -169,6 +171,12 @@ export const startApiHubMockedServer = async ( options ); + this.get( + `${urlPrefix}api/apim/public/auth/schemes/passwordpolicy`, + getPasswordPolicy(database), + options + ); + this.get( `${urlPrefix}api/apim/userContexts`, getUserContexts(database), @@ -181,6 +189,18 @@ export const startApiHubMockedServer = async ( options ); + this.get( + `${urlPrefix}api/apim/userProfile`, + getUserProfile(database), + options + ); + + this.put( + `${urlPrefix}api/apim/userProfile`, + putUserProfile(database), + options + ); + this.get( `${urlPrefix}api/apim/branding/1.0/themes`, getTheme(database), @@ -346,7 +366,7 @@ export const startApiHubMockedServer = async ( ); this.get( - `${urlPrefix}admin/api-management/internal/api-plans`, + `${urlPrefix}api/apim/api-management/internal/api-plans`, getApiApiPlanAssociation(database), options ); diff --git a/packages/layer7-apihub/jest.config.js b/packages/layer7-apihub/jest.config.js index 784c72c20..5e3bcdd9b 100755 --- a/packages/layer7-apihub/jest.config.js +++ b/packages/layer7-apihub/jest.config.js @@ -1,6 +1,7 @@ const { jest: jestConfig } = require('kcd-scripts/config'); module.exports = Object.assign(jestConfig, { + testTimeout: 10000, testMatch: ['/**/*.test.(js|jsx|ts|tsx)'], moduleNameMapper: { '\\.(css|less|scss)$': 'identity-obj-proxy', @@ -14,4 +15,4 @@ module.exports = Object.assign(jestConfig, { statements: 0, }, }, -}); +}); \ No newline at end of file diff --git a/packages/layer7-apihub/package.json b/packages/layer7-apihub/package.json index 1b896a10e..cd30566c4 100755 --- a/packages/layer7-apihub/package.json +++ b/packages/layer7-apihub/package.json @@ -17,6 +17,7 @@ "@material-ui/core": "~4.9.3", "@material-ui/lab": "~4.0.0-alpha.45", "@rehooks/local-storage": "~2.4.0", + "final-form-calculate": "~1.3.2", "focus-trap-react": "~6.0.0", "jsencrypt": "~3.0.0-rc.1", "ra-i18n-polyglot": "~3.6.2", @@ -27,8 +28,8 @@ "react-dnd": "~10.0.2", "react-dnd-html5-backend": "~10.0.2", "react-markdown-editor-lite": "~1.0.2", - "remark-parse": "~7.0.2", - "remark-react": "~6.0.0", + "remark-parse": "~9.0.0", + "remark-react": "~7.0.1", "remove-markdown": "~0.3.0", "slugify": "~1.4.4", "swagger-ui-react": "~3.27.0", diff --git a/packages/layer7-apihub/src/ApiHubAdmin.js b/packages/layer7-apihub/src/ApiHubAdmin.js index f056ab074..a6372966f 100755 --- a/packages/layer7-apihub/src/ApiHubAdmin.js +++ b/packages/layer7-apihub/src/ApiHubAdmin.js @@ -22,7 +22,7 @@ import { HomePageContent } from './homepage'; import { apis } from './apis'; import { applications } from './applications'; import { documents } from './documentation'; -import { userContexts } from './userContexts'; +import { userProfiles } from './userProfiles'; import { ApiHubLayout } from './ApiHubLayout'; import { readApiHubPreference } from './preferences'; @@ -86,6 +86,7 @@ export const ApiHubAdmin = ({ , , , + , ]; // If the user provided their own resources, they should override the defaults. @@ -100,9 +101,9 @@ export const ApiHubAdmin = ({ {...applications} />, ); } diff --git a/packages/layer7-apihub/src/ApiHubUserMenu.js b/packages/layer7-apihub/src/ApiHubUserMenu.js index 79972d0bf..8a3638cc2 100755 --- a/packages/layer7-apihub/src/ApiHubUserMenu.js +++ b/packages/layer7-apihub/src/ApiHubUserMenu.js @@ -68,8 +68,12 @@ export const ApiHubUserMenu = props => { const userName = userContext ? translate('apihub.menu.user_details.full_name', { - last_name: userContext?.userDetails?.lastName, - first_name: userContext?.userDetails?.firstName, + last_name: userContext?.userDetails?.lastName + ? userContext.userDetails.lastName + : '', + first_name: userContext?.userDetails?.firstName + ? userContext.userDetails.firstName + : '', }) : ''; @@ -115,14 +119,14 @@ export const ApiHubUserMenu = props => { > - {translate('resources.userContexts.actions.edit_profile')} + {translate('resources.userProfiles.actions.edit_profile')} { const initialListDisplay = readApiHubPreference( listDisplayPreferenceName, - LIST_DISPLAY_CARDS + LIST_DISPLAY_DATAGRID ); return ( @@ -104,6 +105,10 @@ const ApiFilter = props => { id: 'New', name: 'resources.apis.portalStatus.unpublished', }, + { + id: 'Incomplete', + name: 'resources.apis.portalStatus.incomplete', + }, ]} /> { statusColorClass )} > - {statusLabel} + {translate( + `resources.applications.status.${statusLabel.toLowerCase()}` + )} {data.defaultKey && ( { expect( getByText('resources.applications.fields.default') ).not.toBeNull(); - expect(getByText('Enabled')).not.toBeNull(); + expect( + getByText('resources.applications.status.enabled') + ).not.toBeNull(); expect( getAllByLabelText('resources.applications.fields.scope') ).not.toBeNull(); diff --git a/packages/layer7-apihub/src/applications/ApplicationEditView.js b/packages/layer7-apihub/src/applications/ApplicationEditView.js index b3ee9d806..f3a1d4725 100755 --- a/packages/layer7-apihub/src/applications/ApplicationEditView.js +++ b/packages/layer7-apihub/src/applications/ApplicationEditView.js @@ -63,7 +63,7 @@ export const ApplicationEditView = ({ organizationName: record.organizationName, oAuthCallbackUrl: record.OauthCallbackUrl || '', oAuthScope: record.OauthScope || '', - oAuthType: record.OauthType?.toLowerCase() || 'none', + oAuthType: record.OauthType?.toLowerCase() || 'public', sharedSecret: null, selected: record.ApiIds?.results, customFields: record.CustomFieldValues?.results || [], @@ -120,7 +120,7 @@ export const ApplicationEditView = ({ OrganizationName: organizationName, OauthCallbackUrl: oAuthCallbackUrl, OauthScope: oAuthScope, - OauthType: oAuthType === 'none' ? null : oAuthType, + OauthType: oAuthType, Uuid: id, ApiIds: { results: ApiIds }, ApiApiPlanIds: { results: ApiApiPlanIds }, @@ -269,12 +269,6 @@ export const ApplicationEditView = ({ className={classes.input} required choices={[ - { - id: 'none', - name: translate( - 'resources.applications.fields.none' - ), - }, { id: 'public', name: translate( diff --git a/packages/layer7-apihub/src/applications/ApplicationNew.js b/packages/layer7-apihub/src/applications/ApplicationNew.js index be5698ac8..76c6696a1 100755 --- a/packages/layer7-apihub/src/applications/ApplicationNew.js +++ b/packages/layer7-apihub/src/applications/ApplicationNew.js @@ -49,7 +49,7 @@ export const ApplicationNew = ({ userContext, toolbarProps }) => { organizationName: activeOrg?.name || '', oAuthCallbackUrl: '', oAuthScope: '', - oAuthType: 'none', + oAuthType: 'public', sharedSecret: null, }; useEffect(() => { @@ -92,7 +92,7 @@ export const ApplicationNew = ({ userContext, toolbarProps }) => { OrganizationUuid: selectedOrganization, OauthCallbackUrl: oAuthCallbackUrl, OauthScope: oAuthScope, - OauthType: oAuthType === 'none' ? null : oAuthType, + OauthType: oAuthType, Uuid: '{{GENERATED_GUID}}', ApiIds: { results: ApiIds }, ApiApiPlanIds: { results: ApiApiPlanIds }, @@ -218,12 +218,6 @@ export const ApplicationNew = ({ userContext, toolbarProps }) => { label="resources.applications.fields.type" className={classes.input} choices={[ - { - id: 'none', - name: translate( - 'resources.applications.fields.none' - ), - }, { id: 'public', name: translate( diff --git a/packages/layer7-apihub/src/authentication/Login/LoginForm.js b/packages/layer7-apihub/src/authentication/Login/LoginForm.js index 3180a0100..0b0cf7d7c 100755 --- a/packages/layer7-apihub/src/authentication/Login/LoginForm.js +++ b/packages/layer7-apihub/src/authentication/Login/LoginForm.js @@ -7,7 +7,7 @@ import { useLogin, useTranslate, } from 'react-admin'; -import { Link as RouterLink } from 'react-router-dom'; +import { Link as RouterLink, useLocation } from 'react-router-dom'; import { makeStyles, Link, Typography } from '@material-ui/core'; import get from 'lodash/get'; import { AuthSchemeList, LoginToolbar } from '.'; @@ -19,11 +19,12 @@ export const LoginForm = props => { const login = useLogin(); const classes = useStyles(rest); const translate = useTranslate(); + const location = useLocation(); const [ authSchemes, defaultAuthScheme, defaultEnhancedPasswordSecurity, - ] = useAuthSchemes(); + ] = useAuthSchemes(location); const [publicKey, encrypt] = usePasswordEncryption(); const [isLoading, setIsLoading] = useState(null); diff --git a/packages/layer7-apihub/src/authentication/useAuthSchemes.js b/packages/layer7-apihub/src/authentication/useAuthSchemes.js index 1ab5918b1..bb70e5d6f 100755 --- a/packages/layer7-apihub/src/authentication/useAuthSchemes.js +++ b/packages/layer7-apihub/src/authentication/useAuthSchemes.js @@ -3,7 +3,11 @@ import get from 'lodash/get'; import { useApiHub } from '../ApiHubContext'; import { getFetchJson } from '../fetchUtils'; -export const getAuthSchemes = async (urlWithTenant, originHubName) => { +export const getAuthSchemes = async ( + urlWithTenant, + originHubName, + location +) => { const fetchJson = getFetchJson(originHubName); const timestamp = Date.now(); const { json } = await fetchJson( @@ -17,15 +21,31 @@ export const getAuthSchemes = async (urlWithTenant, originHubName) => { const defaultLoginScheme = json.authSchemes.find( scheme => scheme.defaultConfig ); - if (defaultLoginScheme && (defaultLoginScheme.authMethod === 'SAML')) { + if (defaultLoginScheme && defaultLoginScheme.authMethod === 'SAML') { isSamlDefaultConfig = true; } + let host = window.location.href; + if (location && location.state) { + host = + host.replace(window.location.hash, '') + + '#' + + location.state.nextPathname; + } + + var encoded_query_param = encodeURIComponent(host); + schemesList.forEach((authScheme, i) => { + if (authScheme.authMethod === 'SAML') { + authScheme.url = authScheme.url + '?fromUrl=' + encoded_query_param; + } else if (authScheme.authMethod === 'SAML_DEPRECATED') { + authScheme.url = authScheme.url + '?fromUrl=' + encoded_query_param; + } + }); + if (json.isOktaProxied) { schemesList = schemesList.filter( scheme => scheme.authMethod !== 'SAML' ); - const host = window.location.href; const a = document.createElement('a'); a.href = urlWithTenant; const baseUrl = a.protocol + '//' + a.hostname; @@ -41,7 +61,7 @@ export const getAuthSchemes = async (urlWithTenant, originHubName) => { authMethod: 'SAML', links: [], }; - var encoded_query_param = encodeURIComponent(host); + okta_saml.url = `${baseUrl}/admin/login?fromApiHub=true&fromUrl=${encoded_query_param}`; schemesList.push(okta_saml); } @@ -56,7 +76,7 @@ export const getAuthSchemes = async (urlWithTenant, originHubName) => { return [schemesList, enhancedPasswordSecurity === 'yes']; }; -export const useAuthSchemes = () => { +export const useAuthSchemes = location => { const { urlWithTenant, originHubName } = useApiHub(); const [authSchemes, setAuthSchemes] = useState([]); const [enhancedPasswordSecurity, setEnhancedPasswordSecurity] = useState( @@ -64,11 +84,11 @@ export const useAuthSchemes = () => { ); useEffect(() => { - getAuthSchemes(urlWithTenant, originHubName).then(resp => { + getAuthSchemes(urlWithTenant, originHubName, location).then(resp => { setAuthSchemes(resp[0]); setEnhancedPasswordSecurity(resp[1]); }); - }, [originHubName, urlWithTenant]); + }, [location, originHubName, urlWithTenant]); const defaultScheme = authSchemes.find(scheme => scheme.defaultConfig); diff --git a/packages/layer7-apihub/src/authentication/useAuthSchemes.test.js b/packages/layer7-apihub/src/authentication/useAuthSchemes.test.js index b9760ca1b..e3d44db9c 100755 --- a/packages/layer7-apihub/src/authentication/useAuthSchemes.test.js +++ b/packages/layer7-apihub/src/authentication/useAuthSchemes.test.js @@ -10,7 +10,13 @@ describe('useAuthSchemes', () => { afterEach(() => { windowSpy.mockRestore(); }); + test('should only return all non-default auth schemes when isOktaProxied is false', async () => { + windowSpy.mockImplementation(() => ({ + location: { + href: 'https://apim.dev.ca.com/admin', + }, + })); global.fetch = jest.fn().mockResolvedValue({ text: () => Promise.resolve( @@ -33,6 +39,7 @@ describe('useAuthSchemes', () => { description: 'description two', name: 'name two', uuid: 'uuid two', + url: '', }, { authMethod: 'SOME_AUTH', @@ -56,6 +63,7 @@ describe('useAuthSchemes', () => { description: 'description two', name: 'name two', uuid: 'uuid two', + url: '?fromUrl=https%3A%2F%2Fapim.dev.ca.com%2Fadmin', }, { authMethod: 'SOME_AUTH', diff --git a/packages/layer7-apihub/src/authentication/validatePassword.js b/packages/layer7-apihub/src/authentication/validatePassword.js index 62285ff73..e0935d35f 100755 --- a/packages/layer7-apihub/src/authentication/validatePassword.js +++ b/packages/layer7-apihub/src/authentication/validatePassword.js @@ -1,4 +1,5 @@ import { composeValidators, maxLength, minLength, regex } from 'ra-core'; +import forEach from 'lodash/forEach'; export const validatePassword = composeValidators([ minLength(8), @@ -17,3 +18,40 @@ export const validatePassword = composeValidators([ 'apihub.validation.password.at_least_one_special_character' ), ]); + +export const getPwdTooltip = (regConfig, translate) => { + if (!regConfig) return ''; + const rulesTypes = { + MINIMUM_LENGTH: 'tooltip_password_min', + MAXIMUM_LENGTH: 'tooltip_password_max', + LOWERCASE: 'tooltip_password_lower', + UPPERCASE: 'tooltip_password_upper', + NUMBER: 'tooltip_password_number', + }; + const messages = []; + messages.push( + translate('resources.userProfiles.validation.tooltip_password_title') + ); + forEach(rulesTypes, (msgId, type) => { + const configObj = regConfig[type]; + if (configObj && configObj.enabled) { + messages.push( + translate(`resources.userProfiles.validation.${msgId}`, { + num: configObj.value, + }) + ); + } + }); + if (regConfig && regConfig['SYMBOL'] && regConfig['SYMBOL'].enabled) { + messages.push( + translate( + 'resources.userProfiles.validation.tooltip_password_special', + { + num: regConfig['SYMBOL'].value, + symbols: regConfig['SUPPORTED_SYMBOLS'].value, + } + ) + ); + } + return messages.join('\n'); +}; diff --git a/packages/layer7-apihub/src/dataProvider/index.js b/packages/layer7-apihub/src/dataProvider/index.js index 299f4c27e..0201f65bf 100755 --- a/packages/layer7-apihub/src/dataProvider/index.js +++ b/packages/layer7-apihub/src/dataProvider/index.js @@ -15,6 +15,7 @@ import { registrationsDataProvider } from './registrations'; import { specsDataProvider } from './specs'; import { tagsDataProvider } from './tags'; import { userContextsDataProvider } from './userContexts'; +import { userProfilesDataProvider } from './userProfiles'; export const dataProvider = ( baseUrl, @@ -46,6 +47,7 @@ export const dataProvider = ( specs: specsDataProvider(context), tags: tagsDataProvider(context), userContexts: userContextsDataProvider(context), + userProfiles: userProfilesDataProvider(context), }; const proxy = new Proxy(fakeDataProvider, { diff --git a/packages/layer7-apihub/src/i18n/en.js b/packages/layer7-apihub/src/i18n/en.js index 69f9cb7d2..74ecc21ac 100755 --- a/packages/layer7-apihub/src/i18n/en.js +++ b/packages/layer7-apihub/src/i18n/en.js @@ -44,7 +44,8 @@ const apiHubMessages = { forgot_password: 'Forgot password?', }, notifications: { - invalid_credentials: 'Invalid credentials', + invalid_credentials: + 'Invalid credentials. Please try again or use the forgot password link below', selected_scheme: 'Signing in with', }, }, @@ -369,6 +370,7 @@ const apiHubMessages = { enabled: 'Enabled', disabled: 'Disabled', deprecated: 'Deprecated', + incomplete: 'Incomplete', unpublished: 'Unpublished', rejected: 'Rejected', application_pending_approval: 'Pending Approval', @@ -543,6 +545,46 @@ const apiHubMessages = { }, }, }, + userProfiles: { + passwordDialogTitle: 'Enter Current Password', + fields: { + userName: 'Username', + lastName: 'Last Name', + firstName: 'First Name', + email: 'Email', + password: 'Password', + currentPassword: 'Current Password', + newPassword: 'New Password', + confirmNewPassword: 'Confirm New Password', + }, + actions: { + edit_profile: 'My Profile', + cancel: 'Cancel', + submit: 'Submit', + }, + notifications: { + update_success: 'Profile updated', + }, + validation: { + error_password_empty: "Password can't be blank", + error_password_match: 'The passwords do not match', + error_password_not_matching_criteria: + 'Password must meet the specified password requirements.', + tooltip_current_password: + 'Password required to make changes. Please enter your current password.', + tooltip_password_title: 'Password requirements:', + tooltip_password_min: '-Minimum %{num} characters', + tooltip_password_max: '-Maximum %{num} characters', + tooltip_password_lower: + '-At least %{num} lowercase character(s)', + tooltip_password_upper: + '-At least %{num} uppercase character(s)', + tooltip_password_number: '-At least %{num} number(s)', + tooltip_password_special: + '-At least %{num} special character(s): %{symbols}', + tooltip_password_confirm: 'Repeat your password', + }, + }, }, }; diff --git a/packages/layer7-apihub/src/i18n/es.js b/packages/layer7-apihub/src/i18n/es.js index 4a0ee81a0..1b5a58898 100755 --- a/packages/layer7-apihub/src/i18n/es.js +++ b/packages/layer7-apihub/src/i18n/es.js @@ -45,7 +45,8 @@ const apiHubMessages = { forgot_password: '¿Ha olvidado la contraseña?', }, notifications: { - invalid_credentials: 'Credenciales no válidas', + invalid_credentials: + 'Credenciales no válidas. Vuelva a intentarlo o utilice el enlace de contraseña olvidada a continuación', selected_scheme: 'Iniciando sesión con', }, }, diff --git a/packages/layer7-apihub/src/i18n/fr.js b/packages/layer7-apihub/src/i18n/fr.js index 1a02982f5..20737053e 100755 --- a/packages/layer7-apihub/src/i18n/fr.js +++ b/packages/layer7-apihub/src/i18n/fr.js @@ -46,7 +46,7 @@ const apiHubMessages = { }, notifications: { invalid_credentials: - "Informations d'identification non valides", + "Informations d'identification non valides. Veuillez réessayer ou utiliser le lien mot de passe oublié ci-dessous", selected_scheme: 'Connexion avec', }, }, diff --git a/packages/layer7-apihub/src/i18n/it.js b/packages/layer7-apihub/src/i18n/it.js index 62e0c1b85..51c05e3da 100755 --- a/packages/layer7-apihub/src/i18n/it.js +++ b/packages/layer7-apihub/src/i18n/it.js @@ -38,7 +38,8 @@ const apiHubMessages = { forgot_password: 'Password dimenticata?', }, notifications: { - invalid_credentials: 'Credenziali non valide', + invalid_credentials: + 'Credenziali non valide. Riprova o usa il link di seguito per la password dimenticata', selected_scheme: 'Accesso con', }, }, diff --git a/packages/layer7-apihub/src/index.js b/packages/layer7-apihub/src/index.js index 6a9539cb9..1d7847f7b 100755 --- a/packages/layer7-apihub/src/index.js +++ b/packages/layer7-apihub/src/index.js @@ -18,5 +18,6 @@ export * from './preferences'; export * from './theme'; export * from './ui'; export * from './userContexts'; +export * from './userProfiles'; export * from './fetchUtils'; export * from './useLayer7Notify'; diff --git a/packages/layer7-apihub/src/ui/index.js b/packages/layer7-apihub/src/ui/index.js index 12ad87f3a..ed697e783 100755 --- a/packages/layer7-apihub/src/ui/index.js +++ b/packages/layer7-apihub/src/ui/index.js @@ -6,6 +6,7 @@ export * from './Create'; export * from './CustomFieldInput'; export * from './Datagrid'; export * from './Edit'; +export * from './FormDialog'; export * from './HtmlTooltip'; export * from './LinkField'; export * from './List'; diff --git a/packages/layer7-apihub/src/userContexts/UserContextEdit.js b/packages/layer7-apihub/src/userContexts/UserContextEdit.js deleted file mode 100755 index 24bee381e..000000000 --- a/packages/layer7-apihub/src/userContexts/UserContextEdit.js +++ /dev/null @@ -1,264 +0,0 @@ -import React, { useCallback } from 'react'; -import { - EditView, - SimpleForm, - Toolbar, - TextField, - TextInput, - EditButton, - SaveButton, - required, - maxLength, - email, - useEditController, - useTranslate, -} from 'react-admin'; -import { Link } from 'react-router-dom'; -import { makeStyles } from '@material-ui/core'; -import Button from '@material-ui/core/Button'; -import get from 'lodash/get'; - -import { useLayer7Notify } from '../useLayer7Notify'; -import { ViewTitle, PasswordInput } from '../ui'; -import { useApiHub } from '../ApiHubContext'; -import { usePasswordEncryption, validatePassword } from '../authentication'; -import { UserContextTitle } from './UserContextTitle'; -import { UserContextSubtitle } from './UserContextSubtitle'; -import { getFetchJson } from '../fetchUtils'; - -export const UserContextEdit = props => { - const { record, save, ...editControllerProps } = useEditController({ - successMessage: 'resources.userContexts.notifications.update_success', - ...props, - }); - - const updatePassword = useUpdatePassword(record); - - const handleSave = async formData => { - const { - currentPassword, - newPassword, - confirmNewPassword, - ...userContext - } = formData; - - const result = await save(userContext, 'show'); - - if (currentPassword && newPassword && confirmNewPassword) { - await updatePassword({ currentPassword, newPassword }); - } - - return result; - }; - - return ( - <> - - } />} - record={record} - save={handleSave} - > - - - - ); -}; - -const CancelButton = ({ record }) => { - const translate = useTranslate(); - - return ( - - ); -}; - -const useUserContextEditToolbarStyles = makeStyles( - theme => ({ - toolbar: { - backgroundColor: 'transparent', - display: 'flex', - alignItems: 'center', - justifyContent: 'flex-end', - width: 456, - }, - saveButton: { - marginLeft: theme.spacing(2), - }, - }), - { - name: 'Layer7UserContextEditToolbar', - } -); - -const UserContextEditToolbar = ({ record, ...rest }) => { - const classes = useUserContextEditToolbarStyles(); - - return ( - - - - - ); -}; - -const useUserContextEditFormStyles = makeStyles( - theme => ({ - root: { - padding: `${theme.spacing(2)}px !important`, - }, - field: { - width: 456, - }, - }), - { - name: 'Layer7UserContextEditForm', - } -); - -const validateName = [required(), maxLength(60)]; -const validateEmail = [required(), maxLength(256), email()]; - -export const UserContextEditForm = ({ record, basePath, save, ...rest }) => { - const classes = useUserContextEditFormStyles(); - - const validate = ({ currentPassword, newPassword, confirmNewPassword }) => { - const errors = {}; - - if (newPassword) { - if (!currentPassword) { - errors.currentPassword = - 'resources.userContexts.validation.error_current_password_empty'; - } - if (newPassword !== confirmNewPassword) { - errors.confirmNewPassword = - 'resources.userContexts.validation.error_password_match'; - } - } - - return errors; - }; - - return ( - } - validate={validate} - {...rest} - > - - - - - - - - - - ); -}; - -const useUpdatePassword = user => { - const { url, urlWithTenant, originHubName } = useApiHub(); - const notify = useLayer7Notify(); - const [publicKey, encrypt] = usePasswordEncryption(); - const uuid = get(user, 'userDetails.uuid'); - - return useCallback( - async ({ currentPassword, newPassword }) => { - let finalPassword = currentPassword; - let finalNewPassword = newPassword; - const headers = new Headers({ - 'Content-Type': 'application/json; charset=UTF-8', - Accept: 'text/plain, */*; q=0.01', - }); - - if (publicKey) { - const [ - encryptedPassword, - encryptedNewPassword, - ] = await Promise.all([ - encrypt(currentPassword), - encrypt(newPassword), - ]); - - finalPassword = encryptedPassword; - finalNewPassword = encryptedNewPassword; - headers.set('Public-Key', publicKey); - } - - const fetchJson = getFetchJson(originHubName); - // This is need to get a special cookie required for password change - await fetchJson(`${urlWithTenant}/sessionCheck`); - - return fetchJson(`${url}/admin/v2/users/password/change`, { - credentials: 'include', - headers: headers, - body: JSON.stringify({ - uuid: uuid, - password: finalPassword, - newPassword: finalNewPassword, - }), - method: 'PUT', - }) - .then(() => { - notify( - 'resources.userContexts.notifications.confirm_password_change' - ); - }) - .catch(error => { - if (error.status === 400) { - notify( - error || - 'resources.userContexts.notifications.invalid_password', - 'error' - ); - } - notify( - error || - 'resources.userContexts.notifications.update_error', - 'error' - ); - }); - }, - [encrypt, notify, originHubName, publicKey, url, urlWithTenant, uuid] - ); -}; diff --git a/packages/layer7-apihub/src/userContexts/UserContextEdit.test.js b/packages/layer7-apihub/src/userContexts/UserContextEdit.test.js deleted file mode 100755 index ceca7ecb1..000000000 --- a/packages/layer7-apihub/src/userContexts/UserContextEdit.test.js +++ /dev/null @@ -1,347 +0,0 @@ -import React from 'react'; -import expect from 'expect'; -import { createAdminStore, TestTranslationProvider } from 'ra-core'; -import { Notification } from 'react-admin'; -import { render, fireEvent, within } from '@testing-library/react'; -import { Provider } from 'react-redux'; -import { createMemoryHistory } from 'history'; -import { Router } from 'react-router-dom'; - -import { UserContextEditForm } from './UserContextEdit'; - -const baseData = { - id: 'layer7@currentUser', - userDetails: { - username: 'marmelab', - lastName: 'Amoros', - firstName: 'Adrien', - email: 'adrien@marmelab.com', - }, -}; - -describe('UserContextEdit page', () => { - const history = createMemoryHistory(); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - describe('UserContextEditForm', () => { - const renderUserContextEditForm = ({ - data = baseData, - ...props - } = {}) => { - const store = createAdminStore({ - history, - initialState: { - admin: { - resources: { - userContexts: { - [data.id]: { - ...data, - }, - }, - }, - }, - }, - }); - - const handleSave = jest.fn(); - - return { - store, - save: handleSave, - ...render( - - - key}> - - - - - - ), - }; - }; - - test('should fill the form with the user details', async () => { - const { getByLabelText } = renderUserContextEditForm(); - - // User Details - - expect( - await getByLabelText( - 'resources.userContexts.fields.userDetails.username' - ).textContent - ).toEqual('marmelab'); - expect( - await getByLabelText( - 'resources.userContexts.fields.userDetails.lastName *' - ).value - ).toEqual('Amoros'); - expect( - await getByLabelText( - 'resources.userContexts.fields.userDetails.firstName *' - ).value - ).toEqual('Adrien'); - expect( - await getByLabelText( - 'resources.userContexts.fields.userDetails.email *' - ).value - ).toEqual('adrien@marmelab.com'); - - // Password - - expect( - await getByLabelText( - 'resources.userContexts.fields.currentPassword' - ).value - ).toEqual(''); - expect( - await getByLabelText( - 'resources.userContexts.fields.newPassword' - ).value - ).toEqual(''); - expect( - await getByLabelText( - 'resources.userContexts.fields.confirmNewPassword' - ).value - ).toEqual(''); - }); - - test('should change the user details', async () => { - const { save, getByLabelText } = renderUserContextEditForm(); - - // Fill the form - - const lastName = await getByLabelText( - 'resources.userContexts.fields.userDetails.lastName *' - ); - fireEvent.focus(lastName); - fireEvent.change(lastName, { target: { value: 'Garcia' } }); - fireEvent.blur(lastName); - - const firstName = await getByLabelText( - 'resources.userContexts.fields.userDetails.firstName *' - ); - fireEvent.focus(firstName); - fireEvent.change(firstName, { target: { value: 'Gildas' } }); - fireEvent.blur(firstName); - - const email = await getByLabelText( - 'resources.userContexts.fields.userDetails.email *' - ); - fireEvent.focus(email); - fireEvent.change(email, { - target: { value: 'gildas@marmelab.com' }, - }); - fireEvent.blur(email); - - // Submit - - fireEvent.click(getByLabelText('ra.action.save')); - - expect(save).toHaveBeenCalledWith( - { - id: 'layer7@currentUser', - userDetails: { - username: 'marmelab', - lastName: 'Garcia', - firstName: 'Gildas', - email: 'gildas@marmelab.com', - }, - }, - 'show' - ); - }); - - test('should validate the user details required fields', async () => { - const { save, getByLabelText } = renderUserContextEditForm(); - - // Fill the form - - const lastName = await getByLabelText( - 'resources.userContexts.fields.userDetails.lastName *' - ); - fireEvent.focus(lastName); - fireEvent.change(lastName, { - target: { - value: '', - }, - }); - fireEvent.blur(lastName); - - const firstName = await getByLabelText( - 'resources.userContexts.fields.userDetails.firstName *' - ); - fireEvent.focus(firstName); - fireEvent.change(firstName, { - target: { - value: '', - }, - }); - fireEvent.blur(firstName); - - const email = await getByLabelText( - 'resources.userContexts.fields.userDetails.email *' - ); - fireEvent.focus(email); - fireEvent.change(email, { - target: { - value: '', - }, - }); - fireEvent.blur(email); - - // Submit - - fireEvent.click(getByLabelText('ra.action.save')); - - // Validate lastName - - const lastNameInput = await getByLabelText( - 'resources.userContexts.fields.userDetails.lastName *' - ).parentElement.parentElement; - const lastNameValidation = await within(lastNameInput).getByText( - 'ra.validation.required' - ); - expect(lastNameValidation).not.toBe(null); - - // Validate firstName - - const firstNameInput = await getByLabelText( - 'resources.userContexts.fields.userDetails.firstName *' - ).parentElement.parentElement; - const firstNameValidation = await within(firstNameInput).getByText( - 'ra.validation.required' - ); - expect(firstNameValidation).not.toBe(null); - - // Validate email - - const emailInput = await getByLabelText( - 'resources.userContexts.fields.userDetails.email *' - ).parentElement.parentElement; - const emailValidation = await within(emailInput).getByText( - 'ra.validation.required' - ); - expect(emailValidation).not.toBe(null); - - // Global validation - - expect(save).not.toHaveBeenCalled(); - }); - - test('should validate the user details email field', async () => { - const { save, getByLabelText } = renderUserContextEditForm(); - - // Fill the form - - const email = await getByLabelText( - 'resources.userContexts.fields.userDetails.email *' - ); - fireEvent.focus(email); - fireEvent.change(email, { - target: { - value: 'adrienmarmelab.com', // Missing @ - }, - }); - fireEvent.blur(email); - - // Submit - - fireEvent.click(getByLabelText('ra.action.save')); - - // Validate email - - const emailInput = await getByLabelText( - 'resources.userContexts.fields.userDetails.email *' - ).parentElement.parentElement; - const emailValidation = await within(emailInput).getByText( - 'ra.validation.email' - ); - expect(emailValidation).not.toBe(null); - - // Global validation - - expect(save).not.toHaveBeenCalled(); - }); - - test('should validate the user password fields', async () => { - const { save, getByLabelText } = renderUserContextEditForm(); - - // Fill the form - - const currentPassword = await getByLabelText( - 'resources.userContexts.fields.currentPassword' - ); - fireEvent.focus(currentPassword); - fireEvent.change(currentPassword, { - target: { - value: '', - }, - }); - fireEvent.blur(currentPassword); - - const newPassword = await getByLabelText( - 'resources.userContexts.fields.newPassword' - ); - fireEvent.focus(newPassword); - fireEvent.change(newPassword, { - target: { - value: 'MySuperSecuredPassword@1', - }, - }); - fireEvent.blur(newPassword); - - const confirmNewPassword = await getByLabelText( - 'resources.userContexts.fields.confirmNewPassword' - ); - fireEvent.focus(confirmNewPassword); - fireEvent.change(confirmNewPassword, { - target: { - value: 'NotTheSame', - }, - }); - fireEvent.blur(confirmNewPassword); - - // Submit - - fireEvent.click(getByLabelText('ra.action.save')); - - // Validate currentPassword - - const currentPasswordInput = await getByLabelText( - 'resources.userContexts.fields.currentPassword' - ).parentElement.parentElement; - const currentPasswordValidation = await within( - currentPasswordInput - ).getByText( - 'resources.userContexts.validation.error_current_password_empty' - ); - expect(currentPasswordValidation).not.toBe(null); - - // Validate confirmNewPassword - - const confirmNewPasswordInput = await getByLabelText( - 'resources.userContexts.fields.confirmNewPassword' - ).parentElement.parentElement; - const confirmNewPasswordValidation = await within( - confirmNewPasswordInput - ).getByText( - 'resources.userContexts.validation.error_password_match' - ); - expect(confirmNewPasswordValidation).not.toBe(null); - - // Global validation - - expect(save).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/layer7-apihub/src/userContexts/UserContextList.js b/packages/layer7-apihub/src/userContexts/UserContextList.js deleted file mode 100755 index fbfffd23f..000000000 --- a/packages/layer7-apihub/src/userContexts/UserContextList.js +++ /dev/null @@ -1,20 +0,0 @@ -import React, { useEffect } from 'react'; -import { useRedirect } from 'react-admin'; -import CircularProgress from '@material-ui/core/CircularProgress'; - -import { CurrentUserId } from '../dataProvider/userContexts'; - -/** - * The UserContext is a particular resource that cannot be listed, - * and that contains only one element. - * We perform a redirection to the edit page instead of displaying a blank page. - */ -export const UserContextList = () => { - const redirect = useRedirect(); - - useEffect(() => { - redirect(`/userContexts/${CurrentUserId}/show`); - }, [redirect]); - - return ; -}; diff --git a/packages/layer7-apihub/src/userContexts/UserContextShow.js b/packages/layer7-apihub/src/userContexts/UserContextShow.js deleted file mode 100755 index 1f7cc6b2a..000000000 --- a/packages/layer7-apihub/src/userContexts/UserContextShow.js +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; -import { Show, SimpleShowLayout, TextField, EditButton } from 'react-admin'; -import { makeStyles } from '@material-ui/core'; - -import { ViewTitle } from '../ui'; -import { UserContextTitle } from './UserContextTitle'; -import { UserContextSubtitle } from './UserContextSubtitle'; - -export const UserContextShow = props => { - const classes = useStyles(props); - - return ( - <> - - } {...props} />} - actions={null} - > - - - - - - - - - - - ); -}; - -const useStyles = makeStyles( - theme => ({ - root: { - padding: `${theme.spacing(4)}px !important`, - }, - field: { - width: 456, - }, - }), - { - name: 'Layer7UserContextShow', - } -); diff --git a/packages/layer7-apihub/src/userContexts/index.js b/packages/layer7-apihub/src/userContexts/index.js index 96f4af5e0..481d96bc9 100755 --- a/packages/layer7-apihub/src/userContexts/index.js +++ b/packages/layer7-apihub/src/userContexts/index.js @@ -1,13 +1,3 @@ -import { UserContextList } from './UserContextList'; -import { UserContextEdit } from './UserContextEdit'; -import { UserContextShow } from './UserContextShow'; - -export const userContexts = { - list: UserContextList, - edit: UserContextEdit, - show: UserContextShow, -}; - export * from './UserOrganizationSwitcher'; export * from './useUserContext'; export * from './getUserOrganizations'; diff --git a/pom.xml b/pom.xml index eda948231..e61b7b969 100755 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.ca.apim apihub - 25.6-SNAPSHOT + 27.4-SNAPSHOT jar diff --git a/yarn.lock b/yarn.lock index 2fc414586..7858ecd28 100755 --- a/yarn.lock +++ b/yarn.lock @@ -1307,13 +1307,20 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@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== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.6.2": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3", "@babel/template@^7.4.0", "@babel/template@^7.8.6": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -1903,15 +1910,15 @@ "@babel/runtime" "^7.4.4" "@material-ui/lab@~4.0.0-alpha.45", "@material-ui/lab@~4.0.0-alpha.54": - version "4.0.0-alpha.56" - resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.56.tgz#ff63080949b55b40625e056bbda05e130d216d34" - integrity sha512-xPlkK+z/6y/24ka4gVJgwPfoCF4RCh8dXb1BNE7MtF9bXEBLN/lBxNTK8VAa0qm3V2oinA6xtUIdcRh0aeRtVw== + version "4.0.0-alpha.58" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.58.tgz#c7ebb66f49863c5acbb20817163737caa299fafc" + integrity sha512-GKHlJqLxUeHH3L3dGQ48ZavYrqGOTXkFkiEiuYMAnAvXAZP4rhMIqeHOPXSUQan4Bd8QnafDcpovOSLnadDmKw== dependencies: "@babel/runtime" "^7.4.4" - "@material-ui/utils" "^4.10.2" + "@material-ui/utils" "^4.11.2" clsx "^1.0.4" prop-types "^15.7.2" - react-is "^16.8.0" + react-is "^16.8.0 || ^17.0.0" "@material-ui/styles@^4.10.0", "@material-ui/styles@^4.11.1", "@material-ui/styles@~4.10.0": version "4.10.0" @@ -1959,6 +1966,15 @@ prop-types "^15.7.2" react-is "^16.8.0" +"@material-ui/utils@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a" + integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + "@miragejs/pretender-node-polyfill@^0.1.0": version "0.1.2" resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2" @@ -2022,13 +2038,6 @@ dependencies: mkdirp "^1.0.4" -"@openapi-contrib/openapi-schema-to-json-schema@^3.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.0.4.tgz#a0e29445b9cd76331c473ab820e97b28ae828ebc" - integrity sha512-+1RBoJ+xjX8mIXxisTJVlN/r6DOh4kyszw3cLBSAxwKP7Ui42DjlxWgR2PnWxOOWtRCnQurRzlsvL1ce5FUrWg== - dependencies: - fast-deep-equal "^3.1.3" - "@pmmmwh/react-refresh-webpack-plugin@0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz#1f9741e0bde9790a0e13272082ed7272a083620d" @@ -2199,132 +2208,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@stoplight/http-spec@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@stoplight/http-spec/-/http-spec-2.11.0.tgz#27fc7a9bb67d809a240e39b4169da5cf87146424" - integrity sha512-UY0BvkRkAMhG825Ywy4n1mUU7V7DEpgxGA6KprV7juwVM42Mvn22HiFdXLzl1hnb+soIobIyAUItACe8sbhYBA== - dependencies: - "@openapi-contrib/openapi-schema-to-json-schema" "^3.0" - "@stoplight/json" "^3.5.1" - "@stoplight/types" "^11.5.0" - "@types/swagger-schema-official" "~2.0.21" - "@types/to-json-schema" "^0.2.0" - "@types/type-is" "^1.6.3" - "@types/urijs" "~1.19.7" - json-schema-generator "^2.0.6" - lodash "^4.17.15" - openapi3-ts "~1.3.0" - postman-collection "^3.6.0" - type-is "^1.6.18" - urijs "~1.19.2" - -"@stoplight/json-ref-readers@^1.1.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@stoplight/json-ref-readers/-/json-ref-readers-1.2.1.tgz#45061659cf46b60a7d9422858c4cd4c2a5d5e7c7" - integrity sha512-fbh8sXRrwfOCx4EA2e6FGUwvu5zxCQ9xHZg3vYDFSb1HLTlrCeRTdx3VCmYjCSGAhpcwgpB4zMc8kiudujo8Yg== - dependencies: - node-fetch "^2.6.0" - -"@stoplight/json-ref-resolver@^3.0.1": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.0.tgz#50753b49e650840247aede5734fabb7992eda87d" - integrity sha512-tEVlRi9sMVektCiPsnint0OD/2zzQOPb7GoWboBznDc3f/99SAjgL6TBWvuFCJXWLwhZP4GA55FggmtsF5OvQg== - dependencies: - "@stoplight/json" "^3.4.0" - "@stoplight/path" "^1.3.1" - "@stoplight/types" "^11.6.0" - "@types/urijs" "^1.19.9" - dependency-graph "~0.8.0" - fast-memoize "^2.5.1" - immer "^5.3.2" - lodash "^4.17.15" - tslib "^1.13.0" - urijs "^1.19.2" - -"@stoplight/json@^3.1.2", "@stoplight/json@^3.4.0", "@stoplight/json@^3.5.1": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@stoplight/json/-/json-3.10.0.tgz#bd1af55081e1a47e0d01552d2a7e756931f46a4b" - integrity sha512-Xb1kVQ0t5eqRDF24Y0a2A1o/CEaHjLeVehkBmphqEBkUo6X9L4z5oOUYBMzlAoR/ejhjVgWLzrDBxNOuzBFVDA== - dependencies: - "@stoplight/ordered-object-literal" "^1.0.1" - "@stoplight/types" "^11.9.0" - jsonc-parser "~2.2.1" - lodash "^4.17.15" - safe-stable-stringify "^1.1" - -"@stoplight/ordered-object-literal@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.1.tgz#01ece81ba5dda199ca3dc5ec7464691efa5d5b76" - integrity sha512-kDcBIKwzAXZTkgzaiPXH2I0JXavBkOb3jFzYNFS5cBuvZS3s/K+knpk2wLVt0n8XrnRQsSffzN6XG9HqUhfq6Q== - -"@stoplight/path@^1.3.1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@stoplight/path/-/path-1.3.2.tgz#96e591496b72fde0f0cdae01a61d64f065bd9ede" - integrity sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ== - -"@stoplight/prism-core@^3.3.6": - version "3.3.6" - resolved "https://registry.yarnpkg.com/@stoplight/prism-core/-/prism-core-3.3.6.tgz#aeb52f12e55c726ab4185fed35bc497cdd875a17" - integrity sha512-Mgd/rV/LoLGQvLNmdt7k2t4wbOWrTB7Vmv8p27Xa0QOIp6SBXvGz47HF9S5b66zj65hvsmVbqyaqYEck+4KxRA== - dependencies: - fp-ts "^2.5.3" - lodash "4.17.15" - pino "^6.2.1" - tslib "^1.10.0" - -"@stoplight/prism-http@~3.3.5": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@stoplight/prism-http/-/prism-http-3.3.7.tgz#4f6ba2681181eb8c51729ab849dc9049f40174aa" - integrity sha512-KYTOlrFIXy4RUN56khF5erIpoVWZ+DVX9V7Hm+207lxIM3BO4c2Ny1ii9AMhWmeo7sNfvASFPB1A5LEjxeWRgQ== - dependencies: - "@stoplight/http-spec" "2.11.0" - "@stoplight/json" "^3.1.2" - "@stoplight/json-ref-readers" "^1.1.1" - "@stoplight/json-ref-resolver" "^3.0.1" - "@stoplight/prism-core" "^3.3.6" - "@stoplight/types" "^11.6.0" - "@stoplight/yaml" "^3.0.2" - abstract-logging "^2.0.0" - accepts "^1.3.7" - ajv "^6.10.2" - ajv-oai "^1.0.0" - caseless "^0.12.0" - content-type "^1.0.4" - faker "^4.1.0" - fp-ts "^2.5.3" - fp-ts-contrib "^0.1.15" - json-schema-faker "0.5.0-rc23" - lodash "4.17.15" - node-fetch "^2.6.0" - openapi-sampler "^1.0.0-beta.15" - pino "^6.2.1" - tslib "^1.10.0" - type-is "^1.6.18" - uri-template-lite "^20.5.0" - -"@stoplight/types@^11.1.1", "@stoplight/types@^11.5.0", "@stoplight/types@^11.6.0", "@stoplight/types@^11.9.0": - version "11.9.0" - resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-11.9.0.tgz#ced7de2dd53439d2409a3cb390bf7d5b76382ac6" - integrity sha512-4bzPpWZobt0e+d0OtALCJyl1HGzKo6ur21qxnId9dTl8v3yeD+5HJKZ2h1mv7e94debH5QDtimMU80V6jbXM8Q== - dependencies: - "@types/json-schema" "^7.0.4" - utility-types "^3.10.0" - -"@stoplight/yaml-ast-parser@0.0.45": - version "0.0.45" - resolved "https://registry.yarnpkg.com/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.45.tgz#672c0a1511d581843be5a9c55899ca95a30dcadb" - integrity sha512-0MTEvgp3XMdeMUSTCGiNECuC+YlLbzytDEIOJVDHrrmzVZpIR3gGnHI6mmPI4P7saPxUiHxFF2uuoTuCNlKjrw== - -"@stoplight/yaml@^3.0.2": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@stoplight/yaml/-/yaml-3.8.1.tgz#2a2accdb8b3b6df5c3f1ba93086ca9deb99be0e4" - integrity sha512-wbhcgo7dTjwjjwFziC/SAcQlwPucYhYq6vjzyOjj8zeOVnnmoa7hzU1i9Kj31473FG/re7xtt6j3LWu2VnYbxg== - dependencies: - "@stoplight/ordered-object-literal" "^1.0.1" - "@stoplight/types" "^11.1.1" - "@stoplight/yaml-ast-parser" "0.0.45" - lodash "^4.17.15" - "@surma/rollup-plugin-off-main-thread@^1.1.1": version "1.4.2" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" @@ -2832,7 +2715,7 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== @@ -2842,6 +2725,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2946,11 +2836,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== -"@types/swagger-schema-official@~2.0.21": - version "2.0.21" - resolved "https://registry.yarnpkg.com/@types/swagger-schema-official/-/swagger-schema-official-2.0.21.tgz#56812a86dcd57ba60e5c51705ee96a2b2dc9b374" - integrity sha512-n9BbLOjR4Hre7B4TSGGMPohOgOg8tcp00uxqsIE00uuWQC0QuX57G1bqC1csLsk2DpTGtHkd0dEb3ipsCZ9dAA== - "@types/tapable@*", "@types/tapable@^1.0.5": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" @@ -2970,20 +2855,6 @@ dependencies: "@types/jest" "*" -"@types/to-json-schema@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@types/to-json-schema/-/to-json-schema-0.2.0.tgz#6c76736449942aa8a16a522fa2d3fcfd3bcb8d15" - integrity sha512-9fqRjNFSSxJ8dQrE4v8gThS5ftxdFj8Q0y8hAjaF+uN+saJRxLiJdtFaDd9sv3bhzwcB2oDJpT/1ZelHnexbLw== - dependencies: - "@types/json-schema" "*" - -"@types/type-is@^1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@types/type-is/-/type-is-1.6.3.tgz#45285b3be846a4afc9d488910a8e4b7bc2e8a169" - integrity sha512-PNs5wHaNcBgCQG5nAeeZ7OvosrEsI9O4W2jAOO9BCCg4ux9ZZvH2+0iSCOIDBiKuQsiNS8CBlmfX9f5YBQ22cA== - dependencies: - "@types/node" "*" - "@types/uglify-js@*": version "3.11.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.1.tgz#97ff30e61a0aa6876c270b5f538737e2d6ab8ceb" @@ -2991,16 +2862,16 @@ dependencies: source-map "^0.6.1" +"@types/unist@*": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + "@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== -"@types/urijs@^1.19.9", "@types/urijs@~1.19.7": - version "1.19.13" - resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.13.tgz#0bd025b65df8ee5f038bbf6f1cb2e95160b49a56" - integrity sha512-Wg/E8Q+ylkR6JElTwOcjG7kM99/iJz28E9RKr8syOxssRs3gWchsziUkb+Nr254aUBWHY0QiScGAfIx4lKI3/g== - "@types/webpack-sources@*": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.0.0.tgz#08216ab9be2be2e1499beaebc4d469cec81e82a7" @@ -3514,12 +3385,7 @@ abstract-leveldown@~0.12.0, abstract-leveldown@~0.12.1: dependencies: xtend "~3.0.0" -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.7, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -3604,13 +3470,6 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-oai@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ajv-oai/-/ajv-oai-1.2.1.tgz#6d253fde782cf809ace2d9d0b1b07a53905dcdaa" - integrity sha512-gj7dnSdLyjWKid3uQI16u5wQNpkyqivjtCuvI4BWezeOzYTj5YHt4otH9GOBCaXY3FEbzQeWsp6C2qc18+BXDA== - dependencies: - decimal.js "^10.2.0" - ajv@6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" @@ -3856,7 +3715,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@^1.0.1, array-uniq@^1.0.2: +array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= @@ -3997,11 +3856,6 @@ 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== - attr-accept@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" @@ -4412,9 +4266,9 @@ bindings@^1.5.0: file-uri-to-path "1.0.0" bl@~0.8.1, bl@~4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" - integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== + version "4.0.4" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.4.tgz#f4fda39f81a811d0df6368c1ed91dae499d1c900" + integrity sha512-7tdr4EpSd7jJ6tuQ21vu2ke8w7pNEstzj1O8wwq6sNNzO3UDi5MA8Gny/gquCj7r2C6fHudg8tKRGyjRgmvNxQ== dependencies: buffer "^5.5.0" inherits "^2.0.4" @@ -4432,20 +4286,20 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@*, bluebird@^3.5.5, bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - bluebird@3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bluebird@^3.5.5, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1: version "5.1.3" @@ -4539,7 +4393,7 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -4927,7 +4781,7 @@ case-sensitive-paths-webpack-plugin@2.3.0: resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== -caseless@^0.12.0, caseless@~0.12.0: +caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= @@ -5007,11 +4861,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -charset@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/charset/-/charset-1.0.1.tgz#8d59546c355be61049a8fa9164747793319852bd" - integrity sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg== - check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" @@ -5514,7 +5363,7 @@ content-disposition@0.5.3: dependencies: safe-buffer "5.1.2" -content-type@^1.0.4, content-type@~1.0.4: +content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== @@ -6232,6 +6081,13 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: dependencies: ms "^2.1.1" +debug@^4.0.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" @@ -6363,11 +6219,6 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -dependency-graph@~0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.8.1.tgz#9b8cae3aa2c7bd95ccb3347a09a2d1047a6c3c5a" - integrity sha512-g213uqF8fyk40W8SBjm079n3CZB4qSpCrA2ye1fLGzH/4HEgB6tzuW2CbLE7leb4t45/6h44Ud59Su1/ROTfqw== - des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -6465,9 +6316,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -6635,11 +6486,6 @@ downshift@3.2.7: prop-types "^15.6.0" react-is "^16.5.2" -drange@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/drange/-/drange-1.1.1.tgz#b2aecec2aab82fcef11dbbd7b9e32b83f8f6c0b8" - integrity sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA== - duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -6684,17 +6530,17 @@ elegant-spinner@^1.0.1: integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" emitter-component@^1.1.1: version "1.1.1" @@ -6896,7 +6742,7 @@ escalade@^3.0.2, escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@1.0.3, escape-html@~1.0.3: +escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -7732,14 +7578,10 @@ fake-xml-http-request@^2.1.1: resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== -faker@5.1.0, faker@Marak/faker.js: - version "5.1.0" - resolved "https://codeload.github.com/Marak/faker.js/tar.gz/91dc8a3372426bc691be56153b33e81a16459f49" - -faker@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" - integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= +faker@5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== falafel@2.1.0: version "2.1.0" @@ -7756,7 +7598,7 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.1: 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== @@ -7805,21 +7647,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-memoize@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" - integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== - -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" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - fast-url-parser@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" @@ -7954,11 +7781,6 @@ file-selector@^0.1.12: dependencies: tslib "^2.0.1" -file-type@3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= - file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -7996,6 +7818,11 @@ final-form-arrays@^3.0.1: resolved "https://registry.yarnpkg.com/final-form-arrays/-/final-form-arrays-3.0.2.tgz#9f3bef778dec61432357744eb6f3abef7e7f3847" integrity sha512-TfO8aZNz3RrsZCDx8GHMQcyztDNpGxSSi9w4wpSNKlmv2PfFWVVM8P7Yj5tj4n0OWax+x5YwTLhT5BnqSlCi+w== +final-form-calculate@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/final-form-calculate/-/final-form-calculate-1.3.2.tgz#a5e1908d1aa34eeec6faccdba3fd9516e7fd3d4f" + integrity sha512-pon2K9yNbyqmF8UTpDvxwhk+Hvqpl8Fm3qgwkHniNAmCQe+6YxB1aw4cBAHzmRc39jGl2bYsvKyabQOIWLtrPg== + final-form@^4.18.5: version "4.20.1" resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.1.tgz#525a7f7f27f55c28d8994b157b24d6104fc560e9" @@ -8102,11 +7929,6 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" -flatstr@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" - integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== - flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" @@ -8169,7 +7991,7 @@ for-own@^0.1.3: dependencies: for-in "^1.0.1" -foreach@^2.0.4, foreach@^2.0.5, foreach@~2.0.1: +foreach@^2.0.5, foreach@~2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= @@ -8224,11 +8046,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -format-util@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - format@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" @@ -8239,16 +8056,6 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -fp-ts-contrib@^0.1.15: - version "0.1.21" - resolved "https://registry.yarnpkg.com/fp-ts-contrib/-/fp-ts-contrib-0.1.21.tgz#9a2b6c108ad9487922890f46219d5639f3cacc66" - integrity sha512-Wa1wXpeDDVyPiTZaxbas+y6pigKxiZlf/xzUBhFJ5bPNAsOrzNfFeQliu3bIH9ZjYWrt6HIMuNXAejPh6oSSkA== - -fp-ts@^2.5.3: - version "2.9.1" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.9.1.tgz#24557f66f9221f8a1922fce6cbe2b8ea6d0f3929" - integrity sha512-9++IpEtF2blK7tfSV+iHxO3KXdAGO/bPPQtUYqzC6XKzGOWNctqvlf13SpXxcu2mYaibOvneh/m9vAPLAHdoRQ== - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -8731,17 +8538,17 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hast-to-hyperscript@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz#7c4c037d9a8ea19b0a3fdb676a26448ad922353d" - integrity sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA== +hast-to-hyperscript@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-8.1.1.tgz#081e5a98d961ab46277a844f97dfe8dae05a8479" + integrity sha512-IsVTowDrvX4n+Nt+zP0VLQmh/ddVtnFSLUv1gb/706ovL2VgFdnE5ior2fDHSp1Bc0E5GidF2ax+PMjd+TW7gA== dependencies: comma-separated-tokens "^1.0.0" property-information "^5.3.0" space-separated-tokens "^1.0.0" - style-to-object "^0.2.1" - unist-util-is "^3.0.0" - web-namespaces "^1.1.2" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" hast-util-sanitize@^2.0.0: version "2.0.3" @@ -8772,7 +8579,7 @@ history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -8892,7 +8699,7 @@ html-webpack-plugin@4.5.0: tapable "^1.1.3" util.promisify "1.0.0" -htmlparser2@^3.10.0, htmlparser2@^3.3.0: +htmlparser2@^3.3.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -8977,11 +8784,6 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-reasons@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/http-reasons/-/http-reasons-0.1.0.tgz#a953ca670078669dde142ce899401b9d6e85d3b4" - integrity sha1-qVPKZwB4Zp3eFCzomUAbnW6F07Q= - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -9045,7 +8847,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.2, iconv-lite@^0.6.2: +iconv-lite@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== @@ -9106,11 +8908,6 @@ immer@7.0.9: resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.9.tgz#28e7552c21d39dd76feccd2b800b7bc86ee4a62e" integrity sha512-Vs/gxoM4DqNAYR7pugIxi0Xc8XAun/uy7AQu4fLLqaTBHxjOP9pJ266Q9MWA/ly4z6rAFZbvViOtihxUZ7O28A== -immer@^5.3.2: - version "5.3.6" - resolved "https://registry.yarnpkg.com/immer/-/immer-5.3.6.tgz#51eab8cbbeb13075fe2244250f221598818cac04" - integrity sha512-pqWQ6ozVfNOUDjrLfm4Pt7q4Q12cGw2HUZgry4Q5+Myxu9nmHRkWBpI0J4+MK0AxbdFtdMTwEGVl7Vd+vEiK+A== - immutable@^3.8.1, immutable@^3.x.x: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" @@ -10822,7 +10619,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.12.1, js-yaml@^3.13.1, js-yaml@^3.14.0: +js-yaml@^3.13.1, js-yaml@^3.14.0: version "3.14.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== @@ -10956,49 +10753,6 @@ json-parse-even-better-errors@^2.3.0: 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-pointer@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.1.tgz#3c6caa6ac139e2599f5a1659d39852154015054d" - integrity sha512-3OvjqKdCBvH41DLpV4iSt6v2XhZXV1bPB4OROuknvUXI7ZQNofieCPkmE26stEJ9zdQuvIxDHCuYhfgxFAAs+Q== - dependencies: - foreach "^2.0.4" - -json-promise@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/json-promise/-/json-promise-1.1.8.tgz#7b74120422d16ddb449aa3170403fc69ad416402" - integrity sha1-e3QSBCLRbdtEmqMXBAP8aa1BZAI= - dependencies: - bluebird "*" - -json-schema-faker@0.5.0-rc23: - version "0.5.0-rc23" - resolved "https://registry.yarnpkg.com/json-schema-faker/-/json-schema-faker-0.5.0-rc23.tgz#f6cfab390e429b1f57ac83199480439db60962fa" - integrity sha512-lRzFEnp55TihRzMvUBrtvTlM/aHGhCwfes0/T9bN9OiB2n36/SUFxtMn7anYoES+f95eU3viJ/foXKosCwsiJw== - dependencies: - json-schema-ref-parser "^6.1.0" - jsonpath-plus "^1.0.0" - randexp "^0.5.3" - -json-schema-generator@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/json-schema-generator/-/json-schema-generator-2.0.6.tgz#f6f2bef5c52117f51137a9b7b1c32677239e17ca" - integrity sha512-WyWDTK3jnv/OBI43uWw7pTGoDQ62PfccySZCHTBsOfS6D9QhsQr+95Wcwq5lqjzkiDQkTNkWzXEqHOhswfufmw== - dependencies: - json-promise "^1.1.8" - mkdirp "^0.5.0" - optimist "^0.6.1" - pretty-data "^0.40.0" - request "^2.81.0" - -json-schema-ref-parser@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz#30af34aeab5bee0431da805dac0eb21b574bf63d" - integrity sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw== - dependencies: - call-me-maybe "^1.0.1" - js-yaml "^3.12.1" - ono "^4.0.11" - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -11050,11 +10804,6 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -jsonc-parser@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.1.tgz#db73cd59d78cce28723199466b2a03d1be1df2bc" - integrity sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w== - jsonexport@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsonexport/-/jsonexport-2.5.2.tgz#fafbcdb2cb8e12d0a2a92cda6e0634c8d48005ac" @@ -11081,11 +10830,6 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -jsonpath-plus@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-1.1.0.tgz#7caaea4db88b761a0a3b55d715cb01eaa469dfa5" - integrity sha512-ydqTBOuLcFCUr9e7AxJlKCFgxzEQ03HjnIim0hJSdk2NxD8MOsaMOrRgP6XWEm5q3VuDY5+cRT1DM9vLlGo/qA== - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -11482,11 +11226,6 @@ lint-staged@~10.0.7: string-argv "0.3.1" stringify-object "^3.3.0" -liquid-json@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/liquid-json/-/liquid-json-0.3.1.tgz#9155a18136d8a6b2615e5f16f9a2448ab6b50eea" - integrity sha1-kVWhgTbYprJhXl8W+aJEira1Duo= - listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" @@ -11674,11 +11413,6 @@ lodash.debounce@^4, lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - lodash.find@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" @@ -11734,11 +11468,6 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - lodash.lowerfirst@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" @@ -11759,11 +11488,6 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.mergewith@^4.6.1: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - lodash.omit@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" @@ -11829,11 +11553,16 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@4.17.20, "lodash@>=3.5 <5", lodash@^4.0.0, 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.5, lodash@^4.2.1, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.4, lodash@~4.17.5: +lodash@4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +"lodash@>=3.5 <5", lodash@^4.0.0, 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.5, lodash@^4.2.1, lodash@~4.17.10, lodash@~4.17.21, lodash@~4.17.4, lodash@~4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -12010,11 +11739,6 @@ markdown-escapes@^1.0.0: resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== -marked@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.0.tgz#7221ce2395fa6cf6d722e6f2871a32d3513c85ca" - integrity sha512-tiRxakgbNPBr301ihe/785NntvYyhxlqcL3YaC8CaxJQh7kiaEtrN9B/eK2I2943Yjkh5gw25chYFDQhOMCwMA== - martinez-polygon-clipping@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/martinez-polygon-clipping/-/martinez-polygon-clipping-0.4.3.tgz#a3971ddf1da147104b5d0fbbf68f728bb62885c1" @@ -12037,29 +11761,43 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdast-util-definitions@^1.2.0: - version "1.2.5" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz#3fe622a4171c774ebd06f11e9f8af7ec53ea5c74" - integrity sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA== +mdast-util-definitions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-2.0.1.tgz#2c931d8665a96670639f17f98e32c3afcfee25f3" + integrity sha512-Co+DQ6oZlUzvUR7JCpP249PcexxygiaKk9axJh+eRzHDZJk2julbIdKB4PXHVxdBuLzvJ1Izb+YDpj2deGMOuA== dependencies: - unist-util-visit "^1.0.0" + unist-util-visit "^2.0.0" -mdast-util-to-hast@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-6.0.2.tgz#24a8791b7c624118637d70f03a9d29116e4311cf" - integrity sha512-GjcOimC9qHI0yNFAQdBesrZXzUkRdFleQlcoU8+TVNfDW6oLUazUx8MgUoTaUyCJzBOnE5AOgqhpURrSlf0QwQ== +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-hast@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-8.2.0.tgz#adf9f824defcd382e53dd7bace4282a45602ac67" + integrity sha512-WjH/KXtqU66XyTJQ7tg7sjvTw1OQcVV0hKdFh3BgHPwZ96fSBCQ/NitEHsN70Mmnggt+5eUUC7pCnK+2qGQnCA== dependencies: collapse-white-space "^1.0.0" detab "^2.0.0" - mdast-util-definitions "^1.2.0" - mdurl "^1.0.1" - trim "0.0.1" + mdast-util-definitions "^2.0.0" + mdurl "^1.0.0" trim-lines "^1.0.0" - unist-builder "^1.0.1" - unist-util-generated "^1.1.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" unist-util-position "^3.0.0" - unist-util-visit "^1.1.0" - xtend "^4.0.1" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== mdn-data@2.0.14: version "2.0.14" @@ -12071,7 +11809,7 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdurl@^1.0.1: +mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= @@ -12133,9 +11871,9 @@ meow@^3.7.0: trim-newlines "^1.0.0" merge-deep@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" - integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== dependencies: arr-union "^3.1.0" clone-deep "^0.2.4" @@ -12166,6 +11904,14 @@ microevent.ts@~0.1.1: resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -12216,13 +11962,6 @@ mime-db@~1.33.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-format@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mime-format/-/mime-format-2.0.0.tgz#e29f8891e284d78270246f0050d6834bdbbe1332" - integrity sha1-4p+IkeKE14JwJG8AUNaDS9u+EzI= - dependencies: - charset "^1.0.0" - mime-types@2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" @@ -12230,7 +11969,7 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@2.1.27, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -12295,7 +12034,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= @@ -12312,11 +12051,6 @@ minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1. resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minimongo@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/minimongo/-/minimongo-6.5.1.tgz#e9c9a9836640db78565afb29486673074643d4b4" @@ -12567,7 +12301,7 @@ no-case@^3.0.3: lower-case "^2.0.1" tslib "^1.10.0" -node-fetch@2.6.1, node-fetch@^2.6.0: +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== @@ -12965,13 +12699,6 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -ono@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d" - integrity sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g== - dependencies: - format-util "^1.0.3" - open@^7.0.2: version "7.3.0" resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" @@ -12980,18 +12707,6 @@ open@^7.0.2: is-docker "^2.0.0" is-wsl "^2.1.1" -openapi-sampler@^1.0.0-beta.15: - version "1.0.0-beta.18" - resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.0.0-beta.18.tgz#9e0845616a669e048860625ea5c10d0f554f1b53" - integrity sha512-nG/0kvvSY5FbrU5A+Dbp1xTQN++7pKIh87/atryZlxrzDuok5Y6TCbpxO1jYqpUKLycE4ReKGHCywezngG6xtQ== - dependencies: - json-pointer "^0.6.0" - -openapi3-ts@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/openapi3-ts/-/openapi3-ts-1.3.0.tgz#a6b4a6dda1d037cb826f3230426ce5243c75edb3" - integrity sha512-Xk3hsB0PzB4dzr/r/FdmK+VfQbZH7lQQ2iipMS1/1eoz1wUvh5R7rmOakYvw0bQJJE6PYrOLx8UHsYmzgTr+YQ== - opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" @@ -13004,14 +12719,6 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optimize-css-assets-webpack-plugin@5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" @@ -13244,6 +12951,18 @@ parse-entities@^1.1.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -13350,9 +13069,9 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" @@ -13462,23 +13181,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pino-std-serializers@^2.4.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz#40ead781c65a0ce7ecd9c1c33f409d31fe712315" - integrity sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg== - -pino@^6.2.1: - version "6.7.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.7.0.tgz#d5d96b7004fed78816b5694fda3eab02b5ca6d23" - integrity sha512-vPXJ4P9rWCwzlTJt+f0Ni4THc3DWyt8iDDCO4edQ8narTu6hnpzdXu8FqeSJCGndl1W6lfbYQUQihUO54y66Lw== - dependencies: - fast-redact "^3.0.0" - fast-safe-stringify "^2.0.7" - flatstr "^1.0.12" - pino-std-serializers "^2.4.2" - quick-format-unescaped "^4.0.1" - sonic-boom "^1.0.2" - pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -14245,33 +13947,6 @@ postcss@^8.1.0: source-map "^0.6.1" vfile-location "^3.2.0" -postman-collection@^3.6.0: - version "3.6.8" - resolved "https://registry.yarnpkg.com/postman-collection/-/postman-collection-3.6.8.tgz#23215028cc12e425cf825d21eab39ce7cf6a17cc" - integrity sha512-TNPaK2dpVRhttUFo/WN0ReopXEtuSQMktwcvwJbQ0z8K+5hftvyx2ia40xgg9qFl/Ra78qoNTUmLL1s3lRqLMg== - dependencies: - escape-html "1.0.3" - faker "5.1.0" - file-type "3.9.0" - http-reasons "0.1.0" - iconv-lite "0.6.2" - liquid-json "0.3.1" - lodash "4.17.20" - marked "1.2.0" - mime-format "2.0.0" - mime-types "2.1.27" - postman-url-encoder "3.0.0" - sanitize-html "1.20.1" - semver "7.3.2" - uuid "3.4.0" - -postman-url-encoder@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postman-url-encoder/-/postman-url-encoder-3.0.0.tgz#524bda14f0f1303ed606a6b227645adab034860c" - integrity sha512-bk5wus5/5Ei9pbh+sQXaAxS5n4ZwiNAaIA8VBvRcXP6QyKcue2yF6xk1HqdtaZoH1G8+6509SVeOBojoFQ7nrA== - dependencies: - punycode "^2.1.1" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -14317,11 +13992,6 @@ pretty-bytes@^5.1.0, pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b" integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== -pretty-data@^0.40.0: - version "0.40.0" - resolved "https://registry.yarnpkg.com/pretty-data/-/pretty-data-0.40.0.tgz#572aa8ea23467467ab94b6b5266a6fd9c8fddd72" - integrity sha1-Vyqo6iNGdGerlLa1Jmpv2cj93XI= - pretty-error@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" @@ -14550,11 +14220,6 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -quick-format-unescaped@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz#437a5ea1a0b61deb7605f8ab6a8fd3858dbeb701" - integrity sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A== - quickselect@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.1.1.tgz#852e412ce418f237ad5b660d70cffac647ae94c2" @@ -14647,14 +14312,6 @@ ramda@0.26.1, ramda@~0.26.1: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== -randexp@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.5.3.tgz#f31c2de3148b30bdeb84b7c3f59b0ebb9fec3738" - integrity sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w== - dependencies: - drange "^1.0.2" - ret "^0.2.0" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -14935,6 +14592,11 @@ react-is@^16.13.1, react-is@^16.5.2, react-is@^16.6.0, react-is@^16.7.0, react-i resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +"react-is@^16.8.0 || ^17.0.0": + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^17.0.1: version "17.0.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" @@ -15604,36 +15266,22 @@ remark-parse@^5.0.0: vfile-location "^2.0.0" xtend "^4.0.1" -remark-parse@~7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-7.0.2.tgz#41e7170d9c1d96c3d32cf1109600a9ed50dba7cf" - integrity sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA== +remark-parse@~9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== dependencies: - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^1.1.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^1.0.0" - vfile-location "^2.0.0" - xtend "^4.0.1" + mdast-util-from-markdown "^0.8.0" -remark-react@~6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/remark-react/-/remark-react-6.0.0.tgz#2bc46ce2ba74a8561d8984bf7885b5eb1ebc8273" - integrity sha512-5g73p8ZuqKoSdKByEf6IbXtVaHnbSEV0aamhIIqpzeNvj1wWDPX0USSPs4Gf3ZAsQIehIp6QiqJIbbXpq74bug== +remark-react@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/remark-react/-/remark-react-7.0.1.tgz#499c8b9384e0958834e57a49fe11e7af230936a4" + integrity sha512-JJ99WjMmYx2Yc/Nvg0PFH7qb4nw+POkSc8MQV0we95/cFfbUe7WLY7R+k7akAV5ZOOvv8YIkRmxuUFU+4XGPvA== dependencies: "@mapbox/hast-util-table-cell-style" "^0.1.3" - hast-to-hyperscript "^7.0.0" + hast-to-hyperscript "^8.0.0" hast-util-sanitize "^2.0.0" - mdast-util-to-hast "^6.0.0" + mdast-util-to-hast "^8.0.0" remarkable@^2.0.1: version "2.0.1" @@ -15709,7 +15357,7 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.8: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.81.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: +request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -15877,11 +15525,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" - integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -16089,11 +15732,6 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -safe-stable-stringify@^1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" - integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -16114,22 +15752,6 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sanitize-html@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.20.1.tgz#f6effdf55dd398807171215a62bfc21811bacf85" - integrity sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA== - dependencies: - chalk "^2.4.1" - htmlparser2 "^3.10.0" - lodash.clonedeep "^4.5.0" - lodash.escaperegexp "^4.1.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.mergewith "^4.6.1" - postcss "^7.0.5" - srcset "^1.0.0" - xtend "^4.0.1" - sanitize.css@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" @@ -16583,14 +16205,6 @@ sockjs@0.3.20: uuid "^3.4.0" websocket-driver "0.6.5" -sonic-boom@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.3.0.tgz#5c77c846ce6c395dddf2eb8e8e65f9cc576f2e76" - integrity sha512-4nX6OYvOYr6R76xfQKi6cZpTO3YSWe/vd+QdIfoH0lBy0MnPkeAbb2rRWgmgADkXUeCKPwO1FZAKlAVWAadELw== - dependencies: - 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" @@ -16738,14 +16352,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -srcset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/srcset/-/srcset-1.0.0.tgz#a5669de12b42f3b1d5e83ed03c71046fc48f41ef" - integrity sha1-pWad4StC87HV6D7QPHEEb8SPQe8= - dependencies: - array-uniq "^1.0.2" - number-is-nan "^1.0.0" - sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -17131,10 +16737,10 @@ style-loader@1.3.0: loader-utils "^2.0.0" schema-utils "^2.7.0" -style-to-object@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.2.3.tgz#afcf42bc03846b1e311880c55632a26ad2780bcb" - integrity sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng== +style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== dependencies: inline-style-parser "0.1.1" @@ -17521,9 +17127,9 @@ tmp@~0.2.1: rimraf "^3.0.0" tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" @@ -17675,7 +17281,7 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -17748,7 +17354,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@^1.6.18, type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -17808,9 +17414,9 @@ typescript@~4.1.2: integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== ua-parser-js@^0.7.18: - version "0.7.22" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" - integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== underscore@~1.8.3: version "1.8.3" @@ -17912,14 +17518,12 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -unist-builder@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-1.0.4.tgz#e1808aed30bd72adc3607f25afecebef4dd59e17" - integrity sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg== - dependencies: - object-assign "^4.1.0" +unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== -unist-util-generated@^1.1.0: +unist-util-generated@^1.0.0: version "1.1.6" resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== @@ -17929,6 +17533,11 @@ unist-util-is@^3.0.0: resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + unist-util-position@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" @@ -17960,13 +17569,30 @@ unist-util-visit-parents@^2.0.0: dependencies: unist-util-is "^3.0.0" -unist-util-visit@^1.0.0, unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== dependencies: unist-util-visit-parents "^2.0.0" +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -18036,9 +17662,9 @@ uri-template-lite@^20.5.0: integrity sha512-RL6Pnz0DO4XH9WZhZTX6u0SP6afNM9z+u7lXYHO+RkVGzpNcgKc1Y2tcAX/KVIEi2ctfzf+iLcofkwKoYiGH4Q== urijs@^1.19.2, urijs@~1.19.2: - version "1.19.6" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.6.tgz#51f8cb17ca16faefb20b9a31ac60f84aa2b7c870" - integrity sha512-eSXsXZ2jLvGWeLYlQA3Gh36BcjF+0amo92+wHPyN1mdR8Nxf75fuEuYTd9c0a+m/vhCjRK0ESlE9YNLW+E1VEw== + version "1.19.7" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.7.tgz#4f594e59113928fea63c00ce688fb395b1168ab9" + integrity sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA== urix@^0.1.0: version "0.1.0" @@ -18064,9 +17690,9 @@ url-loader@4.1.1: schema-utils "^3.0.0" url-parse@^1.4.3, url-parse@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -18126,17 +17752,12 @@ utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.4.0, uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -18315,7 +17936,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -web-namespaces@^1.1.2: +web-namespaces@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== @@ -18577,11 +18198,6 @@ word-wrap@^1.2.3, word-wrap@~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== -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - workbox-background-sync@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" @@ -18942,9 +18558,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" From b293030d498ec43c224d3a0916b1577649cac805 Mon Sep 17 00:00:00 2001 From: Ilya Melnikov <70610034+melil02@users.noreply.github.com> Date: Thu, 10 Feb 2022 17:34:09 -0800 Subject: [PATCH 3/4] 5.1 release --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 041663560..4161d915b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ dist: xenial language: node_js node_js: + - '12.16.3' - 'lts/*' addons: chrome: stable From 235e62694ce2da6bb4315a9e5219399d08806dc4 Mon Sep 17 00:00:00 2001 From: Ilya Melnikov <70610034+melil02@users.noreply.github.com> Date: Thu, 10 Feb 2022 17:56:33 -0800 Subject: [PATCH 4/4] 5.1 release --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4161d915b..eb9215990 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ dist: xenial language: node_js node_js: - '12.16.3' - - 'lts/*' addons: chrome: stable firefox: latest