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/.travis.yml b/.travis.yml
index 041663560..eb9215990 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,7 @@
dist: xenial
language: node_js
node_js:
- - 'lts/*'
+ - '12.16.3'
addons:
chrome: stable
firefox: latest
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 (
-
- );
-};
-
-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/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 (
+
+ );
+};
+
+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/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-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 => {
>
{
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/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/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/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 (
+
+ );
+}
+
+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/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/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/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/userContexts/UserContextList.js b/packages/layer7-apihub/src/userProfiles/UserProfileList.js
old mode 100755
new mode 100644
similarity index 75%
rename from packages/layer7-apihub/src/userContexts/UserContextList.js
rename to packages/layer7-apihub/src/userProfiles/UserProfileList.js
index fbfffd23f..64eab8a13
--- a/packages/layer7-apihub/src/userContexts/UserContextList.js
+++ b/packages/layer7-apihub/src/userProfiles/UserProfileList.js
@@ -2,18 +2,18 @@ import React, { useEffect } from 'react';
import { useRedirect } from 'react-admin';
import CircularProgress from '@material-ui/core/CircularProgress';
-import { CurrentUserId } from '../dataProvider/userContexts';
+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 UserContextList = () => {
+export const UserProfileList = () => {
const redirect = useRedirect();
useEffect(() => {
- redirect(`/userContexts/${CurrentUserId}/show`);
+ 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,
+};
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"