+const SwitchCheckbox = ({
+ checked,
+ onCheckboxClick,
+ label,
+ input,
+ className
+}) => (
+
+
@@ -16,7 +27,9 @@ const SwitchCheckbox = ({ checked, onCheckboxClick, label }) => (
SwitchCheckbox.propTypes = {
checked: PropTypes.bool.isRequired,
onCheckboxClick: PropTypes.func.isRequired,
- label: PropTypes.string
+ label: PropTypes.string,
+ input: PropTypes.object,
+ className: PropTypes.string
};
export default SwitchCheckbox;
diff --git a/developer-ui-frontend/src/components/common/buttons/SimpleButton.js b/developer-ui-frontend/src/components/common/buttons/SimpleButton.js
new file mode 100644
index 0000000..b06dd35
--- /dev/null
+++ b/developer-ui-frontend/src/components/common/buttons/SimpleButton.js
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
+ */
+import React from "react";
+import PropTypes from "prop-types";
+import Button from "./Button";
+import { getThemeColor } from "utils";
+
+const SimpleBtn = Button.extend`
+ -webkit-backface-visibility: hidden;
+ border: 0;
+ outline: none;
+ background: none;
+ opacity: 0.65;
+ transition: opacity 0.18s ease-out;
+ color: ${props => getThemeColor(props)};
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+
+ a {
+ text-decoration: none;
+ color: inherit;
+ }
+ svg {
+ path {
+ ${props =>
+ props.submitAnimation
+ ? `fill: ${props.theme.disabledFontColorHiContrast};`
+ : `fill: ${getThemeColor(props)};`};
+ }
+ }
+
+ &:hover {
+ opacity: 1;
+ ${props =>
+ props.submitAnimation &&
+ `
+ svg {
+ transform: translateX(0.5em);
+ path {
+ fill: ${getThemeColor(props)};
+ }
+ }`};
+ }
+ &:disabled {
+ color: ${props => props.theme.disabledFontColorHiContrast};
+ &:hover {
+ svg {
+ transform: translateX(0);
+ path {
+ transform: translateX(0);
+ fill: ${props => props.theme.disabledFontColorHiContrast};
+ }
+ }
+ }
+ }
+`;
+
+const SimpleButton = props => {
+ const {
+ children,
+ submitAnimation,
+ primary,
+ secondary,
+ danger,
+ ...other
+ } = props;
+ return (
+
+ {submitAnimation}
+ {children}
+
+ );
+};
+
+SimpleButton.propTypes = {
+ type: PropTypes.string,
+ children: PropTypes.string,
+ primary: PropTypes.bool,
+ secondary: PropTypes.bool,
+ danger: PropTypes.bool,
+ submitAnimation: PropTypes.bool
+};
+
+export default SimpleButton;
diff --git a/developer-ui-frontend/src/components/common/buttons/index.js b/developer-ui-frontend/src/components/common/buttons/index.js
index dfd59b4..60a28a8 100644
--- a/developer-ui-frontend/src/components/common/buttons/index.js
+++ b/developer-ui-frontend/src/components/common/buttons/index.js
@@ -4,3 +4,4 @@
export { default as OutlineButton } from "./OutlineButton";
export { default as FlatButton } from "./FlatButton";
export { default as RoundOutlineButton } from "./RoundOutlineButton";
+export { default as SimpleButton } from "./SimpleButton";
diff --git a/developer-ui-frontend/src/components/common/dialogModals/ConfigurationModal.js b/developer-ui-frontend/src/components/common/dialogModals/ConfigurationModal.js
index 486c781..dbf8f1b 100644
--- a/developer-ui-frontend/src/components/common/dialogModals/ConfigurationModal.js
+++ b/developer-ui-frontend/src/components/common/dialogModals/ConfigurationModal.js
@@ -49,18 +49,24 @@ export const ConfigurationModalHeader = ({
icon,
subject,
subTitle,
+ children,
...other
}) => (
{icon && icon} {subject} {subTitle && {subTitle}}
+ {children}
);
ConfigurationModalHeader.propTypes = {
subject: PropTypes.string.isRequired,
subTitle: PropTypes.string,
- icon: PropTypes.element
+ icon: PropTypes.element,
+ children: PropTypes.oneOfType([
+ PropTypes.arrayOf(PropTypes.node),
+ PropTypes.node
+ ])
};
export const ConfigurationModalFooter = ({
@@ -77,9 +83,9 @@ export const ConfigurationModalFooter = ({
/>
);
ConfigurationModalFooter.propTypes = {
- submitType: PropTypes.oneOf(["delete", "submit"]).isRequired,
+ submitType: PropTypes.oneOf(["delete", "submit", "none"]).isRequired,
toggleModal: PropTypes.func.isRequired,
- confirm: PropTypes.func.isRequired,
+ confirm: PropTypes.func,
submitBlocked: PropTypes.bool
};
diff --git a/developer-ui-frontend/src/components/common/dialogModals/ConfirmationModal.js b/developer-ui-frontend/src/components/common/dialogModals/ConfirmationModal.js
index 7503c8c..9ddbd5c 100644
--- a/developer-ui-frontend/src/components/common/dialogModals/ConfirmationModal.js
+++ b/developer-ui-frontend/src/components/common/dialogModals/ConfirmationModal.js
@@ -73,9 +73,9 @@ export const ConfirmationModalFooter = ({
};
ConfirmationModalFooter.propTypes = {
- submitType: PropTypes.oneOf(["delete", "submit"]).isRequired,
+ submitType: PropTypes.oneOf(["delete", "submit"]),
toggleModal: PropTypes.func.isRequired,
- confirm: PropTypes.func.isRequired,
+ confirm: PropTypes.func,
checkboxOption: PropTypes.shape({
checkboxLabel: PropTypes.string.isRequired,
checked: PropTypes.bool.isRequired,
@@ -156,7 +156,7 @@ ConfirmationModal.propTypes = {
modalShown: PropTypes.bool.isRequired,
subject: PropTypes.string,
subTitle: PropTypes.string,
- submitType: PropTypes.oneOf(["delete", "submit"]),
+ submitType: PropTypes.oneOf(["delete", "submit"]).isRequired,
toggleModal: PropTypes.func,
children: PropTypes.any,
confirm: PropTypes.func,
diff --git a/developer-ui-frontend/src/components/common/dialogModals/DialogModal.js b/developer-ui-frontend/src/components/common/dialogModals/DialogModal.js
index bd97a44..e8b7a6f 100644
--- a/developer-ui-frontend/src/components/common/dialogModals/DialogModal.js
+++ b/developer-ui-frontend/src/components/common/dialogModals/DialogModal.js
@@ -53,7 +53,9 @@ export const DialogModalBase = styled(Modal)`
`;
export const DialogModalHeaderBase = styled.div`
- display: inline-block;
+ display: inline-flex;
+ justify-content: space-between;
+ align-items: center;
width: calc(100% - 2 * 2.4rem);
white-space: nowrap;
border-bottom: 1px solid rgba(34, 36, 38, 0.15);
@@ -99,8 +101,7 @@ export const DialogModalFooter = ({
+ onClick={confirm}>
Delete
);
@@ -111,29 +112,44 @@ export const DialogModalFooter = ({
disabled={Boolean(submitBlocked)}
submitAnimation
onClick={confirm}
- type="submit"
- >
+ type="submit">
Submit
);
}
- return (
-
- {checkboxOption && checkboxOption}
-
- toggleModal(null, false)}>
- Cancel
-
- {ConfirmBtn}
-
-
- );
+ let SecondButton = null;
+ if (submitType === "none") {
+ SecondButton = (
+
+ {checkboxOption && checkboxOption}
+
+ toggleModal(null, false)}>
+ Close
+
+ {ConfirmBtn}
+
+
+ );
+ } else {
+ SecondButton = (
+
+ {checkboxOption && checkboxOption}
+
+ toggleModal(null, false)}>
+ Cancel
+
+ {ConfirmBtn}
+
+
+ );
+ }
+ return SecondButton;
};
DialogModalFooter.propTypes = {
- submitType: PropTypes.oneOf(["delete", "submit"]).isRequired,
+ submitType: PropTypes.oneOf(["delete", "submit", "none"]).isRequired,
toggleModal: PropTypes.func.isRequired,
- confirm: PropTypes.func.isRequired,
+ confirm: PropTypes.func,
submitBlocked: PropTypes.bool,
/* If provided, this content gets added on the left hand side of
the footer (usually a checkbox like "Don't show me again") */
diff --git a/developer-ui-frontend/src/components/common/textInputs/DatePicker.js b/developer-ui-frontend/src/components/common/textInputs/DatePicker.js
index f7988e2..f5c2418 100644
--- a/developer-ui-frontend/src/components/common/textInputs/DatePicker.js
+++ b/developer-ui-frontend/src/components/common/textInputs/DatePicker.js
@@ -9,15 +9,20 @@ import { Field } from "redux-form/immutable";
import "styles/datePicker.scss";
import moment from "moment";
import CalendarIcon from "images/calendarIcon.svg";
+import CancelIcon from "images/cancelIcon.svg";
/* eslint-disable react/no-multi-comp */
class DatePickerWrapped extends Component {
constructor(props) {
super(props);
+ this.state = {
+ placeholderText: this.props.placeholder
+ };
this.handleChange = this.handleChange.bind(this);
this.handleInputClick = this.handleInputClick.bind(this);
this.handleBlur = this.handleBlur.bind(this);
this.toggle = this.toggle.bind(this);
+ this.clearText = this.clearText.bind(this);
this.component = React.createRef();
}
@@ -30,7 +35,6 @@ class DatePickerWrapped extends Component {
}
handleChange(date) {
- console.log(date);
this.props.input.onChange(moment(date));
this.props.input.onBlur();
}
@@ -47,25 +51,31 @@ class DatePickerWrapped extends Component {
active ? this.props.input.onBlur() : this.props.input.onFocus();
}
+ clearText() {
+ this.props.input.onChange(null);
+ this.setState({ placeholderText: null });
+ }
+
render() {
const {
- placeholder,
input,
meta: { active }
} = this.props;
-
+ const { placeholderText } = this.state;
return (
{
this.component = r;
}}
- selected={input.value ? moment(input.value, "MM/DD/YYYY") : null}
+ dateFormat="YYYY-MM-DDTHH:mm:ss"
+ selected={input.value ? moment(input.value) : null}
onChange={this.handleChange}
onBlur={this.handleBlur}
onClickOutside={this.handleBlur}
- placeholderText={placeholder}
+ placeholderText={placeholderText}
/>
+
@@ -94,7 +104,8 @@ class DatePicker extends Component {
this.state = {
value: moment(),
pristine: true,
- active: false
+ active: false,
+ placeholder: ""
};
this.handleChange = this.handleChange.bind(this);
this.handleFocus = this.handleFocus.bind(this);
diff --git a/developer-ui-frontend/src/images/addBox.svg b/developer-ui-frontend/src/images/addBox.svg
new file mode 100644
index 0000000..8e517d8
--- /dev/null
+++ b/developer-ui-frontend/src/images/addBox.svg
@@ -0,0 +1 @@
+
diff --git a/developer-ui-frontend/src/images/removeBox.svg b/developer-ui-frontend/src/images/removeBox.svg
new file mode 100644
index 0000000..7471a56
--- /dev/null
+++ b/developer-ui-frontend/src/images/removeBox.svg
@@ -0,0 +1 @@
+
diff --git a/developer-ui-frontend/src/images/saveIcon.svg b/developer-ui-frontend/src/images/saveIcon.svg
index 8359ad7..a83612d 100644
--- a/developer-ui-frontend/src/images/saveIcon.svg
+++ b/developer-ui-frontend/src/images/saveIcon.svg
@@ -1,3 +1,3 @@
-
diff --git a/developer-ui-frontend/src/reducers/ConnectionReducer.js b/developer-ui-frontend/src/reducers/ConnectionReducer.js
index a48e59a..b059dd3 100644
--- a/developer-ui-frontend/src/reducers/ConnectionReducer.js
+++ b/developer-ui-frontend/src/reducers/ConnectionReducer.js
@@ -82,7 +82,7 @@ const connectionReducer = (state = initialState, action = {}) => {
case actionTypes.CREATING_REG_FAILED:
case actionTypes.NEW_REG:
case actionTypes.REG_DELETED:
- case actionTypes.SETTED_VIA_PROPERTY:
+ case actionTypes.VIA_PROPERTY_SET:
case actionTypes.CONFIGURED_GATEWAY:
case actionTypes.DELETING_REG_FAILED:
case actionTypes.UPDATED_REG_INFO:
@@ -102,6 +102,10 @@ const connectionReducer = (state = initialState, action = {}) => {
case actionTypes.CREATING_CREDENTIAL:
case actionTypes.DELETING_SECRET:
case actionTypes.DELETING_CREDENTIAL:
+ case actionTypes.UPDATING_CRED_SECRETS:
+ case actionTypes.CHANGING_CRED_SECRETS:
+ case actionTypes.UPDATING_CRED_INFO:
+ case actionTypes.CHANGING_CRED_ENABLED:
return state.updateIn(["fetchInProgress", "credentials", "byId"], ids => {
const alreadyFetching = ids.some(id => id === action.authId);
if (alreadyFetching) {
@@ -118,6 +122,12 @@ const connectionReducer = (state = initialState, action = {}) => {
case actionTypes.DELETING_SECRET_FAILED:
case actionTypes.CREDENTIAL_DELETED:
case actionTypes.DELETING_CREDENTIAL_FAILED:
+ case actionTypes.DELETING_CRED_INFO_FAILED:
+ case actionTypes.DELETING_CRED_SECRETS_FAILED:
+ case actionTypes.UPDATED_CRED_INFO:
+ case actionTypes.CHANGED_CRED_ENABLED:
+ case actionTypes.UPDATED_CRED_SECRETS:
+ case actionTypes.CHANGED_CRED_SECRETS:
return state.updateIn(["fetchInProgress", "credentials", "byId"], ids => {
const credIndex = ids.findIndex(id => id === action.authId);
if (credIndex === -1) {
diff --git a/developer-ui-frontend/src/reducers/CredentialsReducer.js b/developer-ui-frontend/src/reducers/CredentialsReducer.js
index 1cc6958..c7f0035 100644
--- a/developer-ui-frontend/src/reducers/CredentialsReducer.js
+++ b/developer-ui-frontend/src/reducers/CredentialsReducer.js
@@ -7,11 +7,11 @@ import {
NEW_SECRET,
INIT_EMPTY_CREDENTIAL,
SECRET_DELETED,
+ UPDATED_CRED_INFO,
+ UPDATED_CRED_SECRETS,
CREDENTIAL_DELETED,
CREDENTIALS_FETCHED,
- UPDATED_CRED_INFO
-} from "actions/actionTypes";
-import { calculateSecretId } from "utils";
+ ENABLED_CRED_CHANGED} from "actions/actionTypes";
export const initialState = fromJS({
byId: {},
@@ -19,122 +19,102 @@ export const initialState = fromJS({
secrets: { byId: {}, allIds: [] }
});
+const handleNewSecret = (state, action) => {
+ const newSecretId = action.secret.secretId;
+ return state.withMutations(reducedState =>
+ reducedState
+ .updateIn(["byId", action.authId, "secrets"], ids =>
+ ids.push(newSecretId)
+ )
+ .updateIn(["secrets", "allIds"], ids => ids.push(newSecretId))
+ .setIn(["secrets", "byId", newSecretId], fromJS(action.secret))
+ );
+};
+
const credentialsReducer = (state = initialState, action = {}) => {
switch (action.type) {
// CREDENTIALS_FETCHED means Credentials for a specific device-id are fetched
case CREDENTIALS_FETCHED: {
- // Loop over the payload and transfer each credential to the store format (defined in initialState)
- // Update every credential (even those with auth ids that already exist in the store (the payload could be different))
- const newCredentials = state.toJS();
- action.data.credentials.forEach(cred => {
- const { secrets, ...credWithoutSecrets } = cred;
- const authId = cred["auth-id"];
- const credInStore = {
- ...credWithoutSecrets,
- secrets: []
- };
- // (1) Delete every secret associated with that auth-id and (2) adopt the secrets from the API response
- if (newCredentials.byId[authId]) {
- newCredentials.byId[authId].secrets.forEach(secretId => {
- delete newCredentials.secrets.byId[secretId];
- newCredentials.secrets.allIds.splice(
- newCredentials.secrets.allIds.findIndex(id => id === secretId),
- 1
- );
- });
- }
- secrets.forEach(secret => {
- // (2)
- const secretId = secret.secretId
- ? secret.secretId
- : calculateSecretId(secret, authId);
- const secretInStore = { secretId, ...secret };
- newCredentials.secrets.allIds.push(secretId);
- credInStore.secrets.push(secretId);
- newCredentials.secrets.byId[secretId] = secretInStore;
+ if (
+ action.data.entities &&
+ action.data.entities.credentials &&
+ action.data.entities.secrets &&
+ action.data.result &&
+ action.data.result.credentials
+ ) {
+ const newCredentials = fromJS({
+ byId: action.data.entities.credentials,
+ allIds: action.data.result.credentials,
+ secrets: {
+ byId: action.data.entities.secrets,
+ allIds: Object.keys(action.data.entities.secrets)
+ }
});
- // Either updates the credential or saves a new credential
- newCredentials.byId[authId] = credInStore;
- if (!newCredentials.allIds.some(id => id === authId)) {
- newCredentials.allIds.push(authId);
- }
- });
- // Finally check if there are less credentials in the payload than stored for that device
- // Which would mean the credential got deleted by another application in the meantime
- action.prevAuthIds.forEach(credId => {
- const stillAvailable = action.data.credentials.some(
- cred => cred["auth-id"] === credId
- );
- if (!stillAvailable) {
- // Cleanup: Delete all associated secrets and the credential
- const associatedSecretIds = newCredentials.byId[credId].secrets;
- associatedSecretIds.forEach(secretId => {
- delete newCredentials.secrets.byId[secretId];
- newCredentials.secrets.allIds.splice(
- newCredentials.secrets.allIds.findIndex(id => id === secretId),
- 1
- );
- });
- delete newCredentials.byId[credId];
- newCredentials.allIds.splice(
- newCredentials.allIds.findIndex(id => id === credId),
- 1
- );
- }
- });
- return fromJS(newCredentials);
+ return newCredentials;
+ }
+ return state;
}
- case NEW_CREDENTIAL:
+ case NEW_CREDENTIAL: {
+ const newAuthId = action.credential["auth-id"];
+ // secrets are handled by handleNewSecret -> Reset secrets to [] for
+ // credential specific handling
+ const { secrets, ...credentialWithoutSecrets } = action.credential;
+ credentialWithoutSecrets.secrets = [];
return state.withMutations(reducedState => {
const newState = reducedState
.update(
"allIds",
ids =>
- reducedState.getIn(["byId", action.authId])
+ reducedState.getIn(["byId", newAuthId])
? ids
- : ids.push(action.authId)
+ : ids.push(newAuthId)
)
.setIn(
- ["byId", action.authId],
+ ["byId", newAuthId],
fromJS({
- "device-id": action.deviceId,
enabled: true,
- ...action.newCredential
+ ...credentialWithoutSecrets
})
)
.updateIn(
- ["byId", action.authId],
+ ["byId", newAuthId],
cred =>
cred.get("firstInitTime") ? cred.delete("firstInitTime") : cred
- );
+ )
+ .update(stateWithNewCreds => {
+ Object.keys(action.secrets).forEach(secret => {
+ stateWithNewCreds = handleNewSecret(stateWithNewCreds, {
+ authId: action.authId,
+ secret: { ...action.secrets[secret] }
+ });
+ });
+ });
return newState;
});
- case INIT_EMPTY_CREDENTIAL:
+ }
+ case INIT_EMPTY_CREDENTIAL: {
+ const newAuthId = action.credential["auth-id"];
return state.withMutations(reducedState =>
- reducedState.update("allIds", ids => ids.push(action.authId)).setIn(
- ["byId", action.authId],
+ reducedState.update("allIds", ids => ids.push(newAuthId)).setIn(
+ ["byId", newAuthId],
fromJS({
- ...action.newCredential,
+ ...action.credential,
firstInitTime: new Date().getTime()
})
)
);
+ }
+
case UPDATED_CRED_INFO:
return state.withMutations(reducedState =>
reducedState
.setIn(["byId", action.authId, "enabled"], action.enabled)
.setIn(["byId", action.authId, "credentialInfo"], fromJS(action.data))
);
+ case UPDATED_CRED_SECRETS:
+ return state.setIn(["secrets", "allIds"], fromJS(action.newSecrets));
case NEW_SECRET:
- const newSecretId = action.secret.secretId;
- return state.withMutations(reducedState =>
- reducedState
- .updateIn(["secrets", "allIds"], ids => ids.push(newSecretId))
- .setIn(["secrets", "byId", newSecretId], fromJS(action.secret))
- .updateIn(["byId", action.authId, "secrets"], ids =>
- ids.push(newSecretId)
- )
- );
+ return handleNewSecret(state, action);
case SECRET_DELETED:
return state.withMutations(reducedState =>
reducedState
@@ -146,14 +126,40 @@ const credentialsReducer = (state = initialState, action = {}) => {
ids.filter(id => id !== action.secretId)
)
);
+ case ENABLED_CRED_CHANGED:
+ return state.setIn(["byId", action.authId, "enabled"], action.enabled);
case CREDENTIAL_DELETED:
- return state.withMutations(reducedState =>
- reducedState
- .deleteIn(["byId", action.authId])
- .update("allIds", authIds =>
- authIds.filter(id => id !== action.authId)
- )
- );
+ // A Credential may not be loaded in the UI at the time it is deleted
+ // e.g. through "cascading delete" on its registration. This means, changes
+ // to the local app state are only needed if the credential is loaded
+ if (state.getIn(["byId", action.authId])) {
+ const deletedSecretIds = state.getIn([
+ "byId",
+ action.authId,
+ "secrets"
+ ]);
+ return state.withMutations(reducedState =>
+ reducedState
+ .deleteIn(["byId", action.authId])
+ .update("allIds", authIds =>
+ authIds.filter(id => id !== action.authId)
+ )
+ .updateIn(["secrets", "byId"], secrets => {
+ let reducedSecrets = secrets;
+ deletedSecretIds.forEach(id => {
+ reducedSecrets = reducedSecrets.delete(id);
+ });
+ return reducedSecrets;
+ })
+ .updateIn(["secrets", "allIds"], secretIds => {
+ const reducedIds = secretIds.filter(
+ id => deletedSecretIds.indexOf(id) === -1
+ );
+ return reducedIds;
+ })
+ );
+ }
+ return state;
default:
return state;
}
diff --git a/developer-ui-frontend/src/reducers/DevicesReducer.js b/developer-ui-frontend/src/reducers/DevicesReducer.js
index 0937a00..abd5d9e 100644
--- a/developer-ui-frontend/src/reducers/DevicesReducer.js
+++ b/developer-ui-frontend/src/reducers/DevicesReducer.js
@@ -3,32 +3,45 @@
*/
import { fromJS } from "immutable";
import { calculateLogId, extractDeviceIdFromLog } from "utils";
-import { hubDevPresetRegistrations } from "__mocks__/storeMocks/deviceMocks";
-import {
- NEW_LOG,
- REMOVE_OLDEST_LOG,
- NEW_SUB,
- SUB_DELETED,
- DELETING_SUB,
- ADDING_SUB,
- EVENTBUS_DISCONNECTED,
- NEW_REG,
- CONFIGURED_GATEWAY,
- REGISTRATIONS_FETCHED,
- REG_DELETED,
- NEW_CREDENTIAL,
- REMOVE_ALL_LOGS,
- UPDATED_REG_INFO,
- INIT_EMPTY_CREDENTIAL,
- CREDENTIAL_DELETED,
- CREDENTIALS_FETCHED
-} from "actions/actionTypes";
+import * as actionTypes from "actions/actionTypes"; // Too many types for destructuring -> Create a namespace
+
+const createRegistration = issuer => {
+ const emptyReg = {
+ lastActive: null,
+ currentlyActive: false,
+ isSubscribed: false,
+ logs: [],
+ credentials: []
+ };
+ switch (issuer) {
+ case "fromApi":
+ return (deviceId, registrationInfo) =>
+ fromJS(
+ Object.assign(emptyReg, {
+ deviceId,
+ configuredSubscribed: false,
+ registrationInfo
+ })
+ );
+ case "fromUi":
+ return (deviceId, configuredSubscribed) =>
+ fromJS(
+ Object.assign(emptyReg, {
+ deviceId,
+ configuredSubscribed,
+ registrationInfo: { enabled: true }
+ })
+ );
+ default:
+ return new Error("Unknown issuer for createRegistration.");
+ }
+};
export const initialState = fromJS({ byId: {}, allIds: [] });
const devicesReducer = (state = initialState, action = {}) => {
switch (action.type) {
- case NEW_LOG:
+ case actionTypes.NEW_LOG:
const logId = calculateLogId(action.message);
const deviceId = JSON.parse(action.message.body).deviceId;
const time = action.message.timestamp;
@@ -40,12 +53,12 @@ const devicesReducer = (state = initialState, action = {}) => {
.setIn(["byId", deviceId, "lastActive"], time)
.setIn(["byId", deviceId, "currentlyActive"], true);
});
- case REMOVE_OLDEST_LOG:
+ case actionTypes.REMOVE_OLDEST_LOG:
const oldestDeviceId = extractDeviceIdFromLog(action.id);
return state.updateIn(["byId", oldestDeviceId, "logs"], loggings =>
loggings.filter(currId => currId !== action.id)
);
- case REMOVE_ALL_LOGS:
+ case actionTypes.REMOVE_ALL_LOGS:
return state.withMutations(reducedState => {
let newState = reducedState;
newState.get("allIds").forEach(id => {
@@ -55,21 +68,21 @@ const devicesReducer = (state = initialState, action = {}) => {
});
return newState;
});
- case DELETING_SUB:
+ case actionTypes.DELETING_SUB:
return state.setIn(
["byId", action.deviceId, "configuredSubscribed"],
false
);
- case SUB_DELETED:
+ case actionTypes.SUB_DELETED:
return state.setIn(["byId", action.deviceId, "isSubscribed"], false);
- case ADDING_SUB:
+ case actionTypes.ADDING_SUB:
return state.setIn(
["byId", action.deviceId, "configuredSubscribed"],
true
);
- case NEW_SUB:
+ case actionTypes.NEW_SUB:
return state.setIn(["byId", action.deviceId, "isSubscribed"], true);
- case EVENTBUS_DISCONNECTED:
+ case actionTypes.EVENTBUS_DISCONNECTED:
return state.withMutations(reducedState => {
let newState = reducedState;
newState.get("allIds").forEach(id => {
@@ -81,69 +94,78 @@ const devicesReducer = (state = initialState, action = {}) => {
});
return newState;
});
- case REGISTRATIONS_FETCHED: {
- let reduced = state;
- const fetchedRegistrations = fromJS(action.registrations);
- const newAllIds = fromJS(Object.keys(action.registrations));
- newAllIds.forEach(id => {
- // Check if the device is already in the store (e.g. because of localStorage persistence)
- if (state.getIn(["byId", id])) {
- // If so, update just the registrationInfo
- reduced = reduced.setIn(
- ["byId", id, "registrationInfo"],
- fetchedRegistrations.getIn([id, "registrationInfo"])
- );
- } else {
- reduced = reduced.setIn(["byId", id], fetchedRegistrations.get(id));
- }
- });
- // Delete all devices that are persisted but not fetched
- if (newAllIds.size < state.get("allIds").size) {
- const outdatedDevices = newAllIds
- .filter(id => !state.get("allIds").includes(id))
- .concat(state.get("allIds").filter(id => !newAllIds.includes(id)));
- outdatedDevices.forEach(id => {
- reduced = reduced.deleteIn(["byId", id]);
- });
+ case actionTypes.REGISTRATIONS_FETCHED: {
+ if (action.data && action.data.result && action.data.entities) {
+ const fetched = fromJS(action.data);
+ const merged = fetched
+ .getIn(["entities", "devices"])
+ .withMutations(fetchedDevices => {
+ fetched.getIn(["result", "devices"]).forEach(fetchedId => {
+ const oldReg = state.getIn(["byId", fetchedId]);
+ if (oldReg) {
+ // In Case of a conflict (e.g. always on the registrationInfo Prop), use the fetched version
+ /* eslint-disable no-unused-vars */
+ fetchedDevices.update(fetchedId, dev =>
+ dev.mergeWith((fetchedProp, oldProp) => fetchedProp, oldReg)
+ );
+ /* eslint-enable no-unused-vars */
+ } else {
+ fetchedDevices.update(fetchedId, dev =>
+ createRegistration("fromApi")(
+ fetchedId,
+ dev.get("registrationInfo").toJS()
+ )
+ );
+ }
+ });
+ });
+ return state
+ .set("byId", merged)
+ .set("allIds", fromJS(action.data.result.devices));
}
- reduced = reduced.set("allIds", newAllIds);
-
- return reduced;
+ return state;
}
- case CREDENTIALS_FETCHED: {
- const fetchedCredentials = action.data.credentials;
- const newAllIds = fromJS(fetchedCredentials.map(cred => cred["auth-id"]));
- return state.setIn(["byId", action.deviceId, "credentials"], newAllIds);
+ case actionTypes.CREDENTIALS_FETCHED: {
+ if (action.data.result && action.data.result.credentials) {
+ return state.setIn(
+ ["byId", action.deviceId, "credentials"],
+ fromJS(action.data.result.credentials)
+ );
+ }
+ return state;
}
- case NEW_REG:
- const newReg = fromJS(action.device);
+ case actionTypes.NEW_REG:
+ const newReg = createRegistration("fromUi")(
+ action.deviceId,
+ action.configuredSubscribed
+ );
return state.withMutations(reducedState =>
reducedState
- .setIn(["byId", action.device.deviceId], newReg)
+ .setIn(["byId", action.deviceId], newReg)
.update("allIds", ids => ids.push(newReg.get("deviceId")).sort())
);
- case CONFIGURED_GATEWAY: {
+ case actionTypes.CONFIGURED_GATEWAY: {
const gatewayProperty = action.info;
return state.setIn(
["byId", action.deviceId, "registrationInfo", "via"],
gatewayProperty.get("via")
);
}
- case REG_DELETED:
+ case actionTypes.REG_DELETED:
return state.withMutations(reducedState =>
reducedState
.deleteIn(["byId", action.deviceId])
.update("allIds", ids => ids.filter(id => id !== action.deviceId))
);
- case UPDATED_REG_INFO:
+ case actionTypes.UPDATED_REG_INFO:
return state.setIn(
["byId", action.deviceId, "registrationInfo"],
fromJS(action.info)
);
- case NEW_CREDENTIAL:
- case INIT_EMPTY_CREDENTIAL:
+ case actionTypes.NEW_CREDENTIAL:
+ case actionTypes.INIT_EMPTY_CREDENTIAL:
const newCredentialDeviceId = action.deviceId;
- const authId = action.authId;
+ const authId = action.credential["auth-id"];
return state.updateIn(
["byId", newCredentialDeviceId, "credentials"],
credentials =>
@@ -151,7 +173,7 @@ const devicesReducer = (state = initialState, action = {}) => {
? credentials
: credentials.push(authId)
);
- case CREDENTIAL_DELETED:
+ case actionTypes.CREDENTIAL_DELETED:
return state.updateIn(["byId", action.deviceId, "credentials"], creds =>
creds.filter(id => id !== action.authId)
);
diff --git a/developer-ui-frontend/src/reducers/NotificationReducer.js b/developer-ui-frontend/src/reducers/NotificationReducer.js
index 0b998a1..11ea288 100644
--- a/developer-ui-frontend/src/reducers/NotificationReducer.js
+++ b/developer-ui-frontend/src/reducers/NotificationReducer.js
@@ -51,7 +51,7 @@ const notificationReducer = (state = initialState, action = {}) => {
case actionTypes.NEW_REG:
return state.withMutations(reducedState =>
reducedState
- .set("message", `${action.device.deviceId} successfully registered`)
+ .set("message", `${action.deviceId} successfully registered`)
.set("level", "success")
);
case actionTypes.CREATING_REG_FAILED:
diff --git a/developer-ui-frontend/src/reducers/__tests__/ConnectionReducer.test.js b/developer-ui-frontend/src/reducers/__tests__/ConnectionReducer.test.js
deleted file mode 100644
index 40f6db6..0000000
--- a/developer-ui-frontend/src/reducers/__tests__/ConnectionReducer.test.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
- */
-import connectionReducer, { initialState } from "../ConnectionReducer";
-import { fromJS } from "immutable";
-import { CONNECT_TO_EVENTBUS } from "actions/actionTypes";
-import {
- exampleConnectedAction,
- exampleDisconnectedAction
-} from "__mocks__/actionMocks";
-import { exampleEventBus } from "__mocks__/storeMocks/stateMocks";
-
-describe("ConnectionReducer", () => {
- it("should have initial state on empty call", () => {
- expect(connectionReducer()).toEqual(initialState);
- });
-
- it("should not change state on unknown action types", () => {
- expect(connectionReducer(undefined, { type: "NOT_EXISTING" })).toEqual(
- initialState
- );
- });
-
- test("> CONNECT_TO_EVENTBUS switches eventBusConnected to false", () => {
- expect(
- connectionReducer(initialState.set("eventBusConnected", true), {
- type: CONNECT_TO_EVENTBUS
- })
- ).toEqual(initialState);
- });
-
- test("> CONNECT_TO_EVENTBUS does not change eventBus when eventBus is already false (initial)", () => {
- expect(
- connectionReducer(initialState, { type: CONNECT_TO_EVENTBUS })
- ).toEqual(initialState);
- });
-
- const expectedConnectionReturn = fromJS({
- eventBus: exampleEventBus,
- eventBusConnected: true,
- hubConnected: false,
- fetchInProgress: {
- tenant: false,
- registrations: {
- global: false,
- byId: []
- },
- credentials: {
- global: false,
- byId: []
- }
- }
- });
-
- test("> EVENTBUS_CONNECTED switches eventBusConnected to true", () => {
- expect(connectionReducer(initialState, exampleConnectedAction)).toEqual(
- expectedConnectionReturn
- );
- });
-
- test("> EVENTBUS_CONNECTED does not change eventBusConnected when connected is already true", () => {
- expect(
- connectionReducer(expectedConnectionReturn, exampleConnectedAction)
- ).toEqual(expectedConnectionReturn);
- });
-
- const expectedDisconnectReturn = fromJS({
- eventBus: exampleEventBus,
- eventBusConnected: false,
- hubConnected: false,
- fetchInProgress: {
- tenant: false,
- registrations: {
- global: false,
- byId: []
- },
- credentials: {
- global: false,
- byId: []
- }
- }
- });
-
- test("> EVENTBUS_DISCONNECTED switches eventBusConnected to false", () => {
- expect(
- connectionReducer(
- initialState.set("eventBusConnected", true),
- exampleDisconnectedAction
- )
- ).toEqual(expectedDisconnectReturn);
- });
-
- test("> EVENTBUS_DISCONNECTED does not change eventBusConnected when connected is already false", () => {
- expect(
- connectionReducer(expectedDisconnectReturn, exampleDisconnectedAction)
- ).toEqual(expectedDisconnectReturn);
- });
-});
diff --git a/developer-ui-frontend/src/reducers/__tests__/CredentialsReducer.test.js b/developer-ui-frontend/src/reducers/__tests__/CredentialsReducer.test.js
deleted file mode 100644
index a12cc2f..0000000
--- a/developer-ui-frontend/src/reducers/__tests__/CredentialsReducer.test.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
- */
-import credentialsReducer, { initialState } from "../CredentialsReducer";
-import {
- exampleCredentialsFetchedAction,
- exampleCredentialsFetchedAction2,
- exampleCredentialsFetchedAction3,
- exampleNewCredentialAction
-} from "__mocks__/actionMocks";
-import {
- credentialsAfterFirstGet,
- credentialsAfterDeletedCred,
- credentialsAfterNewCred
-} from "__mocks__/storeMocks/credentialMocks";
-
-describe("CredentialsReducer", () => {
- it("should have initial state on empty call", () => {
- expect(credentialsReducer()).toEqual(initialState);
- });
-
- it("should not change state on unknown action types", () => {
- expect(credentialsReducer(undefined, { type: "NOT_EXISTING" })).toEqual(
- initialState
- );
- });
-
- test('> CREDENTIALS_FETCHED with "empty store" (no credentials yet) saves every credential', () => {
- expect(
- credentialsReducer(initialState, exampleCredentialsFetchedAction)
- ).toEqual(credentialsAfterFirstGet);
- });
-
- test("> CREDENTIALS_FETCHED with nothing new doesn't change state", () => {
- expect(
- credentialsReducer(
- credentialsAfterFirstGet,
- exampleCredentialsFetchedAction2
- )
- ).toEqual(credentialsAfterFirstGet);
- });
-
- test("> CREDENTIALS_FETCHED with less credentials than saved deletes missing credentials", () => {
- expect(
- credentialsReducer(
- credentialsAfterFirstGet,
- exampleCredentialsFetchedAction3
- )
- ).toEqual(credentialsAfterDeletedCred);
- });
-
- test("> NEW_CREDENTIAL should add the new auth-id to credentials->allIds", () => {
- expect(
- credentialsReducer(initialState, exampleNewCredentialAction).get("allIds")
- ).toEqual(credentialsAfterNewCred.get("allIds"));
- });
-
- test("> NEW_CREDENTIAL should add the credential to credentials->byId", () => {
- expect(
- credentialsReducer(initialState, exampleNewCredentialAction).get("byId")
- ).toEqual(credentialsAfterNewCred.get("byId"));
- });
-});
diff --git a/developer-ui-frontend/src/reducers/__tests__/DevicesReducer.test.js b/developer-ui-frontend/src/reducers/__tests__/DevicesReducer.test.js
deleted file mode 100644
index 324c1db..0000000
--- a/developer-ui-frontend/src/reducers/__tests__/DevicesReducer.test.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
- */
-import { fromJS } from "immutable";
-import { calculateLogId } from "utils";
-import devicesReducer, { initialState } from "../DevicesReducer"; // initialState is already an Immutable Map
-import {
- exampleNewLogAction,
- exampleRemoveOldestLogAction,
- exampleDeleteSubAction,
- exampleAddSubAction,
- exampleDeletingSubAction,
- exampleAddingSubAction
-} from "__mocks__/actionMocks";
-import {
- exampleShortMessageInStore,
- exampleLongMessageInStore
-} from "__mocks__/storeMocks/messageMocks";
-import {
- hubDevPresetRegistrations as exampleInitialState,
- createExampleSubWOLogs,
- createExampleReg
-} from "__mocks__/storeMocks/deviceMocks";
-
-describe("DevicesReducer", () => {
- it("should have initial state on empty call", () => {
- expect(devicesReducer()).toEqual(initialState);
- });
-
- it("should not change state on unknown action types", () => {
- expect(devicesReducer(undefined, { type: "NOT_EXISTING" })).toEqual(
- initialState
- );
- });
-
- test("> NEW_LOG should push a new logId to the logs array of the corresponding device", () => {
- const initialStateWithSub = exampleInitialState.setIn(
- ["byId", "4746", "isSubscribed"],
- true
- );
- const expectedLogsReturn = fromJS([
- calculateLogId(exampleNewLogAction.message)
- ]);
- const result = devicesReducer(initialStateWithSub, exampleNewLogAction);
- expect(result.getIn(["byId", "4746", "logs"])).toEqual(expectedLogsReturn);
- });
-
- test("> NEW_LOG should make the corresponding subscribed device currentlyActive", () => {
- const result = devicesReducer(exampleInitialState, exampleNewLogAction);
- expect(result.getIn(["byId", "4746", "currentlyActive"])).toBeTruthy();
- });
-
- test("> REMOVE_OLDEST_LOG should delete the the corresponding logId from the logs array of the corresponding device", () => {
- const initialStateWithSubsAndLogs = exampleInitialState
- .setIn(["byId", "4746", "isSubscribed"], true)
- .setIn(["byId", "HubTester", "isSubscribed"], true)
- .setIn(["byId", "4746", "logs"], fromJS([exampleShortMessageInStore.id]))
- .setIn(
- ["byId", "HubTester", "logs"],
- fromJS([exampleLongMessageInStore.id])
- );
-
- const result = devicesReducer(
- initialStateWithSubsAndLogs,
- exampleRemoveOldestLogAction // Should remove the log from 4746 (deviceId of exampleShortMessage)
- );
- expect(result.getIn(["byId", "4746", "logs"]).size).toEqual(0);
- });
-
- const initialStateWithSubs = fromJS({
- byId: {
- 0: createExampleReg("0"),
- 1: createExampleSubWOLogs("1"),
- 2: createExampleSubWOLogs("2")
- },
- allIds: ["0", "1", "2"]
- });
-
- test("> DELETING_SUB should set configuredSubscribed in the device with the corresponding id to false", () => {
- const result = devicesReducer(
- initialStateWithSubs,
- exampleDeletingSubAction
- );
- expect(result.getIn(["byId", "1", "configuredSubscribed"])).toBeFalsy();
- });
-
- test("> SUB_DELETED should set isSubscribed in the device with the corresponding id to false", () => {
- const result = devicesReducer(
- initialStateWithSubs,
- exampleDeleteSubAction // Should delete sub with deviceId '1'
- );
- expect(result.getIn(["byId", "1", "isSubscribed"])).toBeFalsy();
- });
-
- test("> ADDING_SUB should set configuredSubscribed in the device with the corresponding id to true", () => {
- const result = devicesReducer(initialStateWithSubs, exampleAddingSubAction);
- expect(result.getIn(["byId", "0", "configuredSubscribed"])).toBeTruthy();
- });
-
- test("> NEW_SUB should set isSubscribed in the device with the corresponding id to true", () => {
- const result = devicesReducer(initialStateWithSubs, exampleAddSubAction); // Should add sub with deviceId '0'
- expect(result.getIn(["byId", "0", "isSubscribed"])).toBeTruthy();
- });
-});
diff --git a/developer-ui-frontend/src/reducers/__tests__/FilterReducer.test.js b/developer-ui-frontend/src/reducers/__tests__/FilterReducer.test.js
deleted file mode 100644
index 6a889df..0000000
--- a/developer-ui-frontend/src/reducers/__tests__/FilterReducer.test.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
- */
-import filterReducer, { initialState } from '../FilterReducer';
-import {
- exampleNewFilterActionType,
- exampleNewFilterActionDevice,
- exampleNewFilterActionContent,
- exampleRemoveFilterActionDevice,
- exampleRemoveFilterActionContent
-} from '__mocks__/actionMocks';
-import {
- exampleTypeFilterInStore,
- exampleDeviceFilterInStore,
- exampleContentFilterInStore
-} from '__mocks__/storeMocks/filterMocks';
-import { fromJS } from 'immutable';
-
-describe('FilterReducer', () => {
- const exampleContentFilterId = exampleContentFilterInStore.get('id');
- const exampleDeviceFilterId = exampleDeviceFilterInStore.get('id');
- const initialStateWithContentFilter = initialState
- .set(
- 'byId',
- fromJS({ [exampleContentFilterId]: exampleContentFilterInStore })
- )
- .set('allIds', fromJS([exampleContentFilterId]));
- const initialStateWithDeviceFilter = initialState
- .set(
- 'byId',
- fromJS({ [exampleDeviceFilterId]: exampleDeviceFilterInStore })
- )
- .set('allIds', fromJS([exampleDeviceFilterId]));
-
- it('should have initial state on empty call', () => {
- expect(filterReducer()).toEqual(initialState);
- });
-
- it('should not change state on unknown action types', () => {
- expect(filterReducer(undefined, { type: 'NOT_EXISTING' })).toEqual(
- initialState
- );
- });
-
- test('> NEW_FILTER should add a filter object with type and value properties to filters in byId', () => {
- expect(
- filterReducer(initialState, exampleNewFilterActionType).get('byId')
- ).toEqual(
- fromJS({ [exampleTypeFilterInStore.get('id')]: exampleTypeFilterInStore })
- );
- });
-
- test('> NEW_FILTER should add a filterId to filters in allIds', () => {
- expect(
- filterReducer(initialState, exampleNewFilterActionType).get('allIds')
- ).toEqual(fromJS([exampleTypeFilterInStore.get('id')]));
- });
-
- test('> NEW_FILTER should not add an already existing filter', () => {
- expect(
- filterReducer(
- initialStateWithContentFilter,
- exampleNewFilterActionContent
- )
- ).toEqual(initialStateWithContentFilter);
- });
-
- test('> REMOVE_FILTER should remove the given filterId entry from allIds', () => {
- const expectedReturn = fromJS([]); // Last filter gets removed
- console.log('before: ', initialStateWithContentFilter.toJS());
- console.log(
- 'after: ',
- filterReducer(
- initialStateWithContentFilter,
- exampleRemoveFilterActionContent
- )
- );
- expect(
- filterReducer(
- initialStateWithContentFilter,
- exampleRemoveFilterActionContent
- ).get('allIds')
- ).toEqual(expectedReturn);
- });
-
- test('> REMOVE_FILTER should remove the corresponding filter entry from byId', () => {
- const expectedReturn = fromJS({}); // Last filter gets removed
- expect(
- filterReducer(
- initialStateWithDeviceFilter,
- exampleRemoveFilterActionDevice
- ).get('byId')
- ).toEqual(expectedReturn);
- });
-});
diff --git a/developer-ui-frontend/src/reducers/__tests__/LogMemoryCalculationReducer.test.js b/developer-ui-frontend/src/reducers/__tests__/LogMemoryCalculationReducer.test.js
deleted file mode 100644
index 6334213..0000000
--- a/developer-ui-frontend/src/reducers/__tests__/LogMemoryCalculationReducer.test.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
- */
-import logMemoryCalculation, {
- calculateAverageLogSize,
- roughSizeOfObject,
- initialSettings as initialState
-} from "../LogMemoryCalculationReducer";
-import { exampleCalculateLogMemoryAction } from "__mocks__/actionMocks";
-import {
- exampleLongMessageInStore,
- exampleShortMessageInStore
-} from "__mocks__/storeMocks/messageMocks";
-import { AVERAGE_MEMCALC_INTERVAL } from "_APP_CONSTANTS";
-import { fromJS } from "immutable";
-
-const createExampleLogs = callCount => {
- let exampleAllLogs = [];
- if (callCount <= 0) {
- throw new Error("callCount argument must be at least 1");
- } else {
- for (let i = 0; i < (callCount - 1) * AVERAGE_MEMCALC_INTERVAL; i++) {
- const newLog =
- Math.random() < 0.5
- ? exampleLongMessageInStore
- : exampleShortMessageInStore;
- exampleAllLogs.push(newLog);
- }
- exampleAllLogs = fromJS(exampleAllLogs);
- return exampleAllLogs;
- }
-};
-
-describe("LogMemoryCalculationReducer", () => {
- // allLogs property gets passed through the thunk handleNewLog
- test("> CALCULATE_LOG_MEMORY should calculate the averageSizeOfLog by doing a rough average calculation: only one log", () => {
- // roughSizeOfObject(exampleShortMessageInStore) === 82 -> only log -> expect 82 (Byte)
- expect(
- logMemoryCalculation(initialState, exampleCalculateLogMemoryAction).get(
- "averageSizeOfLog"
- )
- ).toEqual(126);
- });
-
- test("> CALCULATE_LOG_MEMORY should cause rough calculations on every second log", () => {
- /* The CALCULATE_LOG_MEMORY action is fired on every AVERAGE_MEMCALC_INTERVAL log. To simulate the second calculation
- (first is on the first log), we need to pass a log list of AVERAGE_MEMCALC_INTERVAL length. */
- const exampleLogs = createExampleLogs(2);
- const mockFn = jest.fn();
- // The implementation is not so expensive, mock functionality is just used for counting the calls.
- mockFn.mockImplementation(roughSizeOfObject);
- calculateAverageLogSize(
- initialState.set("memCalcCounter", 1), // Simulate the second calculation
- exampleLogs,
- mockFn
- );
- // 5 Logs in the list -> Calculate on every second -> 3 calculation calls are expected (first, third and fifth log)
- expect(mockFn.mock.calls.length).toEqual(3);
- });
-
- test("> CALCULATE_LOG_MEMORY should continue from the last used index at the last calculation in all logs", () => {
- // Third call starts the new average calculation at AVERAGE_MEMCALC_INTERVAL and ends at 2*AVERAGE_MEMCALC_INTERVAL
- const exampleLogs = createExampleLogs(3);
- const mockFn = jest.fn();
- mockFn.mockImplementation(roughSizeOfObject);
- calculateAverageLogSize(
- initialState.set("memCalcCounter", 2), // Simulate the third calculation
- exampleLogs,
- mockFn
- );
- /* 10 Logs in the list -> Calculate on every second beginning at index 6 -> still 3 calculation calls are expected
- (sixth, eighth and tenth log) */
- expect(mockFn.mock.calls.length).toEqual(3);
- });
-});
diff --git a/developer-ui-frontend/src/reducers/__tests__/LogsReducer.test.js b/developer-ui-frontend/src/reducers/__tests__/LogsReducer.test.js
deleted file mode 100644
index 39ff5c2..0000000
--- a/developer-ui-frontend/src/reducers/__tests__/LogsReducer.test.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
- */
-import logsReducer, { initialState } from "../LogsReducer"; // initialState is already an Immutable Map
-import {
- exampleNewLogAction,
- exampleRemoveOldestLogAction
-} from "__mocks__/actionMocks";
-import { exampleState } from "__mocks__/storeMocks/stateMocks";
-import { calculateLogId } from "utils";
-
-describe("LogsReducer", () => {
- test("> NEW_LOG should parse the message to a format with id, time and message properties", () => {
- const result = logsReducer(initialState, exampleNewLogAction);
- const expectedLogId = calculateLogId(exampleNewLogAction.message);
- const generatedLogObject = result.getIn(["byId", expectedLogId]).toJS();
- expect(generatedLogObject).toHaveProperty("id", expectedLogId);
- expect(generatedLogObject).toHaveProperty("time");
- expect(generatedLogObject).toHaveProperty("message");
- });
- test("> NEW_LOG should parse the message itself to a format with type, deviceId, contentType, content and applicationProperties properties", () => {
- const result = logsReducer(initialState, exampleNewLogAction);
- const expectedLogId = calculateLogId(exampleNewLogAction.message);
- const parsedMessage = result
- .getIn(["byId", expectedLogId, "message"])
- .toJS();
- expect(parsedMessage).toHaveProperty("type");
- expect(parsedMessage).toHaveProperty("deviceId");
- expect(parsedMessage).toHaveProperty("contentType");
- expect(parsedMessage).toHaveProperty("content");
- expect(parsedMessage).toHaveProperty("applicationProperties");
- });
- test("> NEW_LOG should add the parsed and formatted message to byId and the log's id to allIds", () => {
- const result = logsReducer(initialState, exampleNewLogAction);
- const expectedLogId = calculateLogId(exampleNewLogAction.message);
- expect(result.getIn(["allIds", 0])).toEqual(expectedLogId);
- });
- const initialStateWithLogs = exampleState.get("logs");
- test("> REMOVE_OLDEST_LOG should delete an id in allIds", () => {
- const initialAllLogsLength = initialStateWithLogs.get("allIds").size;
- const result = logsReducer(
- initialStateWithLogs,
- exampleRemoveOldestLogAction
- );
- expect(result.get("allIds").size).toEqual(initialAllLogsLength - 1);
- });
- test("> REMOVE_OLDEST_LOG should delete the first id in allIds", () => {
- const initiallySecondLogId = initialStateWithLogs.getIn(["allIds", 1]);
- // Second log id should get first log id
- const result = logsReducer(
- initialStateWithLogs,
- exampleRemoveOldestLogAction
- );
- expect(result.getIn(["allIds", 0])).toEqual(initiallySecondLogId);
- });
- test("> REMOVE_OLDEST_LOG should delete the corresponding log object in byId", () => {
- const result = logsReducer(
- initialStateWithLogs,
- exampleRemoveOldestLogAction
- );
- expect(
- result.getIn(["byId", exampleRemoveOldestLogAction.id])
- ).toBeUndefined();
- });
- test("> REMOVE_OLDEST_LOG should use the log with the lowest timestamp i.e. this should always be first in allIds", () => {
- const oldestId = initialStateWithLogs
- .get("byId")
- // Take the value of each key and push to an array
- .toArray()
- // find log with minimum timestamp
- .reduce((curr, acc) => (curr.get("time") < acc.get("time") ? curr : acc))
- // get the logs id
- .get("id");
- expect(initialStateWithLogs.getIn(["allIds", 0])).toEqual(oldestId);
- });
-});
diff --git a/developer-ui-frontend/src/reducers/__tests__/SettingsReducer.test.js b/developer-ui-frontend/src/reducers/__tests__/SettingsReducer.test.js
deleted file mode 100644
index 69e888a..0000000
--- a/developer-ui-frontend/src/reducers/__tests__/SettingsReducer.test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2018 Bosch Software Innovations GmbH ("Bosch SI"). All rights reserved.
- */
-import settingsReducer, { initialState } from '../SettingsReducer'; // initialState is already an Immutable Map
-import { exampleChangeSortingAction } from '__mocks__/actionMocks';
-
-describe('SettingsReducer', () => {
- test('> CHANGE_SORTING should change to ascending if category is same as action.category', () => {
- const initialStateSorted = initialState.setIn(
- ['logsSorting', 'category'],
- 'Device Id'
- );
- // exampleChangeSortingAction has category 'Device Id'
- const result = settingsReducer(
- initialStateSorted,
- exampleChangeSortingAction
- );
- expect(result.getIn(['logsSorting', 'ascending'])).toBeTruthy();
- });
- test('> CHANGE_SORTING should keep descending order if category is not same as action.category', () => {
- const initialStateSorted = initialState.setIn(
- ['logsSorting', 'category'],
- 'Type'
- );
- // exampleChangeSortingAction has category 'Device Id'
- const result = settingsReducer(
- initialStateSorted,
- exampleChangeSortingAction
- );
- expect(result.getIn(['logsSorting', 'ascending'])).toBeFalsy();
- });
- test("> CHANGE_SORTING should change to 'unsorted' if category is same as action.category and order is already ascending", () => {
- const initialStateSortedAscending = initialState.withMutations(state =>
- state
- .setIn(['logsSorting', 'category'], 'Device Id')
- .setIn(['logsSorting', 'ascending'], true)
- );
- // exampleChangeSortingAction has category 'Device Id'
- const result = settingsReducer(
- initialStateSortedAscending,
- exampleChangeSortingAction
- );
- expect(result.getIn(['logsSorting', 'category'])).toEqual('unsorted');
- });
-});
diff --git a/developer-ui-frontend/src/reducers/selectors/DevicesSelectors.js b/developer-ui-frontend/src/reducers/selectors/DevicesSelectors.js
index 573793b..4bc1ad4 100644
--- a/developer-ui-frontend/src/reducers/selectors/DevicesSelectors.js
+++ b/developer-ui-frontend/src/reducers/selectors/DevicesSelectors.js
@@ -61,6 +61,7 @@ export const selectPendingUnsubscribes = state => {
};
export const selectNumberOfPendingUnsubscribes = state =>
selectPendingUnsubscribes(state).size;
+export const selectAllDeviceIds = state => state.get("allIds");
export const selectAllDevices = state =>
state.get("allIds").map(id => state.getIn(["byId", id]));
export const selectNumberOfAllDevices = state => state.get("allIds").size;
diff --git a/developer-ui-frontend/src/reducers/selectors/index.js b/developer-ui-frontend/src/reducers/selectors/index.js
index df9d72b..3829c35 100644
--- a/developer-ui-frontend/src/reducers/selectors/index.js
+++ b/developer-ui-frontend/src/reducers/selectors/index.js
@@ -8,7 +8,7 @@ import * as fromConnection from "./ConnectionSelectors";
import * as fromCredentials from "./CredentialsSelectors";
import { createSelector } from "reselect";
import { checkLog } from "utils";
-import { OrderedMap, fromJS } from "immutable";
+import { denormalizeCredential } from "api/schemas";
// Selector Shortcuts
// Naming:
@@ -49,6 +49,8 @@ export const selectCredentialIdsByDeviceId = (state, id) =>
fromDevices.selectCredentialIdsByDeviceId(state.get("devices"), id);
export const selectRegistrationInfo = (state, id) =>
fromDevices.selectRegistrationInfo(state.get("devices"), id);
+export const selectAllDeviceIds = state =>
+ fromDevices.selectAllDeviceIds(state.get("devices"));
export const selectAllFilters = state =>
fromFilter.selectAllFilters(state.get("filters"));
@@ -108,40 +110,16 @@ export const selectVisibleLogs = createSelector(
[selectAllFilters, selectAllLogs],
(filters, logs) => logs.filter(log => checkLog(log, filters))
);
-// TODO: Reimplement as Reselect Memoized Selector
-export const selectAllCredentialsApiFormat = (state, deviceId) => {
- const credentialIds = selectCredentialIdsByDeviceId(state, deviceId);
- const credentialsFromStore = credentialIds.map(credId =>
- selectCredentialById(state, credId)
- );
- // (1) Add the device-id property, (2) get the correct secrets format and (3) bring it in the correct order
- const allCreds = credentialsFromStore.map(credential => {
- const secretsFromStore = selectSecretsByCredentialId(
- state,
- credential.get("auth-id")
- );
- const unorderedMap = credential.withMutations(cred =>
- cred
- .set("device-id", deviceId) // (1)
- .set(
- "secrets",
- secretsFromStore.map(secret => {
- return secret.delete("secretId");
- }) // (2)
- )
- );
- // (3)
- return OrderedMap({
- "device-id": unorderedMap.get("device-id"),
- type: unorderedMap.get("type"),
- "auth-id": unorderedMap.get("auth-id")
- }).merge(unorderedMap);
- });
- return allCreds;
-};
-export const selectCredentialApiFormat = (state, deviceId, authId) => {
- return selectAllCredentialsApiFormat(state, deviceId).find(
- cred => cred.get("auth-id") === authId
+export const selectDenormalizedCredential = (state, deviceId, authId) =>
+ denormalizeCredential(
+ deviceId,
+ authId,
+ state.getIn(["credentials", "byId"]),
+ state.getIn(["credentials", "secrets", "byId"])
);
+
+export const selectDenormalizedCredentials = (state, deviceId) => {
+ const authIds = selectCredentialIdsByDeviceId(state, deviceId);
+ return authIds.map(id => selectDenormalizedCredential(state, deviceId, id));
};
diff --git a/developer-ui-frontend/src/styles/app.scss b/developer-ui-frontend/src/styles/app.scss
index 2c65054..cccb79c 100644
--- a/developer-ui-frontend/src/styles/app.scss
+++ b/developer-ui-frontend/src/styles/app.scss
@@ -4,6 +4,7 @@
@import "~pretty-checkbox/src/pretty-checkbox.scss";
html {
+ overflow: hidden;
font-size: 62.5%; // For rem units support (62.5% of 16px = 10px -> easier calculations)
font-smoothing: antialiased;
-webkit-font-smoothing: antialiased;
@@ -64,8 +65,6 @@ body {
letter-spacing: 0.01rem;
color: $primary_font_color;
background-color: #f5f5f5;
- overflow-x: hidden;
- overflow-y: auto;
background-image: url("https://s3.eu-central-1.amazonaws.com/developer-ui.bosch-iot-hub.com/assets/bosch_supergraphic_top.jpg");
background-position: bottom center;
background-repeat: no-repeat;
diff --git a/developer-ui-frontend/src/styles/credentialModal.scss b/developer-ui-frontend/src/styles/credentialModal.scss
new file mode 100644
index 0000000..8f439fb
--- /dev/null
+++ b/developer-ui-frontend/src/styles/credentialModal.scss
@@ -0,0 +1,302 @@
+@import "_globalVars.scss";
+
+.edit-credential-modal {
+ height: 85vh !important;
+ max-height: 100vh;
+ .secrets-headerIcon {
+ opacity: 0.5;
+ }
+ .edit-credential-modal-body {
+ padding: 0px 6rem;
+ background: rgba(226, 226, 226, 0.45);
+ transform: translateZ(0);
+ }
+
+ .arrow {
+ position: relative;
+ cursor: pointer;
+ fill: rgba(255, 255, 255, 0.8);
+ &.next {
+ transform: rotate(270deg);
+ }
+ &.previous {
+ transform: rotate(90deg);
+ margin-left: -0.8rem;
+ }
+ &.disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+ }
+
+ .removeButtonDisabled {
+ fill: #757575;
+ }
+
+ .secrets-messageRemove {
+ display: inline-flex;
+
+ p {
+ margin: 0 0.5rem 0 0;
+ font-weight: 300;
+ }
+ button {
+ padding-top: 0;
+ padding-bottom: 0;
+ }
+ }
+
+ .secrets-dropdown {
+ padding-left: 1%;
+ width: 100%;
+ margin: 1rem 0;
+ display: flex;
+ align-items: center;
+ label {
+ display: inline-block;
+ color: rgba(0, 0, 0, 0.54);
+ width: 11rem;
+ margin-right: 1rem;
+ font-weight: 600;
+ padding: 0.4rem 0;
+ }
+ }
+
+ .secrets-previousButton {
+ position: relative;
+ top: 77px;
+ float: right;
+ }
+
+ .secrets-nextButton {
+ position: relative;
+ top: 77px;
+ float: right;
+ }
+
+ .enabled-switch {
+ font-size: 1.4rem;
+ }
+
+ .standard-field {
+ width: 100%;
+ margin: 1rem 0;
+ display: flex;
+ align-items: center;
+ height: 2.8rem;
+ flex-wrap: wrap;
+ label {
+ display: inline-block;
+ color: rgba(0, 0, 0, 0.54);
+ width: 11rem;
+ margin-right: 1rem;
+ font-weight: 600;
+ padding: 0.4rem 0;
+ }
+ .field-dropdown {
+ display: inline-block;
+ }
+ }
+
+ .general-info {
+ width: 100%;
+ flex: 1;
+ margin-top: 5%;
+
+ .standard-field {
+ margin: 1rem;
+ }
+ }
+ .secrets-config {
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 1px 2px 0 rgba(0, 0, 0, 0.24);
+ background-color: #fff;
+ position: relative;
+ width: 100%;
+ flex: 2;
+ margin: 5% 0;
+ min-height: 33.6rem;
+
+ form[name="addNewSecret"] {
+ .secret {
+ background-color: #fff !important;
+ }
+ }
+
+ form {
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ background-color: #c2c2c2;
+
+ .secrets-nav-header {
+ display: flex;
+ justify-content: space-between;
+ padding: 1rem;
+ background: #464f53;
+ border: 1px solid #464f53;
+ color: #fff;
+ margin: 0 -1px;
+ z-index: 3;
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19),
+ 0 6px 6px rgba(0, 0, 0, 0.23);
+
+ .secrets-label {
+ display: inline-flex;
+ align-items: center;
+ position: relative;
+ z-index: 2;
+ height: 2.5rem;
+ white-space: nowrap;
+ user-select: none;
+ svg.add-pw-icon {
+ height: 2rem;
+ width: 2rem;
+ margin-right: 1rem;
+ path {
+ fill: rgba(255, 255, 255, 0.8);
+ }
+ }
+ }
+ .cancel-button {
+ background: none;
+ border: none;
+ font-size: 2rem;
+ cursor: pointer;
+ outline: none;
+ color: rgba(255, 255, 255, 0.8);
+ transform: rotate(45deg);
+ }
+ .secrets-buttons {
+ display: inline-flex;
+ position: relative;
+ z-index: 2;
+ svg {
+ height: 2.25rem;
+ width: 2.25rem;
+ cursor: pointer;
+ path {
+ fill: rgba(255, 255, 255, 0.8);
+ }
+ &.secrets-editButton {
+ padding-right: 1.5em;
+ margin-right: 0.5em;
+ border-right: 1px solid rgba(255, 255, 255, 0.3);
+ }
+ &.disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+ }
+ }
+ }
+ .secrets-config-inner {
+ display: flex;
+ position: relative;
+ width: 100%;
+ flex: 1;
+ .secret {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ background-color: #c2c2c2;
+ position: absolute;
+ transition: transform 0.35s cubic-bezier(0, 0, 0.2, 1);
+ width: 100%;
+ height: 100%;
+ .animated-card {
+ height: 100%;
+ background-color: #fff;
+ opacity: 0;
+ box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.24);
+ transition: box-shadow 0.35s cubic-bezier(0, 0, 0.2, 1),
+ opacity 0.35s cubic-bezier(0, 0, 0.2, 1);
+ &.selected {
+ z-index: 1;
+ animation: upAndIn 0.35s cubic-bezier(0, 0, 0.2, 1) forwards;
+ transform-origin: 50% 50%;
+ opacity: 1;
+ box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.24);
+ }
+ }
+ .secrets-standard-fields {
+ position: relative;
+ margin-top: 1rem;
+ padding: 0 1rem;
+ }
+ .secrets-advanced-options {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 3.5rem;
+ padding: 0 1rem 1rem 1rem;
+ .expand-link {
+ margin: 1.4rem 0;
+ }
+ .advanced-headline {
+ color: $accent_blue;
+ }
+ .salt-input-wrapper {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ input {
+ flex: 1;
+ }
+ a {
+ cursor: pointer;
+ transition: opacity 0.2s ease-out;
+ color: $accent_blue;
+ opacity: 0.5;
+ font-weight: 300;
+ margin-right: 1rem;
+ white-space: nowrap;
+ margin: 0 0 0 1rem;
+ &:hover {
+ opacity: 1;
+ }
+ }
+ }
+ .validity-period-wrapper {
+ display: flex;
+ align-items: center;
+ label {
+ display: inline-block;
+ color: rgba(0, 0, 0, 0.54);
+ width: 11rem;
+ margin-right: 1rem;
+ font-weight: 600;
+ padding: 0.4rem 0;
+ }
+ .standard-field {
+ flex: 1;
+ }
+ .date-picker-wrapper {
+ flex: 1;
+ &:first-of-type {
+ margin-right: 3rem;
+ }
+ }
+ }
+ }
+ .fixed-footer {
+ position: absolute;
+ bottom: 1rem;
+ width: calc(100% - 2rem);
+ height: 2.5rem;
+ align-items: center;
+ display: flex;
+ justify-content: flex-end;
+ button {
+ font-size: 1.4rem;
+ padding: 0 0.5rem 0 0;
+ svg {
+ height: 0.525em;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/developer-ui-frontend/src/styles/datePicker.scss b/developer-ui-frontend/src/styles/datePicker.scss
index 9ed58e2..24de1e2 100644
--- a/developer-ui-frontend/src/styles/datePicker.scss
+++ b/developer-ui-frontend/src/styles/datePicker.scss
@@ -6,6 +6,10 @@
.date-picker-wrapper {
position: relative;
+ .iconSpace {
+ padding-right: 25px;
+ }
+
svg {
cursor: pointer;
position: absolute;
@@ -168,7 +172,7 @@
}
.react-datepicker-popper {
- z-index: 1;
+ z-index: 99999999999;
}
.react-datepicker-popper[data-placement^="bottom"] {
diff --git a/developer-ui-frontend/src/styles/jsonEditor.scss b/developer-ui-frontend/src/styles/jsonEditor.scss
index a1f2b0a..05fe028 100644
--- a/developer-ui-frontend/src/styles/jsonEditor.scss
+++ b/developer-ui-frontend/src/styles/jsonEditor.scss
@@ -42,6 +42,9 @@ div.jsoneditor .jsoneditor-search input {
.jsoneditor-menu {
animation: fade-out 0.2s ease-out forwards;
}
+ .jsoneditor-text-errors {
+ display: none;
+ }
.jsoneditor-outer {
margin-left: 0; // gets overwritten by the slide-out animation
@@ -72,7 +75,6 @@ div.jsoneditor table {
border-collapse: collapse;
width: auto;
}
-
div.jsoneditor td,
div.jsoneditor th {
padding: 0;
@@ -279,7 +281,7 @@ div.jsoneditor-container {
height: 100%;
margin: -40px 0 0 0;
margin-left: -41px; // gets overwritten by forwards slide-in animation
- padding: 40px 0 0 0;
+ padding: 40px 0 0 0 !important;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
@@ -378,9 +380,13 @@ div.jsoneditor td,
div.jsoneditor th,
div.jsoneditor textarea,
.jsoneditor-schema-error {
- font-family: "Roboto Mono", monospace;
- font-size: 10pt;
- color: #1a1a1a;
+ font-family: "Roboto", "RobotoDraft", "Helvetica Neue", "Helvetica", "Arial",
+ Sans-Serif;
+ font-size: 1.3rem;
+ color: #000;
+ letter-spacing: 0.01071em;
+ font-weight: 400;
+ line-height: 1.5;
}
/* popover */
@@ -546,10 +552,45 @@ div.jsoneditor-tree .jsoneditor-schema-error {
/* JSON schema errors displayed at the bottom of the editor in mode text and code */
.jsoneditor .jsoneditor-text-errors {
- width: 100%;
+ position: absolute;
+ top: 40px;
+ left: 50%;
+ z-index: 4;
border-collapse: collapse;
- background-color: #ffef8b;
- border-top: 1px solid #ffd700;
+ background-color: rgba(255, 239, 139, 0.65);
+ animation: slideDown 0.2s ease-out forwards;
+ margin-top: 0.5rem;
+ border-radius: 0.4rem;
+ @keyframes slideDown {
+ 0% {
+ transform: translate(-50%, -100%);
+ }
+ 100% {
+ transform: translate(-50%, 0);
+ }
+ }
+}
+.jsoneditor .jsoneditor-text-errors tr {
+ display: flex;
+ align-items: center;
+ height: 3.5rem;
+ padding-right: 1rem;
+
+ &:not(:first-of-type) {
+ display: none;
+ }
+
+ td {
+ &:empty {
+ display: none;
+ }
+ pre {
+ margin: 0;
+ }
+ button {
+ vertical-align: middle;
+ }
+ }
}
.jsoneditor .jsoneditor-text-errors td {
diff --git a/developer-ui-frontend/src/styles/registrations.scss b/developer-ui-frontend/src/styles/registrations.scss
index 44e7aa2..35fef12 100644
--- a/developer-ui-frontend/src/styles/registrations.scss
+++ b/developer-ui-frontend/src/styles/registrations.scss
@@ -219,7 +219,7 @@
cursor: pointer;
outline: none;
text-decoration: none;
- color: $disabled_font_color;
+ color: rgba(0, 0, 0, 0.55);
z-index: 1;
list-style: none;
padding: 1rem;
@@ -229,6 +229,11 @@
transition: color 80ms ease-in;
user-select: none;
+ &.disabled {
+ cursor: not-allowed;
+ color: $disabled_font_color;
+ }
+
&:before {
content: "";
position: absolute;
diff --git a/developer-ui-frontend/src/utils/utils.js b/developer-ui-frontend/src/utils/utils.js
index d07edae..c5cee51 100644
--- a/developer-ui-frontend/src/utils/utils.js
+++ b/developer-ui-frontend/src/utils/utils.js
@@ -3,7 +3,6 @@
*/
import uuid from "uuid/v4";
import _ from "lodash";
-import jssha from "jssha";
export const camelCase = str => {
return str
@@ -27,14 +26,6 @@ export const formatDateString = date => {
export const calculateLogId = message =>
JSON.parse(message.body).deviceId + "-" + message.timestamp;
-export const calculateSecretId = (secretObj, authId) => {
- // secretHashes must be deterministic for testing -> use a hash function
- const hashObj = new jssha("SHA-1", "TEXT");
- hashObj.update(JSON.stringify(secretObj));
- const hashValue = hashObj.getHash("B64");
- return authId + "-" + hashValue;
-};
-
export const calculateFilterId = (category, value) =>
category.toLowerCase() + "-" + value.toLowerCase();
@@ -84,46 +75,6 @@ export const checkLog = (log, filterList) => {
return !filteredOut;
};
-// Maps the entered form params to the schema defined by the CredentialsReducer
-export const mapCredentialParams = (authId, credType, data, secrets) => {
- const newAuthId = authId;
- const newType = credType;
- let newCredential = {
- "auth-id": newAuthId,
- type: newType,
- secrets: secrets ? secrets : []
- };
- if (data) {
- newCredential = { ...newCredential, ...data };
- }
- return newCredential;
-};
-// Maps the entered form params to the schema defined by the CredentialsReducer
-export const mapSecretParams = (secretId, authId, secretType, data) => {
- const newSecretType = secretType;
- let newSecret = null;
- if (newSecretType === "Hashed Password") {
- const { hashMethod, password, ...other } = data;
- let pw = "";
- try {
- const method = hashMethod;
- const hashObj = new jssha(method.toUpperCase(), "TEXT");
- hashObj.update(password);
- pw = hashObj.getHash("B64");
- newSecret = {
- "hash-function": method,
- "pwd-hash": pw,
- ...other
- };
- } catch (err) {
- console.error(err);
- }
- }
- const newSecretId = secretId || calculateSecretId(newSecret, authId);
- newSecret = { ...newSecret, secretId: newSecretId };
- return newSecret;
-};
-
export const deepDiff = (object, base) => {
const changes = (obj, bs) => {
return _.transform(obj, (result, value, key) => {
@@ -137,9 +88,3 @@ export const deepDiff = (object, base) => {
};
return changes(object, base);
};
-
-export const arrayToObject = (array, keyField) =>
- array.reduce((obj, item) => {
- obj[item[keyField]] = item;
- return obj;
- }, {});
diff --git a/developer-ui-frontend/webpack.config.js b/developer-ui-frontend/webpack.config.js
index 1cfc482..675e230 100644
--- a/developer-ui-frontend/webpack.config.js
+++ b/developer-ui-frontend/webpack.config.js
@@ -74,7 +74,7 @@ module.exports = {
filename: "app.bundle.js",
publicPath: publicPathConfig
},
- stats: { errorDetails: true },
+ stats: "verbose",
devtool: isProd ? "source-map" : "cheap-module-source-map",
module: {
rules: [
diff --git a/developer-ui-frontend/yarn.lock b/developer-ui-frontend/yarn.lock
index c34c111..b383b7c 100644
--- a/developer-ui-frontend/yarn.lock
+++ b/developer-ui-frontend/yarn.lock
@@ -403,6 +403,15 @@ ajv@5.5.2, ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5:
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.3.0"
+ajv@6.5.4:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
ajv@^4.7.0, ajv@^4.9.1:
version "4.11.8"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
@@ -473,6 +482,13 @@ anymatch@^1.3.0:
micromatch "^2.1.5"
normalize-path "^2.0.0"
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
append-transform@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
@@ -508,10 +524,18 @@ arr-diff@^2.0.0:
dependencies:
arr-flatten "^1.0.1"
-arr-flatten@^1.0.1:
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
array-differ@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
@@ -553,6 +577,10 @@ array-unique@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
array.prototype.flatmap@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.1.1.tgz#dbb6c44693c2a2a2fcab24e551dfbf47f67fde03"
@@ -603,6 +631,10 @@ assert@^1.1.1:
dependencies:
util "0.10.3"
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
ast-types@0.10.1:
version "0.10.1"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd"
@@ -637,10 +669,20 @@ async@^2.1.2, async@^2.1.4, async@^2.1.5:
dependencies:
lodash "^4.14.0"
+async@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+ dependencies:
+ lodash "^4.17.10"
+
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+atob@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+
atob@~1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773"
@@ -896,13 +938,20 @@ babel-helpers@^6.24.1:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
-babel-jest@^22.0.3, babel-jest@^22.1.0:
+babel-jest@^22.0.3:
version "22.1.0"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.1.0.tgz#7fae6f655fffe77e818a8c2868c754a42463fdfd"
dependencies:
babel-plugin-istanbul "^4.1.5"
babel-preset-jest "^22.1.0"
+babel-jest@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1"
+ dependencies:
+ babel-plugin-istanbul "^4.1.6"
+ babel-preset-jest "^23.2.0"
+
babel-loader@^7.1.1, babel-loader@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126"
@@ -945,10 +994,23 @@ babel-plugin-istanbul@^4.1.5:
istanbul-lib-instrument "^1.7.5"
test-exclude "^4.1.1"
+babel-plugin-istanbul@^4.1.6:
+ version "4.1.6"
+ resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+ find-up "^2.1.0"
+ istanbul-lib-instrument "^1.10.1"
+ test-exclude "^4.2.1"
+
babel-plugin-jest-hoist@^22.1.0:
version "22.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.1.0.tgz#c1281dd7887d77a1711dc760468c3b8285dde9ee"
+babel-plugin-jest-hoist@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
+
babel-plugin-minify-builtins@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz#317f824b0907210b6348671bb040ca072e2e0c82"
@@ -1493,6 +1555,13 @@ babel-preset-jest@^22.1.0:
babel-plugin-jest-hoist "^22.1.0"
babel-plugin-syntax-object-rest-spread "^6.13.0"
+babel-preset-jest@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
+ dependencies:
+ babel-plugin-jest-hoist "^23.2.0"
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+
babel-preset-minify@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc"
@@ -1618,7 +1687,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
babylon "^6.18.0"
lodash "^4.17.4"
-babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
dependencies:
@@ -1632,7 +1701,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
invariant "^2.2.2"
lodash "^4.17.4"
-babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
dependencies:
@@ -1669,6 +1738,18 @@ base64-js@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
batch@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
@@ -1770,6 +1851,21 @@ body-parser@1.18.2:
raw-body "2.3.2"
type-is "~1.6.15"
+body-parser@1.18.3:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
+ dependencies:
+ bytes "3.0.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "~1.6.3"
+ iconv-lite "0.4.23"
+ on-finished "~2.3.0"
+ qs "6.5.2"
+ raw-body "2.3.3"
+ type-is "~1.6.16"
+
boolbase@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
@@ -1819,6 +1915,21 @@ braces@^1.8.2:
preserve "^0.2.0"
repeat-element "^1.1.2"
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
brcast@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd"
@@ -1831,9 +1942,9 @@ browser-process-hrtime@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
-browser-resolve@^1.11.2:
- version "1.11.2"
- resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+browser-resolve@^1.11.3:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
dependencies:
resolve "1.1.7"
@@ -1913,6 +2024,10 @@ buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
buffer-to-vinyl@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262"
@@ -1971,6 +2086,20 @@ cacache@^10.0.1:
unique-filename "^1.1.0"
y18n "^3.2.1"
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
caller-path@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
@@ -2112,10 +2241,33 @@ chokidar@^1.6.0, chokidar@^1.7.0:
optionalDependencies:
fsevents "^1.0.0"
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
chownr@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+chownr@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
+
ci-info@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4"
@@ -2137,6 +2289,15 @@ clap@^1.0.9:
dependencies:
chalk "^1.1.3"
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
classnames@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
@@ -2228,6 +2389,13 @@ code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
color-convert@^1.3.0, color-convert@^1.9.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
@@ -2306,6 +2474,10 @@ commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
compressible@~2.0.11:
version "2.0.12"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66"
@@ -2404,6 +2576,10 @@ copy-concurrently@^1.0.0:
rimraf "^2.5.4"
run-queue "^1.0.0"
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
copy-to-clipboard@^3:
version "3.0.8"
resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9"
@@ -2533,6 +2709,10 @@ crypto-browserify@^3.11.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
+crypto-js@^3.1.9-1:
+ version "3.1.9-1"
+ resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8"
+
crypto-random-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
@@ -2704,7 +2884,7 @@ dateformat@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
-debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.6.8:
+debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
@@ -2788,6 +2968,10 @@ deep-equal@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
deep-extend@~0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
@@ -2809,6 +2993,25 @@ define-properties@^1.1.2:
foreach "^2.0.5"
object-keys "^1.0.8"
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
defined@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
@@ -3476,30 +3679,42 @@ expand-brackets@^0.1.4:
dependencies:
is-posix-bracket "^0.1.0"
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
expand-range@^1.8.1:
version "1.8.2"
resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
dependencies:
fill-range "^2.1.0"
-expect@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/expect/-/expect-22.1.0.tgz#f8f9b019ab275d859cbefed531fbaefe8972431d"
+expect@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98"
dependencies:
ansi-styles "^3.2.0"
- jest-diff "^22.1.0"
+ jest-diff "^23.6.0"
jest-get-type "^22.1.0"
- jest-matcher-utils "^22.1.0"
- jest-message-util "^22.1.0"
- jest-regex-util "^22.1.0"
+ jest-matcher-utils "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-regex-util "^23.3.0"
express@^4.13.3:
- version "4.16.3"
- resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
+ version "4.16.4"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
dependencies:
accepts "~1.3.5"
array-flatten "1.1.1"
- body-parser "1.18.2"
+ body-parser "1.18.3"
content-disposition "0.5.2"
content-type "~1.0.4"
cookie "0.3.1"
@@ -3516,10 +3731,10 @@ express@^4.13.3:
on-finished "~2.3.0"
parseurl "~1.3.2"
path-to-regexp "0.1.7"
- proxy-addr "~2.0.3"
- qs "6.5.1"
+ proxy-addr "~2.0.4"
+ qs "6.5.2"
range-parser "~1.2.0"
- safe-buffer "5.1.1"
+ safe-buffer "5.1.2"
send "0.16.2"
serve-static "1.13.2"
setprototypeof "1.1.0"
@@ -3569,6 +3784,13 @@ extend-shallow@^2.0.1:
dependencies:
is-extendable "^0.1.0"
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
@@ -3579,6 +3801,19 @@ extglob@^0.3.1:
dependencies:
is-extglob "^1.0.0"
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
extract-text-webpack-plugin@^2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz#756ef4efa8155c3681833fbc34da53b941746d6c"
@@ -3608,6 +3843,10 @@ fast-deep-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
@@ -3740,6 +3979,15 @@ fill-range@^2.1.0:
repeat-element "^1.1.2"
repeat-string "^1.5.2"
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
finalhandler@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
@@ -3754,7 +4002,7 @@ finalhandler@1.1.0:
finalhandler@1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
+ resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
@@ -3836,7 +4084,7 @@ for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
-for-in@^1.0.1:
+for-in@^1.0.1, for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -3880,6 +4128,12 @@ forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
@@ -3891,6 +4145,12 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
fs-write-stream-atomic@^1.0.8:
version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -3911,6 +4171,13 @@ fsevents@^1.0.0, fsevents@^1.1.1:
nan "^2.3.0"
node-pre-gyp "^0.6.39"
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
fstream-ignore@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
@@ -3995,6 +4262,10 @@ get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -4044,7 +4315,7 @@ glob-parent@^2.0.0:
dependencies:
is-glob "^2.0.0"
-glob-parent@^3.0.0:
+glob-parent@^3.0.0, glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
dependencies:
@@ -4314,6 +4585,33 @@ has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
has@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
@@ -4480,7 +4778,7 @@ html-tag-names@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/html-tag-names/-/html-tag-names-1.1.2.tgz#f65168964c5a9c82675efda882875dcb2a875c22"
-html-webpack-plugin@^2.28.0, html-webpack-plugin@^2.30.1:
+html-webpack-plugin@^2.30.1:
version "2.30.1"
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5"
dependencies:
@@ -4491,6 +4789,18 @@ html-webpack-plugin@^2.28.0, html-webpack-plugin@^2.30.1:
pretty-error "^2.0.2"
toposort "^1.0.0"
+html-webpack-plugin@^3.2.0:
+ version "3.2.0"
+ resolved "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b"
+ dependencies:
+ html-minifier "^3.2.3"
+ loader-utils "^0.2.16"
+ lodash "^4.17.3"
+ pretty-error "^2.0.2"
+ tapable "^1.0.0"
+ toposort "^1.0.0"
+ util.promisify "1.0.0"
+
htmlparser2@3.9.1:
version "3.9.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.1.tgz#621b7a58bc9acd003f7af0a2c9a00aa67c8505d2"
@@ -4535,6 +4845,15 @@ http-errors@1.6.2, http-errors@~1.6.2:
setprototypeof "1.0.3"
statuses ">= 1.3.1 < 2"
+http-errors@1.6.3, http-errors@~1.6.3:
+ version "1.6.3"
+ resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
http-parser-js@>=0.4.0:
version "0.4.9"
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1"
@@ -4583,6 +4902,18 @@ iconv-lite@0.4.19, iconv-lite@~0.4.13:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+iconv-lite@0.4.23:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.4.4:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -4601,6 +4932,12 @@ iferr@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
ignore@^3.1.2:
version "3.3.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
@@ -4771,7 +5108,7 @@ invariant@2.2.2, invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2:
dependencies:
loose-envify "^1.0.0"
-invariant@^2.2.0:
+invariant@^2.2.0, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
dependencies:
@@ -4789,9 +5126,9 @@ ipaddr.js@1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
-ipaddr.js@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
+ipaddr.js@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
is-absolute-url@^2.0.0:
version "2.1.0"
@@ -4803,6 +5140,18 @@ is-absolute@^0.1.5:
dependencies:
is-relative "^0.1.0"
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -4847,10 +5196,38 @@ is-cwebp-readable@^2.0.1:
dependencies:
file-type "^4.3.0"
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
is-date-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
is-directory@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
@@ -4873,11 +5250,17 @@ is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
is-extglob@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
-is-extglob@^2.1.0:
+is-extglob@^2.1.0, is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -4921,6 +5304,12 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
is-gzip@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83"
@@ -4982,7 +5371,7 @@ is-plain-obj@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
-is-plain-object@^2.0.1, is-plain-object@^2.0.4:
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
dependencies:
@@ -5076,6 +5465,10 @@ is-windows@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9"
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
is-zip@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325"
@@ -5098,7 +5491,7 @@ isobject@^2.0.0:
dependencies:
isarray "1.0.0"
-isobject@^3.0.1:
+isobject@^3.0.0, isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
@@ -5113,18 +5506,18 @@ isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
-istanbul-api@^1.1.14:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
+istanbul-api@^1.3.1:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa"
dependencies:
async "^2.1.4"
fileset "^2.0.2"
- istanbul-lib-coverage "^1.1.1"
- istanbul-lib-hook "^1.1.0"
- istanbul-lib-instrument "^1.9.1"
- istanbul-lib-report "^1.1.2"
- istanbul-lib-source-maps "^1.2.2"
- istanbul-reports "^1.1.3"
+ istanbul-lib-coverage "^1.2.1"
+ istanbul-lib-hook "^1.2.2"
+ istanbul-lib-instrument "^1.10.2"
+ istanbul-lib-report "^1.1.5"
+ istanbul-lib-source-maps "^1.2.6"
+ istanbul-reports "^1.5.1"
js-yaml "^3.7.0"
mkdirp "^0.5.1"
once "^1.4.0"
@@ -5133,13 +5526,29 @@ istanbul-lib-coverage@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
-istanbul-lib-hook@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
+istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
+
+istanbul-lib-hook@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86"
dependencies:
append-transform "^0.4.0"
-istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.1:
+istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.18.0"
+ istanbul-lib-coverage "^1.2.1"
+ semver "^5.3.0"
+
+istanbul-lib-instrument@^1.7.5:
version "1.9.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
dependencies:
@@ -5151,28 +5560,28 @@ istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-ins
istanbul-lib-coverage "^1.1.1"
semver "^5.3.0"
-istanbul-lib-report@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425"
+istanbul-lib-report@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
dependencies:
- istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-coverage "^1.2.1"
mkdirp "^0.5.1"
path-parse "^1.0.5"
supports-color "^3.1.2"
-istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
+istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f"
dependencies:
debug "^3.1.0"
- istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-coverage "^1.2.1"
mkdirp "^0.5.1"
rimraf "^2.6.1"
source-map "^0.5.3"
-istanbul-reports@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10"
+istanbul-reports@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
dependencies:
handlebars "^4.0.3"
@@ -5180,15 +5589,15 @@ javascript-natural-sort@0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
-jest-changed-files@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.1.0.tgz#586a6164b87255dbd541a8bab880d98f14c99b7d"
+jest-changed-files@^23.4.2:
+ version "23.4.2"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
dependencies:
throat "^4.0.0"
-jest-cli@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.1.2.tgz#89497932d7befb8a6952f2712473695c4bbef43f"
+jest-cli@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4"
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.1"
@@ -5197,48 +5606,54 @@ jest-cli@^22.1.2:
graceful-fs "^4.1.11"
import-local "^1.0.0"
is-ci "^1.0.10"
- istanbul-api "^1.1.14"
- istanbul-lib-coverage "^1.1.1"
- istanbul-lib-instrument "^1.8.0"
- istanbul-lib-source-maps "^1.2.1"
- jest-changed-files "^22.1.0"
- jest-config "^22.1.2"
- jest-environment-jsdom "^22.1.2"
+ istanbul-api "^1.3.1"
+ istanbul-lib-coverage "^1.2.0"
+ istanbul-lib-instrument "^1.10.1"
+ istanbul-lib-source-maps "^1.2.4"
+ jest-changed-files "^23.4.2"
+ jest-config "^23.6.0"
+ jest-environment-jsdom "^23.4.0"
jest-get-type "^22.1.0"
- jest-haste-map "^22.1.0"
- jest-message-util "^22.1.0"
- jest-regex-util "^22.1.0"
- jest-resolve-dependencies "^22.1.0"
- jest-runner "^22.1.2"
- jest-runtime "^22.1.2"
- jest-snapshot "^22.1.2"
- jest-util "^22.1.2"
- jest-worker "^22.1.0"
+ jest-haste-map "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-regex-util "^23.3.0"
+ jest-resolve-dependencies "^23.6.0"
+ jest-runner "^23.6.0"
+ jest-runtime "^23.6.0"
+ jest-snapshot "^23.6.0"
+ jest-util "^23.4.0"
+ jest-validate "^23.6.0"
+ jest-watcher "^23.4.0"
+ jest-worker "^23.2.0"
micromatch "^2.3.11"
- node-notifier "^5.1.2"
+ node-notifier "^5.2.1"
+ prompts "^0.1.9"
realpath-native "^1.0.0"
rimraf "^2.5.4"
slash "^1.0.0"
string-length "^2.0.0"
strip-ansi "^4.0.0"
which "^1.2.12"
- yargs "^10.0.3"
+ yargs "^11.0.0"
-jest-config@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.1.2.tgz#d3aee5c1df0997f0e2ae5c707eee04a7c87f1653"
+jest-config@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d"
dependencies:
+ babel-core "^6.0.0"
+ babel-jest "^23.6.0"
chalk "^2.0.1"
glob "^7.1.1"
- jest-environment-jsdom "^22.1.2"
- jest-environment-node "^22.1.2"
+ jest-environment-jsdom "^23.4.0"
+ jest-environment-node "^23.4.0"
jest-get-type "^22.1.0"
- jest-jasmine2 "^22.1.2"
- jest-regex-util "^22.1.0"
- jest-resolve "^22.1.0"
- jest-util "^22.1.2"
- jest-validate "^22.1.2"
- pretty-format "^22.1.0"
+ jest-jasmine2 "^23.6.0"
+ jest-regex-util "^23.3.0"
+ jest-resolve "^23.6.0"
+ jest-util "^23.4.0"
+ jest-validate "^23.6.0"
+ micromatch "^2.3.11"
+ pretty-format "^23.6.0"
jest-diff@^22.1.0:
version "22.1.0"
@@ -5249,63 +5664,82 @@ jest-diff@^22.1.0:
jest-get-type "^22.1.0"
pretty-format "^22.1.0"
-jest-docblock@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.1.0.tgz#3fe5986d5444cbcb149746eb4b07c57c5a464dfd"
+jest-diff@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d"
+ dependencies:
+ chalk "^2.0.1"
+ diff "^3.2.0"
+ jest-get-type "^22.1.0"
+ pretty-format "^23.6.0"
+
+jest-docblock@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7"
dependencies:
detect-newline "^2.1.0"
-jest-environment-jsdom@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.1.2.tgz#4488c629631dd5de9059ec747fcd358735247f70"
+jest-each@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575"
+ dependencies:
+ chalk "^2.0.1"
+ pretty-format "^23.6.0"
+
+jest-environment-jsdom@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023"
dependencies:
- jest-mock "^22.1.0"
- jest-util "^22.1.2"
+ jest-mock "^23.2.0"
+ jest-util "^23.4.0"
jsdom "^11.5.1"
-jest-environment-node@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.1.2.tgz#77dc32fbe08caa03ef2acb0948dce4b25a14633a"
+jest-environment-node@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10"
dependencies:
- jest-mock "^22.1.0"
- jest-util "^22.1.2"
+ jest-mock "^23.2.0"
+ jest-util "^23.4.0"
jest-get-type@^22.1.0:
version "22.1.0"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9"
-jest-haste-map@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.1.0.tgz#1174c6ff393f9818ebf1163710d8868b5370da2a"
+jest-haste-map@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16"
dependencies:
fb-watchman "^2.0.0"
graceful-fs "^4.1.11"
- jest-docblock "^22.1.0"
- jest-worker "^22.1.0"
+ invariant "^2.2.4"
+ jest-docblock "^23.2.0"
+ jest-serializer "^23.0.1"
+ jest-worker "^23.2.0"
micromatch "^2.3.11"
sane "^2.0.0"
-jest-jasmine2@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.1.2.tgz#dee4ba04fb2cf462e4c7cfb499426e82e8fde5ac"
+jest-jasmine2@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0"
dependencies:
- callsites "^2.0.0"
+ babel-traverse "^6.0.0"
chalk "^2.0.1"
co "^4.6.0"
- expect "^22.1.0"
- graceful-fs "^4.1.11"
+ expect "^23.6.0"
is-generator-fn "^1.0.0"
- jest-diff "^22.1.0"
- jest-matcher-utils "^22.1.0"
- jest-message-util "^22.1.0"
- jest-snapshot "^22.1.2"
- source-map-support "^0.5.0"
+ jest-diff "^23.6.0"
+ jest-each "^23.6.0"
+ jest-matcher-utils "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-snapshot "^23.6.0"
+ jest-util "^23.4.0"
+ pretty-format "^23.6.0"
-jest-leak-detector@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.1.0.tgz#08376644cee07103da069baac19adb0299b772c2"
+jest-leak-detector@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de"
dependencies:
- pretty-format "^22.1.0"
+ pretty-format "^23.6.0"
jest-matcher-utils@^22.1.0:
version "22.1.0"
@@ -5315,9 +5749,17 @@ jest-matcher-utils@^22.1.0:
jest-get-type "^22.1.0"
pretty-format "^22.1.0"
-jest-message-util@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.1.0.tgz#51ba0794cb6e579bfc4e9adfac452f9f1a0293fc"
+jest-matcher-utils@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80"
+ dependencies:
+ chalk "^2.0.1"
+ jest-get-type "^22.1.0"
+ pretty-format "^23.6.0"
+
+jest-message-util@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f"
dependencies:
"@babel/code-frame" "^7.0.0-beta.35"
chalk "^2.0.1"
@@ -5325,68 +5767,78 @@ jest-message-util@^22.1.0:
slash "^1.0.0"
stack-utils "^1.0.1"
-jest-mock@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.1.0.tgz#87ec21c0599325671c9a23ad0e05c86fb5879b61"
+jest-mock@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134"
-jest-regex-util@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53"
+jest-regex-util@^23.3.0:
+ version "23.3.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
-jest-resolve-dependencies@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31"
+jest-resolve-dependencies@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d"
dependencies:
- jest-regex-util "^22.1.0"
+ jest-regex-util "^23.3.0"
+ jest-snapshot "^23.6.0"
-jest-resolve@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.1.0.tgz#5f4307f48b93c1abdbeacc9ed80642ffcb246294"
+jest-resolve@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae"
dependencies:
- browser-resolve "^1.11.2"
+ browser-resolve "^1.11.3"
chalk "^2.0.1"
+ realpath-native "^1.0.0"
-jest-runner@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.1.2.tgz#e8565e4eb56c27219352b8486338ced9ceb462da"
+jest-runner@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38"
dependencies:
exit "^0.1.2"
- jest-config "^22.1.2"
- jest-docblock "^22.1.0"
- jest-haste-map "^22.1.0"
- jest-jasmine2 "^22.1.2"
- jest-leak-detector "^22.1.0"
- jest-message-util "^22.1.0"
- jest-runtime "^22.1.2"
- jest-util "^22.1.2"
- jest-worker "^22.1.0"
+ graceful-fs "^4.1.11"
+ jest-config "^23.6.0"
+ jest-docblock "^23.2.0"
+ jest-haste-map "^23.6.0"
+ jest-jasmine2 "^23.6.0"
+ jest-leak-detector "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-runtime "^23.6.0"
+ jest-util "^23.4.0"
+ jest-worker "^23.2.0"
+ source-map-support "^0.5.6"
throat "^4.0.0"
-jest-runtime@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.1.2.tgz#42755d7cea2ffc7cdaa7f2dfa8736264a6057bf9"
+jest-runtime@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082"
dependencies:
babel-core "^6.0.0"
- babel-jest "^22.1.0"
- babel-plugin-istanbul "^4.1.5"
+ babel-plugin-istanbul "^4.1.6"
chalk "^2.0.1"
convert-source-map "^1.4.0"
exit "^0.1.2"
+ fast-json-stable-stringify "^2.0.0"
graceful-fs "^4.1.11"
- jest-config "^22.1.2"
- jest-haste-map "^22.1.0"
- jest-regex-util "^22.1.0"
- jest-resolve "^22.1.0"
- jest-util "^22.1.2"
- json-stable-stringify "^1.0.1"
+ jest-config "^23.6.0"
+ jest-haste-map "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-regex-util "^23.3.0"
+ jest-resolve "^23.6.0"
+ jest-snapshot "^23.6.0"
+ jest-util "^23.4.0"
+ jest-validate "^23.6.0"
micromatch "^2.3.11"
realpath-native "^1.0.0"
slash "^1.0.0"
strip-bom "3.0.0"
write-file-atomic "^2.1.0"
- yargs "^10.0.3"
+ yargs "^11.0.0"
-jest-snapshot@>=20.0.3, jest-snapshot@^22.1.2:
+jest-serializer@^23.0.1:
+ version "23.0.1"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"
+
+jest-snapshot@>=20.0.3:
version "22.1.2"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.1.2.tgz#b270cf6e3098f33aceeafda02b13eb0933dc6139"
dependencies:
@@ -5397,44 +5849,69 @@ jest-snapshot@>=20.0.3, jest-snapshot@^22.1.2:
natural-compare "^1.4.0"
pretty-format "^22.1.0"
+jest-snapshot@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a"
+ dependencies:
+ babel-types "^6.0.0"
+ chalk "^2.0.1"
+ jest-diff "^23.6.0"
+ jest-matcher-utils "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-resolve "^23.6.0"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ pretty-format "^23.6.0"
+ semver "^5.5.0"
+
jest-specific-snapshot@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/jest-specific-snapshot/-/jest-specific-snapshot-0.3.0.tgz#89d37c7c2e94180c7b58bfedf9d9dc172ebd19e3"
dependencies:
jest-snapshot ">=20.0.3"
-jest-util@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.1.2.tgz#4bf098f651e8611d744cefa23fa026c97a6a3d5d"
+jest-util@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561"
dependencies:
callsites "^2.0.0"
chalk "^2.0.1"
graceful-fs "^4.1.11"
is-ci "^1.0.10"
- jest-message-util "^22.1.0"
- jest-validate "^22.1.2"
+ jest-message-util "^23.4.0"
mkdirp "^0.5.1"
+ slash "^1.0.0"
+ source-map "^0.6.0"
-jest-validate@^22.1.2:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.1.2.tgz#c3b06bcba7bd9a850919fe336b5f2a8c3a239404"
+jest-validate@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474"
dependencies:
chalk "^2.0.1"
jest-get-type "^22.1.0"
leven "^2.1.0"
- pretty-format "^22.1.0"
+ pretty-format "^23.6.0"
-jest-worker@^22.1.0:
- version "22.1.0"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.1.0.tgz#0987832fe58fbdc205357f4c19b992446368cafb"
+jest-watcher@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c"
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.1"
+ string-length "^2.0.0"
+
+jest-worker@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9"
dependencies:
merge-stream "^1.0.1"
-jest@^22.0.3:
- version "22.1.2"
- resolved "https://registry.yarnpkg.com/jest/-/jest-22.1.2.tgz#54dce0f4946a089a00d5fdac8291d5926e24f6ab"
+jest@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d"
dependencies:
- jest-cli "^22.1.2"
+ import-local "^1.0.0"
+ jest-cli "^23.6.0"
jmespath@0.15.0:
version "0.15.0"
@@ -5519,6 +5996,10 @@ json-schema-traverse@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
@@ -5582,10 +6063,6 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
-jssha@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/jssha/-/jssha-2.3.1.tgz#147b2125369035ca4b2f7d210dc539f009b3de9a"
-
jsx-ast-utils@^1.2.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
@@ -5600,7 +6077,7 @@ kind-of@^2.0.1:
dependencies:
is-buffer "^1.0.2"
-kind-of@^3.0.2, kind-of@^3.2.2:
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
dependencies:
@@ -5612,6 +6089,18 @@ kind-of@^4.0.0:
dependencies:
is-buffer "^1.1.5"
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+kleur@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300"
+
lazy-cache@^0.2.3:
version "0.2.7"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
@@ -5881,9 +6370,9 @@ lodash@^4.14.0, lodash@^4.17.5:
version "4.17.5"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
-lodash@^4.17.2:
- version "4.17.10"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+lodash@^4.17.10, lodash@^4.17.2:
+ version "4.17.11"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
logalot@^2.0.0:
version "2.1.0"
@@ -5953,10 +6442,20 @@ makeerror@1.0.x:
dependencies:
tmpl "1.0.x"
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
map-obj@^1.0.0, map-obj@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
markdown-loader@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/markdown-loader/-/markdown-loader-2.0.2.tgz#1cdcf11307658cd611046d7db34c2fe80542af7c"
@@ -6055,6 +6554,24 @@ micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7:
parse-glob "^3.0.4"
regex-cache "^0.4.2"
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
miller-rabin@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -6070,9 +6587,9 @@ mime-db@~1.30.0:
version "1.30.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
-mime-db@~1.33.0:
- version "1.33.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+mime-db@~1.37.0:
+ version "1.37.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7:
version "2.1.17"
@@ -6081,10 +6598,10 @@ mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17,
mime-db "~1.30.0"
mime-types@~2.1.18:
- version "2.1.18"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+ version "2.1.21"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
dependencies:
- mime-db "~1.33.0"
+ mime-db "~1.37.0"
mime@1.4.1:
version "1.4.1"
@@ -6134,6 +6651,19 @@ minimist@~0.0.1:
version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+minipass@^2.2.1, minipass@^2.3.4:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42"
+ dependencies:
+ minipass "^2.2.1"
+
mississippi@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5"
@@ -6149,6 +6679,13 @@ mississippi@^1.3.0:
stream-each "^1.1.0"
through2 "^2.0.0"
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
mixin-object@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
@@ -6207,6 +6744,26 @@ nan@^2.3.0, nan@^2.3.2:
version "2.8.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
+nan@^2.9.2:
+ version "2.11.1"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -6225,10 +6782,22 @@ nearley@^2.7.10:
railroad-diagrams "^1.0.0"
randexp "^0.4.2"
+needle@^2.2.1:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+neo-async@^2.5.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835"
+
nested-object-assign@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/nested-object-assign/-/nested-object-assign-1.0.2.tgz#9a84ef51b5c11298b5476d6c65b26458c9eae82b"
@@ -6302,7 +6871,7 @@ node-libs-browser@^2.0.0:
util "^0.10.3"
vm-browserify "0.0.4"
-node-notifier@^5.1.2:
+node-notifier@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea"
dependencies:
@@ -6311,6 +6880,21 @@ node-notifier@^5.1.2:
shellwords "^0.1.1"
which "^1.3.0"
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
node-pre-gyp@^0.6.39:
version "0.6.39"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
@@ -6384,7 +6968,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
-normalize-path@^2.0.0, normalize-path@^2.0.1:
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
dependencies:
@@ -6403,6 +6987,21 @@ normalize-url@^1.4.0:
query-string "^4.1.0"
sort-keys "^1.0.0"
+normalizr@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/normalizr/-/normalizr-3.2.4.tgz#16aafc540ca99dc1060ceaa1933556322eac4429"
+
+npm-bundled@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
+
+npm-packlist@^1.1.6:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -6452,6 +7051,14 @@ object-assign@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
object-hash@^1.1.4:
version "1.2.0"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.2.0.tgz#e96af0e96981996a1d47f88ead8f74f1ebc4422b"
@@ -6468,6 +7075,12 @@ object-keys@^1.0.11, object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
object.assign@^4.0.4, object.assign@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
@@ -6500,6 +7113,12 @@ object.omit@^2.0.0:
for-own "^0.1.4"
is-extendable "^0.1.1"
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
object.values@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
@@ -6535,7 +7154,7 @@ onetime@^1.0.0:
opn@4.0.2:
version "4.0.2"
- resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
+ resolved "http://registry.npmjs.org/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
dependencies:
object-assign "^4.0.1"
pinkie-promise "^2.0.0"
@@ -6706,6 +7325,10 @@ parseurl@~1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
path-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
@@ -6865,6 +7488,10 @@ portfinder@^1.0.9:
debug "^2.2.0"
mkdirp "0.5.x"
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
postcss-calc@^5.2.0:
version "5.3.1"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
@@ -7185,6 +7812,13 @@ pretty-format@^22.1.0:
ansi-regex "^3.0.0"
ansi-styles "^3.2.0"
+pretty-format@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
+ dependencies:
+ ansi-regex "^3.0.0"
+ ansi-styles "^3.2.0"
+
prismjs@^1.8.1:
version "1.10.0"
resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.10.0.tgz#77e5187c2ae6b3253fcc313029cf25fe53778721"
@@ -7233,6 +7867,13 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
+prompts@^0.1.9:
+ version "0.1.14"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
+ dependencies:
+ kleur "^2.0.1"
+ sisteransi "^0.1.1"
+
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0:
version "15.6.0"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
@@ -7255,12 +7896,12 @@ proxy-addr@~2.0.2:
forwarded "~0.1.2"
ipaddr.js "1.5.2"
-proxy-addr@~2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
+proxy-addr@~2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
dependencies:
forwarded "~0.1.2"
- ipaddr.js "1.6.0"
+ ipaddr.js "1.8.0"
prr@~1.0.1:
version "1.0.1"
@@ -7322,6 +7963,10 @@ qs@6.5.1, qs@^6.5.1, qs@~6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+qs@6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+
qs@~6.3.0:
version "6.3.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
@@ -7431,6 +8076,15 @@ raw-body@2.3.2:
iconv-lite "0.4.19"
unpipe "1.0.0"
+raw-body@2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
+ dependencies:
+ bytes "3.0.0"
+ http-errors "1.6.3"
+ iconv-lite "0.4.23"
+ unpipe "1.0.0"
+
rc@^1.1.2:
version "1.2.4"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.4.tgz#a0f606caae2a3b862bbd0ef85482c0125b315fa3"
@@ -7449,6 +8103,15 @@ rc@^1.1.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
react-addons-create-fragment@^15.5.3:
version "15.6.2"
resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz#a394de7c2c7becd6b5475ba1b97ac472ce7c74f8"
@@ -7971,6 +8634,13 @@ regex-cache@^0.4.2:
dependencies:
is-equal-shallow "^0.1.3"
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
regexpu-core@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
@@ -8019,7 +8689,7 @@ repeat-element@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
-repeat-string@^1.5.2:
+repeat-string@^1.5.2, repeat-string@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
@@ -8179,7 +8849,7 @@ resolve-pathname@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879"
-resolve-url@~0.2.1:
+resolve-url@^0.2.1, resolve-url@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
@@ -8250,6 +8920,20 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+safe-buffer@5.1.2, safe-buffer@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
sane@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56"
@@ -8304,7 +8988,7 @@ sass-loader@^6.0.5:
lodash.tail "^4.1.1"
pify "^3.0.0"
-sax@^1.2.1, sax@~1.2.1:
+sax@^1.2.1, sax@^1.2.4, sax@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
@@ -8360,6 +9044,10 @@ semver@^4.0.3:
version "4.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+semver@^5.5.0:
+ version "5.5.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
+
semver@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -8452,6 +9140,24 @@ set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
setimmediate@^1.0.4, setimmediate@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
@@ -8516,6 +9222,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+sisteransi@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
+
slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
@@ -8524,6 +9234,33 @@ slice-ansi@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
sntp@1.x.x:
version "1.0.9"
resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -8584,18 +9321,33 @@ source-map-resolve@^0.3.0:
source-map-url "~0.3.0"
urix "~0.1.0"
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
source-map-support@^0.4.15:
version "0.4.18"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
dependencies:
source-map "^0.5.6"
-source-map-support@^0.5.0:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.1.tgz#72291517d1fd0cb9542cee6c27520884b5da1a07"
+source-map-support@^0.5.6:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
dependencies:
+ buffer-from "^1.0.0"
source-map "^0.6.0"
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
source-map-url@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9"
@@ -8661,6 +9413,12 @@ spdy@^3.4.1:
select-hose "^2.0.0"
spdy-transport "^2.0.18"
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@@ -8701,10 +9459,21 @@ stat-mode@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502"
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
"statuses@>= 1.3.1 < 2", statuses@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+"statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+
statuses@~1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
@@ -8979,10 +9748,18 @@ table@^3.7.8:
slice-ansi "0.0.4"
string-width "^2.0.0"
-tapable@^0.2.7, tapable@~0.2.5:
+tapable@^0.2.7:
version "0.2.8"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+tapable@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e"
+
+tapable@~0.2.5:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8"
+
tar-pack@^3.4.0:
version "3.4.1"
resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
@@ -9013,6 +9790,18 @@ tar@^2.0.0, tar@^2.2.1:
fstream "^1.0.2"
inherits "2"
+tar@^4:
+ version "4.4.8"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.4"
+ minizlib "^1.1.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
temp-dir@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
@@ -9041,6 +9830,16 @@ test-exclude@^4.1.1:
read-pkg-up "^1.0.1"
require-main-filename "^1.0.1"
+test-exclude@^4.2.1:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20"
+ dependencies:
+ arrify "^1.0.1"
+ micromatch "^2.3.11"
+ object-assign "^4.1.0"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+
text-table@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -9118,6 +9917,28 @@ to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
toggle-selection@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
@@ -9268,6 +10089,15 @@ underscore@~1.4.4:
version "1.4.4"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604"
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
uniq@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
@@ -9311,14 +10141,31 @@ unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
unzip-response@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
upper-case@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+uri-js@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
urix@^0.1.0, urix@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
@@ -9352,8 +10199,8 @@ url-parse@^1.0.1:
requires-port "~1.0.0"
url-parse@^1.1.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz#4dec9dad3dc8585f862fed461d2e19bbf623df30"
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8"
dependencies:
querystringify "^2.0.0"
requires-port "^1.0.0"
@@ -9371,6 +10218,10 @@ url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
user-home@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
@@ -9381,7 +10232,7 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
-util.promisify@^1.0.0:
+util.promisify@1.0.0, util.promisify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
dependencies:
@@ -9554,7 +10405,15 @@ watch@~0.18.0:
exec-sh "^0.2.0"
minimist "^1.2.0"
-watchpack@^1.3.1, watchpack@^1.4.0:
+watchpack@^1.3.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+watchpack@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
dependencies:
@@ -9804,9 +10663,13 @@ yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
+
yargs-parser@^4.2.0:
version "4.2.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+ resolved "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
dependencies:
camelcase "^3.0.0"
@@ -9822,15 +10685,15 @@ yargs-parser@^7.0.0:
dependencies:
camelcase "^4.1.0"
-yargs-parser@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+yargs-parser@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
dependencies:
camelcase "^4.1.0"
-yargs@^10.0.3:
- version "10.1.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.1.tgz#5fe1ea306985a099b33492001fa19a1e61efe285"
+yargs@^11.0.0:
+ version "11.1.0"
+ resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
dependencies:
cliui "^4.0.0"
decamelize "^1.1.1"
@@ -9843,11 +10706,11 @@ yargs@^10.0.3:
string-width "^2.0.0"
which-module "^2.0.0"
y18n "^3.2.1"
- yargs-parser "^8.1.0"
+ yargs-parser "^9.0.2"
yargs@^6.0.0:
version "6.6.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+ resolved "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
dependencies:
camelcase "^3.0.0"
cliui "^3.2.0"