From 2ccb3e29a3bd0832dbfad652a136a0ff6ba5ce8b Mon Sep 17 00:00:00 2001
From: kalitopix
Date: Fri, 3 Mar 2023 09:14:14 -0500
Subject: [PATCH 01/24] add password validation on sign up
---
packages/coinstac-api-server/seed/populate.js | 7 +
.../coinstac-api-server/src/auth-helpers.js | 23 +-
.../coinstac-api-server/src/routes/auth.js | 4 +
.../user/form-signup-controller.jsx | 20 -
.../render/components/user/form-signup.jsx | 266 +-
.../app/render/state/ducks/auth.js | 4 +-
.../coinstac-desktop-app/package-lock.json | 2472 +++--------------
packages/coinstac-desktop-app/package.json | 5 +-
8 files changed, 555 insertions(+), 2246 deletions(-)
diff --git a/packages/coinstac-api-server/seed/populate.js b/packages/coinstac-api-server/seed/populate.js
index 1e3fedb2a..8a65cb358 100644
--- a/packages/coinstac-api-server/seed/populate.js
+++ b/packages/coinstac-api-server/seed/populate.js
@@ -904,6 +904,7 @@ async function populateUsers() {
[CONSORTIA_IDS[0]]: 'none',
[CONSORTIA_IDS[1]]: 'none',
},
+ passwordChangedAt: new Date(),
}, password);
await helperFunctions.createUser({
@@ -929,6 +930,7 @@ async function populateUsers() {
[CONSORTIA_IDS[0]]: 'none',
[CONSORTIA_IDS[1]]: 'none',
},
+ passwordChangedAt: new Date(),
}, password);
await helperFunctions.createUser({
@@ -954,6 +956,7 @@ async function populateUsers() {
[CONSORTIA_IDS[0]]: 'none',
[CONSORTIA_IDS[1]]: 'none',
},
+ passwordChangedAt: new Date(),
}, password);
await helperFunctions.createUser({
@@ -979,6 +982,7 @@ async function populateUsers() {
[CONSORTIA_IDS[0]]: 'none',
[CONSORTIA_IDS[1]]: 'none',
},
+ passwordChangedAt: new Date(),
}, password);
await helperFunctions.createUser({
@@ -1004,6 +1008,7 @@ async function populateUsers() {
[CONSORTIA_IDS[0]]: 'none',
[CONSORTIA_IDS[1]]: 'none',
},
+ passwordChangedAt: new Date(),
}, password);
await helperFunctions.createUser({
@@ -1025,6 +1030,7 @@ async function populateUsers() {
author: false,
},
},
+ passwordChangedAt: new Date(),
}, password);
const adminPassword = await helperFunctions.hashPassword(process.argv[3]
@@ -1050,6 +1056,7 @@ async function populateUsers() {
[CONSORTIA_IDS[0]]: 'none',
[CONSORTIA_IDS[1]]: 'none',
},
+ passwordChangedAt: new Date(),
}, adminPassword);
}
diff --git a/packages/coinstac-api-server/src/auth-helpers.js b/packages/coinstac-api-server/src/auth-helpers.js
index 4d5605403..8fd3c68b7 100644
--- a/packages/coinstac-api-server/src/auth-helpers.js
+++ b/packages/coinstac-api-server/src/auth-helpers.js
@@ -9,6 +9,8 @@ const { eventEmitter, USER_CHANGED } = require('./data/events');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
+const passwordLifeTime = 180;
+
const audience = 'coinstac';
const issuer = 'coinstac';
const subject = 'coinstac';
@@ -84,6 +86,7 @@ const helperFunctions = {
pipelines: {},
},
consortiaStatuses: user.consortiaStatuses || {},
+ passwordChangedAt: new Date(),
};
const db = database.getDbInstance();
@@ -305,11 +308,21 @@ const helperFunctions = {
req.payload.password, user.passwordHash
);
- if (passwordMatch) {
- return h.response(transformToClient(user));
+ if (!passwordMatch) {
+ return Boom.unauthorized('Incorrect username or password');
}
- return Boom.unauthorized('Incorrect username or password');
+ const { passwordChangedAt } = user;
+ const currentDate = new Date();
+ const difference = Math.ceil(
+ (currentDate.getTime() - passwordChangedAt.getTime()) / (1000 * 3600 * 24)
+ );
+
+ if (difference >= passwordLifeTime) {
+ return Boom.unauthorized('Password is expired');
+ }
+
+ return h.response(transformToClient(user));
},
/**
* Validate api key used by headless client
@@ -463,6 +476,10 @@ const helperFunctions = {
return Boom.badRequest('invalid user/run combination');
}
},
+ validatePassword(password) {
+ const PASSWORD_PATTERN = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-]).{8,}$/g;
+ return PASSWORD_PATTERN.test(password);
+ },
audience,
issuer,
subject,
diff --git a/packages/coinstac-api-server/src/routes/auth.js b/packages/coinstac-api-server/src/routes/auth.js
index c1ea58d5f..5c2b9c62e 100644
--- a/packages/coinstac-api-server/src/routes/auth.js
+++ b/packages/coinstac-api-server/src/routes/auth.js
@@ -69,6 +69,10 @@ module.exports = [
{ method: helperFunctions.validateUniqueUser },
],
handler: async (req, h) => {
+ const isPasswordValid = helperFunctions.validatePassword(req.payload.password);
+ if (!isPasswordValid) {
+ return h.response('Invalid password').code(400);
+ }
const passwordHash = await helperFunctions.hashPassword(req.payload.password);
const user = await helperFunctions.createUser(req.payload, passwordHash);
const {
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-signup-controller.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-signup-controller.jsx
index a86464f67..c3f5fa4ae 100644
--- a/packages/coinstac-desktop-app/app/render/components/user/form-signup-controller.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-signup-controller.jsx
@@ -44,26 +44,6 @@ class FormSignupController extends Component {
onSubmit = (formData) => {
const { signUp, notifySuccess } = this.props;
- let error;
-
- if (!formData.name) {
- error = 'Name required';
- } else if (!formData.username) {
- error = 'Username required';
- } else if (!formData.email) {
- error = 'Email required';
- } else if (!formData.password) {
- error = 'Password required';
- } else if (formData.password.length < 8) {
- error = 'Password must be at least 8 characters long';
- } else if (!formData.institution) {
- error = 'Institution required';
- }
-
- if (error) {
- return this.handleSignupError(error);
- }
-
this.setState({ error: null });
return signUp(formData)
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-signup.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-signup.jsx
index f05332b4b..ccbe01284 100644
--- a/packages/coinstac-desktop-app/app/render/components/user/form-signup.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-signup.jsx
@@ -1,13 +1,26 @@
-import React, { Component } from 'react';
+import React from 'react';
import PropTypes from 'prop-types';
import Paper from '@material-ui/core/Paper';
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
-import { withStyles } from '@material-ui/core/styles';
+import makeStyles from '@material-ui/core/styles/makeStyles';
import classNames from 'classnames';
-import memoize from 'memoize-one';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+
+const PASSWORD_PATTERN = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-]).{8,}$/g;
+
+const validationSchema = Yup.object().shape({
+ name: Yup.string().required('Required'),
+ username: Yup.string().required('Required'),
+ email: Yup.string().email('Invalid email').required('Required'),
+ password: Yup.string().required('Required').matches(PASSWORD_PATTERN, {
+ message: 'Passwords should be 8 character minimum with a mix of uppercase, lowercase and special character',
+ }),
+ confirmPassword: Yup.string().required('Required').oneOf([Yup.ref('password')], 'Your passwords do not match.'),
+});
-const styles = theme => ({
+const useStyles = makeStyles(theme => ({
bottomMargin: {
marginBottom: 10,
},
@@ -23,134 +36,122 @@ const styles = theme => ({
textAlign: 'center',
color: 'red',
},
-});
-
-class FormSignup extends Component {
- state = {
- name: '',
- username: '',
- email: '',
- password: '',
- confirmPassword: '',
- };
-
- checkPasswordsMatch = memoize(
- (password, confirmPassword) => password === confirmPassword
+}));
+
+const FormSignup = ({
+ auth,
+ error,
+ onSubmit,
+}) => {
+ const classes = useStyles();
+
+ const formik = useFormik({
+ initialValues: {
+ name: '',
+ username: '',
+ email: '',
+ password: '',
+ confirmPassword: '',
+ },
+ validationSchema,
+ onSubmit: (values) => {
+ onSubmit({
+ institution: 'mrn',
+ name: values.name.trim(),
+ username: values.username.trim(),
+ email: values.email.trim(),
+ password: values.password.trim(),
+ });
+ },
+ });
+
+ return (
+
+
+
);
-
- handleChange = name => (event) => {
- this.setState({
- [name]: event.target.value,
- });
- };
-
- handleSubmit = (evt) => {
- evt.preventDefault();
-
- const { onSubmit } = this.props;
-
- const {
- name,
- username,
- email,
- password,
- } = this.state;
-
- onSubmit({
- institution: 'mrn',
- name: name.trim(),
- username: username.trim(),
- email: email.trim(),
- password: password.trim(),
- });
- }
-
-
- render() {
- const { auth, classes, error } = this.props;
- const {
- name,
- username,
- email,
- password,
- confirmPassword,
- } = this.state;
-
- const passwordsMatch = this.checkPasswordsMatch(password, confirmPassword);
-
- return (
-
-
-
- );
- }
-}
+};
FormSignup.displayName = 'FormSignup';
@@ -160,9 +161,8 @@ FormSignup.defaultProps = {
FormSignup.propTypes = {
auth: PropTypes.object.isRequired,
- classes: PropTypes.object.isRequired,
error: PropTypes.object,
onSubmit: PropTypes.func.isRequired,
};
-export default withStyles(styles)(FormSignup);
+export default FormSignup;
diff --git a/packages/coinstac-desktop-app/app/render/state/ducks/auth.js b/packages/coinstac-desktop-app/app/render/state/ducks/auth.js
index 1b6c9806e..ba7054bf3 100644
--- a/packages/coinstac-desktop-app/app/render/state/ducks/auth.js
+++ b/packages/coinstac-desktop-app/app/render/state/ducks/auth.js
@@ -209,10 +209,10 @@ export const login = applyAsyncLoading(({ username, password, saveLogin }) => (d
.catch((err) => {
console.error(err); // eslint-disable-line no-console
if (err.response) {
- const { statusCode } = getErrorDetail(err);
+ const { statusCode, message } = getErrorDetail(err);
if (statusCode === 401) {
- dispatch(setError('Username and/or Password Incorrect'));
+ dispatch(setError(message));
} else {
dispatch(setError('An unexpected error has occurred'));
}
diff --git a/packages/coinstac-desktop-app/package-lock.json b/packages/coinstac-desktop-app/package-lock.json
index 91597407d..eb30572e1 100644
--- a/packages/coinstac-desktop-app/package-lock.json
+++ b/packages/coinstac-desktop-app/package-lock.json
@@ -5,6 +5,7 @@
"requires": true,
"packages": {
"": {
+ "name": "coinstac-desktop-app",
"version": "6.5.7",
"license": "MIT",
"dependencies": {
@@ -33,6 +34,7 @@
"electron-store": "^8.0.1",
"electron-updater": "^4.6.1",
"form-data": "^4.0.0",
+ "formik": "^2.2.9",
"graphql": "^15.5.0",
"gunzip-maybe": "^1.4.2",
"immutability-helper": "^2.7.0",
@@ -83,7 +85,8 @@
"tail": "^1.2.3",
"tar-fs": "^2.1.1",
"uuid": "^8.3.2",
- "winston": "^3.4.0"
+ "winston": "^3.4.0",
+ "yup": "^1.0.2"
},
"devDependencies": {
"@babel/cli": "^7.16.0",
@@ -111,7 +114,6 @@
"react-hot-loader": "^4.13.0",
"rimraf": "^2.6.2",
"sass-loader": "^13.2.0",
- "spectron": "^13.0.0",
"stack-chain": "^2.0.0",
"style-loader": "^3.3.1",
"tape": "^4.9.0",
@@ -2721,17 +2723,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/cacheable-request": {
- "version": "6.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "*",
- "@types/node": "*",
- "@types/responselike": "*"
- }
- },
"node_modules/@types/connect": {
"version": "3.4.35",
"dev": true,
@@ -2843,11 +2834,6 @@
"hoist-non-react-statics": "^3.3.0"
}
},
- "node_modules/@types/http-cache-semantics": {
- "version": "4.0.1",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/http-proxy": {
"version": "1.17.9",
"dev": true,
@@ -2856,24 +2842,11 @@
"@types/node": "*"
}
},
- "node_modules/@types/json-buffer": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/json-schema": {
"version": "7.0.11",
"dev": true,
"license": "MIT"
},
- "node_modules/@types/keyv": {
- "version": "3.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/linkify-it": {
"version": "3.0.2",
"dev": true,
@@ -2941,22 +2914,6 @@
"version": "15.7.5",
"license": "MIT"
},
- "node_modules/@types/puppeteer": {
- "version": "5.4.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/puppeteer-core": {
- "version": "5.4.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/puppeteer": "*"
- }
- },
"node_modules/@types/qs": {
"version": "6.9.7",
"dev": true,
@@ -2997,14 +2954,6 @@
"version": "3.1.0",
"license": "MIT"
},
- "node_modules/@types/responselike": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/retry": {
"version": "0.12.0",
"dev": true,
@@ -3049,11 +2998,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/@types/which": {
- "version": "1.3.2",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/ws": {
"version": "8.5.3",
"dev": true,
@@ -3075,141 +3019,11 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/yauzl": {
- "version": "2.10.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@ungap/promise-all-settled": {
"version": "1.1.2",
"dev": true,
"license": "ISC"
},
- "node_modules/@wdio/config": {
- "version": "6.12.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@wdio/logger": "6.10.10",
- "deepmerge": "^4.0.0",
- "glob": "^7.1.2"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@wdio/logger": {
- "version": "6.10.10",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "loglevel": "^1.6.0",
- "loglevel-plugin-prefix": "^0.8.4",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@wdio/logger/node_modules/ansi-styles": {
- "version": "4.3.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@wdio/logger/node_modules/chalk": {
- "version": "4.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@wdio/logger/node_modules/color-convert": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@wdio/logger/node_modules/color-name": {
- "version": "1.1.4",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@wdio/logger/node_modules/has-flag": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/logger/node_modules/supports-color": {
- "version": "7.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/protocols": {
- "version": "6.12.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@wdio/repl": {
- "version": "6.11.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@wdio/utils": "6.11.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@wdio/utils": {
- "version": "6.11.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@wdio/logger": "6.10.10"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
"node_modules/@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -3775,7 +3589,8 @@
},
"node_modules/archiver": {
"version": "5.3.1",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz",
+ "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==",
"dependencies": {
"archiver-utils": "^2.1.0",
"async": "^3.2.3",
@@ -3791,7 +3606,8 @@
},
"node_modules/archiver-utils": {
"version": "2.1.0",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
+ "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
"dependencies": {
"glob": "^7.1.4",
"graceful-fs": "^4.2.0",
@@ -3810,11 +3626,13 @@
},
"node_modules/archiver-utils/node_modules/lodash.isplainobject": {
"version": "4.0.6",
- "license": "MIT"
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
},
"node_modules/archiver/node_modules/readable-stream": {
- "version": "3.6.0",
- "license": "MIT",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -3905,18 +3723,11 @@
"node": ">= 6"
}
},
- "node_modules/asn1": {
- "version": "0.2.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
"node_modules/assert-plus": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
+ "optional": true,
"engines": {
"node": ">=0.8"
}
@@ -3978,17 +3789,6 @@
"version": "1.0.0",
"license": "MIT"
},
- "node_modules/atob": {
- "version": "2.1.2",
- "dev": true,
- "license": "(MIT OR Apache-2.0)",
- "bin": {
- "atob": "bin/atob.js"
- },
- "engines": {
- "node": ">= 4.5.0"
- }
- },
"node_modules/atomically": {
"version": "1.7.0",
"license": "MIT",
@@ -4014,19 +3814,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.11.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/axios": {
"version": "0.21.4",
"license": "MIT",
@@ -4216,14 +4003,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
"node_modules/big.js": {
"version": "5.2.2",
"dev": true,
@@ -4952,14 +4731,6 @@
"node": "*"
}
},
- "node_modules/cacheable-lookup": {
- "version": "5.0.4",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.6.0"
- }
- },
"node_modules/cacheable-request": {
"version": "6.1.0",
"dev": true,
@@ -5093,11 +4864,6 @@
],
"license": "CC-BY-4.0"
},
- "node_modules/caseless": {
- "version": "0.12.0",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/catharsis": {
"version": "0.9.0",
"dev": true,
@@ -5199,33 +4965,6 @@
"node": ">=10"
}
},
- "node_modules/chrome-launcher": {
- "version": "0.13.4",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/node": "*",
- "escape-string-regexp": "^1.0.5",
- "is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0",
- "mkdirp": "^0.5.3",
- "rimraf": "^3.0.2"
- }
- },
- "node_modules/chrome-launcher/node_modules/rimraf": {
- "version": "3.0.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/chrome-trace-event": {
"version": "1.0.3",
"dev": true,
@@ -5442,9 +5181,9 @@
}
},
"node_modules/coinstac-pipeline/node_modules/compress-commons/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -5481,9 +5220,9 @@
}
},
"node_modules/coinstac-pipeline/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -5618,26 +5357,10 @@
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
"integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw=="
},
- "node_modules/compress-brotli": {
- "version": "1.3.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-buffer": "~3.0.0",
- "json-buffer": "~3.0.1"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/compress-brotli/node_modules/json-buffer": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT"
- },
"node_modules/compress-commons": {
"version": "4.1.1",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
+ "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
"dependencies": {
"buffer-crc32": "^0.2.13",
"crc32-stream": "^4.0.2",
@@ -5649,8 +5372,9 @@
}
},
"node_modules/compress-commons/node_modules/readable-stream": {
- "version": "3.6.0",
- "license": "MIT",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -5992,7 +5716,8 @@
},
"node_modules/crc-32": {
"version": "1.2.2",
- "license": "Apache-2.0",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
"bin": {
"crc32": "bin/crc32.njs"
},
@@ -6002,7 +5727,8 @@
},
"node_modules/crc32-stream": {
"version": "4.0.2",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
+ "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
"dependencies": {
"crc-32": "^1.2.0",
"readable-stream": "^3.4.0"
@@ -6012,8 +5738,9 @@
}
},
"node_modules/crc32-stream/node_modules/readable-stream": {
- "version": "3.6.0",
- "license": "MIT",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -6177,14 +5904,6 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
- "node_modules/css-shorthand-properties": {
- "version": "1.1.1",
- "dev": true
- },
- "node_modules/css-value": {
- "version": "0.0.1",
- "dev": true
- },
"node_modules/css-vendor": {
"version": "2.0.8",
"license": "MIT",
@@ -6614,22 +6333,11 @@
"node": ">=12"
}
},
- "node_modules/dashdash": {
- "version": "1.14.1",
- "dev": true,
+ "node_modules/debounce-fn": {
+ "version": "4.0.0",
"license": "MIT",
"dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/debounce-fn": {
- "version": "4.0.0",
- "license": "MIT",
- "dependencies": {
- "mimic-fn": "^3.0.0"
+ "mimic-fn": "^3.0.0"
},
"engines": {
"node": ">=10"
@@ -7022,35 +6730,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/dev-null": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/devtools": {
- "version": "6.12.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/protocols": "6.12.0",
- "@wdio/utils": "6.11.0",
- "chrome-launcher": "^0.13.1",
- "edge-paths": "^2.1.0",
- "puppeteer-core": "^5.1.0",
- "ua-parser-js": "^0.7.21",
- "uuid": "^8.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/devtools-protocol": {
- "version": "0.0.818844",
- "dev": true,
- "license": "BSD-3-Clause"
- },
"node_modules/dfa": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
@@ -7442,38 +7121,6 @@
"stream-shift": "^1.0.0"
}
},
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/edge-paths": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/which": "^1.3.2",
- "which": "^2.0.2"
- }
- },
- "node_modules/edge-paths/node_modules/which": {
- "version": "2.0.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/ee-first": {
"version": "1.1.1",
"license": "MIT"
@@ -7632,55 +7279,6 @@
"node": ">= 10.0.0"
}
},
- "node_modules/electron-chromedriver": {
- "version": "11.0.0",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "@electron/get": "^1.12.2",
- "extract-zip": "^2.0.0"
- },
- "bin": {
- "chromedriver": "chromedriver.js"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "node_modules/electron-chromedriver/node_modules/extract-zip": {
- "version": "2.0.1",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/electron-chromedriver/node_modules/get-stream": {
- "version": "5.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/electron-debug": {
"version": "3.2.0",
"dev": true,
@@ -8056,9 +7654,9 @@
}
},
"node_modules/engine.io": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
- "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz",
+ "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==",
"dependencies": {
"@types/cookie": "^0.4.1",
"@types/cors": "^2.8.12",
@@ -8069,7 +7667,7 @@
"cors": "~2.8.5",
"debug": "~4.3.1",
"engine.io-parser": "~5.0.3",
- "ws": "~8.2.3"
+ "ws": "~8.11.0"
},
"engines": {
"node": ">=10.0.0"
@@ -8092,9 +7690,9 @@
}
},
"node_modules/engine.io/node_modules/ws": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
- "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+ "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
"engines": {
"node": ">=10.0.0"
},
@@ -8508,11 +8106,6 @@
],
"license": "MIT"
},
- "node_modules/extend": {
- "version": "3.0.2",
- "dev": true,
- "license": "MIT"
- },
"node_modules/extract-zip": {
"version": "1.7.0",
"dev": true,
@@ -8546,7 +8139,8 @@
"engines": [
"node >=0.6.0"
],
- "license": "MIT"
+ "license": "MIT",
+ "optional": true
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
@@ -8923,14 +8517,6 @@
"node": ">= 8"
}
},
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
"node_modules/form-data": {
"version": "4.0.0",
"license": "MIT",
@@ -8943,6 +8529,42 @@
"node": ">= 6"
}
},
+ "node_modules/formik": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
+ "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://opencollective.com/formik"
+ }
+ ],
+ "dependencies": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^1.10.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/formik/node_modules/deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/formik/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"license": "MIT",
@@ -9131,17 +8753,6 @@
"node": ">=8.0.0"
}
},
- "node_modules/get-port": {
- "version": "5.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/get-stdin": {
"version": "4.0.1",
"dev": true,
@@ -9175,14 +8786,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/getpass": {
- "version": "0.1.7",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
"node_modules/glob": {
"version": "7.2.3",
"license": "ISC",
@@ -9437,11 +9040,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/grapheme-splitter": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT"
- },
"node_modules/graphql": {
"version": "15.8.0",
"license": "MIT",
@@ -9505,26 +9103,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/har-schema": {
- "version": "2.0.0",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/har-validator": {
- "version": "5.1.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/hard-rejection": {
"version": "2.1.0",
"dev": true,
@@ -9645,9 +9223,9 @@
}
},
"node_modules/help-me/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -9839,43 +9417,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/http-signature": {
- "version": "1.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- },
- "engines": {
- "node": ">=0.8",
- "npm": ">=1.3.7"
- }
- },
- "node_modules/http2-wrapper": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- }
- },
- "node_modules/http2-wrapper/node_modules/quick-lru": {
- "version": "5.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/https-proxy-agent": {
"version": "5.0.1",
"dev": true,
@@ -10609,11 +10150,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/isstream": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT"
- },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.0",
"dev": true,
@@ -10899,14 +10435,14 @@
}
},
"node_modules/joi": {
- "version": "17.7.0",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
- "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
+ "version": "17.8.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.8.3.tgz",
+ "integrity": "sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==",
"dependencies": {
"@hapi/hoek": "^9.0.0",
"@hapi/topo": "^5.0.0",
"@sideway/address": "^4.1.3",
- "@sideway/formula": "^3.0.0",
+ "@sideway/formula": "^3.0.1",
"@sideway/pinpoint": "^2.0.0"
}
},
@@ -10947,11 +10483,6 @@
"xmlcreate": "^2.0.4"
}
},
- "node_modules/jsbn": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT"
- },
"node_modules/jsdoc": {
"version": "3.6.10",
"dev": true,
@@ -11019,11 +10550,6 @@
"version": "2.3.1",
"license": "MIT"
},
- "node_modules/json-schema": {
- "version": "0.4.0",
- "dev": true,
- "license": "(AFL-2.1 OR BSD-3-Clause)"
- },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"dev": true,
@@ -11036,7 +10562,8 @@
"node_modules/json-stringify-safe": {
"version": "5.0.1",
"dev": true,
- "license": "ISC"
+ "license": "ISC",
+ "optional": true
},
"node_modules/json5": {
"version": "2.2.1",
@@ -11080,38 +10607,6 @@
"node": "*"
}
},
- "node_modules/jsprim": {
- "version": "1.4.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/jsprim/node_modules/core-util-is": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/jsprim/node_modules/verror": {
- "version": "1.10.0",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
"node_modules/jss": {
"version": "10.9.0",
"license": "MIT",
@@ -11257,7 +10752,8 @@
},
"node_modules/lazystream": {
"version": "1.0.1",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+ "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
"dependencies": {
"readable-stream": "^2.0.5"
},
@@ -11273,28 +10769,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/lighthouse-logger": {
- "version": "1.3.0",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "debug": "^2.6.9",
- "marky": "^1.2.2"
- }
- },
- "node_modules/lighthouse-logger/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/lighthouse-logger/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/linebreak": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
@@ -11436,11 +10910,13 @@
},
"node_modules/lodash.defaults": {
"version": "4.2.0",
- "license": "MIT"
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
},
"node_modules/lodash.difference": {
"version": "4.5.0",
- "license": "MIT"
+ "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+ "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA=="
},
"node_modules/lodash.escaperegexp": {
"version": "4.1.2",
@@ -11448,7 +10924,8 @@
},
"node_modules/lodash.flatten": {
"version": "4.4.0",
- "license": "MIT"
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="
},
"node_modules/lodash.flattendeep": {
"version": "4.4.0",
@@ -11476,11 +10953,6 @@
"resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
"integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA=="
},
- "node_modules/lodash.isobject": {
- "version": "3.0.2",
- "dev": true,
- "license": "MIT"
- },
"node_modules/lodash.isplainobject": {
"version": "3.2.0",
"license": "MIT",
@@ -11508,24 +10980,15 @@
"lodash.isarray": "^3.0.0"
}
},
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.restparam": {
- "version": "3.6.1",
+ "node_modules/lodash.restparam": {
+ "version": "3.6.1",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.union": {
"version": "4.6.0",
- "license": "MIT"
- },
- "node_modules/lodash.zip": {
- "version": "4.2.0",
- "dev": true,
- "license": "MIT"
+ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
+ "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw=="
},
"node_modules/log-symbols": {
"version": "4.1.0",
@@ -11617,23 +11080,6 @@
"triple-beam": "^1.3.0"
}
},
- "node_modules/loglevel": {
- "version": "1.8.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6.0"
- },
- "funding": {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/loglevel"
- }
- },
- "node_modules/loglevel-plugin-prefix": {
- "version": "0.8.4",
- "dev": true,
- "license": "MIT"
- },
"node_modules/loose-envify": {
"version": "1.4.0",
"license": "MIT",
@@ -11771,11 +11217,6 @@
"node": ">= 12"
}
},
- "node_modules/marky": {
- "version": "1.2.4",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/matcher": {
"version": "3.0.0",
"dev": true,
@@ -12377,9 +11818,9 @@
}
},
"node_modules/mqtt/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -13339,14 +12780,6 @@
"node": ">=6"
}
},
- "node_modules/oauth-sign": {
- "version": "0.9.0",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
"node_modules/object-assign": {
"version": "4.1.1",
"license": "MIT",
@@ -13676,11 +13109,6 @@
"version": "1.2.0",
"license": "MIT"
},
- "node_modules/performance-now": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/picocolors": {
"version": "1.0.0",
"dev": true,
@@ -14147,6 +13575,11 @@
"version": "16.13.1",
"license": "MIT"
},
+ "node_modules/property-expr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
+ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
+ },
"node_modules/proto-list": {
"version": "1.2.4",
"dev": true,
@@ -14171,21 +13604,11 @@
"node": ">= 0.10"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/pseudomap": {
"version": "1.0.2",
"dev": true,
"license": "ISC"
},
- "node_modules/psl": {
- "version": "1.8.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/pump": {
"version": "3.0.0",
"license": "MIT",
@@ -14229,107 +13652,10 @@
"node": ">=8"
}
},
- "node_modules/puppeteer-core": {
- "version": "5.5.0",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "debug": "^4.1.0",
- "devtools-protocol": "0.0.818844",
- "extract-zip": "^2.0.0",
- "https-proxy-agent": "^4.0.0",
- "node-fetch": "^2.6.1",
- "pkg-dir": "^4.2.0",
- "progress": "^2.0.1",
- "proxy-from-env": "^1.0.0",
- "rimraf": "^3.0.2",
- "tar-fs": "^2.0.0",
- "unbzip2-stream": "^1.3.3",
- "ws": "^7.2.3"
- },
- "engines": {
- "node": ">=10.18.1"
- }
- },
- "node_modules/puppeteer-core/node_modules/agent-base": {
- "version": "5.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/puppeteer-core/node_modules/extract-zip": {
- "version": "2.0.1",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/puppeteer-core/node_modules/get-stream": {
- "version": "5.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/puppeteer-core/node_modules/https-proxy-agent": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "agent-base": "5",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/puppeteer-core/node_modules/rimraf": {
- "version": "3.0.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/pure-color": {
"version": "1.3.0",
"license": "MIT"
},
- "node_modules/qs": {
- "version": "6.5.3",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.6"
- }
- },
"node_modules/query-selector": {
"version": "1.0.9",
"license": "MIT",
@@ -14546,6 +13872,11 @@
"react": ">= 16.8"
}
},
+ "node_modules/react-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
"node_modules/react-faux-dom": {
"version": "4.5.0",
"license": "Unlicense",
@@ -15094,10 +14425,30 @@
}
},
"node_modules/readdir-glob": {
- "version": "1.1.1",
- "license": "Apache-2.0",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz",
+ "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==",
"dependencies": {
- "minimatch": "^3.0.4"
+ "minimatch": "^5.1.0"
+ }
+ },
+ "node_modules/readdir-glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/readdir-glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/readdirp": {
@@ -15289,36 +14640,6 @@
"node": ">=4"
}
},
- "node_modules/request": {
- "version": "2.88.2",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/request-stream": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/request-stream/-/request-stream-1.2.2.tgz",
@@ -15341,27 +14662,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
- "node_modules/request/node_modules/form-data": {
- "version": "2.3.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/request/node_modules/uuid": {
- "version": "3.4.0",
- "dev": true,
- "license": "MIT",
- "bin": {
- "uuid": "bin/uuid"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"license": "MIT",
@@ -15408,11 +14708,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "dev": true,
- "license": "MIT"
- },
"node_modules/resolve-cwd": {
"version": "3.0.0",
"dev": true,
@@ -15448,19 +14743,6 @@
"lowercase-keys": "^1.0.0"
}
},
- "node_modules/resq": {
- "version": "1.10.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^2.0.1"
- }
- },
- "node_modules/resq/node_modules/fast-deep-equal": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT"
- },
"node_modules/restructure": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz",
@@ -15487,11 +14769,6 @@
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
},
- "node_modules/rgb2hex": {
- "version": "0.2.3",
- "dev": true,
- "license": "MIT"
- },
"node_modules/rimraf": {
"version": "2.7.1",
"dev": true,
@@ -16170,15 +15447,15 @@
}
},
"node_modules/socket.io": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
- "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz",
+ "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==",
"dependencies": {
"accepts": "~1.3.4",
"base64id": "~2.0.0",
"debug": "~4.3.2",
- "engine.io": "~6.2.1",
- "socket.io-adapter": "~2.4.0",
+ "engine.io": "~6.4.1",
+ "socket.io-adapter": "~2.5.2",
"socket.io-parser": "~4.2.1"
},
"engines": {
@@ -16186,9 +15463,32 @@
}
},
"node_modules/socket.io-adapter": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
- "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
+ "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
+ "dependencies": {
+ "ws": "~8.11.0"
+ }
+ },
+ "node_modules/socket.io-adapter/node_modules/ws": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+ "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
},
"node_modules/socket.io-parser": {
"version": "4.2.2",
@@ -16415,33 +15715,6 @@
"node": ">= 6"
}
},
- "node_modules/spectron": {
- "version": "13.0.0",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "dev-null": "^0.1.1",
- "electron-chromedriver": "^11.0.0",
- "request": "^2.88.2",
- "split": "^1.0.1",
- "webdriverio": "^6.9.1"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "node_modules/split": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "through": "2"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/split-ca": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz",
@@ -16456,9 +15729,9 @@
}
},
"node_modules/split2/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -16474,30 +15747,6 @@
"license": "BSD-3-Clause",
"optional": true
},
- "node_modules/sshpk": {
- "version": "1.17.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/ssri": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
@@ -17053,6 +16302,11 @@
"version": "1.0.1",
"license": "MIT"
},
+ "node_modules/tiny-case": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
+ "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
+ },
"node_modules/tiny-inflate": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
@@ -17142,17 +16396,10 @@
"hoek": "6.x.x"
}
},
- "node_modules/tough-cookie": {
- "version": "2.5.0",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
+ "node_modules/toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
},
"node_modules/tr46": {
"version": "0.0.3",
@@ -17215,22 +16462,6 @@
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
}
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "dev": true,
- "license": "Unlicense"
- },
"node_modules/type-detect": {
"version": "4.0.8",
"dev": true,
@@ -17240,8 +16471,9 @@
}
},
"node_modules/type-fest": {
- "version": "2.13.0",
- "license": "(MIT OR CC0-1.0)",
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
"engines": {
"node": ">=12.20"
},
@@ -17309,7 +16541,8 @@
},
"node_modules/unbzip2-stream": {
"version": "1.4.3",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
"dependencies": {
"buffer": "^5.2.1",
"through": "^2.3.8"
@@ -17785,280 +17018,6 @@
"minimalistic-assert": "^1.0.0"
}
},
- "node_modules/webdriver": {
- "version": "6.12.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/protocols": "6.12.0",
- "@wdio/utils": "6.11.0",
- "got": "^11.0.2",
- "lodash.merge": "^4.6.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webdriver/node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
- "node_modules/webdriver/node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "defer-to-connect": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/webdriver/node_modules/cacheable-request": {
- "version": "7.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/webdriver/node_modules/decompress-response": {
- "version": "6.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/webdriver/node_modules/defer-to-connect": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/webdriver/node_modules/get-stream": {
- "version": "5.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/webdriver/node_modules/got": {
- "version": "11.8.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
- "node_modules/webdriver/node_modules/json-buffer": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/webdriver/node_modules/keyv": {
- "version": "4.3.0",
- "dev": true,
- "license": "MIT",
- "workspaces": [
- "packages/test-suite"
- ],
- "dependencies": {
- "compress-brotli": "^1.3.8",
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/webdriver/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/webdriver/node_modules/mimic-response": {
- "version": "3.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/webdriver/node_modules/normalize-url": {
- "version": "6.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/webdriver/node_modules/p-cancelable": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/webdriver/node_modules/responselike": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lowercase-keys": "^2.0.0"
- }
- },
- "node_modules/webdriverio": {
- "version": "6.12.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/puppeteer-core": "^5.4.0",
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/repl": "6.11.0",
- "@wdio/utils": "6.11.0",
- "archiver": "^5.0.0",
- "atob": "^2.1.2",
- "css-shorthand-properties": "^1.1.1",
- "css-value": "^0.0.1",
- "devtools": "6.12.1",
- "fs-extra": "^9.0.1",
- "get-port": "^5.1.1",
- "grapheme-splitter": "^1.0.2",
- "lodash.clonedeep": "^4.5.0",
- "lodash.isobject": "^3.0.2",
- "lodash.isplainobject": "^4.0.6",
- "lodash.zip": "^4.2.0",
- "minimatch": "^3.0.4",
- "puppeteer-core": "^5.1.0",
- "resq": "^1.9.1",
- "rgb2hex": "0.2.3",
- "serialize-error": "^8.0.0",
- "webdriver": "6.12.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webdriverio/node_modules/fs-extra": {
- "version": "9.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/webdriverio/node_modules/jsonfile": {
- "version": "6.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/webdriverio/node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/webdriverio/node_modules/serialize-error": {
- "version": "8.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/webdriverio/node_modules/type-fest": {
- "version": "0.20.2",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/webdriverio/node_modules/universalify": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"license": "BSD-2-Clause"
@@ -18850,6 +17809,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/yup": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.0.2.tgz",
+ "integrity": "sha512-Lpi8nITFKjWtCoK3yQP8MUk78LJmHWqbFd0OOMXTar+yjejlQ4OIIoZgnTW1bnEUKDw6dZBcy3/IdXnt2KDUow==",
+ "dependencies": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ }
+ },
"node_modules/zen-observable": {
"version": "0.8.15",
"license": "MIT"
@@ -18863,7 +17833,8 @@
},
"node_modules/zip-stream": {
"version": "4.1.0",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
+ "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
"dependencies": {
"archiver-utils": "^2.1.0",
"compress-commons": "^4.1.0",
@@ -18874,8 +17845,9 @@
}
},
"node_modules/zip-stream/node_modules/readable-stream": {
- "version": "3.6.0",
- "license": "MIT",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -20448,16 +19420,6 @@
"@types/node": "*"
}
},
- "@types/cacheable-request": {
- "version": "6.0.2",
- "dev": true,
- "requires": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "*",
- "@types/node": "*",
- "@types/responselike": "*"
- }
- },
"@types/connect": {
"version": "3.4.35",
"dev": true,
@@ -20561,10 +19523,6 @@
"hoist-non-react-statics": "^3.3.0"
}
},
- "@types/http-cache-semantics": {
- "version": "4.0.1",
- "dev": true
- },
"@types/http-proxy": {
"version": "1.17.9",
"dev": true,
@@ -20572,21 +19530,10 @@
"@types/node": "*"
}
},
- "@types/json-buffer": {
- "version": "3.0.0",
- "dev": true
- },
"@types/json-schema": {
"version": "7.0.11",
"dev": true
},
- "@types/keyv": {
- "version": "3.1.4",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
"@types/linkify-it": {
"version": "3.0.2",
"dev": true
@@ -20642,20 +19589,6 @@
"@types/prop-types": {
"version": "15.7.5"
},
- "@types/puppeteer": {
- "version": "5.4.6",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/puppeteer-core": {
- "version": "5.4.0",
- "dev": true,
- "requires": {
- "@types/puppeteer": "*"
- }
- },
"@types/qs": {
"version": "6.9.7",
"dev": true
@@ -20692,13 +19625,6 @@
"@types/react": "*"
}
},
- "@types/responselike": {
- "version": "1.0.0",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
"@types/retry": {
"version": "0.12.0",
"dev": true
@@ -20736,10 +19662,6 @@
"dev": true,
"optional": true
},
- "@types/which": {
- "version": "1.3.2",
- "dev": true
- },
"@types/ws": {
"version": "8.5.3",
"dev": true,
@@ -20754,98 +19676,14 @@
"@types/yargs-parser": "*"
}
},
- "@types/yargs-parser": {
- "version": "21.0.0",
- "dev": true
- },
- "@types/yauzl": {
- "version": "2.10.0",
- "dev": true,
- "optional": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@ungap/promise-all-settled": {
- "version": "1.1.2",
- "dev": true
- },
- "@wdio/config": {
- "version": "6.12.1",
- "dev": true,
- "requires": {
- "@wdio/logger": "6.10.10",
- "deepmerge": "^4.0.0",
- "glob": "^7.1.2"
- }
- },
- "@wdio/logger": {
- "version": "6.10.10",
- "dev": true,
- "requires": {
- "chalk": "^4.0.0",
- "loglevel": "^1.6.0",
- "loglevel-plugin-prefix": "^0.8.4",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@wdio/protocols": {
- "version": "6.12.0",
- "dev": true
- },
- "@wdio/repl": {
- "version": "6.11.0",
- "dev": true,
- "requires": {
- "@wdio/utils": "6.11.0"
- }
- },
- "@wdio/utils": {
- "version": "6.11.0",
- "dev": true,
- "requires": {
- "@wdio/logger": "6.10.10"
- }
- },
+ "@types/yargs-parser": {
+ "version": "21.0.0",
+ "dev": true
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "dev": true
+ },
"@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -21284,6 +20122,8 @@
},
"archiver": {
"version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz",
+ "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==",
"requires": {
"archiver-utils": "^2.1.0",
"async": "^3.2.3",
@@ -21295,7 +20135,9 @@
},
"dependencies": {
"readable-stream": {
- "version": "3.6.0",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -21306,6 +20148,8 @@
},
"archiver-utils": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
+ "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
"requires": {
"glob": "^7.1.4",
"graceful-fs": "^4.2.0",
@@ -21320,7 +20164,9 @@
},
"dependencies": {
"lodash.isplainobject": {
- "version": "4.0.6"
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
}
}
},
@@ -21382,16 +20228,10 @@
}
}
},
- "asn1": {
- "version": "0.2.6",
- "dev": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
"assert-plus": {
"version": "1.0.0",
- "dev": true
+ "dev": true,
+ "optional": true
},
"assertion-error": {
"version": "1.1.0",
@@ -21428,10 +20268,6 @@
"atoa": {
"version": "1.0.0"
},
- "atob": {
- "version": "2.1.2",
- "dev": true
- },
"atomically": {
"version": "1.7.0"
},
@@ -21443,14 +20279,6 @@
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
},
- "aws-sign2": {
- "version": "0.7.0",
- "dev": true
- },
- "aws4": {
- "version": "1.11.0",
- "dev": true
- },
"axios": {
"version": "0.21.4",
"requires": {
@@ -21584,13 +20412,6 @@
"version": "0.6.1",
"dev": true
},
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "dev": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
"big.js": {
"version": "5.2.2",
"dev": true
@@ -22094,10 +20915,6 @@
}
}
},
- "cacheable-lookup": {
- "version": "5.0.4",
- "dev": true
- },
"cacheable-request": {
"version": "6.1.0",
"dev": true,
@@ -22178,10 +20995,6 @@
"version": "1.0.30001352",
"dev": true
},
- "caseless": {
- "version": "0.12.0",
- "dev": true
- },
"catharsis": {
"version": "0.9.0",
"dev": true,
@@ -22244,27 +21057,6 @@
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"dev": true
},
- "chrome-launcher": {
- "version": "0.13.4",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "escape-string-regexp": "^1.0.5",
- "is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0",
- "mkdirp": "^0.5.3",
- "rimraf": "^3.0.2"
- },
- "dependencies": {
- "rimraf": {
- "version": "3.0.2",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
"chrome-trace-event": {
"version": "1.0.3",
"dev": true
@@ -22437,9 +21229,9 @@
},
"dependencies": {
"readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -22472,9 +21264,9 @@
}
},
"readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -22576,22 +21368,10 @@
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
"integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw=="
},
- "compress-brotli": {
- "version": "1.3.8",
- "dev": true,
- "requires": {
- "@types/json-buffer": "~3.0.0",
- "json-buffer": "~3.0.1"
- },
- "dependencies": {
- "json-buffer": {
- "version": "3.0.1",
- "dev": true
- }
- }
- },
"compress-commons": {
"version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
+ "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
"requires": {
"buffer-crc32": "^0.2.13",
"crc32-stream": "^4.0.2",
@@ -22600,7 +21380,9 @@
},
"dependencies": {
"readable-stream": {
- "version": "3.6.0",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -22833,17 +21615,23 @@
}
},
"crc-32": {
- "version": "1.2.2"
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
},
"crc32-stream": {
"version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
+ "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
"requires": {
"crc-32": "^1.2.0",
"readable-stream": "^3.4.0"
},
"dependencies": {
"readable-stream": {
- "version": "3.6.0",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -22967,14 +21755,6 @@
}
}
},
- "css-shorthand-properties": {
- "version": "1.1.1",
- "dev": true
- },
- "css-value": {
- "version": "0.0.1",
- "dev": true
- },
"css-vendor": {
"version": "2.0.8",
"requires": {
@@ -23280,13 +22060,6 @@
"d3-transition": "2 - 3"
}
},
- "dashdash": {
- "version": "1.14.1",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
"debounce-fn": {
"version": "4.0.0",
"requires": {
@@ -23565,29 +22338,6 @@
"version": "2.1.0",
"dev": true
},
- "dev-null": {
- "version": "0.1.1",
- "dev": true
- },
- "devtools": {
- "version": "6.12.1",
- "dev": true,
- "requires": {
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/protocols": "6.12.0",
- "@wdio/utils": "6.11.0",
- "chrome-launcher": "^0.13.1",
- "edge-paths": "^2.1.0",
- "puppeteer-core": "^5.1.0",
- "ua-parser-js": "^0.7.21",
- "uuid": "^8.0.0"
- }
- },
- "devtools-protocol": {
- "version": "0.0.818844",
- "dev": true
- },
"dfa": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
@@ -23903,31 +22653,6 @@
"stream-shift": "^1.0.0"
}
},
- "ecc-jsbn": {
- "version": "0.1.2",
- "dev": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "edge-paths": {
- "version": "2.2.1",
- "dev": true,
- "requires": {
- "@types/which": "^1.3.2",
- "which": "^2.0.2"
- },
- "dependencies": {
- "which": {
- "version": "2.0.2",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
"ee-first": {
"version": "1.1.1"
},
@@ -24027,33 +22752,6 @@
}
}
},
- "electron-chromedriver": {
- "version": "11.0.0",
- "dev": true,
- "requires": {
- "@electron/get": "^1.12.2",
- "extract-zip": "^2.0.0"
- },
- "dependencies": {
- "extract-zip": {
- "version": "2.0.1",
- "dev": true,
- "requires": {
- "@types/yauzl": "^2.9.1",
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- }
- },
- "get-stream": {
- "version": "5.2.0",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- }
- }
- },
"electron-debug": {
"version": "3.2.0",
"dev": true,
@@ -24320,9 +23018,9 @@
}
},
"engine.io": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
- "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz",
+ "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==",
"requires": {
"@types/cookie": "^0.4.1",
"@types/cors": "^2.8.12",
@@ -24333,7 +23031,7 @@
"cors": "~2.8.5",
"debug": "~4.3.1",
"engine.io-parser": "~5.0.3",
- "ws": "~8.2.3"
+ "ws": "~8.11.0"
},
"dependencies": {
"cookie": {
@@ -24342,9 +23040,9 @@
"integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
},
"ws": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
- "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+ "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
"requires": {}
}
}
@@ -24623,10 +23321,6 @@
}
}
},
- "extend": {
- "version": "3.0.2",
- "dev": true
- },
"extract-zip": {
"version": "1.7.0",
"dev": true,
@@ -24652,7 +23346,8 @@
},
"extsprintf": {
"version": "1.3.0",
- "dev": true
+ "dev": true,
+ "optional": true
},
"fast-deep-equal": {
"version": "3.1.3"
@@ -24922,10 +23617,6 @@
}
}
},
- "forever-agent": {
- "version": "0.6.1",
- "dev": true
- },
"form-data": {
"version": "4.0.0",
"requires": {
@@ -24934,6 +23625,32 @@
"mime-types": "^2.1.12"
}
},
+ "formik": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
+ "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
+ "requires": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^1.10.0"
+ },
+ "dependencies": {
+ "deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
"forwarded": {
"version": "0.2.0"
},
@@ -25042,10 +23759,6 @@
"version": "0.1.0",
"dev": true
},
- "get-port": {
- "version": "5.1.1",
- "dev": true
- },
"get-stdin": {
"version": "4.0.1",
"dev": true
@@ -25064,13 +23777,6 @@
"get-intrinsic": "^1.1.1"
}
},
- "getpass": {
- "version": "0.1.7",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
"glob": {
"version": "7.2.3",
"requires": {
@@ -25242,10 +23948,6 @@
"version": "1.0.1",
"dev": true
},
- "grapheme-splitter": {
- "version": "1.0.4",
- "dev": true
- },
"graphql": {
"version": "15.8.0"
},
@@ -25288,18 +23990,6 @@
"version": "2.0.1",
"dev": true
},
- "har-schema": {
- "version": "2.0.0",
- "dev": true
- },
- "har-validator": {
- "version": "5.1.5",
- "dev": true,
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
"hard-rejection": {
"version": "2.1.0",
"dev": true
@@ -25369,9 +24059,9 @@
},
"dependencies": {
"readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -25516,29 +24206,6 @@
}
}
},
- "http-signature": {
- "version": "1.2.0",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "http2-wrapper": {
- "version": "1.0.3",
- "dev": true,
- "requires": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- },
- "dependencies": {
- "quick-lru": {
- "version": "5.1.1",
- "dev": true
- }
- }
- },
"https-proxy-agent": {
"version": "5.0.1",
"dev": true,
@@ -25967,10 +24634,6 @@
"version": "3.0.1",
"dev": true
},
- "isstream": {
- "version": "0.1.2",
- "dev": true
- },
"istanbul-lib-coverage": {
"version": "3.2.0",
"dev": true
@@ -26156,14 +24819,14 @@
}
},
"joi": {
- "version": "17.7.0",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
- "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
+ "version": "17.8.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.8.3.tgz",
+ "integrity": "sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==",
"requires": {
"@hapi/hoek": "^9.0.0",
"@hapi/topo": "^5.0.0",
"@sideway/address": "^4.1.3",
- "@sideway/formula": "^3.0.0",
+ "@sideway/formula": "^3.0.1",
"@sideway/pinpoint": "^2.0.0"
}
},
@@ -26194,10 +24857,6 @@
"xmlcreate": "^2.0.4"
}
},
- "jsbn": {
- "version": "0.1.1",
- "dev": true
- },
"jsdoc": {
"version": "3.6.10",
"dev": true,
@@ -26240,10 +24899,6 @@
"json-parse-even-better-errors": {
"version": "2.3.1"
},
- "json-schema": {
- "version": "0.4.0",
- "dev": true
- },
"json-schema-traverse": {
"version": "0.4.1",
"dev": true
@@ -26253,7 +24908,8 @@
},
"json-stringify-safe": {
"version": "5.0.1",
- "dev": true
+ "dev": true,
+ "optional": true
},
"json5": {
"version": "2.2.1",
@@ -26280,31 +24936,6 @@
"through": ">=2.2.7 <3"
}
},
- "jsprim": {
- "version": "1.4.2",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- },
- "dependencies": {
- "core-util-is": {
- "version": "1.0.2",
- "dev": true
- },
- "verror": {
- "version": "1.10.0",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- }
- }
- },
"jss": {
"version": "10.9.0",
"requires": {
@@ -26417,6 +25048,8 @@
},
"lazystream": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+ "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
"requires": {
"readable-stream": "^2.0.5"
}
@@ -26426,27 +25059,6 @@
"resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
"integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA=="
},
- "lighthouse-logger": {
- "version": "1.3.0",
- "dev": true,
- "requires": {
- "debug": "^2.6.9",
- "marky": "^1.2.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "dev": true
- }
- }
- },
"linebreak": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
@@ -26557,16 +25169,22 @@
"dev": true
},
"lodash.defaults": {
- "version": "4.2.0"
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
},
"lodash.difference": {
- "version": "4.5.0"
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+ "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA=="
},
"lodash.escaperegexp": {
"version": "4.1.2"
},
"lodash.flatten": {
- "version": "4.4.0"
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="
},
"lodash.flattendeep": {
"version": "4.4.0",
@@ -26589,10 +25207,6 @@
"resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
"integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA=="
},
- "lodash.isobject": {
- "version": "3.0.2",
- "dev": true
- },
"lodash.isplainobject": {
"version": "3.2.0",
"requires": {
@@ -26617,20 +25231,14 @@
"lodash.isarray": "^3.0.0"
}
},
- "lodash.merge": {
- "version": "4.6.2",
- "dev": true
- },
"lodash.restparam": {
"version": "3.6.1",
"dev": true
},
"lodash.union": {
- "version": "4.6.0"
- },
- "lodash.zip": {
- "version": "4.2.0",
- "dev": true
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
+ "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw=="
},
"log-symbols": {
"version": "4.1.0",
@@ -26689,14 +25297,6 @@
"triple-beam": "^1.3.0"
}
},
- "loglevel": {
- "version": "1.8.0",
- "dev": true
- },
- "loglevel-plugin-prefix": {
- "version": "0.8.4",
- "dev": true
- },
"loose-envify": {
"version": "1.4.0",
"requires": {
@@ -26792,10 +25392,6 @@
"version": "4.0.16",
"dev": true
},
- "marky": {
- "version": "1.2.4",
- "dev": true
- },
"matcher": {
"version": "3.0.0",
"dev": true,
@@ -27198,9 +25794,9 @@
}
},
"readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -27907,11 +26503,7 @@
"decamelize": "^1.2.0"
}
}
- }
- },
- "oauth-sign": {
- "version": "0.9.0",
- "dev": true
+ }
},
"object-assign": {
"version": "4.1.1"
@@ -28111,10 +26703,6 @@
"pend": {
"version": "1.2.0"
},
- "performance-now": {
- "version": "2.1.0",
- "dev": true
- },
"picocolors": {
"version": "1.0.0",
"dev": true
@@ -28423,6 +27011,11 @@
}
}
},
+ "property-expr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
+ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
+ },
"proto-list": {
"version": "1.2.4",
"dev": true,
@@ -28440,18 +27033,10 @@
}
}
},
- "proxy-from-env": {
- "version": "1.1.0",
- "dev": true
- },
"pseudomap": {
"version": "1.0.2",
"dev": true
},
- "psl": {
- "version": "1.8.0",
- "dev": true
- },
"pump": {
"version": "3.0.0",
"requires": {
@@ -28486,69 +27071,9 @@
"escape-goat": "^2.0.0"
}
},
- "puppeteer-core": {
- "version": "5.5.0",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "devtools-protocol": "0.0.818844",
- "extract-zip": "^2.0.0",
- "https-proxy-agent": "^4.0.0",
- "node-fetch": "^2.6.1",
- "pkg-dir": "^4.2.0",
- "progress": "^2.0.1",
- "proxy-from-env": "^1.0.0",
- "rimraf": "^3.0.2",
- "tar-fs": "^2.0.0",
- "unbzip2-stream": "^1.3.3",
- "ws": "^7.2.3"
- },
- "dependencies": {
- "agent-base": {
- "version": "5.1.1",
- "dev": true
- },
- "extract-zip": {
- "version": "2.0.1",
- "dev": true,
- "requires": {
- "@types/yauzl": "^2.9.1",
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- }
- },
- "get-stream": {
- "version": "5.2.0",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "https-proxy-agent": {
- "version": "4.0.0",
- "dev": true,
- "requires": {
- "agent-base": "5",
- "debug": "4"
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
"pure-color": {
"version": "1.3.0"
},
- "qs": {
- "version": "6.5.3",
- "dev": true
- },
"query-selector": {
"version": "1.0.9"
},
@@ -28701,6 +27226,11 @@
"prop-types": "^15.7.2"
}
},
+ "react-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
"react-faux-dom": {
"version": "4.5.0",
"requires": {
@@ -29062,9 +27592,29 @@
}
},
"readdir-glob": {
- "version": "1.1.1",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz",
+ "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==",
"requires": {
- "minimatch": "^3.0.4"
+ "minimatch": "^5.1.0"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
}
},
"readdirp": {
@@ -29197,47 +27747,6 @@
"es6-error": "^4.0.1"
}
},
- "request": {
- "version": "2.88.2",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "form-data": {
- "version": "2.3.3",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "uuid": {
- "version": "3.4.0",
- "dev": true
- }
- }
- },
"request-stream": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/request-stream/-/request-stream-1.2.2.tgz",
@@ -29290,10 +27799,6 @@
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
- "resolve-alpn": {
- "version": "1.2.1",
- "dev": true
- },
"resolve-cwd": {
"version": "3.0.0",
"dev": true,
@@ -29317,19 +27822,6 @@
"lowercase-keys": "^1.0.0"
}
},
- "resq": {
- "version": "1.10.2",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^2.0.1"
- },
- "dependencies": {
- "fast-deep-equal": {
- "version": "2.0.1",
- "dev": true
- }
- }
- },
"restructure": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz",
@@ -29351,10 +27843,6 @@
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
},
- "rgb2hex": {
- "version": "0.2.3",
- "dev": true
- },
"rimraf": {
"version": "2.7.1",
"dev": true,
@@ -29822,22 +28310,33 @@
"dev": true
},
"socket.io": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
- "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz",
+ "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==",
"requires": {
"accepts": "~1.3.4",
"base64id": "~2.0.0",
"debug": "~4.3.2",
- "engine.io": "~6.2.1",
- "socket.io-adapter": "~2.4.0",
+ "engine.io": "~6.4.1",
+ "socket.io-adapter": "~2.5.2",
"socket.io-parser": "~4.2.1"
}
},
"socket.io-adapter": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
- "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
+ "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
+ "requires": {
+ "ws": "~8.11.0"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+ "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+ "requires": {}
+ }
+ }
},
"socket.io-parser": {
"version": "4.2.2",
@@ -30013,24 +28512,6 @@
}
}
},
- "spectron": {
- "version": "13.0.0",
- "dev": true,
- "requires": {
- "dev-null": "^0.1.1",
- "electron-chromedriver": "^11.0.0",
- "request": "^2.88.2",
- "split": "^1.0.1",
- "webdriverio": "^6.9.1"
- }
- },
- "split": {
- "version": "1.0.1",
- "dev": true,
- "requires": {
- "through": "2"
- }
- },
"split-ca": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz",
@@ -30045,9 +28526,9 @@
},
"dependencies": {
"readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -30061,21 +28542,6 @@
"dev": true,
"optional": true
},
- "sshpk": {
- "version": "1.17.0",
- "dev": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
"ssri": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
@@ -30448,6 +28914,11 @@
"ticky": {
"version": "1.0.1"
},
+ "tiny-case": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
+ "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
+ },
"tiny-inflate": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
@@ -30509,13 +28980,10 @@
"hoek": "6.x.x"
}
},
- "tough-cookie": {
- "version": "2.5.0",
- "dev": true,
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
+ "toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
},
"tr46": {
"version": "0.0.3"
@@ -30561,23 +29029,14 @@
"dev": true,
"optional": true
},
- "tunnel-agent": {
- "version": "0.6.0",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "dev": true
- },
"type-detect": {
"version": "4.0.8",
"dev": true
},
"type-fest": {
- "version": "2.13.0"
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="
},
"type-is": {
"version": "1.6.18",
@@ -30614,6 +29073,8 @@
},
"unbzip2-stream": {
"version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
"requires": {
"buffer": "^5.2.1",
"through": "^2.3.8"
@@ -30936,182 +29397,6 @@
"minimalistic-assert": "^1.0.0"
}
},
- "webdriver": {
- "version": "6.12.1",
- "dev": true,
- "requires": {
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/protocols": "6.12.0",
- "@wdio/utils": "6.11.0",
- "got": "^11.0.2",
- "lodash.merge": "^4.6.1"
- },
- "dependencies": {
- "@sindresorhus/is": {
- "version": "4.6.0",
- "dev": true
- },
- "@szmarczak/http-timer": {
- "version": "4.0.6",
- "dev": true,
- "requires": {
- "defer-to-connect": "^2.0.0"
- }
- },
- "cacheable-request": {
- "version": "7.0.2",
- "dev": true,
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- }
- },
- "decompress-response": {
- "version": "6.0.0",
- "dev": true,
- "requires": {
- "mimic-response": "^3.1.0"
- }
- },
- "defer-to-connect": {
- "version": "2.0.1",
- "dev": true
- },
- "get-stream": {
- "version": "5.2.0",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "got": {
- "version": "11.8.5",
- "dev": true,
- "requires": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- }
- },
- "json-buffer": {
- "version": "3.0.1",
- "dev": true
- },
- "keyv": {
- "version": "4.3.0",
- "dev": true,
- "requires": {
- "compress-brotli": "^1.3.8",
- "json-buffer": "3.0.1"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "dev": true
- },
- "mimic-response": {
- "version": "3.1.0",
- "dev": true
- },
- "normalize-url": {
- "version": "6.1.0",
- "dev": true
- },
- "p-cancelable": {
- "version": "2.1.1",
- "dev": true
- },
- "responselike": {
- "version": "2.0.0",
- "dev": true,
- "requires": {
- "lowercase-keys": "^2.0.0"
- }
- }
- }
- },
- "webdriverio": {
- "version": "6.12.1",
- "dev": true,
- "requires": {
- "@types/puppeteer-core": "^5.4.0",
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/repl": "6.11.0",
- "@wdio/utils": "6.11.0",
- "archiver": "^5.0.0",
- "atob": "^2.1.2",
- "css-shorthand-properties": "^1.1.1",
- "css-value": "^0.0.1",
- "devtools": "6.12.1",
- "fs-extra": "^9.0.1",
- "get-port": "^5.1.1",
- "grapheme-splitter": "^1.0.2",
- "lodash.clonedeep": "^4.5.0",
- "lodash.isobject": "^3.0.2",
- "lodash.isplainobject": "^4.0.6",
- "lodash.zip": "^4.2.0",
- "minimatch": "^3.0.4",
- "puppeteer-core": "^5.1.0",
- "resq": "^1.9.1",
- "rgb2hex": "0.2.3",
- "serialize-error": "^8.0.0",
- "webdriver": "6.12.1"
- },
- "dependencies": {
- "fs-extra": {
- "version": "9.1.0",
- "dev": true,
- "requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "jsonfile": {
- "version": "6.1.0",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "lodash.isplainobject": {
- "version": "4.0.6",
- "dev": true
- },
- "serialize-error": {
- "version": "8.1.0",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "type-fest": {
- "version": "0.20.2",
- "dev": true
- },
- "universalify": {
- "version": "2.0.0",
- "dev": true
- }
- }
- },
"webidl-conversions": {
"version": "3.0.1"
},
@@ -31613,6 +29898,17 @@
"version": "0.1.0",
"dev": true
},
+ "yup": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.0.2.tgz",
+ "integrity": "sha512-Lpi8nITFKjWtCoK3yQP8MUk78LJmHWqbFd0OOMXTar+yjejlQ4OIIoZgnTW1bnEUKDw6dZBcy3/IdXnt2KDUow==",
+ "requires": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ }
+ },
"zen-observable": {
"version": "0.8.15"
},
@@ -31624,6 +29920,8 @@
},
"zip-stream": {
"version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
+ "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
"requires": {
"archiver-utils": "^2.1.0",
"compress-commons": "^4.1.0",
@@ -31631,7 +29929,9 @@
},
"dependencies": {
"readable-stream": {
- "version": "3.6.0",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
diff --git a/packages/coinstac-desktop-app/package.json b/packages/coinstac-desktop-app/package.json
index e1d1ea7e7..c86b96634 100644
--- a/packages/coinstac-desktop-app/package.json
+++ b/packages/coinstac-desktop-app/package.json
@@ -29,6 +29,7 @@
"electron-store": "^8.0.1",
"electron-updater": "^4.6.1",
"form-data": "^4.0.0",
+ "formik": "^2.2.9",
"graphql": "^15.5.0",
"gunzip-maybe": "^1.4.2",
"immutability-helper": "^2.7.0",
@@ -79,7 +80,8 @@
"tail": "^1.2.3",
"tar-fs": "^2.1.1",
"uuid": "^8.3.2",
- "winston": "^3.4.0"
+ "winston": "^3.4.0",
+ "yup": "^1.0.2"
},
"devDependencies": {
"@babel/cli": "^7.16.0",
@@ -107,7 +109,6 @@
"react-hot-loader": "^4.13.0",
"rimraf": "^2.6.2",
"sass-loader": "^13.2.0",
- "spectron": "^13.0.0",
"stack-chain": "^2.0.0",
"style-loader": "^3.3.1",
"tape": "^4.9.0",
From 70cc8bc600ff689383ab5977cd0161837a4e2c93 Mon Sep 17 00:00:00 2001
From: kalitopix
Date: Fri, 3 Mar 2023 10:50:52 -0500
Subject: [PATCH 02/24] refactor forgot password flow
---
.../coinstac-api-server/src/auth-helpers.js | 3 +-
.../coinstac-api-server/src/routes/auth.js | 4 +-
.../tests/resolvers.test.js | 6 +-
.../coinstac-api-server/tests/routes.test.js | 8 +-
.../components/user/form-forgot-password.jsx | 125 ++++++++
.../components/user/form-login-controller.jsx | 2 +-
.../app/render/components/user/form-login.jsx | 275 +++++++++---------
.../user/form-password-controller.jsx | 188 +++---------
.../components/user/form-send-email.jsx | 78 +++++
.../app/render/state/ducks/auth.js | 2 +-
10 files changed, 382 insertions(+), 309 deletions(-)
create mode 100644 packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx
create mode 100644 packages/coinstac-desktop-app/app/render/components/user/form-send-email.jsx
diff --git a/packages/coinstac-api-server/src/auth-helpers.js b/packages/coinstac-api-server/src/auth-helpers.js
index 8fd3c68b7..eb0400cdf 100644
--- a/packages/coinstac-api-server/src/auth-helpers.js
+++ b/packages/coinstac-api-server/src/auth-helpers.js
@@ -389,7 +389,7 @@ const helperFunctions = {
* @param {object} password new password
* @return {object}
*/
- async resetPassword(token, password) {
+ async resetForgotPassword(token, password) {
const db = database.getDbInstance();
const newPassword = await helperFunctions.hashPassword(password);
@@ -400,6 +400,7 @@ const helperFunctions = {
$set: {
passwordHash: newPassword,
passwordResetToken: '',
+ passwordChangedAt: new Date(),
},
}, {
returnOriginal: false,
diff --git a/packages/coinstac-api-server/src/routes/auth.js b/packages/coinstac-api-server/src/routes/auth.js
index 5c2b9c62e..a3226a720 100644
--- a/packages/coinstac-api-server/src/routes/auth.js
+++ b/packages/coinstac-api-server/src/routes/auth.js
@@ -135,13 +135,13 @@ module.exports = [
},
{
method: 'POST',
- path: '/resetPassword',
+ path: '/resetForgotPassword',
config: {
auth: false,
pre: [{ method: helperFunctions.validateResetToken }],
handler: (req, h) => {
return helperFunctions
- .resetPassword(req.payload.token, req.payload.password)
+ .resetForgotPassword(req.payload.token, req.payload.password)
.then(() => h.response().code(204));
},
},
diff --git a/packages/coinstac-api-server/tests/resolvers.test.js b/packages/coinstac-api-server/tests/resolvers.test.js
index a6038e292..ad423f87a 100644
--- a/packages/coinstac-api-server/tests/resolvers.test.js
+++ b/packages/coinstac-api-server/tests/resolvers.test.js
@@ -95,7 +95,7 @@ test('decodeToken', (t) => {
t.is(decoded.id, username);
});
-test('createPasswordResetToken, savePasswordResetToken, validateResetToken and resetPassword', async (t) => {
+test('createPasswordResetToken, savePasswordResetToken, validateResetToken and resetForgotPassword', async (t) => {
/* createPasswordResetToken */
const email = 'test@mrn.org';
const token = helperFunctions.createPasswordResetToken(email);
@@ -133,9 +133,9 @@ test('createPasswordResetToken, savePasswordResetToken, validateResetToken and r
t.is(error.message, INVALID_EMAIL);
jwt.verify.restore();
- /* resetPassword */
+ /* resetForgotPassword */
const newPassword = 'newPassword';
- await helperFunctions.resetPassword(token, newPassword);
+ await helperFunctions.resetForgotPassword(token, newPassword);
const res = await helperFunctions.getUserDetailsByID(USER_IDS[0]);
const isValid = await helperFunctions.verifyPassword(newPassword, res.passwordHash);
t.true(isValid);
diff --git a/packages/coinstac-api-server/tests/routes.test.js b/packages/coinstac-api-server/tests/routes.test.js
index 5ae556b8f..ba13eb2ef 100644
--- a/packages/coinstac-api-server/tests/routes.test.js
+++ b/packages/coinstac-api-server/tests/routes.test.js
@@ -225,8 +225,8 @@ test('sendPasswordResetEmail', async (t) => {
});
-test('resetPassword', async (t) => {
- const createAccount = find(authRoutes, { path: '/resetPassword' });
+test('resetForgotPassword', async (t) => {
+ const createAccount = find(authRoutes, { path: '/resetForgotPassword' });
const req = {
payload: {
@@ -235,7 +235,7 @@ test('resetPassword', async (t) => {
},
};
- sinon.stub(helperFunctions, 'resetPassword').resolves();
+ sinon.stub(helperFunctions, 'resetForgotPassword').resolves();
const res = {
response: () => ({
@@ -247,7 +247,7 @@ test('resetPassword', async (t) => {
await createAccount.config.handler(req, res);
- helperFunctions.resetPassword.restore();
+ helperFunctions.resetForgotPassword.restore();
});
test('version', (t) => {
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx
new file mode 100644
index 000000000..e155d8270
--- /dev/null
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx
@@ -0,0 +1,125 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Button from '@material-ui/core/Button';
+import TextField from '@material-ui/core/TextField';
+import makeStyles from '@material-ui/core/styles/makeStyles';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+
+const PASSWORD_PATTERN = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-]).{8,}$/g;
+
+const validationSchema = Yup.object().shape({
+ token: Yup.string().required('Required'),
+ password: Yup.string().required('Required').matches(PASSWORD_PATTERN, {
+ message: 'Passwords should be 8 character minimum with a mix of uppercase, lowercase and special character',
+ }),
+ confirmPassword: Yup.string().required('Required').oneOf([Yup.ref('password')], 'Your passwords do not match.'),
+});
+
+const useStyles = makeStyles(theme => ({
+ loginFormContainer: {
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ },
+ paper: {
+ padding: theme.spacing(2),
+ maxWidth: 300,
+ marginBottom: theme.spacing(2),
+ },
+ bottomMargin: {
+ marginBottom: 10,
+ },
+ formControl: {
+ marginBottom: theme.spacing(2),
+ },
+ error: {
+ textAlign: 'center',
+ color: 'red',
+ },
+}));
+
+const FormLogin = ({
+ loading,
+ onSubmit,
+}) => {
+ const classes = useStyles();
+
+ const formik = useFormik({
+ initialValues: {
+ token: '',
+ password: '',
+ confirmPassword: '',
+ },
+ validationSchema,
+ onSubmit: (values) => {
+ onSubmit({
+ token: values.token.trim(),
+ password: values.password.trim(),
+ });
+ },
+ });
+
+ return (
+
+ );
+};
+
+FormLogin.propTypes = {
+ loading: PropTypes.object,
+ onSubmit: PropTypes.func.isRequired,
+};
+
+FormLogin.defaultProps = {
+ loading: null,
+};
+
+export default FormLogin;
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-login-controller.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-login-controller.jsx
index fbfe8cc0f..1b37dd509 100644
--- a/packages/coinstac-desktop-app/app/render/components/user/form-login-controller.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-login-controller.jsx
@@ -53,7 +53,7 @@ class FormLoginController extends Component {
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx
index dc060e42b..d4d38b6ad 100644
--- a/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx
@@ -1,17 +1,24 @@
-import React, { Component } from 'react';
+import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { Link } from 'react-router';
-import { withStyles } from '@material-ui/core/styles';
import Paper from '@material-ui/core/Paper';
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Checkbox from '@material-ui/core/Checkbox';
import FormControlLabel from '@material-ui/core/FormControlLabel';
+import makeStyles from '@material-ui/core/styles/makeStyles';
import classNames from 'classnames';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
import FormStartupDirectory from './form-startup-directory';
import { EXPIRED_TOKEN } from '../../utils/error-codes';
-const styles = theme => ({
+const validationSchema = Yup.object().shape({
+ username: Yup.string().required('Required'),
+ password: Yup.string().required('Required'),
+});
+
+const useStyles = makeStyles(theme => ({
loginFormContainer: {
display: 'flex',
flexDirection: 'column',
@@ -32,71 +39,54 @@ const styles = theme => ({
textAlign: 'center',
color: 'red',
},
-});
+}));
-class FormLogin extends Component {
- constructor(props) {
- super(props);
+const FormLogin = ({
+ auth,
+ loading,
+ changeAppDirectory,
+ changeClientServerURL,
+ onSubmit,
+}) => {
+ const classes = useStyles();
- this.state = {
+ const [isStartupDirectoryDialogOpen, setIsStartupDirectoryDialogOpen] = useState(false);
+
+ const formik = useFormik({
+ initialValues: {
username: '',
password: '',
saveLogin: false,
- isStartupDirectoryDialogOpen: false,
- };
- }
-
- onSubmit = (e) => {
- e.preventDefault();
-
- const { submit } = this.props;
- const { username, password, saveLogin } = this.state;
-
- const data = {
- username: username.trim(),
- password: password.trim(),
- saveLogin,
- };
-
- submit(data);
- }
-
- handleChange = name => (event) => {
- this.setState({
- [name]: event.target.value,
- });
+ },
+ validationSchema,
+ onSubmit: (values) => {
+ onSubmit({
+ username: values.username.trim(),
+ password: values.password.trim(),
+ saveLogin: values.saveLogin,
+ });
+ },
+ });
+
+
+ const toggleStartupDirectoryDialog = () => {
+ setIsStartupDirectoryDialogOpen(prevState => !prevState);
};
- handleChangeCheckbox = name => (event) => {
- this.setState({
- [name]: event.target.checked,
- });
- };
-
- toggleStartupDirectoryDialog = () => {
- const { isStartupDirectoryDialogOpen } = this.state;
- this.setState({
- isStartupDirectoryDialogOpen: !isStartupDirectoryDialogOpen,
- });
- }
-
- changeAppData = ({ appDirectory, clientServerURL }) => {
- const { changeAppDirectory, changeClientServerURL } = this.props;
+ const changeAppData = ({ appDirectory, clientServerURL }) => {
changeAppDirectory(appDirectory);
changeClientServerURL(clientServerURL);
- this.setState({ isStartupDirectoryDialogOpen: false });
- }
-
- renderError = () => {
- const { auth, classes } = this.props;
+ setIsStartupDirectoryDialogOpen(false);
+ };
+ const renderError = () => {
const errorMessage = auth.error === EXPIRED_TOKEN
? (
-
+ <>
Your login session has expired,
please re-login
-
+ >
)
: auth.error;
@@ -105,106 +95,105 @@ class FormLogin extends Component {
{errorMessage}
);
- }
-
- render() {
- const { auth, loading, classes } = this.props;
- const {
- username,
- password,
- saveLogin,
- isStartupDirectoryDialogOpen,
- } = this.state;
+ };
- return (
-
-
-
-
-
-
-
-
-
-
- );
- }
-}
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
FormLogin.propTypes = {
auth: PropTypes.object.isRequired,
- classes: PropTypes.object.isRequired,
loading: PropTypes.object,
changeAppDirectory: PropTypes.func.isRequired,
changeClientServerURL: PropTypes.func.isRequired,
- submit: PropTypes.func.isRequired,
+ onSubmit: PropTypes.func.isRequired,
};
FormLogin.defaultProps = {
loading: null,
};
-export default withStyles(styles)(FormLogin);
+export default FormLogin;
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-password-controller.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-password-controller.jsx
index 27de2215d..47be7a1eb 100644
--- a/packages/coinstac-desktop-app/app/render/components/user/form-password-controller.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-password-controller.jsx
@@ -1,12 +1,7 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
-import {
- ValidatorForm,
- TextValidator,
-} from 'react-material-ui-form-validator';
import AppBar from '@material-ui/core/AppBar';
-import Button from '@material-ui/core/Button';
import Paper from '@material-ui/core/Paper';
import Tab from '@material-ui/core/Tab';
import Tabs from '@material-ui/core/Tabs';
@@ -14,12 +9,14 @@ import { withStyles } from '@material-ui/core/styles';
import LayoutNoauth from '../layout-noauth';
import {
sendPasswordResetEmail,
- resetPassword,
+ resetForgotPassword,
} from '../../state/ducks/auth';
+import FormSendEmail from './form-send-email';
+import FormForgotPassword from './form-forgot-password';
const styles = theme => ({
paper: {
- maxWidth: 320,
+ maxWidth: 367,
},
tabPanel: {
padding: theme.spacing(2),
@@ -37,91 +34,44 @@ class FormPasswordController extends Component {
this.state = {
selectedTab: 'sendEmail',
- sendingEmail: {
- loading: false,
- email: '',
- },
- resettingPassword: {
- loading: false,
- token: '',
- newPassword: '',
- confirmPassword: '',
- },
+ sendingEmail: false,
+ resettingPassword: false,
};
}
- componentDidMount() {
- ValidatorForm.addValidationRule(
- 'isPasswordMatch',
- // eslint-disable-next-line react/destructuring-assignment
- value => value === this.state.resettingPassword.newPassword
- );
- }
-
- componentWillUnmount() {
- ValidatorForm.removeValidationRule('isPasswordMatch');
- }
-
- handleSendingEmailStateChange = (key, value) => {
- const { sendingEmail } = this.state;
-
- this.setState({
- sendingEmail: {
- ...sendingEmail,
- [key]: value,
- },
- });
- }
-
- handleResettingPasswordStateChange = (key, value) => {
- const { resettingPassword } = this.state;
-
- this.setState({
- resettingPassword: {
- ...resettingPassword,
- [key]: value,
- },
- });
- }
-
handleTabChange = (selectedTab) => {
const { sendingEmail, resettingPassword } = this.state;
- if (!sendingEmail.loading && !resettingPassword.loading) {
+ if (!sendingEmail && !resettingPassword) {
this.setState({ selectedTab });
}
}
- handleSendEmail = () => {
+ handleSendEmail = (values) => {
const { sendPasswordResetEmail } = this.props;
- const { sendingEmail } = this.state;
- this.handleSendingEmailStateChange('loading', true);
+ this.setState({ sendingEmail: true });
- sendPasswordResetEmail({ email: sendingEmail.email })
+ sendPasswordResetEmail(values)
.then(() => {
- this.handleSendingEmailStateChange('loading', false);
- this.handleTabChange('passwordReset');
+ this.setState({ sendingEmail: false });
+ this.handleTabChange('resetForgotPassword');
})
.catch(() => {
- this.handleSendingEmailStateChange('loading', false);
+ this.setState({ sendingEmail: false });
});
}
- handleResetPassword = () => {
+ handleResetForgotPassword = (values) => {
const { router } = this.context;
- const { resetPassword } = this.props;
- const { resettingPassword } = this.state;
+ const { resetForgotPassword } = this.props;
- this.handleResettingPasswordStateChange('loading', true);
+ this.setState({ resettingPassword: true });
- resetPassword({
- token: resettingPassword.token,
- password: resettingPassword.newPassword,
- })
+ resetForgotPassword(values)
.then(() => router.push('/login'))
.finally(() => {
- this.handleResettingPasswordStateChange('loading', false);
+ this.setState({ resettingPassword: false });
});
}
@@ -129,12 +79,6 @@ class FormPasswordController extends Component {
const { classes } = this.props;
const { selectedTab, sendingEmail, resettingPassword } = this.state;
- const commonProps = {
- fullWidth: true,
- withRequiredValidator: true,
- required: true,
- };
-
return (
@@ -146,7 +90,7 @@ class FormPasswordController extends Component {
}
>
-
+
@@ -155,92 +99,22 @@ class FormPasswordController extends Component {
className={classes.tabPanel}
square
>
-
- this.handleSendingEmailStateChange('email', evt.target.value)
- }
- {...commonProps}
- />
-
-
+ />
)}
- {selectedTab === 'passwordReset' && (
+ {selectedTab === 'resetForgotPassword' && (
-
- this.handleResettingPasswordStateChange('token', evt.target.value)
- }
- {...commonProps}
- />
- this.handleResettingPasswordStateChange('newPassword', evt.target.value)
- }
- {...commonProps}
- />
- this.handleResettingPasswordStateChange('confirmPassword', evt.target.value)
- }
- {...commonProps}
- />
-
-
+
)}
@@ -253,6 +127,12 @@ FormPasswordController.contextTypes = {
router: PropTypes.object.isRequired,
};
+FormPasswordController.propTypes = {
+ classes: PropTypes.object.isRequired,
+ sendPasswordResetEmail: PropTypes.func.isRequired,
+ resetForgotPassword: PropTypes.func.isRequired,
+};
+
FormPasswordController.displayName = 'FormPasswordController';
const mapStateToProps = ({ auth, loading }) => ({
@@ -262,7 +142,7 @@ const mapStateToProps = ({ auth, loading }) => ({
const connectedComponent = connect(mapStateToProps, {
sendPasswordResetEmail,
- resetPassword,
+ resetForgotPassword,
})(FormPasswordController);
export default withStyles(styles)(connectedComponent);
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-send-email.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-send-email.jsx
new file mode 100644
index 000000000..f848a7d7a
--- /dev/null
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-send-email.jsx
@@ -0,0 +1,78 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Button from '@material-ui/core/Button';
+import TextField from '@material-ui/core/TextField';
+import makeStyles from '@material-ui/core/styles/makeStyles';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+
+const validationSchema = Yup.object().shape({
+ email: Yup.string().required('Required').email('Invalid email'),
+});
+
+const useStyles = makeStyles(theme => ({
+ paper: {
+ padding: theme.spacing(2),
+ maxWidth: 300,
+ marginBottom: theme.spacing(2),
+ },
+ formControl: {
+ marginBottom: theme.spacing(2),
+ },
+}));
+
+const FormSendEmail = ({
+ loading,
+ onSubmit,
+}) => {
+ const classes = useStyles();
+
+ const formik = useFormik({
+ initialValues: {
+ email: '',
+ },
+ validationSchema,
+ onSubmit: (values) => {
+ onSubmit({
+ email: values.email.trim(),
+ });
+ },
+ });
+
+ return (
+
+ );
+};
+
+FormSendEmail.propTypes = {
+ loading: PropTypes.object,
+ onSubmit: PropTypes.func.isRequired,
+};
+
+FormSendEmail.defaultProps = {
+ loading: null,
+};
+
+export default FormSendEmail;
diff --git a/packages/coinstac-desktop-app/app/render/state/ducks/auth.js b/packages/coinstac-desktop-app/app/render/state/ducks/auth.js
index ba7054bf3..91478312d 100644
--- a/packages/coinstac-desktop-app/app/render/state/ducks/auth.js
+++ b/packages/coinstac-desktop-app/app/render/state/ducks/auth.js
@@ -261,7 +261,7 @@ export const sendPasswordResetEmail = applyAsyncLoading(payload => dispatch => a
throw err;
}));
-export const resetPassword = applyAsyncLoading(payload => dispatch => axios.post(`${API_URL}/resetPassword`, payload)
+export const resetForgotPassword = applyAsyncLoading(payload => dispatch => axios.post(`${API_URL}/resetForgotPassword`, payload)
.then(() => {
dispatch(notifySuccess('Reset password successfully'));
})
From de5f97645a883d059a720f099afa2ce02cf9bd25 Mon Sep 17 00:00:00 2001
From: kalitopix
Date: Fri, 3 Mar 2023 11:40:16 -0500
Subject: [PATCH 03/24] add reset password
---
.../coinstac-api-server/src/auth-helpers.js | 58 +++++++-
.../coinstac-api-server/src/routes/auth.js | 13 ++
.../components/consortia/consortia-list.jsx | 4 +-
.../components/consortia/consortium-about.jsx | 4 +-
.../consortia/consortium-pipeline.jsx | 4 +-
.../components/consortia/consortium-tabs.jsx | 8 +-
.../components/dashboard/dashboard-nav.jsx | 4 +-
.../render/components/pipelines/pipeline.jsx | 4 +-
...sx => form-forgot-password-controller.jsx} | 10 +-
.../components/user/form-forgot-password.jsx | 25 +---
.../app/render/components/user/form-login.jsx | 8 ++
.../user/form-reset-password-controller.jsx | 77 +++++++++++
.../components/user/form-reset-password.jsx | 128 ++++++++++++++++++
.../render/components/user/form-signup.jsx | 3 +-
.../constants/{tutorial.js => index.js} | 4 +-
.../app/render/routes.jsx | 4 +-
.../app/render/state/ducks/auth.js | 10 ++
17 files changed, 325 insertions(+), 43 deletions(-)
rename packages/coinstac-desktop-app/app/render/components/user/{form-password-controller.jsx => form-forgot-password-controller.jsx} (93%)
create mode 100644 packages/coinstac-desktop-app/app/render/components/user/form-reset-password-controller.jsx
create mode 100644 packages/coinstac-desktop-app/app/render/components/user/form-reset-password.jsx
rename packages/coinstac-desktop-app/app/render/constants/{tutorial.js => index.js} (95%)
diff --git a/packages/coinstac-api-server/src/auth-helpers.js b/packages/coinstac-api-server/src/auth-helpers.js
index eb0400cdf..781d4fd58 100644
--- a/packages/coinstac-api-server/src/auth-helpers.js
+++ b/packages/coinstac-api-server/src/auth-helpers.js
@@ -384,8 +384,38 @@ const helperFunctions = {
}
},
/**
- * Reset password
- * @param {object} password token for resetting password
+ * Confirms that submitted token is valid
+ * @param {object} req request
+ * @param {object} res response
+ * @return {object} The requested object
+ */
+ async validateResetPassword(req, h) {
+ const db = database.getDbInstance();
+ const user = await db.collection('users').findOne({ username: req.payload.username });
+
+ if (!user) {
+ return Boom.badRequest('Invalid user');
+ }
+
+ const passwordMatch = await helperFunctions.verifyPassword(
+ req.payload.currentPassword, user.passwordHash
+ );
+
+ if (!passwordMatch) {
+ return Boom.badRequest('Current Password is not correct');
+ }
+
+ const isPasswordValid = helperFunctions.validatePasswordWithRegEx(req.payload.newPassword);
+
+ if (!isPasswordValid) {
+ return Boom.badRequest('New Password is not valid');
+ }
+
+ return h.response();
+ },
+ /**
+ * Reset forgot password
+ * @param {object} token token for resetting password
* @param {object} password new password
* @return {object}
*/
@@ -406,6 +436,28 @@ const helperFunctions = {
returnOriginal: false,
});
},
+ /**
+ * Reset password
+ * @param {object} username username
+ * @param {object} password new password
+ * @return {object}
+ */
+ async resetPassword(username, password) {
+ const db = database.getDbInstance();
+
+ const newPassword = await helperFunctions.hashPassword(password);
+
+ return db.collection('users').updateOne({
+ username,
+ }, {
+ $set: {
+ passwordHash: newPassword,
+ passwordChangedAt: new Date(),
+ },
+ }, {
+ returnOriginal: false,
+ });
+ },
/**
* Verify that authenticating user is using correct password
* @param {string} password user password
@@ -477,7 +529,7 @@ const helperFunctions = {
return Boom.badRequest('invalid user/run combination');
}
},
- validatePassword(password) {
+ validatePasswordWithRegEx(password) {
const PASSWORD_PATTERN = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-]).{8,}$/g;
return PASSWORD_PATTERN.test(password);
},
diff --git a/packages/coinstac-api-server/src/routes/auth.js b/packages/coinstac-api-server/src/routes/auth.js
index a3226a720..50b4ee0b0 100644
--- a/packages/coinstac-api-server/src/routes/auth.js
+++ b/packages/coinstac-api-server/src/routes/auth.js
@@ -146,4 +146,17 @@ module.exports = [
},
},
},
+ {
+ method: 'POST',
+ path: '/resetPassword',
+ config: {
+ auth: false,
+ pre: [{ method: helperFunctions.validateResetPassword }],
+ handler: (req, h) => {
+ return helperFunctions
+ .resetPassword(req.payload.username, req.payload.newPassword)
+ .then(() => h.response().code(204));
+ },
+ },
+ },
];
diff --git a/packages/coinstac-desktop-app/app/render/components/consortia/consortia-list.jsx b/packages/coinstac-desktop-app/app/render/components/consortia/consortia-list.jsx
index 0283523f0..95d25d6a1 100644
--- a/packages/coinstac-desktop-app/app/render/components/consortia/consortia-list.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/consortia/consortia-list.jsx
@@ -49,7 +49,7 @@ import { notifyInfo, notifyError, notifyWarning } from '../../state/ducks/notify
import { start, finish } from '../../state/ducks/loading';
import { startRun } from '../../state/ducks/runs';
import { isUserInGroup, isUserOnlyOwner, pipelineNeedsDataMapping } from '../../utils/helpers';
-import STEPS from '../../constants/tutorial';
+import { TUTORIAL_STEPS } from '../../constants';
import ErrorDialog from '../common/error-dialog';
const MAX_LENGTH_CONSORTIA = 50;
@@ -747,7 +747,7 @@ class ConsortiaList extends Component {
/>
{!auth.isTutorialHidden && (
diff --git a/packages/coinstac-desktop-app/app/render/components/consortia/consortium-about.jsx b/packages/coinstac-desktop-app/app/render/components/consortia/consortium-about.jsx
index 3592e7798..01894852d 100644
--- a/packages/coinstac-desktop-app/app/render/components/consortia/consortium-about.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/consortia/consortium-about.jsx
@@ -21,7 +21,7 @@ import { omit } from 'lodash';
import Select from '../common/react-select';
import MemberAvatar from '../common/member-avatar';
import StatusButtonWrapper from '../common/status-button-wrapper';
-import STEPS from '../../constants/tutorial';
+import { TUTORIAL_STEPS } from '../../constants';
const styles = theme => ({
textField: {
@@ -286,7 +286,7 @@ class ConsortiumAbout extends Component {
}
{!isTutorialHidden && (
({
tabTitle: {
@@ -182,7 +182,7 @@ function ConsortiumPipeline({
)}
{!isTutorialHidden && (
diff --git a/packages/coinstac-desktop-app/app/render/components/consortia/consortium-tabs.jsx b/packages/coinstac-desktop-app/app/render/components/consortia/consortium-tabs.jsx
index 53da49ed4..6531b46e0 100644
--- a/packages/coinstac-desktop-app/app/render/components/consortia/consortium-tabs.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/consortia/consortium-tabs.jsx
@@ -30,7 +30,7 @@ import {
} from '../../state/graphql/functions';
import { notifySuccess, notifyError } from '../../state/ducks/notifyAndLog';
import { getGraphQLErrorMessage } from '../../utils/helpers';
-import STEPS from '../../constants/tutorial';
+import { TUTORIAL_STEPS } from '../../constants';
const styles = theme => ({
title: {
@@ -280,7 +280,11 @@ class ConsortiumTabs extends Component {
{!isTutorialHidden && isEditingConsortium && (
-
+
)}
{!isTutorialHidden && router.location.pathname === '/dashboard' && (
diff --git a/packages/coinstac-desktop-app/app/render/components/pipelines/pipeline.jsx b/packages/coinstac-desktop-app/app/render/components/pipelines/pipeline.jsx
index 877a2e480..609c2ab88 100644
--- a/packages/coinstac-desktop-app/app/render/components/pipelines/pipeline.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/pipelines/pipeline.jsx
@@ -62,7 +62,7 @@ import {
getGraphQLErrorMessage,
isUserInGroup,
} from '../../utils/helpers';
-import STEPS from '../../constants/tutorial';
+import { TUTORIAL_STEPS } from '../../constants';
const VAULT_USERS_TOOLTIP = `Vault users are persistent nodes that can run some pipelines. If you add one or more vault users,
the available pipelines list will be filtered by the ones that the vault users can run.`;
@@ -989,7 +989,7 @@ class Pipeline extends Component {
{!auth.isTutorialHidden && (
({
},
});
-class FormPasswordController extends Component {
+class FormForgotPasswordController extends Component {
constructor(props) {
super(props);
@@ -123,17 +123,17 @@ class FormPasswordController extends Component {
}
}
-FormPasswordController.contextTypes = {
+FormForgotPasswordController.contextTypes = {
router: PropTypes.object.isRequired,
};
-FormPasswordController.propTypes = {
+FormForgotPasswordController.propTypes = {
classes: PropTypes.object.isRequired,
sendPasswordResetEmail: PropTypes.func.isRequired,
resetForgotPassword: PropTypes.func.isRequired,
};
-FormPasswordController.displayName = 'FormPasswordController';
+FormForgotPasswordController.displayName = 'FormForgotPasswordController';
const mapStateToProps = ({ auth, loading }) => ({
auth,
@@ -143,6 +143,6 @@ const mapStateToProps = ({ auth, loading }) => ({
const connectedComponent = connect(mapStateToProps, {
sendPasswordResetEmail,
resetForgotPassword,
-})(FormPasswordController);
+})(FormForgotPasswordController);
export default withStyles(styles)(connectedComponent);
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx
index e155d8270..770a73596 100644
--- a/packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-forgot-password.jsx
@@ -5,8 +5,7 @@ import TextField from '@material-ui/core/TextField';
import makeStyles from '@material-ui/core/styles/makeStyles';
import { useFormik } from 'formik';
import * as Yup from 'yup';
-
-const PASSWORD_PATTERN = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-]).{8,}$/g;
+import { PASSWORD_PATTERN } from '../../constants';
const validationSchema = Yup.object().shape({
token: Yup.string().required('Required'),
@@ -17,29 +16,17 @@ const validationSchema = Yup.object().shape({
});
const useStyles = makeStyles(theme => ({
- loginFormContainer: {
- display: 'flex',
- flexDirection: 'column',
- alignItems: 'center',
- },
paper: {
padding: theme.spacing(2),
maxWidth: 300,
marginBottom: theme.spacing(2),
},
- bottomMargin: {
- marginBottom: 10,
- },
formControl: {
marginBottom: theme.spacing(2),
},
- error: {
- textAlign: 'center',
- color: 'red',
- },
}));
-const FormLogin = ({
+const FormForgotPassword = ({
loading,
onSubmit,
}) => {
@@ -107,19 +94,19 @@ const FormLogin = ({
fullWidth
disabled={loading}
>
- REset
+ Reset
);
};
-FormLogin.propTypes = {
+FormForgotPassword.propTypes = {
loading: PropTypes.object,
onSubmit: PropTypes.func.isRequired,
};
-FormLogin.defaultProps = {
+FormForgotPassword.defaultProps = {
loading: null,
};
-export default FormLogin;
+export default FormForgotPassword;
diff --git a/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx b/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx
index d4d38b6ad..fb1b79d5a 100644
--- a/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx
+++ b/packages/coinstac-desktop-app/app/render/components/user/form-login.jsx
@@ -167,6 +167,14 @@ const FormLogin = ({
Forgot Password?
+
+