From 84ed1089ce1514d5d6a3a436323ff2bd34bd0e08 Mon Sep 17 00:00:00 2001 From: "mati108@gmail.com" <34651529+matbenitez@users.noreply.github.com> Date: Wed, 13 Feb 2019 19:43:20 -0300 Subject: [PATCH 01/42] Adding integration with key vault --- client/package-lock.json | 2 +- client/package.json | 2 +- client/src/GraphQL/Calls/index.js | 4 +- client/src/GraphQL/Calls/keys.js | 15 ++++ client/src/GraphQL/Fragments/clone.js | 1 + client/src/GraphQL/models.js | 1 - client/src/index.js | 8 +- client/src/views/Clone/Add/index.js | 82 ++++++++++++++++--- server/README.md | 29 +++++++ server/src/errors/index.js | 1 - server/src/graphQLCalls/authorizeClone.js | 28 +++++++ server/src/graphQLCalls/teamQuery.js | 4 +- server/src/kubernetes/createClone.js | 5 ++ server/src/models/clone.js | 1 + server/src/schema/cloneDetails.js | 10 +-- .../src/schema/mutations/AddCloneMutation.js | 61 ++++++++------ .../schema/mutations/RemoveCloneMutation.js | 3 + .../mutations/UpdateExecutionSummary.js | 4 +- server/src/schema/queries/GetClones.js | 3 +- server/src/schema/types/CloneType.js | 3 +- server/src/schema/types/input/Clone.js | 3 +- 21 files changed, 209 insertions(+), 61 deletions(-) create mode 100644 client/src/GraphQL/Calls/keys.js create mode 100644 server/src/graphQLCalls/authorizeClone.js diff --git a/client/package-lock.json b/client/package-lock.json index 2f4b4a7ba..7ada4ee5a 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.2", + "version": "0.0.13", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/client/package.json b/client/package.json index 43a89253f..40b5a1d21 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.13", + "version": "0.0.14", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/Calls/index.js b/client/src/GraphQL/Calls/index.js index f410adf89..7f1d17294 100644 --- a/client/src/GraphQL/Calls/index.js +++ b/client/src/GraphQL/Calls/index.js @@ -1,7 +1,9 @@ import clones from './clones'; import teams from './teams'; +import keys from './keys'; export { clones, - teams + teams, + keys }; diff --git a/client/src/GraphQL/Calls/keys.js b/client/src/GraphQL/Calls/keys.js new file mode 100644 index 000000000..97bd6b26f --- /dev/null +++ b/client/src/GraphQL/Calls/keys.js @@ -0,0 +1,15 @@ +import gql from 'graphql-tag'; + +export const GET_ALL_KEYS = gql` + query { + keyVault_AvailableKeys { + id + key + description + } + } +` + +export default { + GET_ALL_KEYS +}; diff --git a/client/src/GraphQL/Fragments/clone.js b/client/src/GraphQL/Fragments/clone.js index 42022c0bd..6993b966b 100644 --- a/client/src/GraphQL/Fragments/clone.js +++ b/client/src/GraphQL/Fragments/clone.js @@ -30,5 +30,6 @@ export const clone = gql` botAvatar teamAvatar processName + keyId } `; diff --git a/client/src/GraphQL/models.js b/client/src/GraphQL/models.js index c7a5df51b..82f6c331e 100644 --- a/client/src/GraphQL/models.js +++ b/client/src/GraphQL/models.js @@ -3,7 +3,6 @@ const availableMonths = ["January", "February", "March", "April", "May", "June", const tradingStartModes ={ live: "Live", - competition: "Competition", backtest: "Backtest" } diff --git a/client/src/index.js b/client/src/index.js index 970c534aa..fbec00c0c 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -12,10 +12,10 @@ import Home from './views/Home' const App = () => ( - - - - + + + + ) diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 3db9ccfdd..15bda776f 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import { graphql, compose, Query } from 'react-apollo' -import { clones, teams } from '../../../GraphQL/Calls' +import { clones, teams, keys } from '../../../GraphQL/Calls' import { DateTime } from 'luxon'; import TopBar from '../../BannerTopBar' @@ -45,6 +45,7 @@ class AddClone extends Component { runAsTeam: false, teams: [], teamId: '', + keyId: '', // Indicator Bot startYear: 2019, @@ -60,7 +61,8 @@ class AddClone extends Component { isNewCloneConfirmationOpen: false, serverResponse: '', serverError: false, - processNameError: false + processNameError: false, + keyIdError: false } } @@ -230,6 +232,60 @@ class AddClone extends Component { } + { this.state.mode == "live" && + + + Select one of your available Exchange API Keys to be used by this clone. + + + + {({ loading, error, data }) => { + if (loading) return ( + this.setState({keyId:e.target.value})} + onBlur={(e)=>this.setState({keyIdError:false})} + error={this.state.keyIdError} + fullWidth + > + + 'Loading keys...' + + + ); + if (error) return `Error! ${error.message}`; + const list = data.keyVault_AvailableKeys.map((key) => ( + + {key.key} + + )); + return ( + this.setState({keyId:e.target.value})} + onBlur={(e)=>this.setState({keyIdError:false})} + error={this.state.keyIdError} + fullWidth + > + { list } + + ); + }} + + + + + + } + If Run as Team is selected, the clone will be taken from the team respository instead of your own team member folder. @@ -399,7 +455,8 @@ class AddClone extends Component { - @@ -431,7 +488,7 @@ class AddClone extends Component { let serverResponse = await this.createCloneOnServer() error = serverResponse.errors || !isDefined(serverResponse.data.operations_AddClone) if(error){ - this.state.serverResponse = serverResponse.errors[0].message + this.state.serverResponse = serverResponse.errors[0].message || serverResponse.errors[0] this.state.serverError = true }else{ this.state.serverResponse = "The new clone was sucessfully created." @@ -453,15 +510,16 @@ class AddClone extends Component { } } - if(this.state.mode === "backtest"){ - variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000|0 - variables.clone.endDatetime = this.state.endDatetime.valueOf() / 1000|0 - variables.clone.waitTime = this.state.waitTime - } - if(this.state.selectedBot.kind === "TRADER"){ variables.clone.runAsTeam = this.state.runAsTeam variables.clone.processName = 'Trading-Process' + if(this.state.mode === "backtest"){ + variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000|0 + variables.clone.endDatetime = this.state.endDatetime.valueOf() / 1000|0 + variables.clone.waitTime = this.state.waitTime + } else { + variables.clone.keyId = this.state.keyId + } } else { variables.clone.processName = this.state.processName variables.clone.startYear = this.state.startYear @@ -508,6 +566,7 @@ class AddClone extends Component { processName: '', teams: [], teamId: '', + keyId: '', //Error handlers nameError: false, @@ -517,7 +576,8 @@ class AddClone extends Component { isNewCloneConfirmationOpen: false, serverResponse: '', serverError: false, - processNameError: false + processNameError: false, + keyIdError: false }) }; diff --git a/server/README.md b/server/README.md index bb4cbecf6..6607a6cfd 100644 --- a/server/README.md +++ b/server/README.md @@ -2,3 +2,32 @@ ## AA Operations Server Server side functions support the business rules for the module. + +## Available Methods + +# Active clones List +- List active personal clones +- List active team clones (future release) + +# History clone List +- List history personal clones +- List history team clones (future release) + +# Get clone by id +- Get existing clones corresponding to the clone ids passed by parameter and returns: + - Clone id + - Team id + - Bot id + +# Add new clones: + Receive a list of clones, create each of them and return the newly created clone. + A clone can be created: + - As a personal clone (run from the personal user folder) + - As a team clone (on competitions, run from the team folder) + Who can create each type: + - Personal clones are managed by the user who creates it, not visible for any other user. + - Team clones are managed by any ADMIN type team member (on the team member role attribute), + and all team admins will see it listed. + + - Events Module: + At enroll time, the clone is created and the authId is sent diff --git a/server/src/errors/index.js b/server/src/errors/index.js index 63b27a61a..74e7c36ff 100644 --- a/server/src/errors/index.js +++ b/server/src/errors/index.js @@ -53,6 +53,5 @@ export class KubernateError extends Error { message = 'OperationsModule Kubernate Error. ' + this.message constructor(message){ super(message) - logger.error(this.stack) } } diff --git a/server/src/graphQLCalls/authorizeClone.js b/server/src/graphQLCalls/authorizeClone.js new file mode 100644 index 000000000..da12c9879 --- /dev/null +++ b/server/src/graphQLCalls/authorizeClone.js @@ -0,0 +1,28 @@ +import logger from '../config/logger' +import axios from 'axios' + +const authorizeClon = (authorization, keyId, cloneId, releaseClon) => { + logger.debug('authorizeClon -> Entering function.') + + return axios({ + url: process.env.GATEWAY_ENDPOINT, + method: 'post', + data: { + query: ` + mutation keyVault_AuthorizeClone($keyId: String!, $cloneId: String!, $releaseClon: Boolean!){ + keyVault_AuthorizeClone(keyId: $keyId, cloneId: $cloneId, releaseClon:$releaseClon) + } + `, + variables: { + keyId: keyId, + cloneId: cloneId, + releaseClon: releaseClon + } + }, + headers: { + authorization: authorization + } + }) +} + +export default authorizeClon diff --git a/server/src/graphQLCalls/teamQuery.js b/server/src/graphQLCalls/teamQuery.js index c42c1722a..d5c3e32c4 100644 --- a/server/src/graphQLCalls/teamQuery.js +++ b/server/src/graphQLCalls/teamQuery.js @@ -1,8 +1,8 @@ import logger from '../config/logger' import axios from 'axios' -const teamQuery = async(authorization, teamId) => { - logger.debug('GraphQL retrieving team information. %s', teamId) +const teamQuery = (authorization, teamId) => { + logger.debug('teamQuery -> Entering function') return axios({ url: process.env.GATEWAY_ENDPOINT, diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index e4db79b8e..78e03c181 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -104,6 +104,11 @@ const createClone = async (clone) => { "name": "WAIT_TIME", "value": clone.waitTime.toString() }) + } else{ + env.push({ + "name": "KEY_ID", + "value": clone.keyId + }) } } else if(clone.botType === INDICATOR || clone.botType === EXTRACTION ){ if(clone.mode !== NO_TIME){ diff --git a/server/src/models/clone.js b/server/src/models/clone.js index e69df8262..d1071b4ec 100644 --- a/server/src/models/clone.js +++ b/server/src/models/clone.js @@ -23,6 +23,7 @@ const cloneSchema = new Schema({ type: String, required: true, }, + keyId: String, mode: { type: String, enum: CloneModeEnum, diff --git a/server/src/schema/cloneDetails.js b/server/src/schema/cloneDetails.js index 5ac7ba13b..22c10d69d 100644 --- a/server/src/schema/cloneDetails.js +++ b/server/src/schema/cloneDetails.js @@ -2,8 +2,8 @@ import logger from '../config/logger' import { isDefined } from '../config/utils' import { AutorizationError } from '../errors' -const cloneDetails = async(authId, team, clone) => { - logger.debug('Retrieving clone details.') +const cloneDetails = (authId, team, clone) => { + logger.debug('cloneDetails -> Entering function.') if(!(authId === (process.env.AUTH_CLIENT_ID + '@clients') || isAuthorized(team, authId))){ logger.debug('User %s is not authorized to manage team %s.', authId, team.slug ) @@ -22,12 +22,12 @@ const cloneDetails = async(authId, team, clone) => { clone.teamAvatar = team.profile.avatar clone.userLoggedIn = team.members[0].member.alias //TODO change by context info if possible - logger.debug('Retrieving clone details complete.') + logger.debug('cloneDetails -> Retrieving clone details complete.') return clone }; function getSelectedBot(team, selectedBotId){ - logger.debug('Getting selected bot.') + logger.debug('cloneDetails -> Getting selected bot.') if(isDefined(team)){ for (var i = 0; i < team.fb.length; i++) { if(team.fb[i].id === selectedBotId){ @@ -38,7 +38,7 @@ function getSelectedBot(team, selectedBotId){ } function isAuthorized(team, authId){ - logger.debug('Checking if the user is authorized by the teams module.') + logger.debug('cloneDetails -> Checking if the user is authorized by the teams module.') let authorized = false if(isDefined(team)){ for (var i = 0; i < team.members.length; i++) { diff --git a/server/src/schema/mutations/AddCloneMutation.js b/server/src/schema/mutations/AddCloneMutation.js index a0f9db02e..072c4f8df 100644 --- a/server/src/schema/mutations/AddCloneMutation.js +++ b/server/src/schema/mutations/AddCloneMutation.js @@ -1,23 +1,26 @@ -import { CloneInputType } from '../types/input'; -import { CloneType } from '../types'; -import { Clone } from '../../models'; -import { CloneModeEnum } from '../../enums/CloneMode'; -import { BotTypesEnum } from '../../enums/BotTypes'; +import { CloneInputType } from '../types/input' +import { CloneType } from '../types' +import { Clone } from '../../models' +import { CloneModeEnum } from '../../enums/CloneMode' +import { BotTypesEnum } from '../../enums/BotTypes' import teamQuery from '../../graphQLCalls/teamQuery' +import authorizeClone from '../../graphQLCalls/authorizeClone' import cloneDetails from '../cloneDetails' import { AuthentificationError, WrongArgumentsError, - OperationsError + OperationsError, + AutorizationError } from '../../errors' import logger from '../../config/logger' import createKubernetesClone from '../../kubernetes/createClone' import { isDefined } from '../../config/utils' +import { LIVE } from '../../enums/CloneMode' const args = { - clone: {type: CloneInputType } + clone: { type: CloneInputType } } const resolve = async(parent, { clone }, context) => { @@ -27,40 +30,44 @@ const resolve = async(parent, { clone }, context) => { throw new AuthentificationError() } - if(!Object.values(CloneModeEnum).includes(clone.mode)){ + if (!Object.values(CloneModeEnum).includes(clone.mode)) { throw new WrongArgumentsError('The mode selected is not valid.') } - if(!Object.values(BotTypesEnum).includes(clone.botType)){ + if (!Object.values(BotTypesEnum).includes(clone.botType)) { throw new WrongArgumentsError('The bot type selected is not valid.') } - try{ + if (clone.mode === LIVE && !isDefined(clone.keyId)) { + throw new WrongArgumentsError('The key was not provided to run the clone in Live mode.') + } + + try { let team = await teamQuery(context.authorization, clone.teamId) clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) - clone.createDatetime = new Date().valueOf() / 1000|0 + clone.createDatetime = new Date().valueOf() / 1000 | 0 clone.active = true - logger.debug('addClone -> Creating a new clone.') let newClone = new Clone(clone) newClone.authId = context.userId clone.id = newClone._id - await createKubernetesClone(clone) - return new Promise((resolve, reject) => { - newClone.save((err) => { - if (err){ - logger.error('addClone -> Error: %s', err.stack) - reject('There has been an error storing the clone.') - } - else { - //TODO transaction on database - logger.debug('addClone -> Save clone sucessful.') - resolve(newClone) - } - }) - }) - } catch(err) { + logger.debug('addClone -> Creating the clone on the Database.') + let savedClone = await newClone.save() + + if (clone.mode === LIVE) { + logger.debug('addClone -> Authorizing clone to use the key.') + let response = await authorizeClone(context.authorization, clone.keyId, clone.id, false) + logger.debug('addClone -> Authorizing clone to use the key.') + if (response.data.data.keyVault_AuthorizeClone === clone.keyId) { + await createKubernetesClone(clone) + } else { + throw new AutorizationError() + } + } + logger.debug('addClone -> Clone created sucessfully.') + return savedClone + } catch (err) { logger.error('addClone -> Error: %s', err.stack) throw new OperationsError('There has been an error creating the clone.') } diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index 2efa137c0..32f33c3c3 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -40,6 +40,9 @@ const resolve = async (parent, { id }, context) => { let team = await teamQuery(context.authorization, clone.teamId) clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) + logger.debug('removeClone -> Release the clone key.') + await authorizeClone(context.authorization, clone.keyId, clone.id, true) + logger.debug('removeClone -> Removing Clone from Kubernates.') await removeKuberneteClone(clone) diff --git a/server/src/schema/mutations/UpdateExecutionSummary.js b/server/src/schema/mutations/UpdateExecutionSummary.js index 1c889198d..4e46d5f91 100644 --- a/server/src/schema/mutations/UpdateExecutionSummary.js +++ b/server/src/schema/mutations/UpdateExecutionSummary.js @@ -13,6 +13,7 @@ import { import { Clone } from '../../models' import logger from '../../config/logger' import teamQuery from '../../graphQLCalls/teamQuery' +import authorizeClone from '../../graphQLCalls/authorizeClone' import cloneDetails from '../cloneDetails' import removeKuberneteClone from '../../kubernetes/removeClone' import { isDefined } from '../../config/utils' @@ -55,9 +56,6 @@ const resolve = async (parent, let team = await teamQuery(context.authorization, clone.teamId) clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) - logger.debug('UpdateExecutionSummary -> Removing Clone from Kubernates.') - await removeKuberneteClone(clone) - const query = { _id: id } const options = { new: true } const update = { diff --git a/server/src/schema/queries/GetClones.js b/server/src/schema/queries/GetClones.js index 7125edc7b..020b02474 100644 --- a/server/src/schema/queries/GetClones.js +++ b/server/src/schema/queries/GetClones.js @@ -18,7 +18,7 @@ const args = { } const resolve = async(parent, { cloneIdList }, context) => { - logger.debug('Get Clones -> Entering Fuction. %j', cloneIdList) + logger.debug('Get Clones -> Entering Fuction.') try{ let clones = [] for (var i = 0; i < cloneIdList.length; i++) { @@ -44,7 +44,6 @@ const resolve = async(parent, { cloneIdList }, context) => { id: cloneIdList[i] }) } - } return clones diff --git a/server/src/schema/types/CloneType.js b/server/src/schema/types/CloneType.js index dfcd10a68..e06819625 100644 --- a/server/src/schema/types/CloneType.js +++ b/server/src/schema/types/CloneType.js @@ -37,7 +37,8 @@ const CloneType = new GraphQLObjectType({ teamName: {type: GraphQLString}, botName: {type: GraphQLString}, botAvatar: {type: GraphQLString}, - teamAvatar: {type: GraphQLString} + teamAvatar: {type: GraphQLString}, + keyId: {type: GraphQLString} }) }) export default CloneType diff --git a/server/src/schema/types/input/Clone.js b/server/src/schema/types/input/Clone.js index a4a6d95ec..8b40dd2ce 100644 --- a/server/src/schema/types/input/Clone.js +++ b/server/src/schema/types/input/Clone.js @@ -23,7 +23,8 @@ const Type = new GraphQLInputObjectType({ month: { type: GraphQLInt }, interval: { type: GraphQLInt }, processName: { type: new GraphQLNonNull(GraphQLString) }, - botType: { type: new GraphQLNonNull(GraphQLString) } + botType: { type: new GraphQLNonNull(GraphQLString) }, + keyId: { type: GraphQLString } }) }); From 4ce8cde5b0422d48d5cd46d8efb096818c352412 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 14 Feb 2019 11:22:27 -0300 Subject: [PATCH 02/42] Fixing code scan issues. --- .gitignore | 2 + client/package-lock.json | 2 +- client/src/index.js | 4 +- client/src/views/Clone/Add/index.js | 9 +- client/src/views/Clone/History/index.js | 4 - client/src/views/Clone/List/CloneDialog.js | 5 +- client/src/views/Clone/List/ListClones.js | 8 +- client/src/views/Clone/List/index.js | 4 - client/src/views/Clone/List/styles.js | 1 - client/src/views/Home.js | 5 +- server/src/errors/index.js | 2 - server/src/kubernetes/createClone.js | 143 +++++++++--------- server/src/kubernetes/removeClone.js | 16 +- .../src/schema/mutations/AddCloneMutation.js | 4 +- .../schema/mutations/RemoveCloneMutation.js | 4 +- .../mutations/UpdateExecutionSummary.js | 23 ++- server/src/schema/queries/GetClones.js | 4 +- server/src/schema/queries/HistoryClones.js | 6 +- server/src/schema/queries/ListClones.js | 4 +- 19 files changed, 106 insertions(+), 144 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..66374a65a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# See https://help.github.com/ignore-files/ for more about ignoring files. +.scannerwork diff --git a/client/package-lock.json b/client/package-lock.json index 7ada4ee5a..8a42f92c0 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.13", + "version": "0.0.14", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/client/src/index.js b/client/src/index.js index fbec00c0c..dbc3944b5 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -1,9 +1,7 @@ -import React, { Component } from 'react' +import React from 'react' import { Route, Switch } from 'react-router-dom' - import { MuiPickersUtilsProvider } from 'material-ui-pickers' import LuxonUtils from 'material-ui-pickers/utils/luxon-utils' - import BrowseClones from './views/Clone/List' import HistoryClones from './views/Clone/History' import AddClone from './views/Clone/Add' diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 15bda776f..341634773 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -2,24 +2,17 @@ import React, { Component } from 'react' import { graphql, compose, Query } from 'react-apollo' import { clones, teams, keys } from '../../../GraphQL/Calls' import { DateTime } from 'luxon'; - import TopBar from '../../BannerTopBar' - import { withStyles } from '@material-ui/core/styles' import classNames from 'classnames' import styles from './styles' - -import { tradingStartModes, indicatorStartModes, availableMonths, processNames } from '../../../GraphQL/models' +import { tradingStartModes, indicatorStartModes, availableMonths } from '../../../GraphQL/models' import { isDefined, getIndicatorYears } from '../../../utils' - import { MenuItem, Button, TextField, FormControl, InputLabel, Input, Typography, Paper, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, Select, FormControlLabel, Checkbox, FormHelperText } from '@material-ui/core' - -import NumberFormat from 'react-number-format' - import { DateTimePicker } from 'material-ui-pickers' import { ChevronLeft, diff --git a/client/src/views/Clone/History/index.js b/client/src/views/Clone/History/index.js index 7a1c103e3..396a7b1b4 100644 --- a/client/src/views/Clone/History/index.js +++ b/client/src/views/Clone/History/index.js @@ -2,12 +2,8 @@ import React, { Component } from 'react' import { graphql } from 'react-apollo' import { clones } from '../../../GraphQL/Calls' import TopBar from '../../BannerTopBar' -//import CloneDialog from './CloneDialog' import ListClones from '../List/ListClones' -// Material-ui -import { Typography, Paper } from '@material-ui/core' - class HistoryClones extends Component { constructor (props) { diff --git a/client/src/views/Clone/List/CloneDialog.js b/client/src/views/Clone/List/CloneDialog.js index 46525d2c1..90998f09a 100644 --- a/client/src/views/Clone/List/CloneDialog.js +++ b/client/src/views/Clone/List/CloneDialog.js @@ -1,12 +1,9 @@ import React, { Component } from 'react' import AddClone from './AddClone' - -import AddIcon from '@material-ui/icons/Add' import { withStyles } from '@material-ui/core/styles' import styles from './styles' - import { - Button, Dialog, DialogContent, DialogContentText, DialogTitle, Paper, Typography + Button, Dialog, DialogContent, DialogContentText, DialogTitle } from '@material-ui/core' class CloneDialog extends Component { diff --git a/client/src/views/Clone/List/ListClones.js b/client/src/views/Clone/List/ListClones.js index 7eea28c18..b9c577826 100644 --- a/client/src/views/Clone/List/ListClones.js +++ b/client/src/views/Clone/List/ListClones.js @@ -1,19 +1,15 @@ import React, { Component } from 'react' import { graphql, compose } from 'react-apollo' import { clones } from '../../../GraphQL/Calls' -import Poloniex from '../../../img/poloniex.png' -import Binance from '../../../img/binance.png' - import { - Grid, Paper, Typography, Button, TextField, Dialog, DialogContent, + Typography, Button, TextField, Dialog, DialogContent, DialogContentText, DialogTitle, DialogActions, ExpansionPanel, ExpansionPanelDetails, ExpansionPanelSummary, - ExpansionPanelActions, Chip, Divider + ExpansionPanelActions, Divider } from '@material-ui/core' import Avatar from '@material-ui/core/Avatar'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; - import { tradingStartModes, indicatorStartModes } from '../../../GraphQL/models' import { isDefined, toLocalTime } from '../../../utils' import classNames from 'classnames' diff --git a/client/src/views/Clone/List/index.js b/client/src/views/Clone/List/index.js index 8b601e92e..6df628fa4 100644 --- a/client/src/views/Clone/List/index.js +++ b/client/src/views/Clone/List/index.js @@ -2,12 +2,8 @@ import React, { Component } from 'react' import { graphql } from 'react-apollo' import { clones } from '../../../GraphQL/Calls' import TopBar from '../../BannerTopBar' -//import CloneDialog from './CloneDialog' import ListClones from './ListClones' -// Material-ui -import { Typography, Paper } from '@material-ui/core' - class BrowseClones extends Component { constructor (props) { diff --git a/client/src/views/Clone/List/styles.js b/client/src/views/Clone/List/styles.js index f2c33d236..1e7adc606 100644 --- a/client/src/views/Clone/List/styles.js +++ b/client/src/views/Clone/List/styles.js @@ -32,7 +32,6 @@ const styles = theme => ({ marginRight: theme.spacing.unit, }, textArea: { - width:'1750px', margin: theme.spacing.unit, whiteSpace: 'pre', width:'98%', diff --git a/client/src/views/Home.js b/client/src/views/Home.js index 766c931a2..6b4d9aaec 100644 --- a/client/src/views/Home.js +++ b/client/src/views/Home.js @@ -1,6 +1,5 @@ import React, { Component } from 'react' import { Typography } from '@material-ui/core' -import { withStyles } from '@material-ui/core/styles' import TopBar from './BannerTopBar' class Home extends Component { @@ -29,9 +28,7 @@ class Home extends Component {
- - - +
diff --git a/server/src/errors/index.js b/server/src/errors/index.js index 74e7c36ff..0a2f6ad14 100644 --- a/server/src/errors/index.js +++ b/server/src/errors/index.js @@ -1,5 +1,3 @@ -import logger from '../config/logger' - export class AuthentificationError extends Error { code = 401 message = 'Autentification not found, you have to be authentificated to perform this action.' diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 78e03c181..3ea956ad1 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -2,143 +2,142 @@ import logger from '../config/logger' import { toPlatformDatetime, isDefined } from '../config/utils' import { KubernateError } from '../errors' import { Client, config } from 'kubernetes-client' -// Get base Deployment config import deploymentManifest from '../config/clone-deployment.json' import { BACKTEST, NO_TIME } from '../enums/CloneMode' import { TRADER, INDICATOR, EXTRACTION } from '../enums/BotTypes' const createClone = async (clone) => { try { - logger.debug("createClone %s", clone.id) + logger.debug('createClone %s', clone.id) const client = new Client({config: config.fromKubeconfig(), version: '1.9'}) // Make changes to base deployment config deploymentManifest.metadata.name = clone.id - logger.debug("createClone Environment and Auth Configuration.") + logger.debug('createClone Environment and Auth Configuration.') let env = [] env.push({ - "name": "PLATFORM_ENVIRONMENT", - "value": process.env.PLATFORM_ENVIRONMENT + 'name': 'PLATFORM_ENVIRONMENT', + 'value': process.env.PLATFORM_ENVIRONMENT }) env.push({ - "name": "GATEWAY_ENDPOINT", - "value": process.env.GATEWAY_ENDPOINT + 'name': 'GATEWAY_ENDPOINT', + 'value': process.env.GATEWAY_ENDPOINT }) env.push({ - "name": "STORAGE_BASE_URL", - "value": process.env.STORAGE_BASE_URL + 'name': 'STORAGE_BASE_URL', + 'value': process.env.STORAGE_BASE_URL }) env.push({ - "name": "STORAGE_CONNECTION_STRING", - "value": process.env.STORAGE_CONNECTION_STRING + 'name': 'STORAGE_CONNECTION_STRING', + 'value': process.env.STORAGE_CONNECTION_STRING }) env.push({ - "name": "AUTH_URL", - "value": process.env.AUTH_URL + 'name': 'AUTH_URL', + 'value': process.env.AUTH_URL }) env.push({ - "name": "AUTH_CLIENT_ID", - "value": process.env.AUTH_CLIENT_ID + 'name': 'AUTH_CLIENT_ID', + 'value': process.env.AUTH_CLIENT_ID }) env.push({ - "name": "AUTH_CLIENT_SECRET", - "value": process.env.AUTH_CLIENT_SECRET + 'name': 'AUTH_CLIENT_SECRET', + 'value': process.env.AUTH_CLIENT_SECRET }) env.push({ - "name": "AUTH_AUDIENCE", - "value": process.env.AUTH_AUDIENCE + 'name': 'AUTH_AUDIENCE', + 'value': process.env.AUTH_AUDIENCE }) - logger.debug("createClone General Financial Being Configuration.") + logger.debug('createClone General Financial Being Configuration.') env.push({ - "name": "DEV_TEAM", - "value": clone.teamSlug + 'name': 'DEV_TEAM', + 'value': clone.teamSlug }) env.push({ - "name": "BOT", - "value": clone.botSlug + 'name': 'BOT', + 'value': clone.botSlug }) env.push({ - "name": "TYPE", - "value": clone.botType + 'name': 'TYPE', + 'value': clone.botType }) env.push({ - "name": "CLONE_ID", - "value": clone.id.toString() + 'name': 'CLONE_ID', + 'value': clone.id.toString() }) env.push({ - "name": "START_MODE", - "value": clone.mode + 'name': 'START_MODE', + 'value': clone.mode }) env.push({ - "name": "RUN_AS_TEAM", - "value": clone.runAsTeam.toString() + 'name': 'RUN_AS_TEAM', + 'value': clone.runAsTeam.toString() }) env.push({ - "name": "USER_LOGGED_IN", - "value": clone.userLoggedIn + 'name': 'USER_LOGGED_IN', + 'value': clone.userLoggedIn }) env.push({ - "name": "PROCESS", - "value": clone.processName + 'name': 'PROCESS', + 'value': clone.processName }) - logger.debug("createClone Trading Configuration.") - if(clone.botType === TRADER ){ + logger.debug('createClone Trading Configuration.') + if (clone.botType === TRADER) { env.push({ - "name": "RESUME_EXECUTION", - "value": clone.resumeExecution.toString() + 'name': 'RESUME_EXECUTION', + 'value': clone.resumeExecution.toString() }) - if(clone.mode === BACKTEST){ + if (clone.mode === BACKTEST) { env.push({ - "name": "BEGIN_DATE_TIME", - "value": toPlatformDatetime(clone.beginDatetime) + 'name': 'BEGIN_DATE_TIME', + 'value': toPlatformDatetime(clone.beginDatetime) }) env.push({ - "name": "END_DATE_TIME", - "value": toPlatformDatetime(clone.endDatetime) + 'name': 'END_DATE_TIME', + 'value': toPlatformDatetime(clone.endDatetime) }) env.push({ - "name": "WAIT_TIME", - "value": clone.waitTime.toString() + 'name': 'WAIT_TIME', + 'value': clone.waitTime.toString() }) - } else{ + } else { env.push({ - "name": "KEY_ID", - "value": clone.keyId + 'name': 'KEY_ID', + 'value': clone.keyId + }) + } + } else if (clone.botType === INDICATOR || clone.botType === EXTRACTION) { + if (clone.mode !== NO_TIME) { + env.push({ + 'name': 'MIN_YEAR', + 'value': isDefined(clone.startYear) ? clone.startYear.toString() : '' + }) + env.push({ + 'name': 'MAX_YEAR', + 'value': isDefined(clone.endYear) ? clone.endYear.toString() : '' + }) + env.push({ + 'name': 'MONTH', + 'value': isDefined(clone.month) ? clone.month.toString() : '' + }) + env.push({ + 'name': 'INTERVAL', + 'value': isDefined(clone.interval) ? clone.interval.toString() : '' }) } - } else if(clone.botType === INDICATOR || clone.botType === EXTRACTION ){ - if(clone.mode !== NO_TIME){ - env.push({ - "name": "MIN_YEAR", - "value": isDefined(clone.startYear) ? clone.startYear.toString() : '' - }) - env.push({ - "name": "MAX_YEAR", - "value": isDefined(clone.endYear) ? clone.endYear.toString() : '' - }) - env.push({ - "name": "MONTH", - "value": isDefined(clone.month) ? clone.month.toString() : '' - }) - env.push({ - "name": "INTERVAL", - "value": isDefined(clone.interval) ? clone.interval.toString() : '' - }) - } } deploymentManifest.spec.template.spec.containers[0].env = env - const create = await client.apis.batch.v1.namespaces('default').jobs.post( + await client.apis.batch.v1.namespaces('default').jobs.post( { body: deploymentManifest }) - logger.debug("createClone %s on Kubernates success.", clone.id) + logger.debug('createClone %s on Kubernates success.', clone.id) } catch (err) { - throw new KubernateError(err) + throw new KubernateError(err) } } export default createClone diff --git a/server/src/kubernetes/removeClone.js b/server/src/kubernetes/removeClone.js index 5af470b47..8bac6a3fa 100644 --- a/server/src/kubernetes/removeClone.js +++ b/server/src/kubernetes/removeClone.js @@ -4,25 +4,23 @@ import { Client, config } from 'kubernetes-client' const removeClone = async (clone) => { try { - logger.debug("removeClone %s", clone.id) + logger.debug('removeClone %s', clone.id) const client = new Client({config: config.fromKubeconfig(), version: '1.9'}) let query = { - "qs":{ - "labelSelector": "job-name=" + clone.id + 'qs': { + 'labelSelector': 'job-name=' + clone.id } } - const removed = await client.apis.batch.v1.namespaces('default').jobs( - clone.id).delete() + await client.apis.batch.v1.namespaces('default').jobs(clone.id).delete() const pod = await client.api.v1.namespaces('default').pods.get(query) - const podRemoved = await client.api.v1.namespaces('default') - .pods(pod.body.items[0].metadata.name).delete() + await client.api.v1.namespaces('default').pods(pod.body.items[0].metadata.name).delete() - logger.debug("removeClone %s on kubernates succesful", clone.id) + logger.debug('removeClone %s on kubernates succesful', clone.id) } catch (err) { - throw new KubernateError(err) + throw new KubernateError(err) } } export default removeClone diff --git a/server/src/schema/mutations/AddCloneMutation.js b/server/src/schema/mutations/AddCloneMutation.js index 072c4f8df..f41ee11e5 100644 --- a/server/src/schema/mutations/AddCloneMutation.js +++ b/server/src/schema/mutations/AddCloneMutation.js @@ -73,7 +73,7 @@ const resolve = async(parent, { clone }, context) => { } } -const mutation = { +const AddCloneMutation = { addClone: { type: CloneType, args, @@ -81,4 +81,4 @@ const mutation = { } } -export default mutation +export default AddCloneMutation diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index 32f33c3c3..c4509399f 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -64,7 +64,7 @@ const resolve = async (parent, { id }, context) => { }) } -const mutation = { +const RemoveCloneMutation = { removeClone: { type: GraphQLString, args, @@ -72,4 +72,4 @@ const mutation = { } } -export default mutation +export default RemoveCloneMutation diff --git a/server/src/schema/mutations/UpdateExecutionSummary.js b/server/src/schema/mutations/UpdateExecutionSummary.js index 4e46d5f91..c3210c084 100644 --- a/server/src/schema/mutations/UpdateExecutionSummary.js +++ b/server/src/schema/mutations/UpdateExecutionSummary.js @@ -5,17 +5,13 @@ import { GraphQLInt, GraphQLFloat } from 'graphql' - import { OperationsError } from '../../errors' - import { Clone } from '../../models' import logger from '../../config/logger' import teamQuery from '../../graphQLCalls/teamQuery' -import authorizeClone from '../../graphQLCalls/authorizeClone' import cloneDetails from '../cloneDetails' -import removeKuberneteClone from '../../kubernetes/removeClone' import { isDefined } from '../../config/utils' const args = { @@ -34,23 +30,22 @@ const resolve = async (parent, { id, summaryDate, buyAverage, sellAverage, marketRate, combinedProfitsA, combinedProfitsB, assetA, assetB }, context) => { - logger.debug('UpdateExecutionSummary -> Entering Function.') if (!context.userId) { throw new AuthentificationError() } - try{ + try { let sucessful - let clone = await Clone.findOne( { + let clone = await Clone.findOne({ _id: id, active: true }) - if(!isDefined(clone)){ - return "Clone not found." + if (!isDefined(clone)) { + return 'Clone not found.' } let team = await teamQuery(context.authorization, clone.teamId) @@ -72,7 +67,7 @@ const resolve = async (parent, logger.debug('UpdateExecutionSummary -> Updating clone on database.') await Clone.update(query, update, options, (err, clone) => { - if (err){ + if (err) { logger.error('Error updating execution summary on the database. %s', err.stack) throw err } else { @@ -81,16 +76,16 @@ const resolve = async (parent, } }) - if(sucessful) + if (sucessful) { return 'Execution summary updated.' - + } } catch (error) { logger.error('Error updating the execution summary. %s', error.stack) throw new OperationsError(error.message) } } -const mutation = { +const UpdateExecutionSummary = { updateExecutionSummary: { type: GraphQLString, args, @@ -98,4 +93,4 @@ const mutation = { } } -export default mutation +export default UpdateExecutionSummary diff --git a/server/src/schema/queries/GetClones.js b/server/src/schema/queries/GetClones.js index 020b02474..f4902273f 100644 --- a/server/src/schema/queries/GetClones.js +++ b/server/src/schema/queries/GetClones.js @@ -53,7 +53,7 @@ const resolve = async(parent, { cloneIdList }, context) => { } } -const query = { +const GetClones = { getClones: { type: new GraphQLList(GetClonesType), args, @@ -61,4 +61,4 @@ const query = { } } -export default query +export default GetClones diff --git a/server/src/schema/queries/HistoryClones.js b/server/src/schema/queries/HistoryClones.js index bdf853f3c..081457f3b 100644 --- a/server/src/schema/queries/HistoryClones.js +++ b/server/src/schema/queries/HistoryClones.js @@ -10,8 +10,6 @@ import { import { CloneType } from '../types' import { Clone } from '../../models' import logger from '../../config/logger' -import getKuberneteClonePodStatus from '../../kubernetes/getClonePodStatus' -import getKuberneteClonePodLogs from '../../kubernetes/getClonePodLogs' import cloneDetails from '../cloneDetails' import teamQuery from '../../graphQLCalls/teamQuery' @@ -42,7 +40,7 @@ const resolve = async(parent, args, context) => { } } -const query = { +const HistoryClones = { historyClones: { type: new GraphQLList(CloneType), args, @@ -50,4 +48,4 @@ const query = { } } -export default query +export default HistoryClones diff --git a/server/src/schema/queries/ListClones.js b/server/src/schema/queries/ListClones.js index 9e80b9aec..b44458cf3 100644 --- a/server/src/schema/queries/ListClones.js +++ b/server/src/schema/queries/ListClones.js @@ -45,7 +45,7 @@ const resolve = async(parent, args, context) => { } } -const query = { +const ListClones = { clones: { type: new GraphQLList(CloneType), args, @@ -53,4 +53,4 @@ const query = { } } -export default query +export default ListClones From 37028e34ad48bc89fca2935c60faedbd6f77cc29 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 14 Feb 2019 12:36:43 -0300 Subject: [PATCH 03/42] Standard Format Code Changes --- client/src/GraphQL/Calls/clones.js | 14 ++-- client/src/GraphQL/Calls/index.js | 8 +-- client/src/GraphQL/Calls/keys.js | 4 +- client/src/GraphQL/Calls/teams.js | 4 +- client/src/GraphQL/Fragments/clone.js | 4 +- client/src/GraphQL/Fragments/index.js | 3 +- client/src/GraphQL/index.js | 1 - client/src/GraphQL/models.js | 18 +++-- client/src/utils/index.js | 6 +- client/src/views/Clone/Add/index.js | 5 +- client/src/views/Clone/Add/styles.js | 10 +-- client/src/views/Clone/History/index.js | 2 +- client/src/views/Clone/List/styles.js | 38 +++++------ server/src/enums/CloneMode.js | 1 - server/src/graphQLCalls/teamQuery.js | 6 +- server/src/index.js | 8 +-- server/src/kubernetes/createClone.js | 2 - server/src/kubernetes/getClonePodLogs.js | 14 ++-- server/src/kubernetes/getClonePodStatus.js | 10 +-- server/src/models/clone.js | 24 +++---- server/src/schema/cloneDetails.js | 20 +++--- server/src/schema/index.js | 5 +- .../src/schema/mutations/AddCloneMutation.js | 2 - .../schema/mutations/RemoveCloneMutation.js | 21 ++---- .../mutations/UpdateExecutionSummary.js | 4 +- server/src/schema/mutations/index.js | 5 +- server/src/schema/queries/GetClones.js | 66 ++++++++----------- server/src/schema/queries/HistoryClones.js | 41 +++++------- server/src/schema/queries/ListClones.js | 41 +++++------- server/src/schema/queries/index.js | 5 +- server/src/schema/types/GetClonesType.js | 5 +- server/src/schema/types/input/Clone.js | 8 +-- server/src/schema/types/input/index.js | 2 +- 33 files changed, 175 insertions(+), 232 deletions(-) delete mode 100644 client/src/GraphQL/index.js diff --git a/client/src/GraphQL/Calls/clones.js b/client/src/GraphQL/Calls/clones.js index cf6c8d7b8..7d4c1aff6 100644 --- a/client/src/GraphQL/Calls/clones.js +++ b/client/src/GraphQL/Calls/clones.js @@ -1,5 +1,5 @@ -import gql from 'graphql-tag'; -import { clone } from '../Fragments'; +import gql from 'graphql-tag' +import { clone } from '../Fragments' const OPERATIONS_ADD_CLONE = gql` mutation Operations_AddClone($clone: operations_CloneInput!) { @@ -8,7 +8,7 @@ const OPERATIONS_ADD_CLONE = gql` } } ${clone} -`; +` const OPERATIONS_LIST_CLONES = gql` query Operations_Clones{ @@ -17,7 +17,7 @@ const OPERATIONS_LIST_CLONES = gql` } } ${clone} -`; +` const OPERATIONS_HISTORY_CLONES = gql` query Operations_HistoryClones{ @@ -26,17 +26,17 @@ const OPERATIONS_HISTORY_CLONES = gql` } } ${clone} -`; +` const OPERATIONS_REMOVE_CLONE = gql` mutation Operations_RemoveClone($id: ID!){ operations_RemoveClone( id: $id) } -`; +` export default { OPERATIONS_LIST_CLONES, OPERATIONS_HISTORY_CLONES, OPERATIONS_ADD_CLONE, OPERATIONS_REMOVE_CLONE -}; +} diff --git a/client/src/GraphQL/Calls/index.js b/client/src/GraphQL/Calls/index.js index 7f1d17294..619c6f158 100644 --- a/client/src/GraphQL/Calls/index.js +++ b/client/src/GraphQL/Calls/index.js @@ -1,9 +1,9 @@ -import clones from './clones'; -import teams from './teams'; -import keys from './keys'; +import clones from './clones' +import teams from './teams' +import keys from './keys' export { clones, teams, keys -}; +} diff --git a/client/src/GraphQL/Calls/keys.js b/client/src/GraphQL/Calls/keys.js index 97bd6b26f..0f6e8006a 100644 --- a/client/src/GraphQL/Calls/keys.js +++ b/client/src/GraphQL/Calls/keys.js @@ -1,4 +1,4 @@ -import gql from 'graphql-tag'; +import gql from 'graphql-tag' export const GET_ALL_KEYS = gql` query { @@ -12,4 +12,4 @@ export const GET_ALL_KEYS = gql` export default { GET_ALL_KEYS -}; +} diff --git a/client/src/GraphQL/Calls/teams.js b/client/src/GraphQL/Calls/teams.js index 0a27afd3c..2785ede48 100644 --- a/client/src/GraphQL/Calls/teams.js +++ b/client/src/GraphQL/Calls/teams.js @@ -1,4 +1,4 @@ -import gql from 'graphql-tag'; +import gql from 'graphql-tag' export const GET_ALL_TEAMS_QUERY = gql` query { @@ -18,4 +18,4 @@ export const GET_ALL_TEAMS_QUERY = gql` export default { GET_ALL_TEAMS_QUERY -}; +} diff --git a/client/src/GraphQL/Fragments/clone.js b/client/src/GraphQL/Fragments/clone.js index 6993b966b..75a5f9dbc 100644 --- a/client/src/GraphQL/Fragments/clone.js +++ b/client/src/GraphQL/Fragments/clone.js @@ -1,4 +1,4 @@ -import gql from 'graphql-tag'; +import gql from 'graphql-tag' export const clone = gql` fragment clone on operations_Clone { @@ -32,4 +32,4 @@ export const clone = gql` processName keyId } -`; +` diff --git a/client/src/GraphQL/Fragments/index.js b/client/src/GraphQL/Fragments/index.js index 2ee040281..d916b776d 100644 --- a/client/src/GraphQL/Fragments/index.js +++ b/client/src/GraphQL/Fragments/index.js @@ -1,6 +1,5 @@ import { clone } from './clone' - export { clone -}; +} diff --git a/client/src/GraphQL/index.js b/client/src/GraphQL/index.js deleted file mode 100644 index 8b1378917..000000000 --- a/client/src/GraphQL/index.js +++ /dev/null @@ -1 +0,0 @@ - diff --git a/client/src/GraphQL/models.js b/client/src/GraphQL/models.js index 82f6c331e..47c7e6dfb 100644 --- a/client/src/GraphQL/models.js +++ b/client/src/GraphQL/models.js @@ -1,15 +1,15 @@ -const availableMonths = ["January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"] +const availableMonths = ['January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December'] -const tradingStartModes ={ - live: "Live", - backtest: "Backtest" +const tradingStartModes = { + live: 'Live', + backtest: 'Backtest' } const indicatorStartModes = { - allMonths: "All Months", - oneMonth: "One Month", - noTime: "No Time" + allMonths: 'All Months', + oneMonth: 'One Month', + noTime: 'No Time' } const exchanges = [ @@ -19,6 +19,4 @@ const exchanges = [ } ] - - export { tradingStartModes, exchanges, indicatorStartModes, availableMonths } diff --git a/client/src/utils/index.js b/client/src/utils/index.js index e5e223f3c..a12aa4fa9 100644 --- a/client/src/utils/index.js +++ b/client/src/utils/index.js @@ -10,13 +10,13 @@ export function toLocalTime (epoch) { } export function toUTCTimestamp (localDate) { - if(isDefined(localDate)){ + if (isDefined(localDate)) { const date = new Date(localDate.valueOf()) const utcDate = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()) - return utcDate.valueOf() / 1000|0 + return utcDate.valueOf() / 1000 | 0 } } @@ -77,7 +77,7 @@ export function getIndicatorYears () { const localDate = new Date() let availableYears = [] for (var i = 2015; i <= localDate.getUTCFullYear(); i++) { - availableYears[i-2015] = i + availableYears[i - 2015] = i } return availableYears } diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 341634773..361f5ee43 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -14,10 +14,7 @@ import { Select, FormControlLabel, Checkbox, FormHelperText } from '@material-ui/core' import { DateTimePicker } from 'material-ui-pickers' -import { - ChevronLeft, - ChevronRight, -} from '@material-ui/icons' +import { ChevronLeft, ChevronRight } from '@material-ui/icons' class AddClone extends Component { diff --git a/client/src/views/Clone/Add/styles.js b/client/src/views/Clone/Add/styles.js index c9339ec38..2d831d291 100644 --- a/client/src/views/Clone/Add/styles.js +++ b/client/src/views/Clone/Add/styles.js @@ -14,7 +14,7 @@ const styles = theme => ({ }, textField: { width: '80%', - marginLeft:'10%', + marginLeft: '10%', marginBottom: 10 }, actionButton: { @@ -30,8 +30,8 @@ const styles = theme => ({ marginTop: 20 }, selectEmpty: { - marginTop: theme.spacing.unit * 2, - }, -}); + marginTop: theme.spacing.unit * 2 + } +}) -export default styles; +export default styles diff --git a/client/src/views/Clone/History/index.js b/client/src/views/Clone/History/index.js index 396a7b1b4..4ccaed243 100644 --- a/client/src/views/Clone/History/index.js +++ b/client/src/views/Clone/History/index.js @@ -40,7 +40,7 @@ class HistoryClones extends Component { { data.operations_HistoryClones.map((clone, i) => { return ( - + ) }) } diff --git a/client/src/views/Clone/List/styles.js b/client/src/views/Clone/List/styles.js index 1e7adc606..f7e1b1135 100644 --- a/client/src/views/Clone/List/styles.js +++ b/client/src/views/Clone/List/styles.js @@ -17,26 +17,26 @@ const styles = theme => ({ }, buttonList: { margin: theme.spacing.unit, - float: 'right', + float: 'right' }, buttonGrid: { - marginTop: -20, + marginTop: -20 }, button: { display: 'block', marginLeft: 'auto', - marginRight: 'auto', + marginRight: 'auto' }, textField: { marginLeft: theme.spacing.unit, - marginRight: theme.spacing.unit, + marginRight: theme.spacing.unit }, textArea: { margin: theme.spacing.unit, whiteSpace: 'pre', - width:'98%', - overflowY:'hidden', - overflowX:'hidden' + width: '98%', + overflowY: 'hidden', + overflowX: 'hidden' }, heading: { fontSize: theme.typography.pxToRem(18), @@ -49,15 +49,15 @@ const styles = theme => ({ }, helper: { borderLeft: `2px solid ${theme.palette.divider}`, - padding: `0px ${theme.spacing.unit * 2}px`, + padding: `0px ${theme.spacing.unit * 2}px` }, - logsWrapper:{ - width:'1750px', - overflowY:'auto', - overflowX:'hidden' + logsWrapper: { + width: '1750px', + overflowY: 'auto', + overflowX: 'hidden' }, - details:{ - display:'flex' + details: { + display: 'flex' }, column2: { flexBasis: '50%', @@ -67,23 +67,23 @@ const styles = theme => ({ flexBasis: '33.33%', maxWidth: '33.33%' }, - cloneInfoTitle:{ + cloneInfoTitle: { fontWeight: '600', flexBasis: '100%', maxWidth: '100%' }, - cloneInfoBold:{ + cloneInfoBold: { fontWeight: '600', paddingLeft: '10px', paddingTop: '10px' }, - cloneInfoNormal:{ + cloneInfoNormal: { paddingLeft: '10px', paddingTop: '10px' }, avatar: { - margin: 10, - }, + margin: 10 + } }) export default styles diff --git a/server/src/enums/CloneMode.js b/server/src/enums/CloneMode.js index 0a463100f..fcf46ab0c 100644 --- a/server/src/enums/CloneMode.js +++ b/server/src/enums/CloneMode.js @@ -6,7 +6,6 @@ export const ONE_MONTH = 'oneMonth' export const NO_TIME = 'noTime' export const FIXED_INTERVAL = 'fixedInterval' - export const CloneModeEnum = [ LIVE, BACKTEST, diff --git a/server/src/graphQLCalls/teamQuery.js b/server/src/graphQLCalls/teamQuery.js index d5c3e32c4..b38833ee5 100644 --- a/server/src/graphQLCalls/teamQuery.js +++ b/server/src/graphQLCalls/teamQuery.js @@ -34,13 +34,13 @@ const teamQuery = (authorization, teamId) => { } `, variables: { - teamId: teamId - } + teamId: teamId + } }, headers: { authorization: authorization } }) -}; +} export default teamQuery diff --git a/server/src/index.js b/server/src/index.js index 02cdaa6fd..4d3e7c7a4 100644 --- a/server/src/index.js +++ b/server/src/index.js @@ -5,17 +5,17 @@ import schema from './schema' import mongoose from 'mongoose' import cors from 'cors' import logger from './config/logger' -import wrongPreshared from './errors/notAllowed.json'; +import wrongPreshared from './errors/notAllowed.json' const app = express() app.post('/graphql', (req, res, next) => { if (req.headers.preshared === process.env.OPERATIONS_API_PRESHARED) { - next(); + next() } else { - res.send(wrongPreshared); + res.send(wrongPreshared) } -}); +}) // Allow cross origing request app.use(cors()) diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 3ea956ad1..bad047b30 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -10,8 +10,6 @@ const createClone = async (clone) => { try { logger.debug('createClone %s', clone.id) const client = new Client({config: config.fromKubeconfig(), version: '1.9'}) - - // Make changes to base deployment config deploymentManifest.metadata.name = clone.id logger.debug('createClone Environment and Auth Configuration.') diff --git a/server/src/kubernetes/getClonePodLogs.js b/server/src/kubernetes/getClonePodLogs.js index 9730f300c..5367bfdd8 100644 --- a/server/src/kubernetes/getClonePodLogs.js +++ b/server/src/kubernetes/getClonePodLogs.js @@ -4,31 +4,31 @@ import { Client, config } from 'kubernetes-client' const getClonePodLogs = async (cloneName) => { try { - logger.debug("getClonePodLogs on kubernates started.") + logger.debug('getClonePodLogs on kubernates started.') const client = new Client({config: config.fromKubeconfig(), version: '1.9'}) let query = { - "qs":{ - "labelSelector": "job-name="+cloneName + 'qs': { + 'labelSelector': 'job-name=' + cloneName } } const pod = await client.api.v1.namespaces('default').pods.get(query) let queryLogs = { - "qs":{ - "tailLines": "20" + 'qs': { + 'tailLines': '20' } } const logs = await client.api.v1.namespaces('default') .pods(pod.body.items[0].metadata.name).log.get(queryLogs) let logsArray = logs.body.split('\n') - logger.debug("getClonePodLogs on kubernates successful.") + logger.debug('getClonePodLogs on kubernates successful.') return JSON.stringify(logsArray, null, 2) } catch (err) { - throw new KubernateError(err) + throw new KubernateError(err) } } export default getClonePodLogs diff --git a/server/src/kubernetes/getClonePodStatus.js b/server/src/kubernetes/getClonePodStatus.js index e0abbea96..957cf49ed 100644 --- a/server/src/kubernetes/getClonePodStatus.js +++ b/server/src/kubernetes/getClonePodStatus.js @@ -4,12 +4,12 @@ import { Client, config } from 'kubernetes-client' const getClonePodStatus = async (cloneName) => { try { - logger.debug("getClonePodStatus on kubernates started. ") + logger.debug('getClonePodStatus on kubernates started. ') const client = new Client({config: config.fromKubeconfig(), version: '1.9'}) let query = { - "qs":{ - "labelSelector": "job-name="+cloneName + 'qs': { + 'labelSelector': 'job-name=' + cloneName } } @@ -21,10 +21,10 @@ const getClonePodStatus = async (cloneName) => { && clonePodStatus.terminated.hasOwnProperty('containerID')) { delete clonePodStatus.terminated.containerID } - logger.debug("getClonePodStatus %s on kubernates successful", cloneName) + logger.debug('getClonePodStatus %s on kubernates successful', cloneName) return JSON.stringify(clonePodStatus, null, 2) } catch (err) { - throw new KubernateError(err) + throw new KubernateError(err) } } export default getClonePodStatus diff --git a/server/src/models/clone.js b/server/src/models/clone.js index d1071b4ec..d51d3a10a 100644 --- a/server/src/models/clone.js +++ b/server/src/models/clone.js @@ -2,32 +2,32 @@ import mongoose, { Schema } from 'mongoose' import { UNPUBLISHED, - CloneStateEnum, -} from '../enums/CloneState'; + CloneStateEnum +} from '../enums/CloneState' import { BACKTEST, - CloneModeEnum, -} from '../enums/CloneMode'; + CloneModeEnum +} from '../enums/CloneMode' const cloneSchema = new Schema({ authId: { type: String, - required: true, + required: true }, teamId: { - type: String, - required: true, + type: String, + required: true }, botId: { - type: String, - required: true, + type: String, + required: true }, keyId: String, mode: { type: String, enum: CloneModeEnum, - default: BACKTEST, + default: BACKTEST }, resumeExecution: Boolean, beginDatetime: Number, @@ -36,7 +36,7 @@ const cloneSchema = new Schema({ state: { type: String, enum: CloneStateEnum, - default: UNPUBLISHED, + default: UNPUBLISHED }, stateDatetime: Number, createDatetime: Number, @@ -52,7 +52,7 @@ const cloneSchema = new Schema({ assetB: String, processName: { type: String, - required: true, + required: true } }) diff --git a/server/src/schema/cloneDetails.js b/server/src/schema/cloneDetails.js index 22c10d69d..b8cab3c23 100644 --- a/server/src/schema/cloneDetails.js +++ b/server/src/schema/cloneDetails.js @@ -5,8 +5,8 @@ import { AutorizationError } from '../errors' const cloneDetails = (authId, team, clone) => { logger.debug('cloneDetails -> Entering function.') - if(!(authId === (process.env.AUTH_CLIENT_ID + '@clients') || isAuthorized(team, authId))){ - logger.debug('User %s is not authorized to manage team %s.', authId, team.slug ) + if (!(authId === (process.env.AUTH_CLIENT_ID + '@clients') || isAuthorized(team, authId))) { + logger.debug('User %s is not authorized to manage team %s.', authId, team.slug) throw new AutorizationError() } @@ -20,29 +20,29 @@ const cloneDetails = (authId, team, clone) => { clone.botName = selectedBot.name clone.botAvatar = selectedBot.avatar clone.teamAvatar = team.profile.avatar - clone.userLoggedIn = team.members[0].member.alias //TODO change by context info if possible + clone.userLoggedIn = team.members[0].member.alias // TODO change by context info if possible logger.debug('cloneDetails -> Retrieving clone details complete.') return clone -}; +} -function getSelectedBot(team, selectedBotId){ +function getSelectedBot (team, selectedBotId) { logger.debug('cloneDetails -> Getting selected bot.') - if(isDefined(team)){ + if (isDefined(team)) { for (var i = 0; i < team.fb.length; i++) { - if(team.fb[i].id === selectedBotId){ + if (team.fb[i].id === selectedBotId) { return team.fb[i] } } } } -function isAuthorized(team, authId){ +function isAuthorized (team, authId) { logger.debug('cloneDetails -> Checking if the user is authorized by the teams module.') let authorized = false - if(isDefined(team)){ + if (isDefined(team)) { for (var i = 0; i < team.members.length; i++) { - if(team.members[i].member.authId === authId){ + if (team.members[i].member.authId === authId) { authorized = true break } diff --git a/server/src/schema/index.js b/server/src/schema/index.js index 4155e4999..fe0cc23fd 100644 --- a/server/src/schema/index.js +++ b/server/src/schema/index.js @@ -1,7 +1,4 @@ -import { - GraphQLSchema -} from 'graphql' - +import { GraphQLSchema } from 'graphql' import Mutation from './mutations' import RootQuery from './queries' diff --git a/server/src/schema/mutations/AddCloneMutation.js b/server/src/schema/mutations/AddCloneMutation.js index f41ee11e5..76381ca74 100644 --- a/server/src/schema/mutations/AddCloneMutation.js +++ b/server/src/schema/mutations/AddCloneMutation.js @@ -6,14 +6,12 @@ import { BotTypesEnum } from '../../enums/BotTypes' import teamQuery from '../../graphQLCalls/teamQuery' import authorizeClone from '../../graphQLCalls/authorizeClone' import cloneDetails from '../cloneDetails' - import { AuthentificationError, WrongArgumentsError, OperationsError, AutorizationError } from '../../errors' - import logger from '../../config/logger' import createKubernetesClone from '../../kubernetes/createClone' import { isDefined } from '../../config/utils' diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index c4509399f..694f37c15 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -1,14 +1,5 @@ -import { - GraphQLNonNull, - GraphQLID, - GraphQLString -} from 'graphql' - -import { - AuthentificationError, - OperationsError -} from '../../errors' - +import { GraphQLNonNull, GraphQLID, GraphQLString } from 'graphql' +import { AuthentificationError, OperationsError } from '../../errors' import { Clone } from '../../models' import logger from '../../config/logger' import removeKuberneteClone from '../../kubernetes/removeClone' @@ -33,7 +24,7 @@ const resolve = async (parent, { id }, context) => { active: true }) - if(!isDefined(clone)){ + if (!isDefined(clone)) { throw new OperationsError('You are not authorized to remove this clone.') } @@ -54,12 +45,12 @@ const resolve = async (parent, { id }, context) => { const update = { active: false } Clone.findOneAndUpdate(query, update, options, (err, doc) => { - if (err){ + if (err) { logger.error('removeClone -> Error removing clone from the DB. %s', err.stack) throw new OperationsError(err) - }else{ + } else { logger.debug('removeClone -> Clone Removed from the DB.') - return('Clone Removed.') + return ('Clone Removed.') } }) } diff --git a/server/src/schema/mutations/UpdateExecutionSummary.js b/server/src/schema/mutations/UpdateExecutionSummary.js index c3210c084..63b2d6fb1 100644 --- a/server/src/schema/mutations/UpdateExecutionSummary.js +++ b/server/src/schema/mutations/UpdateExecutionSummary.js @@ -5,9 +5,7 @@ import { GraphQLInt, GraphQLFloat } from 'graphql' -import { - OperationsError -} from '../../errors' +import { OperationsError } from '../../errors' import { Clone } from '../../models' import logger from '../../config/logger' import teamQuery from '../../graphQLCalls/teamQuery' diff --git a/server/src/schema/mutations/index.js b/server/src/schema/mutations/index.js index b5aa00205..74c316ea8 100644 --- a/server/src/schema/mutations/index.js +++ b/server/src/schema/mutations/index.js @@ -1,7 +1,4 @@ -import { - GraphQLObjectType -} from 'graphql' - +import { GraphQLObjectType } from 'graphql' import AddCloneMutation from './AddCloneMutation' import RemoveCloneMutation from './RemoveCloneMutation' import UpdateExecutionSummary from './UpdateExecutionSummary' diff --git a/server/src/schema/queries/GetClones.js b/server/src/schema/queries/GetClones.js index f4902273f..0c6616d90 100644 --- a/server/src/schema/queries/GetClones.js +++ b/server/src/schema/queries/GetClones.js @@ -1,12 +1,5 @@ -import { - GraphQLList, - GraphQLID -} from 'graphql' - -import { - OperationsError -} from '../../errors' - +import { GraphQLList, GraphQLID } from 'graphql' +import { OperationsError } from '../../errors' import { GetClonesType } from '../types' import { Clone } from '../../models' import logger from '../../config/logger' @@ -19,38 +12,37 @@ const args = { const resolve = async(parent, { cloneIdList }, context) => { logger.debug('Get Clones -> Entering Fuction.') - try{ - let clones = [] - for (var i = 0; i < cloneIdList.length; i++) { + try { + let clones = [] + for (var i = 0; i < cloneIdList.length; i++) { + if (mongoose.Types.ObjectId.isValid(cloneIdList[i])) { + let existingClone = await Clone.findOne({ + _id: cloneIdList[i] + }) - if(mongoose.Types.ObjectId.isValid(cloneIdList[i])){ - let existingClone = await Clone.findOne({ - _id: cloneIdList[i] - }) + if (isDefined(existingClone)) { + clones.push({ + id: cloneIdList[i], + teamId: existingClone.teamId, + botId: existingClone.botId + }) + } else { + clones.push({ + id: cloneIdList[i] + }) + } + } else { + clones.push({ + id: cloneIdList[i] + }) + } + } - if(isDefined(existingClone)){ - clones.push({ - id: cloneIdList[i], - teamId: existingClone.teamId, - botId: existingClone.botId - }) - }else{ - clones.push({ - id: cloneIdList[i] - }) - } - } else { - clones.push({ - id: cloneIdList[i] - }) - } - } - - return clones - } catch (err){ + return clones + } catch (err) { logger.error('Get Clones error: %s', err.stack) throw new OperationsError('There has been an error getting the clones.') - } + } } const GetClones = { diff --git a/server/src/schema/queries/HistoryClones.js b/server/src/schema/queries/HistoryClones.js index 081457f3b..23bcd6d2f 100644 --- a/server/src/schema/queries/HistoryClones.js +++ b/server/src/schema/queries/HistoryClones.js @@ -1,12 +1,5 @@ -import { - GraphQLList -} from 'graphql' - -import { - AuthentificationError, - OperationsError -} from '../../errors' - +import { GraphQLList } from 'graphql' +import { AuthentificationError, OperationsError } from '../../errors' import { CloneType } from '../types' import { Clone } from '../../models' import logger from '../../config/logger' @@ -17,27 +10,27 @@ const args = {} const resolve = async(parent, args, context) => { logger.debug('Retrieving History Clones.') - try{ - if (!context.userId) { - throw new AuthentificationError() - } + try { + if (!context.userId) { + throw new AuthentificationError() + } - let clones = await Clone.find({ - authId: context.userId, - active: false - }).sort({createDatetime: -1}) + let clones = await Clone.find({ + authId: context.userId, + active: false + }).sort({createDatetime: -1}) - for (var i = 0; i < clones.length; i++) { + for (var i = 0; i < clones.length; i++) { let team = await teamQuery(context.authorization, clones[i].teamId) clones[i] = await cloneDetails(context.userId, team.data.data.teams_TeamById, clones[i]) clones[i].botType = clones[i].kind // Only for listing we show the teams value - } + } - return clones - } catch (err){ - logger.error('Retrieving History Clones error: %s', err.stack) - throw new OperationsError('There has been an error retrieving history clones.') - } + return clones + } catch (err) { + logger.error('Retrieving History Clones error: %s', err.stack) + throw new OperationsError('There has been an error retrieving history clones.') + } } const HistoryClones = { diff --git a/server/src/schema/queries/ListClones.js b/server/src/schema/queries/ListClones.js index b44458cf3..b36a2b875 100644 --- a/server/src/schema/queries/ListClones.js +++ b/server/src/schema/queries/ListClones.js @@ -1,12 +1,5 @@ -import { - GraphQLList -} from 'graphql' - -import { - AuthentificationError, - OperationsError -} from '../../errors' - +import { GraphQLList } from 'graphql' +import { AuthentificationError, OperationsError } from '../../errors' import { CloneType } from '../types' import { Clone } from '../../models' import logger from '../../config/logger' @@ -19,30 +12,30 @@ const args = {} const resolve = async(parent, args, context) => { logger.debug('List Clones -> Entering Fuction.') - try{ - if (!context.userId) { - throw new AuthentificationError() - } + try { + if (!context.userId) { + throw new AuthentificationError() + } - let clones = await Clone.find({ - authId: context.userId, - active: true - }).sort({createDatetime: -1}) + let clones = await Clone.find({ + authId: context.userId, + active: true + }).sort({createDatetime: -1}) - for (var i = 0; i < clones.length; i++) { + for (var i = 0; i < clones.length; i++) { let team = await teamQuery(context.authorization, clones[i].teamId) clones[i] = await cloneDetails(context.userId, team.data.data.teams_TeamById, clones[i]) let state = await getCloneStatus(clones[i].id) - clones[i].state = state.substring(1, state.length-1) + clones[i].state = state.substring(1, state.length - 1) let lastLogs = await getCloneLogs(clones[i].id) - clones[i].lastLogs = lastLogs.substring(1, lastLogs.length-1) + clones[i].lastLogs = lastLogs.substring(1, lastLogs.length - 1) clones[i].botType = clones[i].kind // Only for listing we show the teams value - } - return clones - } catch (err){ + } + return clones + } catch (err) { logger.error('List Clones error: %s', err.stack) throw new OperationsError('There has been an error listing the clones.') - } + } } const ListClones = { diff --git a/server/src/schema/queries/index.js b/server/src/schema/queries/index.js index bdf6ff629..b7d1de155 100644 --- a/server/src/schema/queries/index.js +++ b/server/src/schema/queries/index.js @@ -1,7 +1,4 @@ -import { - GraphQLObjectType -} from 'graphql' - +import { GraphQLObjectType } from 'graphql' import ListClones from './ListClones' import HistoryClones from './HistoryClones' import GetClones from './GetClones' diff --git a/server/src/schema/types/GetClonesType.js b/server/src/schema/types/GetClonesType.js index f3bdebe35..df24d0502 100644 --- a/server/src/schema/types/GetClonesType.js +++ b/server/src/schema/types/GetClonesType.js @@ -1,7 +1,4 @@ -import { - GraphQLObjectType, - GraphQLID -} from 'graphql' +import { GraphQLObjectType, GraphQLID } from 'graphql' const GetClonesType = new GraphQLObjectType({ name: 'GetClones', diff --git a/server/src/schema/types/input/Clone.js b/server/src/schema/types/input/Clone.js index 8b40dd2ce..509ea9af5 100644 --- a/server/src/schema/types/input/Clone.js +++ b/server/src/schema/types/input/Clone.js @@ -4,7 +4,7 @@ import { GraphQLInputObjectType, GraphQLBoolean, GraphQLNonNull -} from 'graphql'; +} from 'graphql' const Type = new GraphQLInputObjectType({ name: 'CloneInput', @@ -25,7 +25,7 @@ const Type = new GraphQLInputObjectType({ processName: { type: new GraphQLNonNull(GraphQLString) }, botType: { type: new GraphQLNonNull(GraphQLString) }, keyId: { type: GraphQLString } - }) -}); + }) +}) -export default Type; +export default Type diff --git a/server/src/schema/types/input/index.js b/server/src/schema/types/input/index.js index e51b0ca74..5c39e7316 100644 --- a/server/src/schema/types/input/index.js +++ b/server/src/schema/types/input/index.js @@ -2,4 +2,4 @@ import CloneInputType from './Clone' export { CloneInputType -}; +} From fbcd2099d5bfc6d03bb540da5177a7c90571f807 Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 15 Feb 2019 10:16:38 -0300 Subject: [PATCH 04/42] Removing state change on update --- server/src/schema/mutations/UpdateExecutionSummary.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/schema/mutations/UpdateExecutionSummary.js b/server/src/schema/mutations/UpdateExecutionSummary.js index 63b2d6fb1..324771330 100644 --- a/server/src/schema/mutations/UpdateExecutionSummary.js +++ b/server/src/schema/mutations/UpdateExecutionSummary.js @@ -59,8 +59,7 @@ const resolve = async (parent, combinedProfitsA: combinedProfitsA, combinedProfitsB: combinedProfitsB, assetA: assetA, - assetB: assetB, - active: false + assetB: assetB } logger.debug('UpdateExecutionSummary -> Updating clone on database.') From 78e301f541c17ecd9f0e37b2e4b499490edd1462 Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 15 Feb 2019 11:11:01 -0300 Subject: [PATCH 05/42] Improving error handling --- .../schema/mutations/RemoveCloneMutation.js | 74 ++++++++++--------- .../mutations/UpdateExecutionSummary.js | 22 +++--- 2 files changed, 50 insertions(+), 46 deletions(-) diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index 694f37c15..e93a0d289 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -17,42 +17,48 @@ const resolve = async (parent, { id }, context) => { if (!context.userId) { throw new AuthentificationError() } + try { + let clone = await Clone.findOne({ + _id: id, + authId: context.userId, + active: true + }) - let clone = await Clone.findOne({ - _id: id, - authId: context.userId, - active: true - }) - - if (!isDefined(clone)) { - throw new OperationsError('You are not authorized to remove this clone.') - } - - let team = await teamQuery(context.authorization, clone.teamId) - clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) - - logger.debug('removeClone -> Release the clone key.') - await authorizeClone(context.authorization, clone.keyId, clone.id, true) - - logger.debug('removeClone -> Removing Clone from Kubernates.') - await removeKuberneteClone(clone) - - const query = { - _id: id, - authId: context.userId - } - const options = { new: true } - const update = { active: false } - - Clone.findOneAndUpdate(query, update, options, (err, doc) => { - if (err) { - logger.error('removeClone -> Error removing clone from the DB. %s', err.stack) - throw new OperationsError(err) - } else { - logger.debug('removeClone -> Clone Removed from the DB.') - return ('Clone Removed.') + if (!isDefined(clone)) { + throw new OperationsError('You are not authorized to remove this clone.') } - }) + + let team = await teamQuery(context.authorization, clone.teamId) + clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) + + logger.debug('removeClone -> Release the clone key.') + await authorizeClone(context.authorization, clone.keyId, clone.id, true) + + logger.debug('removeClone -> Removing Clone from Kubernates.') + await removeKuberneteClone(clone) + + const query = { + _id: id, + authId: context.userId + } + const options = { new: true } + const update = { active: false } + + return new Promise((res, rej) => { + Clone.findOneAndUpdate(query, update, options, (err, doc) => { + if (err) { + logger.error('removeClone -> Error removing clone from the DB. %s', err.stack) + rej(err) + return + } + logger.debug('removeClone -> Clone Removed from the DB.') + res('Clone Removed.') + }) + }) + } catch (error) { + logger.error('Error removing the clone. %s', error.stack) + throw new OperationsError(error.message) + } } const RemoveCloneMutation = { diff --git a/server/src/schema/mutations/UpdateExecutionSummary.js b/server/src/schema/mutations/UpdateExecutionSummary.js index 324771330..dfe434e7d 100644 --- a/server/src/schema/mutations/UpdateExecutionSummary.js +++ b/server/src/schema/mutations/UpdateExecutionSummary.js @@ -35,8 +35,6 @@ const resolve = async (parent, } try { - let sucessful - let clone = await Clone.findOne({ _id: id, active: true @@ -63,19 +61,19 @@ const resolve = async (parent, } logger.debug('UpdateExecutionSummary -> Updating clone on database.') - await Clone.update(query, update, options, (err, clone) => { - if (err) { - logger.error('Error updating execution summary on the database. %s', err.stack) - throw err - } else { + + return new Promise((res, rej) => { + Clone.update(query, update, options, (err, clone) => { + if (err) { + logger.error('Error updating execution summary on the database. %s', err.stack) + rej(err) + return + } logger.debug('Execution summary updated.') - sucessful = true - } + res('Execution summary updated.') + }) }) - if (sucessful) { - return 'Execution summary updated.' - } } catch (error) { logger.error('Error updating the execution summary. %s', error.stack) throw new OperationsError(error.message) From adc79011047db8786827a4028d2459e7702615e0 Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 15 Feb 2019 11:18:27 -0300 Subject: [PATCH 06/42] Missing import --- server/src/schema/mutations/RemoveCloneMutation.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index e93a0d289..2d970b2b2 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -6,6 +6,7 @@ import removeKuberneteClone from '../../kubernetes/removeClone' import teamQuery from '../../graphQLCalls/teamQuery' import { isDefined } from '../../config/utils' import cloneDetails from '../cloneDetails' +import authorizeClone from '../../graphQLCalls/authorizeClone' const args = { id: { type: new GraphQLNonNull(GraphQLID) } From 37dbc410411e3180ee58bcff7567bd087b1d5d0f Mon Sep 17 00:00:00 2001 From: Matias Date: Sat, 16 Feb 2019 19:20:25 -0300 Subject: [PATCH 07/42] Browser integration --- client/package.json | 2 +- client/src/views/Clone/Add/index.js | 44 +++++++++---------- client/src/views/Clone/Add/styles.js | 2 +- client/src/views/Home.js | 6 +-- .../src/schema/mutations/AddCloneMutation.js | 11 +++-- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/client/package.json b/client/package.json index 40b5a1d21..af5922a49 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.14", + "version": "0.0.15", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 361f5ee43..1b7ae66d8 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -32,7 +32,7 @@ class AddClone extends Component { state: '', stateDatetime: 0, createDatetime: 0, - runAsTeam: false, + runAsTeam: true, teams: [], teamId: '', keyId: '', @@ -52,7 +52,7 @@ class AddClone extends Component { serverResponse: '', serverError: false, processNameError: false, - keyIdError: false + keyIdError: false, } } @@ -155,7 +155,16 @@ class AddClone extends Component { { this.state.selectedBot.kind === "TRADER" && - At the moment Live Trading Clones trade by default 0.001 BTC on Poloniex. + Available Running Modes are Backtest and Live. +
    +
  • Backtest mode does NOT put real orders at the exchange; + it simulates the order execution at the specified price. + +
  • +
  • + Live mode DOES put real orders at the exchange. +
  • +
- + + Because we are still in early alpha-testing phase, + Live Trading Clones are limited to an initial investment + of 0.001 BTC. If you choose to run this bot or any modified + version of the code, you are doing it at your own risk. +
} @@ -294,22 +308,6 @@ class AddClone extends Component { className={classNames(classes.form, classes.textField)} /> - - The Resume Execution option let's you pick up the context of - the last execution and continue from there. - - this.setState({resumeExecution:e.target.checked })} - value="resumeExecution" - color="primary" - /> - } - label="Resume Execution" - className={classNames(classes.form, classes.textField)} - /> } @@ -417,9 +415,9 @@ class AddClone extends Component { } - - You will be able to query your clone information under Active Clones until it finishes the execution, then it will moved to the History. + You will be able to see the clone information under Active Clones. + Whenever you decide to stop the clone you can delete it. On History Clones will find all deleted clones.
@@ -552,7 +550,7 @@ class AddClone extends Component { state : '', stateDatetime: 0, createDatetime: 0, - runAsTeam: false, + runAsTeam: true, processName: '', teams: [], teamId: '', diff --git a/client/src/views/Clone/Add/styles.js b/client/src/views/Clone/Add/styles.js index 2d831d291..b5533fe95 100644 --- a/client/src/views/Clone/Add/styles.js +++ b/client/src/views/Clone/Add/styles.js @@ -24,7 +24,7 @@ const styles = theme => ({ typography: { width: '80%', marginLeft: '10%', - marginTop: 40 + marginTop: 20 }, form: { marginTop: 20 diff --git a/client/src/views/Home.js b/client/src/views/Home.js index 6b4d9aaec..02e13a7cf 100644 --- a/client/src/views/Home.js +++ b/client/src/views/Home.js @@ -9,21 +9,21 @@ class Home extends Component {
- Welcome to the Operations Module! + Welcome to the Clones Module! Responsible for manage bot clones.
- The Operations module allows you to create instances of your bots + The Clones module allows you to create instances of your bots that will be executed on a virtual machine.
diff --git a/server/src/schema/mutations/AddCloneMutation.js b/server/src/schema/mutations/AddCloneMutation.js index 76381ca74..092ffe6e7 100644 --- a/server/src/schema/mutations/AddCloneMutation.js +++ b/server/src/schema/mutations/AddCloneMutation.js @@ -15,7 +15,7 @@ import { import logger from '../../config/logger' import createKubernetesClone from '../../kubernetes/createClone' import { isDefined } from '../../config/utils' -import { LIVE } from '../../enums/CloneMode' +import { LIVE, COMPETITION } from '../../enums/CloneMode' const args = { clone: { type: CloneInputType } @@ -36,8 +36,8 @@ const resolve = async(parent, { clone }, context) => { throw new WrongArgumentsError('The bot type selected is not valid.') } - if (clone.mode === LIVE && !isDefined(clone.keyId)) { - throw new WrongArgumentsError('The key was not provided to run the clone in Live mode.') + if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) { + throw new WrongArgumentsError('The key was not provided to run the clone.') } try { @@ -53,7 +53,7 @@ const resolve = async(parent, { clone }, context) => { logger.debug('addClone -> Creating the clone on the Database.') let savedClone = await newClone.save() - if (clone.mode === LIVE) { + if (clone.mode === LIVE || clone.mode === COMPETITION) { logger.debug('addClone -> Authorizing clone to use the key.') let response = await authorizeClone(context.authorization, clone.keyId, clone.id, false) logger.debug('addClone -> Authorizing clone to use the key.') @@ -62,7 +62,10 @@ const resolve = async(parent, { clone }, context) => { } else { throw new AutorizationError() } + }else{ + await createKubernetesClone(clone) } + logger.debug('addClone -> Clone created sucessfully.') return savedClone } catch (err) { From ab61d8d1e4d270fe9180d687c10e86948455103f Mon Sep 17 00:00:00 2001 From: Matias Date: Sat, 16 Feb 2019 19:20:25 -0300 Subject: [PATCH 08/42] Live mode notice --- client/package.json | 2 +- client/src/views/Clone/Add/index.js | 44 +++++++++---------- client/src/views/Clone/Add/styles.js | 2 +- client/src/views/Home.js | 6 +-- .../src/schema/mutations/AddCloneMutation.js | 11 +++-- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/client/package.json b/client/package.json index 40b5a1d21..af5922a49 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.14", + "version": "0.0.15", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 361f5ee43..1b7ae66d8 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -32,7 +32,7 @@ class AddClone extends Component { state: '', stateDatetime: 0, createDatetime: 0, - runAsTeam: false, + runAsTeam: true, teams: [], teamId: '', keyId: '', @@ -52,7 +52,7 @@ class AddClone extends Component { serverResponse: '', serverError: false, processNameError: false, - keyIdError: false + keyIdError: false, } } @@ -155,7 +155,16 @@ class AddClone extends Component { { this.state.selectedBot.kind === "TRADER" && - At the moment Live Trading Clones trade by default 0.001 BTC on Poloniex. + Available Running Modes are Backtest and Live. +
    +
  • Backtest mode does NOT put real orders at the exchange; + it simulates the order execution at the specified price. + +
  • +
  • + Live mode DOES put real orders at the exchange. +
  • +
- + + Because we are still in early alpha-testing phase, + Live Trading Clones are limited to an initial investment + of 0.001 BTC. If you choose to run this bot or any modified + version of the code, you are doing it at your own risk. +
} @@ -294,22 +308,6 @@ class AddClone extends Component { className={classNames(classes.form, classes.textField)} /> - - The Resume Execution option let's you pick up the context of - the last execution and continue from there. - - this.setState({resumeExecution:e.target.checked })} - value="resumeExecution" - color="primary" - /> - } - label="Resume Execution" - className={classNames(classes.form, classes.textField)} - /> } @@ -417,9 +415,9 @@ class AddClone extends Component { } - - You will be able to query your clone information under Active Clones until it finishes the execution, then it will moved to the History. + You will be able to see the clone information under Active Clones. + Whenever you decide to stop the clone you can delete it. On History Clones will find all deleted clones.
@@ -552,7 +550,7 @@ class AddClone extends Component { state : '', stateDatetime: 0, createDatetime: 0, - runAsTeam: false, + runAsTeam: true, processName: '', teams: [], teamId: '', diff --git a/client/src/views/Clone/Add/styles.js b/client/src/views/Clone/Add/styles.js index 2d831d291..b5533fe95 100644 --- a/client/src/views/Clone/Add/styles.js +++ b/client/src/views/Clone/Add/styles.js @@ -24,7 +24,7 @@ const styles = theme => ({ typography: { width: '80%', marginLeft: '10%', - marginTop: 40 + marginTop: 20 }, form: { marginTop: 20 diff --git a/client/src/views/Home.js b/client/src/views/Home.js index 6b4d9aaec..02e13a7cf 100644 --- a/client/src/views/Home.js +++ b/client/src/views/Home.js @@ -9,21 +9,21 @@ class Home extends Component {
- Welcome to the Operations Module! + Welcome to the Clones Module! Responsible for manage bot clones.
- The Operations module allows you to create instances of your bots + The Clones module allows you to create instances of your bots that will be executed on a virtual machine.
diff --git a/server/src/schema/mutations/AddCloneMutation.js b/server/src/schema/mutations/AddCloneMutation.js index 76381ca74..092ffe6e7 100644 --- a/server/src/schema/mutations/AddCloneMutation.js +++ b/server/src/schema/mutations/AddCloneMutation.js @@ -15,7 +15,7 @@ import { import logger from '../../config/logger' import createKubernetesClone from '../../kubernetes/createClone' import { isDefined } from '../../config/utils' -import { LIVE } from '../../enums/CloneMode' +import { LIVE, COMPETITION } from '../../enums/CloneMode' const args = { clone: { type: CloneInputType } @@ -36,8 +36,8 @@ const resolve = async(parent, { clone }, context) => { throw new WrongArgumentsError('The bot type selected is not valid.') } - if (clone.mode === LIVE && !isDefined(clone.keyId)) { - throw new WrongArgumentsError('The key was not provided to run the clone in Live mode.') + if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) { + throw new WrongArgumentsError('The key was not provided to run the clone.') } try { @@ -53,7 +53,7 @@ const resolve = async(parent, { clone }, context) => { logger.debug('addClone -> Creating the clone on the Database.') let savedClone = await newClone.save() - if (clone.mode === LIVE) { + if (clone.mode === LIVE || clone.mode === COMPETITION) { logger.debug('addClone -> Authorizing clone to use the key.') let response = await authorizeClone(context.authorization, clone.keyId, clone.id, false) logger.debug('addClone -> Authorizing clone to use the key.') @@ -62,7 +62,10 @@ const resolve = async(parent, { clone }, context) => { } else { throw new AutorizationError() } + }else{ + await createKubernetesClone(clone) } + logger.debug('addClone -> Clone created sucessfully.') return savedClone } catch (err) { From b7cfc5028cad3a9fdd79fd0c8345acaf14e25b56 Mon Sep 17 00:00:00 2001 From: Matias Date: Sat, 16 Feb 2019 21:22:40 -0300 Subject: [PATCH 09/42] Release key only on Live and Competition --- server/src/schema/mutations/RemoveCloneMutation.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index 2d970b2b2..23f4db15c 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -7,6 +7,7 @@ import teamQuery from '../../graphQLCalls/teamQuery' import { isDefined } from '../../config/utils' import cloneDetails from '../cloneDetails' import authorizeClone from '../../graphQLCalls/authorizeClone' +import { LIVE, COMPETITION } from '../../enums/CloneMode' const args = { id: { type: new GraphQLNonNull(GraphQLID) } @@ -32,8 +33,10 @@ const resolve = async (parent, { id }, context) => { let team = await teamQuery(context.authorization, clone.teamId) clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) - logger.debug('removeClone -> Release the clone key.') - await authorizeClone(context.authorization, clone.keyId, clone.id, true) + if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) { + logger.debug('removeClone -> Release the clone key.') + await authorizeClone(context.authorization, clone.keyId, clone.id, true) + } logger.debug('removeClone -> Removing Clone from Kubernates.') await removeKuberneteClone(clone) From e2aa60189c8b46a2236f9e002f237078bce1cb93 Mon Sep 17 00:00:00 2001 From: Matias Date: Sun, 17 Feb 2019 10:48:30 -0300 Subject: [PATCH 10/42] Adding module documentation --- server/README.md | 62 +++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/server/README.md b/server/README.md index 6607a6cfd..6d5616a45 100644 --- a/server/README.md +++ b/server/README.md @@ -1,33 +1,51 @@ +# Superalgos Operations Server Module -## AA Operations Server +The Superalgos Operations Server manages the clone life cycle inside the **Superalgos Ecosystem**. +The main function includes storing the metadata information of the clones and handling the interaction with the orchestration software which is [Kubernetes](https://Kubernetes.io). -Server side functions support the business rules for the module. +# Execution sequence +The operations module (or Clones) integrates with other system modules to enable secure and encapsulated execution. On the clone creation process the encapsulation is achieved by deploying a **Cloud** Image on a **Kubernates** container. +- [Keys](https://github.com/Superalgos/KeyVaultModule): Manages the signature of the messages sent to the external exchanges. +- [Teams](https://github.com/Superalgos/TeamsModule): Provide team and bot authorization. +- [Cloud](https://github.com/Superalgos/AACloud): Receive the execution parameters and runs an independent instance of the platform. -## Available Methods +```mermaid +sequenceDiagram +User ->> Keys: createKey +User ->> Keys: getAvailableKeys +User ->> Clones: createClone +Clones ->> Keys: getAvailableKeys +Clones ->> Keys: authorizeCloneToUseKey +Keys ->> Clones: geCloneTeamAndBot +Keys ->> Teams: getTeamMembers +Keys -->> Clones: authorizeCloneToUseKey +Clones ->> Cloud: createClone +Cloud ->> Keys: signTransaction +Cloud ->> Clones: updateExection -# Active clones List -- List active personal clones -- List active team clones (future release) +Note left of Cloud: signTransaction and
updateExection are
called n number
of times +User ->> Clones: getCloneExecutionInformation +Cloud ->> Clones: cloneExecutionComplete +User ->> Clones: deleteClone +Clones ->> Keys: releaseKey +``` -# History clone List -- List history personal clones -- List history team clones (future release) +> Details about all available methods can be found at the GraphQL endpoint. -# Get clone by id -- Get existing clones corresponding to the clone ids passed by parameter and returns: - - Clone id - - Team id - - Bot id +## List active clones +- List the clones created by the user that are currently running on the virtual machine. +- List the running clones of the teams who the user is authorized to manage (future release) -# Add new clones: - Receive a list of clones, create each of them and return the newly created clone. +## List history clones +- List the clones owned by the user that were completed and deleted +- List the finalised clones of the teams who the user is authorized to manage (future release) + +## Add new clones A clone can be created: - - As a personal clone (run from the personal user folder) - - As a team clone (on competitions, run from the team folder) + - As a personal clone (the source code will be the one on the personal user folder) + - As a team clone (the source code will be the one on the main team folder) Who can create each type: - Personal clones are managed by the user who creates it, not visible for any other user. - - Team clones are managed by any ADMIN type team member (on the team member role attribute), - and all team admins will see it listed. + - Team clones are managed by any ADMIN type team member (on the team member role attribute), and all team admins will see it listed. - - Events Module: - At enroll time, the clone is created and the authId is sent +> Written with [StackEdit](https://stackedit.io/). From 6a51b6cde1caada66b6e151286bd14c72cd20bbb Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 19 Feb 2019 16:12:12 -0300 Subject: [PATCH 11/42] Default Run as team --- client/src/views/Clone/Add/index.js | 41 ++++++++++++++++------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 1b7ae66d8..4e52af534 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -32,7 +32,7 @@ class AddClone extends Component { state: '', stateDatetime: 0, createDatetime: 0, - runAsTeam: true, + runAsTeam: false, teams: [], teamId: '', keyId: '', @@ -290,23 +290,28 @@ class AddClone extends Component { } - - If Run as Team is selected, the clone will be taken from the - team respository instead of your own team member folder. - Competitions runs from the team respository. - - this.setState({runAsTeam:e.target.checked })} - value="runAsTeam" - color="primary" + { false && + + + If Run as Team is selected, the clone will be taken from the + team respository instead of your own team member folder. + Competitions runs from the team respository. + + + this.setState({runAsTeam:e.target.checked })} + value="runAsTeam" + color="primary" + /> + } + label="Run as Team" + className={classNames(classes.form, classes.textField)} /> - } - label="Run as Team" - className={classNames(classes.form, classes.textField)} - /> + + } } @@ -550,7 +555,7 @@ class AddClone extends Component { state : '', stateDatetime: 0, createDatetime: 0, - runAsTeam: true, + runAsTeam: false, processName: '', teams: [], teamId: '', From 0a98428ddc61dda1833422f39cf8650a43ffbd45 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 19 Feb 2019 16:12:59 -0300 Subject: [PATCH 12/42] Adding time to competition mode --- server/src/kubernetes/createClone.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index bad047b30..83ac6af4e 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -3,7 +3,7 @@ import { toPlatformDatetime, isDefined } from '../config/utils' import { KubernateError } from '../errors' import { Client, config } from 'kubernetes-client' import deploymentManifest from '../config/clone-deployment.json' -import { BACKTEST, NO_TIME } from '../enums/CloneMode' +import { BACKTEST, COMPETITION, LIVE, NO_TIME } from '../enums/CloneMode' import { TRADER, INDICATOR, EXTRACTION } from '../enums/BotTypes' const createClone = async (clone) => { @@ -101,7 +101,20 @@ const createClone = async (clone) => { 'name': 'WAIT_TIME', 'value': clone.waitTime.toString() }) - } else { + } else if (clone.mode === COMPETITION) { + env.push({ + 'name': 'BEGIN_DATE_TIME', + 'value': toPlatformDatetime(clone.beginDatetime) + }) + env.push({ + 'name': 'END_DATE_TIME', + 'value': toPlatformDatetime(clone.endDatetime) + }) + env.push({ + 'name': 'KEY_ID', + 'value': clone.keyId + }) + } else if (clone.mode === LIVE) { env.push({ 'name': 'KEY_ID', 'value': clone.keyId From 9e9c5e5bb8f8958010914bf4811a7e1b888927e2 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 19 Feb 2019 16:16:24 -0300 Subject: [PATCH 13/42] New version --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index af5922a49..8d25a66f8 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.15", + "version": "0.0.16", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { From 70519177bf673baa25d155e48bb430c4c2547776 Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 22 Feb 2019 10:17:41 -0300 Subject: [PATCH 14/42] Adding GetClone method --- server/package-lock.json | 2862 +++++++++++++------------ server/package.json | 26 +- server/src/schema/queries/GetClone.js | 49 + server/src/schema/queries/index.js | 4 +- 4 files changed, 1559 insertions(+), 1382 deletions(-) create mode 100644 server/src/schema/queries/GetClone.js diff --git a/server/package-lock.json b/server/package-lock.json index 5be8d7666..71a693a20 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -20,7 +20,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.20", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -29,8 +29,8 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", "requires": { - "clean-stack": "1.3.0", - "indent-string": "3.2.0" + "clean-stack": "^1.0.0", + "indent-string": "^3.0.0" } }, "ajv": { @@ -38,10 +38,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-align": { @@ -50,7 +50,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" } }, "ansi-regex": { @@ -65,33 +65,12 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "1.1.0" + "sprintf-js": "~1.0.2" } }, "arr-flatten": { @@ -111,19 +90,12 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "assert-plus": { @@ -142,7 +114,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "async-each": { @@ -182,8 +154,8 @@ "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { - "follow-redirects": "1.5.9", - "is-buffer": "1.1.6" + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" } }, "babel-cli": { @@ -192,21 +164,186 @@ "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.19.0", - "convert-source-map": "1.6.0", - "fs-readdir-recursive": "1.1.0", - "glob": "7.1.3", - "lodash": "4.17.10", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "chokidar": "^1.6.1", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "optional": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + } } }, "babel-code-frame": { @@ -215,9 +352,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -226,25 +363,33 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.6.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } } }, "babel-generator": { @@ -253,14 +398,22 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } } }, "babel-helper-bindify-decorators": { @@ -269,9 +422,9 @@ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -280,9 +433,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -291,10 +444,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -303,10 +456,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -315,9 +468,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-explode-class": { @@ -326,10 +479,10 @@ "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "dev": true, "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -338,11 +491,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -351,8 +504,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -361,8 +514,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -371,8 +524,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -381,9 +534,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -392,11 +545,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -405,12 +558,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -419,8 +572,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-messages": { @@ -429,7 +582,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -438,48 +591,48 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, "babel-plugin-syntax-async-generators": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", "dev": true }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", "dev": true }, "babel-plugin-syntax-decorators": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", "dev": true }, "babel-plugin-syntax-dynamic-import": { "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", "dev": true }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, @@ -495,9 +648,9 @@ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-async-to-generator": { @@ -506,9 +659,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-properties": { @@ -517,10 +670,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-decorators": { @@ -529,11 +682,11 @@ "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", "dev": true, "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -542,7 +695,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -551,7 +704,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -560,11 +713,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -573,15 +726,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -590,8 +743,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -600,7 +753,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -609,8 +762,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -619,7 +772,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -628,9 +781,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -639,7 +792,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -648,9 +801,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -659,10 +812,10 @@ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -671,9 +824,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -682,9 +835,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -693,8 +846,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -703,12 +856,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -717,8 +870,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -727,7 +880,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -736,9 +889,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -747,7 +900,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -756,7 +909,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -765,9 +918,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -776,9 +929,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -787,8 +940,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -797,7 +950,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -806,8 +959,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-polyfill": { @@ -816,9 +969,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -835,36 +988,36 @@ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "3.2.8", - "invariant": "2.2.4", - "semver": "5.5.1" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, "babel-preset-stage-2": { @@ -873,10 +1026,10 @@ "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", "dev": true, "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" } }, "babel-preset-stage-3": { @@ -885,11 +1038,11 @@ "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", "dev": true, "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" } }, "babel-register": { @@ -898,13 +1051,34 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } } }, "babel-runtime": { @@ -913,8 +1087,16 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } } }, "babel-template": { @@ -923,11 +1105,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -936,15 +1118,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -953,10 +1135,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -977,13 +1159,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "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" }, "dependencies": { "define-property": { @@ -992,7 +1174,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1001,7 +1183,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1010,7 +1192,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1019,9 +1201,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1048,7 +1230,7 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "binary-extensions": { @@ -1068,15 +1250,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" } }, "boxen": { @@ -1085,13 +1267,13 @@ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.4.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.1" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "dependencies": { "ansi-styles": { @@ -1100,7 +1282,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -1109,9 +1291,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -1120,7 +1302,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1131,30 +1313,18 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.3" - } - }, "browserslist": { "version": "3.2.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000902", - "electron-to-chromium": "1.3.82" + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" } }, "bson": { @@ -1173,15 +1343,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "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" + "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" }, "dependencies": { "isobject": { @@ -1220,9 +1390,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30000902", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000902.tgz", - "integrity": "sha512-EZG6qrRHkW715hOFjOrshH2JygbLfhaC8NjjkE5EdGJZhCYbtnJMaRdicB+2AP8xKX3QzW9g3mkDUTHUoBG5rQ==", + "version": "1.0.30000938", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000938.tgz", + "integrity": "sha512-ekW8NQ3/FvokviDxhdKLZZAx7PptXNwxKgXtnR5y+PR3hckwuP3yJ1Ir+4/c97dsHNqtAyfKUGdw8P4EYzBNgw==", "dev": true }, "capture-stack-trace": { @@ -1238,33 +1408,15 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.4", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "ci-info": { @@ -1279,10 +1431,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1291,7 +1443,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "isobject": { @@ -1318,7 +1470,7 @@ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "requires": { - "mimic-response": "1.0.1" + "mimic-response": "^1.0.0" } }, "collection-visit": { @@ -1327,8 +1479,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { @@ -1336,8 +1488,8 @@ "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", "requires": { - "color-convert": "1.9.3", - "color-string": "1.5.3" + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, "color-convert": { @@ -1358,8 +1510,8 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, "colornames": { @@ -1377,8 +1529,8 @@ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", "requires": { - "color": "3.0.0", - "text-hex": "1.0.0" + "color": "3.0.x", + "text-hex": "1.0.x" } }, "combined-stream": { @@ -1386,7 +1538,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1413,12 +1565,12 @@ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.4.2", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "content-disposition": { @@ -1437,7 +1589,7 @@ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.1" } }, "cookie": { @@ -1457,9 +1609,9 @@ "dev": true }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", "dev": true }, "core-util-is": { @@ -1472,8 +1624,8 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" + "object-assign": "^4", + "vary": "^1" } }, "create-error-class": { @@ -1482,7 +1634,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "1.0.1" + "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { @@ -1491,9 +1643,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-random-string": { @@ -1507,7 +1659,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -1528,7 +1680,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "mimic-response": "1.0.1" + "mimic-response": "^1.0.0" } }, "deep-extend": { @@ -1548,8 +1700,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1558,7 +1710,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1567,7 +1719,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1576,9 +1728,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1616,7 +1768,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "diagnostics": { @@ -1624,9 +1776,9 @@ "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", "requires": { - "colorspace": "1.1.1", - "enabled": "1.0.2", - "kuler": "1.0.0" + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" } }, "dot-prop": { @@ -1635,7 +1787,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotenv": { @@ -1653,8 +1805,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -1663,9 +1815,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.82.tgz", - "integrity": "sha512-NI4nB2IWGcU4JVT1AE8kBb/dFor4zjLHMLsOROPahppeHrR0FG5uslxMmkp/thO1MvPjM2xhlKoY29/I60s0ew==", + "version": "1.3.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", + "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", "dev": true }, "enabled": { @@ -1673,7 +1825,7 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", "requires": { - "env-variable": "0.0.4" + "env-variable": "0.0.x" } }, "encodeurl": { @@ -1724,23 +1876,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "0.1.1" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-range": { @@ -1750,7 +1892,43 @@ "dev": true, "optional": true, "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + } } }, "express": { @@ -1758,36 +1936,36 @@ "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.4", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" } }, "express-graphql": { @@ -1795,10 +1973,10 @@ "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.6.12.tgz", "integrity": "sha512-ouLWV0hRw4hnaLtXzzwhdC79ewxKbY2PRvm05mPc/zOH5W5WVCHDQ1SmNxEPBQdUeeSNh29aIqW9zEQkA3kMuA==", "requires": { - "accepts": "1.3.5", - "content-type": "1.0.4", - "http-errors": "1.6.3", - "raw-body": "2.3.2" + "accepts": "^1.3.0", + "content-type": "^1.0.4", + "http-errors": "^1.3.0", + "raw-body": "^2.3.2" } }, "extend": { @@ -1812,8 +1990,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -1822,21 +2000,11 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "1.0.0" - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1869,32 +2037,18 @@ "dev": true, "optional": true }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "optional": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.1.1", - "repeat-element": "1.1.3", - "repeat-string": "1.6.1" - } - }, "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } }, "fluent-openapi": { @@ -1902,7 +2056,7 @@ "resolved": "https://registry.npmjs.org/fluent-openapi/-/fluent-openapi-1.0.0.tgz", "integrity": "sha512-Q0drDENt875UTMpWY5nAJi7/0BaqQ0riXVNnhAwaDlpcXFLGos/jW/IuSGLdoStw10BZ3RpkJghG2gkR3XASPA==", "requires": { - "lodash.merge": "4.6.1" + "lodash.merge": "^4.6.1" } }, "follow-redirects": { @@ -1910,7 +2064,7 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", "requires": { - "debug": "3.1.0" + "debug": "=3.1.0" }, "dependencies": { "debug": { @@ -1936,7 +2090,7 @@ "dev": true, "optional": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "forever-agent": { @@ -1949,9 +2103,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.7", - "mime-types": "2.1.20" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "forwarded": { @@ -1965,7 +2119,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { @@ -1978,8 +2132,8 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-readdir-recursive": { @@ -1995,14 +2149,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { - "nan": "2.11.1", - "node-pre-gyp": "0.10.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -2014,7 +2168,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2023,31 +2178,33 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -2055,17 +2212,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2083,7 +2243,7 @@ } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -2106,7 +2266,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -2121,28 +2281,28 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -2152,12 +2312,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -2166,7 +2326,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -2175,14 +2335,15 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2194,8 +2355,9 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -2208,37 +2370,41 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", + "version": "2.3.5", "bundled": true, "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2250,32 +2416,32 @@ "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.2.4", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.10.3", "bundled": true, "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "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" } }, "nopt": { @@ -2284,24 +2450,24 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.5", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -2310,16 +2476,17 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2331,8 +2498,9 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2353,8 +2521,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -2370,15 +2538,15 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2395,28 +2563,29 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2431,7 +2600,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.6.0", "bundled": true, "dev": true, "optional": true @@ -2452,10 +2621,11 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -2464,15 +2634,16 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -2482,18 +2653,18 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "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" } }, "util-deprecate": { @@ -2503,23 +2674,25 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2539,7 +2712,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -2548,12 +2721,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -2563,17 +2736,37 @@ "dev": true, "optional": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + } } }, "global-dirs": { @@ -2582,7 +2775,7 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "globals": { @@ -2597,17 +2790,17 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { @@ -2621,7 +2814,7 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.0.tgz", "integrity": "sha512-HGVcnO6B25YZcSt6ZsH6/N+XkYuPA7yMqJmlJ4JWxWlS4Tr8SHI56R1Ocs8Eor7V7joEZPRXPDH8RRdll1w44Q==", "requires": { - "iterall": "1.2.2" + "iterall": "^1.2.2" } }, "har-schema": { @@ -2634,8 +2827,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { - "ajv": "6.6.1", - "har-schema": "2.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, "has-ansi": { @@ -2644,7 +2837,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -2663,7 +2856,7 @@ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "requires": { - "has-symbol-support-x": "1.4.2" + "has-symbol-support-x": "^1.4.1" } }, "has-value": { @@ -2672,9 +2865,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -2691,8 +2884,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -2701,7 +2894,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2710,7 +2903,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2721,21 +2914,11 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -2746,10 +2929,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.4.0" + "statuses": ">= 1.4.0 < 2" } }, "http-signature": { @@ -2757,9 +2940,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.15.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -2796,8 +2979,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2816,8 +2999,8 @@ "resolved": "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" } }, "invariant": { @@ -2826,7 +3009,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } }, "ipaddr.js": { @@ -2840,7 +3023,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -2854,7 +3037,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.12.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -2868,7 +3051,7 @@ "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { - "ci-info": "1.6.0" + "ci-info": "^1.5.0" } }, "is-data-descriptor": { @@ -2877,7 +3060,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-descriptor": { @@ -2886,9 +3069,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -2913,7 +3096,7 @@ "dev": true, "optional": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -2922,19 +3105,13 @@ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -2943,23 +3120,14 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-npm": { @@ -2968,16 +3136,6 @@ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", "dev": true }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - } - }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -2995,7 +3153,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-obj": { @@ -3009,7 +3167,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -3072,16 +3230,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -3092,8 +3240,8 @@ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, "iterall": { @@ -3112,8 +3260,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -3121,12 +3269,6 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -3149,7 +3291,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, @@ -3183,7 +3325,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "kubernetes-client": { @@ -3191,13 +3333,13 @@ "resolved": "https://registry.npmjs.org/kubernetes-client/-/kubernetes-client-6.5.1.tgz", "integrity": "sha512-xEumU2rBQNqvP39IfVJbTTubx/Mm35ckNHxTsnA8aV5lo14dP/EsXjBgRVtEubUU58ANjKbJP5C8NQnjfRiMnQ==", "requires": { - "deepmerge": "2.2.1", - "fluent-openapi": "1.0.0", - "js-yaml": "3.12.0", - "openid-client": "2.4.5", - "qs": "6.6.0", - "request": "2.88.0", - "ws": "6.1.2" + "deepmerge": "^2.1.1", + "fluent-openapi": "^1.0.0", + "js-yaml": "^3.10.0", + "openid-client": "^2.4.4", + "qs": "^6.5.2", + "request": "^2.88.0", + "ws": "^6.0.0" }, "dependencies": { "qs": { @@ -3212,7 +3354,7 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.0.tgz", "integrity": "sha512-oyy6pu/yWRjiVfCoJebNUKFL061sNtrs9ejKTbirIwY3oiHmENVCSkHhxDV85Dkm7JYR/czMCBeoM87WilTdSg==", "requires": { - "colornames": "1.1.1" + "colornames": "^1.1.1" } }, "latest-version": { @@ -3221,13 +3363,13 @@ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.assign": { "version": "4.2.0", @@ -3289,11 +3431,11 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", "requires": { - "colors": "1.3.2", - "fast-safe-stringify": "2.0.6", - "fecha": "2.3.3", - "ms": "2.1.1", - "triple-beam": "1.3.0" + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" }, "dependencies": { "ms": { @@ -3314,7 +3456,7 @@ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lowercase-keys": { @@ -3328,8 +3470,8 @@ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -3338,7 +3480,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "map-cache": { @@ -3353,13 +3495,13 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true, "optional": true }, @@ -3368,6 +3510,12 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3378,28 +3526,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", @@ -3415,7 +3541,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", "requires": { - "mime-db": "1.36.0" + "mime-db": "~1.36.0" } }, "mimic-response": { @@ -3429,7 +3555,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3444,8 +3570,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -3454,7 +3580,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -3474,7 +3600,7 @@ "integrity": "sha512-BGUxo4a/p5KtZpOn6+z6iZXTHfDxKDvibHQap9uMJqQouwoszvTIO/QbVZkaSX3Spny0jtTEeHc0FwfpGbtEzA==", "requires": { "mongodb-core": "3.1.3", - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.2" }, "dependencies": { "safe-buffer": { @@ -3489,10 +3615,10 @@ "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.3.tgz", "integrity": "sha512-dISiV3zHGJTwZpg0xDhi9zCqFGMhA5kDPByHlcaEp09NSKfzHJ7XQbqVrL7qhki1U9PZHsmRfbFzco+6b1h2wA==", "requires": { - "bson": "1.1.0", - "require_optional": "1.0.1", - "safe-buffer": "5.1.2", - "saslprep": "1.0.1" + "bson": "^1.1.0", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" }, "dependencies": { "bson": { @@ -3513,7 +3639,7 @@ "integrity": "sha512-yfQw4lbci12DvQrnc25DmP/g74vjhus5SaCliP5sbbzIIJPpeU1F3xscb4uPX26ygjPkl/NzppS65rILNv20Bg==", "requires": { "async": "2.6.1", - "bson": "1.0.9", + "bson": "~1.0.5", "kareem": "2.2.1", "lodash.get": "4.4.2", "mongodb": "3.1.4", @@ -3589,17 +3715,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" }, "dependencies": { "arr-diff": { @@ -3637,21 +3763,21 @@ "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-1.1.0.tgz", "integrity": "sha512-Ux5MDElyiAlBQyOdFcwznK2TWMJbG8ZUfIZ28UtBvTB/VUz5HA/1WJV7s+YCah5NilPhkMkNi6xjnFRI+MQAVg==", "requires": { - "base64url": "3.0.1", - "es6-promise": "4.2.5", - "lodash.assign": "4.2.0", - "lodash.clone": "4.5.0", - "lodash.fill": "3.4.0", - "lodash.flatten": "4.4.0", - "lodash.intersection": "4.4.0", - "lodash.merge": "4.6.1", - "lodash.omit": "4.5.0", - "lodash.partialright": "4.2.1", - "lodash.pick": "4.4.0", - "lodash.uniq": "4.5.0", - "long": "4.0.0", - "node-forge": "0.7.6", - "uuid": "3.3.2" + "base64url": "^3.0.0", + "es6-promise": "^4.2.5", + "lodash.assign": "^4.2.0", + "lodash.clone": "^4.5.0", + "lodash.fill": "^3.4.0", + "lodash.flatten": "^4.4.0", + "lodash.intersection": "^4.4.0", + "lodash.merge": "^4.6.1", + "lodash.omit": "^4.5.0", + "lodash.partialright": "^4.2.1", + "lodash.pick": "^4.4.0", + "lodash.uniq": "^4.5.0", + "long": "^4.0.0", + "node-forge": "^0.7.6", + "uuid": "^3.3.2" } }, "nodemon": { @@ -3660,16 +3786,16 @@ "integrity": "sha512-we51yBb1TfEvZamFchRgcfLbVYgg0xlGbyXmOtbBzDwxwgewYS/YbZ5tnlnsH51+AoSTTsT3A2E/FloUbtH8cQ==", "dev": true, "requires": { - "chokidar": "2.1.0", - "debug": "3.2.6", - "ignore-by-default": "1.0.1", - "minimatch": "3.0.4", - "pstree.remy": "1.1.6", - "semver": "5.5.1", - "supports-color": "5.5.0", - "touch": "3.1.0", - "undefsafe": "2.0.2", - "update-notifier": "2.5.0" + "chokidar": "^2.1.0", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.6", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" }, "dependencies": { "anymatch": { @@ -3678,8 +3804,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { "normalize-path": { @@ -3688,7 +3814,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } } } @@ -3711,16 +3837,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "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.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "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" }, "dependencies": { "extend-shallow": { @@ -3729,7 +3855,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3740,18 +3866,18 @@ "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.7", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" } }, "debug": { @@ -3760,7 +3886,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" }, "dependencies": { "ms": { @@ -3777,13 +3903,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" }, "dependencies": { "debug": { @@ -3801,7 +3927,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -3810,7 +3936,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -3819,7 +3945,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3828,7 +3954,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3839,7 +3965,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3848,7 +3974,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3859,9 +3985,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -3878,14 +4004,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" }, "dependencies": { "define-property": { @@ -3894,7 +4020,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -3903,7 +4029,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3914,10 +4040,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -3926,7 +4052,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3938,8 +4064,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.11.1", - "node-pre-gyp": "0.10.3" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -3951,7 +4077,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3965,19 +4092,21 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -3992,17 +4121,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4043,7 +4175,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -4058,14 +4190,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -4074,12 +4206,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -4094,7 +4226,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -4103,7 +4235,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -4112,14 +4244,15 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4131,8 +4264,9 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -4145,22 +4279,25 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, "minizlib": { @@ -4169,13 +4306,14 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4192,9 +4330,9 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.24", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -4203,16 +4341,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.4", - "nopt": "4.0.1", - "npm-packlist": "1.2.0", - "npmlog": "4.1.2", - "rc": "1.2.8", - "rimraf": "2.6.3", - "semver": "5.6.0", - "tar": "4.4.8" + "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" } }, "nopt": { @@ -4221,8 +4359,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -4237,8 +4375,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.5" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -4247,16 +4385,17 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4268,8 +4407,9 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -4290,8 +4430,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -4312,10 +4452,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -4332,13 +4472,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -4347,13 +4487,14 @@ "dev": true, "optional": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4389,10 +4530,11 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -4401,15 +4543,16 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -4424,13 +4567,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "1.1.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.5", - "minizlib": "1.2.1", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "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" } }, "util-deprecate": { @@ -4445,18 +4588,20 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4466,8 +4611,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -4476,7 +4621,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -4487,7 +4632,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -4496,7 +4641,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -4505,9 +4650,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -4522,7 +4667,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -4531,7 +4676,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4540,7 +4685,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4563,19 +4708,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "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.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" } }, "normalize-path": { @@ -4590,7 +4735,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4601,16 +4746,7 @@ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "dev": true, "requires": { - "abbrev": "1.1.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" + "abbrev": "1" } }, "normalize-url": { @@ -4618,9 +4754,9 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.1", - "sort-keys": "2.0.0" + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" }, "dependencies": { "prepend-http": { @@ -4636,7 +4772,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -4661,9 +4797,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -4672,7 +4808,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -4683,7 +4819,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -4701,8 +4837,8 @@ "dev": true, "optional": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -4711,7 +4847,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -4727,7 +4863,7 @@ "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-3.0.1.tgz", "integrity": "sha512-oLnVSEcNZkw01sB5aFR+2iJmW4oyC1PIMJmd3FMBGDuPTy5ZtEuX5WNhKMRarJIMOq8NiOwIB6eJB9AhgYwBTg==", "requires": { - "base64url": "3.0.1" + "base64url": "^3.0.0" } }, "on-finished": { @@ -4744,7 +4880,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "one-time": { @@ -4757,13 +4893,13 @@ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-2.4.5.tgz", "integrity": "sha512-TmQQF7mOiYZsxX4kaQbrN06SXZ31UR5m4ur6sjM+VhaIuF79lqHe7uLmmt/NGVBIQojox6a4eilQ8DQDEQv31Q==", "requires": { - "base64url": "3.0.1", - "got": "8.3.2", - "lodash": "4.17.11", - "lru-cache": "4.1.5", - "node-jose": "1.1.0", - "oidc-token-hash": "3.0.1", - "p-any": "1.1.0" + "base64url": "^3.0.0", + "got": "^8.3.2", + "lodash": "^4.17.11", + "lru-cache": "^4.1.3", + "node-jose": "^1.1.0", + "oidc-token-hash": "^3.0.1", + "p-any": "^1.1.0" }, "dependencies": { "got": { @@ -4771,23 +4907,23 @@ "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "requires": { - "@sindresorhus/is": "0.7.0", - "cacheable-request": "2.1.4", - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "into-stream": "3.1.0", - "is-retry-allowed": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "mimic-response": "1.0.1", - "p-cancelable": "0.4.1", - "p-timeout": "2.0.1", - "pify": "3.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "3.0.0", - "url-to-options": "1.0.1" + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" } }, "lodash": { @@ -4800,8 +4936,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "prepend-http": { @@ -4814,7 +4950,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "requires": { - "prepend-http": "2.0.0" + "prepend-http": "^2.0.0" } } } @@ -4831,23 +4967,12 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, "p-any": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-any/-/p-any-1.1.0.tgz", "integrity": "sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g==", "requires": { - "p-some": "2.0.1" + "p-some": "^2.0.0" } }, "p-cancelable": { @@ -4870,7 +4995,7 @@ "resolved": "https://registry.npmjs.org/p-some/-/p-some-2.0.1.tgz", "integrity": "sha1-Zdh8ixVO289SIdFnd4ttLhUPbwY=", "requires": { - "aggregate-error": "1.0.0" + "aggregate-error": "^1.0.0" } }, "p-timeout": { @@ -4878,7 +5003,7 @@ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "requires": { - "p-finally": "1.0.0" + "p-finally": "^1.0.0" } }, "package-json": { @@ -4887,10 +5012,10 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.1" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "parse-glob": { @@ -4900,10 +5025,29 @@ "dev": true, "optional": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + } } }, "parseurl": { @@ -4991,7 +5135,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.8.0" } }, @@ -5026,9 +5170,9 @@ "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "randomatic": { @@ -5038,9 +5182,9 @@ "dev": true, "optional": true, "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -5088,7 +5232,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" } }, "setprototypeof": { @@ -5104,10 +5248,10 @@ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -5123,13 +5267,13 @@ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -5138,9 +5282,9 @@ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "dependencies": { "arr-diff": { @@ -5161,16 +5305,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "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.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "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" }, "dependencies": { "extend-shallow": { @@ -5179,7 +5323,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5190,13 +5334,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" }, "dependencies": { "define-property": { @@ -5205,7 +5349,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5214,7 +5358,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -5223,7 +5367,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5232,7 +5376,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5243,7 +5387,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5252,7 +5396,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5263,9 +5407,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -5282,14 +5426,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" }, "dependencies": { "define-property": { @@ -5298,7 +5442,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -5307,7 +5451,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5318,10 +5462,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -5330,7 +5474,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5341,7 +5485,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -5350,7 +5494,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -5359,9 +5503,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -5370,7 +5514,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5379,7 +5523,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5402,19 +5546,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "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.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" } } } @@ -5425,21 +5569,15 @@ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -5449,7 +5587,7 @@ "dev": true, "optional": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -5458,8 +5596,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexp-clone": { @@ -5473,9 +5611,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { @@ -5484,8 +5622,8 @@ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "rc": "1.2.8", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -5494,12 +5632,12 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.8" + "rc": "^1.0.1" } }, "regjsgen": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "dev": true }, @@ -5509,7 +5647,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -5544,7 +5682,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -5552,26 +5690,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.7", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.1.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.20", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "dependencies": { "qs": { @@ -5591,8 +5729,8 @@ "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", "requires": { - "resolve-from": "2.0.0", - "semver": "5.5.1" + "resolve-from": "^2.0.0", + "semver": "^5.1.0" } }, "resolve-from": { @@ -5611,7 +5749,7 @@ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "requires": { - "lowercase-keys": "1.0.1" + "lowercase-keys": "^1.0.0" } }, "ret": { @@ -5631,7 +5769,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -5640,10 +5778,13 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "saslprep": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.1.tgz", - "integrity": "sha512-ntN6SbE3hRqd45PKKadRPgA+xHPWg5lPSj2JWJdJvjTwXDDfkPVtXWvP8jJojvnm+rAsZ2b299C5NwZqq818EA==", - "optional": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", + "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } }, "semver": { "version": "5.5.1", @@ -5656,7 +5797,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "5.5.1" + "semver": "^5.0.3" } }, "send": { @@ -5665,18 +5806,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" } }, "serve-static": { @@ -5684,9 +5825,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -5696,10 +5837,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -5708,7 +5849,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5724,7 +5865,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5744,15 +5885,9 @@ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { - "is-arrayish": "0.3.2" + "is-arrayish": "^0.3.1" } }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -5764,14 +5899,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "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" }, "dependencies": { "define-property": { @@ -5780,7 +5915,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5789,7 +5924,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5800,9 +5935,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -5811,7 +5946,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -5820,7 +5955,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -5829,7 +5964,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -5838,9 +5973,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -5863,7 +5998,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sort-keys": { @@ -5871,7 +6006,7 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-map": { @@ -5886,20 +6021,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" + "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-url": { @@ -5908,13 +6034,22 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -5927,15 +6062,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "stack-trace": { @@ -5949,8 +6084,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -5959,7 +6094,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5980,8 +6115,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -5996,7 +6131,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -6006,16 +6141,16 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-eof": { @@ -6042,7 +6177,7 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "text-hex": { @@ -6067,7 +6202,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -6076,10 +6211,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -6088,8 +6223,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -6098,7 +6233,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } @@ -6109,7 +6244,7 @@ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { - "nopt": "1.0.10" + "nopt": "~1.0.10" } }, "tough-cookie": { @@ -6117,8 +6252,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "1.1.29", - "punycode": "1.4.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" }, "dependencies": { "punycode": { @@ -6144,7 +6279,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -6158,7 +6293,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.20" + "mime-types": "~2.1.18" } }, "undefsafe": { @@ -6167,7 +6302,7 @@ "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", "dev": true, "requires": { - "debug": "2.6.9" + "debug": "^2.2.0" } }, "union-value": { @@ -6176,10 +6311,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -6188,7 +6323,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -6197,10 +6332,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -6211,7 +6346,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "unpipe": { @@ -6225,8 +6360,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -6235,9 +6370,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -6283,16 +6418,16 @@ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { - "boxen": "1.3.0", - "chalk": "2.4.2", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.2.1", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -6301,7 +6436,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -6310,9 +6445,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -6321,7 +6456,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -6331,7 +6466,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -6346,7 +6481,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "url-to-options": { @@ -6381,15 +6516,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -6400,9 +6526,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "which": { @@ -6411,7 +6537,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "widest-line": { @@ -6420,7 +6546,7 @@ "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "winston": { @@ -6428,15 +6554,15 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz", "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==", "requires": { - "async": "2.6.1", - "diagnostics": "1.1.1", - "is-stream": "1.1.0", - "logform": "1.10.0", + "async": "^2.6.0", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^1.9.1", "one-time": "0.0.4", - "readable-stream": "2.3.6", - "stack-trace": "0.0.10", - "triple-beam": "1.3.0", - "winston-transport": "4.2.0" + "readable-stream": "^2.3.6", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.2.0" } }, "winston-transport": { @@ -6444,8 +6570,8 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", "requires": { - "readable-stream": "2.3.6", - "triple-beam": "1.3.0" + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" } }, "wrappy": { @@ -6460,9 +6586,9 @@ "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "ws": { @@ -6470,7 +6596,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz", "integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==", "requires": { - "async-limiter": "1.0.0" + "async-limiter": "~1.0.0" } }, "xdg-basedir": { diff --git a/server/package.json b/server/package.json index 3b1379b86..5755b4a57 100644 --- a/server/package.json +++ b/server/package.json @@ -10,20 +10,20 @@ "author": "", "license": "ISC", "devDependencies": { - "babel-cli": "^6.26.0", - "babel-preset-env": "^1.7.0", - "babel-preset-stage-2": "^6.24.1", - "nodemon": "^1.18.10" + "babel-cli": "6.26.0", + "babel-preset-env": "1.7.0", + "babel-preset-stage-2": "6.24.1", + "nodemon": "1.18.10" }, "dependencies": { - "axios": "^0.18.0", - "cors": "^2.8.4", - "dotenv": "^6.0.0", - "express": "^4.16.3", - "express-graphql": "^0.6.12", - "graphql": "^14.0.0", - "kubernetes-client": "^6.5.1", - "mongoose": "^5.2.12", - "winston": "^3.1.0" + "axios": "0.18.0", + "cors": "2.8.4", + "dotenv": "6.0.0", + "express": "4.16.3", + "express-graphql": "0.6.12", + "graphql": "14.0.0", + "kubernetes-client": "6.5.1", + "mongoose": "5.2.12", + "winston": "3.1.0" } } diff --git a/server/src/schema/queries/GetClone.js b/server/src/schema/queries/GetClone.js new file mode 100644 index 000000000..c449e3084 --- /dev/null +++ b/server/src/schema/queries/GetClone.js @@ -0,0 +1,49 @@ +import { GraphQLNonNull, GraphQLID } from 'graphql' +import { OperationsError } from '../../errors' +import { GetClonesType } from '../types' +import { Clone } from '../../models' +import logger from '../../config/logger' +import mongoose from 'mongoose' +import { isDefined } from '../../config/utils' + +const args = { + cloneId: { type: new GraphQLNonNull(GraphQLID) } +} + +const resolve = async(parent, { cloneId }, context) => { + logger.debug('Get Clone -> Entering Fuction.') + + try { + if (mongoose.Types.ObjectId.isValid(cloneId)) { + let existingClone = await Clone.findOne({ + _id: cloneId + }) + + if (isDefined(existingClone)) { + return { + id: cloneId, + teamId: existingClone.teamId, + botId: existingClone.botId + } + } else { + throw new Error('Clone not found.') + } + } else { + throw new Error('Invalid Clone ID.') + } + return clones + } catch (err) { + logger.error('Get Clone error: %s', err.stack) + throw new OperationsError('There has been an error getting the clone. ' + err.message) + } +} + +const GetClones = { + getClone: { + type: GetClonesType, + args, + resolve + } +} + +export default GetClones diff --git a/server/src/schema/queries/index.js b/server/src/schema/queries/index.js index b7d1de155..ac8c69673 100644 --- a/server/src/schema/queries/index.js +++ b/server/src/schema/queries/index.js @@ -2,13 +2,15 @@ import { GraphQLObjectType } from 'graphql' import ListClones from './ListClones' import HistoryClones from './HistoryClones' import GetClones from './GetClones' +import GetClone from './GetClone' const RootQuery = new GraphQLObjectType({ name: 'RootQueryType', fields: Object.assign( ListClones, HistoryClones, - GetClones + GetClones, + GetClone ) }) From 8f16b37ee1020c3d55a392a45b67a1e3075b908d Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 22 Feb 2019 18:15:43 -0300 Subject: [PATCH 15/42] Fixing releasing key issue --- server/src/schema/mutations/RemoveCloneMutation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index 23f4db15c..43eebde78 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -33,7 +33,7 @@ const resolve = async (parent, { id }, context) => { let team = await teamQuery(context.authorization, clone.teamId) clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) - if ( (clone.mode === LIVE || clone.mode === COMPETITION) && !isDefined(clone.keyId)) { + if ((clone.mode === LIVE || clone.mode === COMPETITION) && isDefined(clone.keyId)) { logger.debug('removeClone -> Release the clone key.') await authorizeClone(context.authorization, clone.keyId, clone.id, true) } From bb1b1ec8ae75f3e05bfab3d77be948e1e84a3d40 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 28 Feb 2019 18:46:43 -0300 Subject: [PATCH 16/42] Adding competition mode to the list view --- client/package.json | 2 +- client/src/GraphQL/models.js | 8 +++++++- client/src/views/Clone/List/ListClones.js | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/client/package.json b/client/package.json index 8d25a66f8..e6a8e7cc6 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.16", + "version": "0.0.17", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/models.js b/client/src/GraphQL/models.js index 47c7e6dfb..cd7e37973 100644 --- a/client/src/GraphQL/models.js +++ b/client/src/GraphQL/models.js @@ -6,6 +6,12 @@ const tradingStartModes = { backtest: 'Backtest' } +const tradingStartModesList = { + live: 'Live', + backtest: 'Backtest', + competition: 'Competition' +} + const indicatorStartModes = { allMonths: 'All Months', oneMonth: 'One Month', @@ -19,4 +25,4 @@ const exchanges = [ } ] -export { tradingStartModes, exchanges, indicatorStartModes, availableMonths } +export { tradingStartModes, tradingStartModesList, exchanges, indicatorStartModes, availableMonths } diff --git a/client/src/views/Clone/List/ListClones.js b/client/src/views/Clone/List/ListClones.js index b9c577826..774536bf8 100644 --- a/client/src/views/Clone/List/ListClones.js +++ b/client/src/views/Clone/List/ListClones.js @@ -10,7 +10,7 @@ import { } from '@material-ui/core' import Avatar from '@material-ui/core/Avatar'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { tradingStartModes, indicatorStartModes } from '../../../GraphQL/models' +import { tradingStartModesList, indicatorStartModes } from '../../../GraphQL/models' import { isDefined, toLocalTime } from '../../../utils' import classNames from 'classnames' import { withStyles } from '@material-ui/core/styles' @@ -43,7 +43,7 @@ class ListClones extends Component {
- { clone.processName } / { clone.botType === 'TRADER' ? tradingStartModes[clone.mode] : indicatorStartModes[clone.mode] } + { clone.processName } / { clone.botType === 'TRADER' ? tradingStartModesList[clone.mode] : indicatorStartModes[clone.mode] }
From 2afc55416617238d1227a7246067aeeea011f8c2 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 5 Mar 2019 20:13:24 -0300 Subject: [PATCH 17/42] Adding link to logs module --- client/package-lock.json | 310 +++++++++++----------- client/package.json | 2 +- client/src/GraphQL/Fragments/clone.js | 1 + client/src/views/Clone/List/ListClones.js | 14 +- server/src/schema/queries/ListClones.js | 1 + server/src/schema/types/CloneType.js | 3 +- 6 files changed, 173 insertions(+), 158 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 8a42f92c0..a41a32819 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.14", + "version": "0.0.17", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", "requires": { - "regenerator-runtime": "0.12.1" + "regenerator-runtime": "^0.12.0" }, "dependencies": { "regenerator-runtime": { @@ -25,31 +25,31 @@ "integrity": "sha512-wDTJyR76+OBdlltiPs3lc1gD6zR+dSA6nITtgkBeLf1NvWfNotMWdvldIDnF3bu24ySAX9imfzDfkBu4Edtqww==", "requires": { "@babel/runtime": "7.1.2", - "@types/jss": "9.5.6", - "@types/react-transition-group": "2.0.14", - "brcast": "3.0.1", - "classnames": "2.2.6", - "csstype": "2.5.7", - "debounce": "1.2.0", - "deepmerge": "2.2.1", - "dom-helpers": "3.3.1", - "hoist-non-react-statics": "2.5.5", - "is-plain-object": "2.0.4", - "jss": "9.8.7", - "jss-camel-case": "6.1.0", - "jss-default-unit": "8.0.2", - "jss-global": "3.0.0", - "jss-nested": "6.0.1", - "jss-props-sort": "6.0.0", - "jss-vendor-prefixer": "7.0.0", - "keycode": "2.2.0", - "normalize-scroll-left": "0.1.2", - "popper.js": "1.14.4", - "prop-types": "15.6.2", - "react-event-listener": "0.6.4", - "react-transition-group": "2.5.0", - "recompose": "0.30.0", - "warning": "4.0.2" + "@types/jss": "^9.5.6", + "@types/react-transition-group": "^2.0.8", + "brcast": "^3.0.1", + "classnames": "^2.2.5", + "csstype": "^2.5.2", + "debounce": "^1.1.0", + "deepmerge": "^2.0.1", + "dom-helpers": "^3.2.1", + "hoist-non-react-statics": "^2.5.0", + "is-plain-object": "^2.0.4", + "jss": "^9.3.3", + "jss-camel-case": "^6.0.0", + "jss-default-unit": "^8.0.2", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-vendor-prefixer": "^7.0.0", + "keycode": "^2.1.9", + "normalize-scroll-left": "^0.1.2", + "popper.js": "^1.14.1", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.2", + "react-transition-group": "^2.2.1", + "recompose": "0.28.0 - 0.30.0", + "warning": "^4.0.1" }, "dependencies": { "@babel/runtime": { @@ -57,7 +57,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", "requires": { - "regenerator-runtime": "0.12.1" + "regenerator-runtime": "^0.12.0" } } } @@ -68,7 +68,7 @@ "integrity": "sha512-1kNcxYiIT1x8iDPEAlgmKrfRTIV8UyK6fLVcZ9kMHIKGWft9I451V5mvSrbCjbf7MX1TbLWzZjph0aVCRf9MqQ==", "requires": { "@babel/runtime": "7.0.0", - "recompose": "0.29.0" + "recompose": "^0.29.0" }, "dependencies": { "recompose": { @@ -76,12 +76,12 @@ "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.29.0.tgz", "integrity": "sha512-J/qLXNU4W+AeHCDR70ajW8eMd1uroqZaECTj6qqDLPMILz3y0EzpYlvrnxKB9DnqcngWrtGwjXY9JeXaW9kS1A==", "requires": { - "@babel/runtime": "7.0.0", - "change-emitter": "0.1.6", - "fbjs": "0.8.17", - "hoist-non-react-statics": "2.5.5", - "react-lifecycles-compat": "3.0.4", - "symbol-observable": "1.2.0" + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" } } } @@ -97,8 +97,8 @@ "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.6.tgz", "integrity": "sha512-7TWmR5y1jYG4ka4wTZt65RR0kw4WgALFUWktQIWbLnDd6/z/0SQZ/4+UeH0rhdp+HEdIfmzPBH0VwE/4Z9Evzw==", "requires": { - "csstype": "2.5.7", - "indefinite-observable": "1.0.1" + "csstype": "^2.0.0", + "indefinite-observable": "^1.0.1" } }, "@types/prop-types": { @@ -111,8 +111,8 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.16.tgz", "integrity": "sha512-lxyoipLWweAnLnSsV4Ho2NAZTKKmxeYgkTQ6PaDiPDU9JJBUY2zJVVGiK1smzYv8+ZgbqEmcm5xM74GCpunSEA==", "requires": { - "@types/prop-types": "15.5.6", - "csstype": "2.5.7" + "@types/prop-types": "*", + "csstype": "^2.2.0" } }, "@types/react-transition-group": { @@ -120,7 +120,7 @@ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.14.tgz", "integrity": "sha512-pa7qB0/mkhwWMBFoXhX8BcntK8G4eQl4sIfSrJCxnivTYRQWjOWf2ClR9bWdm0EUFBDHzMbKYS+QYfDtBzkY4w==", "requires": { - "@types/react": "16.4.16" + "@types/react": "*" } }, "@types/zen-observable": { @@ -133,7 +133,7 @@ "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.17.tgz", "integrity": "sha512-7sp24n2HZO4vXgTaKNomLyIfGxG4gDdDkBB0jkRzRi7HhnKmfwhiF/RCiKNbgLdrPX151INdls0KwIVliD0dHQ==", "requires": { - "apollo-utilities": "1.0.21" + "apollo-utilities": "^1.0.21" } }, "apollo-client": { @@ -142,13 +142,13 @@ "integrity": "sha512-g1z23umaVSoKLj9xNl0aAnk2KBF4JeBi7MeKFc9CGTixH7TkqeQUQtxcjrC7j2h4KmDbuhOAHOFUGf8YshN+ag==", "requires": { "@types/async": "2.0.49", - "@types/zen-observable": "0.8.0", + "@types/zen-observable": "^0.8.0", "apollo-cache": "1.1.17", - "apollo-link": "1.2.3", - "apollo-link-dedup": "1.0.10", + "apollo-link": "^1.0.0", + "apollo-link-dedup": "^1.0.0", "apollo-utilities": "1.0.21", - "symbol-observable": "1.2.0", - "zen-observable": "0.8.9" + "symbol-observable": "^1.0.2", + "zen-observable": "^0.8.0" } }, "apollo-link": { @@ -156,8 +156,8 @@ "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz", "integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==", "requires": { - "apollo-utilities": "1.0.21", - "zen-observable-ts": "0.8.10" + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.10" } }, "apollo-link-dedup": { @@ -165,7 +165,7 @@ "resolved": "https://registry.npmjs.org/apollo-link-dedup/-/apollo-link-dedup-1.0.10.tgz", "integrity": "sha512-tpUI9lMZsidxdNygSY1FxflXEkUZnvKRkMUsXXuQUNoSLeNtEvUX7QtKRAl4k9ubLl8JKKc9X3L3onAFeGTK8w==", "requires": { - "apollo-link": "1.2.3" + "apollo-link": "^1.2.3" } }, "apollo-utilities": { @@ -173,8 +173,8 @@ "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.21.tgz", "integrity": "sha512-ZcxELlEl+sDCYBgEMdNXJAsZtRVm8wk4HIA58bMsqYfd1DSAJQEtZ93F0GZgYNAGy3QyaoBeZtbb0/01++G8JQ==", "requires": { - "fast-json-stable-stringify": "2.0.0", - "fclone": "1.0.11" + "fast-json-stable-stringify": "^2.0.0", + "fclone": "^1.0.11" } }, "asap": { @@ -207,7 +207,7 @@ "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", "requires": { - "is-in-browser": "1.1.3" + "is-in-browser": "^1.0.2" } }, "csstype": { @@ -241,7 +241,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.24" + "iconv-lite": "~0.4.13" } }, "fast-json-stable-stringify": { @@ -260,13 +260,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.18" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" } }, "fbjs-css-vars": { @@ -285,8 +285,8 @@ "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", "dev": true, "requires": { - "min-document": "2.19.0", - "process": "0.5.2" + "min-document": "^2.19.0", + "process": "~0.5.1" } }, "graphql": { @@ -294,7 +294,7 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", "requires": { - "iterall": "1.2.2" + "iterall": "^1.2.2" } }, "graphql-tag": { @@ -307,11 +307,11 @@ "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", "requires": { - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "resolve-pathname": "2.2.0", - "value-equal": "0.4.0", - "warning": "3.0.0" + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" }, "dependencies": { "warning": { @@ -319,7 +319,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } } } @@ -339,7 +339,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "indefinite-observable": { @@ -362,7 +362,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } }, "is-in-browser": { @@ -375,7 +375,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -395,8 +395,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.4" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "iterall": { @@ -414,9 +414,9 @@ "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", "requires": { - "is-in-browser": "1.1.3", - "symbol-observable": "1.2.0", - "warning": "3.0.0" + "is-in-browser": "^1.1.3", + "symbol-observable": "^1.1.0", + "warning": "^3.0.0" }, "dependencies": { "warning": { @@ -424,7 +424,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } } } @@ -434,7 +434,7 @@ "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", "requires": { - "hyphenate-style-name": "1.0.2" + "hyphenate-style-name": "^1.0.2" } }, "jss-default-unit": { @@ -452,7 +452,7 @@ "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", "requires": { - "warning": "3.0.0" + "warning": "^3.0.0" }, "dependencies": { "warning": { @@ -460,7 +460,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } } } @@ -475,7 +475,7 @@ "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", "requires": { - "css-vendor": "0.3.8" + "css-vendor": "^0.3.8" } }, "keycode": { @@ -498,7 +498,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "js-tokens": "4.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "luxon": { @@ -511,12 +511,12 @@ "resolved": "https://registry.npmjs.org/material-ui-pickers/-/material-ui-pickers-1.0.1.tgz", "integrity": "sha512-FRJwgeFUQdQxzNAybZvf11204KFBxqKS6sg4JvAO0cWmHULXJhrc9kuEDT8F7Pomwnv6+AyfxygsoMgIRcBMNg==", "requires": { - "classnames": "2.2.6", - "keycode": "2.2.0", - "react-event-listener": "0.6.4", - "react-text-mask": "5.4.1", - "react-transition-group": "2.5.0", - "tslib": "1.9.3" + "classnames": "^2.2.6", + "keycode": "^2.2.0", + "react-event-listener": "^0.6.4", + "react-text-mask": "=5.4.1", + "react-transition-group": "^2.5.0", + "tslib": "^1.9.3" } }, "min-document": { @@ -525,7 +525,7 @@ "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "dev": true, "requires": { - "dom-walk": "0.1.1" + "dom-walk": "^0.1.0" } }, "node-fetch": { @@ -533,8 +533,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "normalize-scroll-left": { @@ -578,7 +578,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "prop-types": { @@ -586,8 +586,8 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "react": { @@ -595,10 +595,10 @@ "resolved": "https://registry.npmjs.org/react/-/react-16.6.1.tgz", "integrity": "sha512-OtawJThYlvRgm9BXK+xTL7BIlDx8vv21j+fbQDjRRUyok6y7NyjlweGorielTahLZHYIdKUoK2Dp9ByVWuMqxw==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "scheduler": "0.11.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.11.0" } }, "react-apollo": { @@ -606,12 +606,12 @@ "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.2.4.tgz", "integrity": "sha512-haS5R30Qvteb65ZLfWomUZQh47VU4ld4Kof3zlqdbLOrYPt3/DdVZC8ZFPZSxd5zPeIJtZqpUfAxD1WHVoMPIA==", "requires": { - "fbjs": "1.0.0", - "hoist-non-react-statics": "3.0.1", - "invariant": "2.2.4", - "lodash.flowright": "3.5.0", - "lodash.isequal": "4.5.0", - "prop-types": "15.6.2" + "fbjs": "^1.0.0", + "hoist-non-react-statics": "^3.0.0", + "invariant": "^2.2.2", + "lodash.flowright": "^3.5.0", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.6.0" }, "dependencies": { "core-js": { @@ -624,14 +624,14 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", "requires": { - "core-js": "2.5.7", - "fbjs-css-vars": "1.0.1", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.18" + "core-js": "^2.4.1", + "fbjs-css-vars": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" } }, "hoist-non-react-statics": { @@ -639,7 +639,7 @@ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.0.1.tgz", "integrity": "sha512-1kXwPsOi0OGQIZNVMPvgWJ9tSnGMiMfJdihqEzrPEXlHOBh9AAHXX/QYmAJTXztnz/K+PQ8ryCb4eGaN6HlGbQ==", "requires": { - "react-is": "16.5.2" + "react-is": "^16.3.2" } } } @@ -649,10 +649,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.1.tgz", "integrity": "sha512-zm+wBuEMGm009Wt1uE4Zw5KcXOW7qC4E/xW/fpJsCsbOco4U/R84u+DzzO/S4SYSdNBcqcaulcp4w3FXl8pImw==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "scheduler": "0.11.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.11.0" } }, "react-event-listener": { @@ -661,8 +661,8 @@ "integrity": "sha512-t7VSjIuUFmN+GeyKb+wm025YLeojVB85kJL6sSs0wEBJddfmKBEQz+CNBZ2zBLKVWkPy/fZXM6U5yvojjYBVYQ==", "requires": { "@babel/runtime": "7.0.0", - "prop-types": "15.6.2", - "warning": "4.0.2" + "prop-types": "^15.6.0", + "warning": "^4.0.1" } }, "react-hot-loader": { @@ -671,12 +671,12 @@ "integrity": "sha512-T0G5jURyTsFLoiW6MTr5Q35UHC/B2pmYJ7+VBjk8yMDCEABRmCGy4g6QwxoB4pWg4/xYvVTa/Pbqnsgx/+NLuA==", "dev": true, "requires": { - "fast-levenshtein": "2.0.6", - "global": "4.3.2", - "hoist-non-react-statics": "2.5.5", - "prop-types": "15.6.2", - "react-lifecycles-compat": "3.0.4", - "shallowequal": "1.1.0" + "fast-levenshtein": "^2.0.6", + "global": "^4.3.0", + "hoist-non-react-statics": "^2.5.0", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.0.2" } }, "react-is": { @@ -694,7 +694,7 @@ "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-4.0.6.tgz", "integrity": "sha512-WfBlqYRD0fGZpQxRy1apxsPeaqtxhzo7CnUVFKBoGDsQbc89+DQNhjG/D3IxgGYM47oKB+W/Su9ol/vVS6Wc2Q==", "requires": { - "prop-types": "15.6.2" + "prop-types": "^15.6.0" } }, "react-router": { @@ -702,13 +702,13 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", "requires": { - "history": "4.7.2", - "hoist-non-react-statics": "2.5.5", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "path-to-regexp": "1.7.0", - "prop-types": "15.6.2", - "warning": "4.0.2" + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" } }, "react-router-dom": { @@ -716,12 +716,12 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", "requires": { - "history": "4.7.2", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "prop-types": "15.6.2", - "react-router": "4.3.1", - "warning": "4.0.2" + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" } }, "react-text-mask": { @@ -729,7 +729,7 @@ "resolved": "https://registry.npmjs.org/react-text-mask/-/react-text-mask-5.4.1.tgz", "integrity": "sha512-mGx1n0x0skktwsKcpgAGnrgExFlXDflbWEHh8PC1UaQP8+EdHkW7JYczTghsBo2rnVwU9/4A9x/2bVt3HY46/w==", "requires": { - "prop-types": "15.6.2" + "prop-types": "^15.5.6" } }, "react-transition-group": { @@ -737,10 +737,10 @@ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.0.tgz", "integrity": "sha512-qYB3JBF+9Y4sE4/Mg/9O6WFpdoYjeeYqx0AFb64PTazVy8RPMiE3A47CG9QmM4WJ/mzDiZYslV+Uly6O1Erlgw==", "requires": { - "dom-helpers": "3.3.1", - "loose-envify": "1.4.0", - "prop-types": "15.6.2", - "react-lifecycles-compat": "3.0.4" + "dom-helpers": "^3.3.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" } }, "recompose": { @@ -748,12 +748,12 @@ "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", "requires": { - "@babel/runtime": "7.0.0", - "change-emitter": "0.1.6", - "fbjs": "0.8.17", - "hoist-non-react-statics": "2.5.5", - "react-lifecycles-compat": "3.0.4", - "symbol-observable": "1.2.0" + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" } }, "regenerator-runtime": { @@ -776,8 +776,8 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.0.tgz", "integrity": "sha512-MAYbBfmiEHxF0W+c4CxMpEqMYK+rYF584VP/qMKSiHM6lTkBKKYOJaDiSILpJHla6hBOsVd6GucPL46o2Uq3sg==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "setimmediate": { @@ -816,7 +816,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } }, "whatwg-fetch": { @@ -834,7 +834,7 @@ "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.10.tgz", "integrity": "sha512-5vqMtRggU/2GhePC9OU4sYEWOdvmayp2k3gjPf4F0mXwB3CSbbNznfDUvDJx9O2ZTa1EIXdJhPchQveFKwNXPQ==", "requires": { - "zen-observable": "0.8.9" + "zen-observable": "^0.8.0" } } } diff --git a/client/package.json b/client/package.json index e6a8e7cc6..63204e01c 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.17", + "version": "0.0.18", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/Fragments/clone.js b/client/src/GraphQL/Fragments/clone.js index 75a5f9dbc..3fc772000 100644 --- a/client/src/GraphQL/Fragments/clone.js +++ b/client/src/GraphQL/Fragments/clone.js @@ -31,5 +31,6 @@ export const clone = gql` teamAvatar processName keyId + botSlug } ` diff --git a/client/src/views/Clone/List/ListClones.js b/client/src/views/Clone/List/ListClones.js index 774536bf8..f934cfd5f 100644 --- a/client/src/views/Clone/List/ListClones.js +++ b/client/src/views/Clone/List/ListClones.js @@ -1,5 +1,6 @@ import React, { Component } from 'react' import { graphql, compose } from 'react-apollo' +import {withRouter} from "react-router-dom"; import { clones } from '../../../GraphQL/Calls' import { Typography, Button, TextField, Dialog, DialogContent, @@ -144,6 +145,12 @@ class ListClones extends Component { className={classes.buttonList} variant='contained' color='secondary' size='small' onClick={() => this.setState({ isLogsDialogOpen: true })}> + View Process Output + +
- { clone.processName } / { clone.botType === 'TRADER' ? tradingStartModesList[clone.mode] : indicatorStartModes[clone.mode] } + { clone.processName } / { clone.botType === 'Trader' ? tradingStartModesList[clone.mode] : indicatorStartModes[clone.mode] }
@@ -90,7 +90,7 @@ class ListClones extends Component {
Last Execution: - { (clone.botType === 'TRADER' && isDefined(clone.assetA) ) && + { (clone.botType === 'Trader' && isDefined(clone.assetA) ) && Buy Average: Sell Average: @@ -102,7 +102,7 @@ class ListClones extends Component {
{ toLocalTime(clone.summaryDate) } - { (clone.botType === 'TRADER' && isDefined(clone.assetA) ) && + { (clone.botType === 'Trader' && isDefined(clone.assetA) ) && {clone.buyAverage} {clone.sellAverage} diff --git a/server/src/enums/BotTypes.js b/server/src/enums/BotTypes.js index 62cf49339..8616c540b 100644 --- a/server/src/enums/BotTypes.js +++ b/server/src/enums/BotTypes.js @@ -1,11 +1,11 @@ -export const TRADER = 'Trading' -export const INDICATOR = 'Indicator' -export const EXTRACTION = 'Extraction' +export const Trader = 'Trading' +export const Indicator = 'Indicator' +export const Sensor = 'Extraction' export const BotTypesEnum = [ - TRADER, - INDICATOR, - EXTRACTION + Trader, + Indicator, + Sensor ] export default BotTypesEnum diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 2cc127923..8b40b3305 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -4,7 +4,7 @@ import { KubernateError } from '../errors' import { Client, config } from 'kubernetes-client' import deploymentManifest from '../config/clone-deployment.json' import { BACKTEST, COMPETITION, LIVE, NO_TIME } from '../enums/CloneMode' -import { TRADER, INDICATOR, EXTRACTION } from '../enums/BotTypes' +import { Trader, Indicator, Sensor } from '../enums/BotTypes' const createClone = async (clone) => { try { @@ -82,7 +82,7 @@ const createClone = async (clone) => { }) logger.debug('createClone Trading Configuration.') - if (clone.botType === TRADER) { + if (clone.botType === Trader) { env.push({ 'name': 'RESUME_EXECUTION', 'value': clone.resumeExecution.toString() @@ -130,7 +130,7 @@ const createClone = async (clone) => { 'value': clone.keyId }) } - } else if (clone.botType === INDICATOR || clone.botType === EXTRACTION) { + } else if (clone.botType === Indicator || clone.botType === Sensor) { if (clone.mode !== NO_TIME) { env.push({ 'name': 'MIN_YEAR', From 73815df2d725dff563d6d0424c7d9e3e2f42a338 Mon Sep 17 00:00:00 2001 From: Barry Low Date: Sat, 23 Mar 2019 13:23:13 +0100 Subject: [PATCH 24/42] Update Trader to Trading --- client/src/views/Clone/Add/index.js | 10 +++++----- client/src/views/Clone/List/ListClones.js | 6 +++--- server/src/enums/BotTypes.js | 4 ++-- server/src/kubernetes/createClone.js | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index fae774b3b..7cab25671 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -43,7 +43,7 @@ class AddClone extends Component { month: 1, processName: '', - //TraderBot + //TradingBot timePeriod: '01-hs', //Error handlers @@ -155,7 +155,7 @@ class AddClone extends Component { {this.state.selectedBot.kind} - { this.state.selectedBot.kind === "Trader" && + { this.state.selectedBot.kind === "Trading" && Available Running Modes are Backtest and Live. @@ -522,7 +522,7 @@ class AddClone extends Component { } } - if(this.state.selectedBot.kind === "Trader"){ + if(this.state.selectedBot.kind === "Trading"){ variables.clone.runAsTeam = this.state.runAsTeam variables.clone.processName = 'Trading-Process' variables.clone.timePeriod = this.state.timePeriod @@ -547,7 +547,7 @@ class AddClone extends Component { } getBotTypeFromKind(kind){ - if(kind === 'Trader') + if(kind === 'Trading') return 'Trading' else if(kind === 'Indicator') return 'Indicator' @@ -607,7 +607,7 @@ class AddClone extends Component { this.setState(state => ({ modeError: true })); } - if(this.state.selectedBot.kind !== "Trader" + if(this.state.selectedBot.kind !== "Trading" && this.state.processName.length < 1 ) { isError = true this.setState(state => ({ processNameError: true })); diff --git a/client/src/views/Clone/List/ListClones.js b/client/src/views/Clone/List/ListClones.js index 8ceae3594..3591965e9 100644 --- a/client/src/views/Clone/List/ListClones.js +++ b/client/src/views/Clone/List/ListClones.js @@ -44,7 +44,7 @@ class ListClones extends Component {
- { clone.processName } / { clone.botType === 'Trader' ? tradingStartModesList[clone.mode] : indicatorStartModes[clone.mode] } + { clone.processName } / { clone.botType === 'Trading' ? tradingStartModesList[clone.mode] : indicatorStartModes[clone.mode] }
@@ -90,7 +90,7 @@ class ListClones extends Component {
Last Execution: - { (clone.botType === 'Trader' && isDefined(clone.assetA) ) && + { (clone.botType === 'Trading' && isDefined(clone.assetA) ) && Buy Average: Sell Average: @@ -102,7 +102,7 @@ class ListClones extends Component {
{ toLocalTime(clone.summaryDate) } - { (clone.botType === 'Trader' && isDefined(clone.assetA) ) && + { (clone.botType === 'Trading' && isDefined(clone.assetA) ) && {clone.buyAverage} {clone.sellAverage} diff --git a/server/src/enums/BotTypes.js b/server/src/enums/BotTypes.js index 8616c540b..5c716da7d 100644 --- a/server/src/enums/BotTypes.js +++ b/server/src/enums/BotTypes.js @@ -1,9 +1,9 @@ -export const Trader = 'Trading' +export const Trading = 'Trading' export const Indicator = 'Indicator' export const Sensor = 'Extraction' export const BotTypesEnum = [ - Trader, + Trading, Indicator, Sensor ] diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 8b40b3305..cc05966f9 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -4,7 +4,7 @@ import { KubernateError } from '../errors' import { Client, config } from 'kubernetes-client' import deploymentManifest from '../config/clone-deployment.json' import { BACKTEST, COMPETITION, LIVE, NO_TIME } from '../enums/CloneMode' -import { Trader, Indicator, Sensor } from '../enums/BotTypes' +import { Trading, Indicator, Sensor } from '../enums/BotTypes' const createClone = async (clone) => { try { @@ -82,7 +82,7 @@ const createClone = async (clone) => { }) logger.debug('createClone Trading Configuration.') - if (clone.botType === Trader) { + if (clone.botType === Trading) { env.push({ 'name': 'RESUME_EXECUTION', 'value': clone.resumeExecution.toString() From 0af6e810f15709eb60d57841350114850e524dc6 Mon Sep 17 00:00:00 2001 From: Barry Low Date: Sat, 23 Mar 2019 13:46:45 +0100 Subject: [PATCH 25/42] Publish 0.0.23 --- client/package-lock.json | 2 +- client/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 60295d23c..ee733b83d 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.18", + "version": "0.0.21", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/client/package.json b/client/package.json index 483789cf3..2c450f830 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.21", + "version": "0.0.23", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { From b4a2950e48ac95aee49a22e5c45773ab24aa9e61 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 23 Mar 2019 15:56:01 +0100 Subject: [PATCH 26/42] Making the clones filterable by botType (optional) --- server/src/schema/queries/HistoryClones.js | 16 +++++++++++----- server/src/schema/queries/ListClones.js | 15 +++++++++++---- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/server/src/schema/queries/HistoryClones.js b/server/src/schema/queries/HistoryClones.js index 23bcd6d2f..de5ec8232 100644 --- a/server/src/schema/queries/HistoryClones.js +++ b/server/src/schema/queries/HistoryClones.js @@ -1,4 +1,4 @@ -import { GraphQLList } from 'graphql' +import { GraphQLList, GraphQLString } from 'graphql' import { AuthentificationError, OperationsError } from '../../errors' import { CloneType } from '../types' import { Clone } from '../../models' @@ -6,9 +6,11 @@ import logger from '../../config/logger' import cloneDetails from '../cloneDetails' import teamQuery from '../../graphQLCalls/teamQuery' -const args = {} +const args = { + botType: { type: GraphQLString } +} -const resolve = async(parent, args, context) => { +const resolve = async(parent, { botType }, context) => { logger.debug('Retrieving History Clones.') try { if (!context.userId) { @@ -25,8 +27,12 @@ const resolve = async(parent, args, context) => { clones[i] = await cloneDetails(context.userId, team.data.data.teams_TeamById, clones[i]) clones[i].botType = clones[i].kind // Only for listing we show the teams value } - - return clones + if (botType) { + var filtered = clones.filter((value) => value.botType === botType) + return filtered + } else { + return clones + } } catch (err) { logger.error('Retrieving History Clones error: %s', err.stack) throw new OperationsError('There has been an error retrieving history clones.') diff --git a/server/src/schema/queries/ListClones.js b/server/src/schema/queries/ListClones.js index bb418b293..bb911dd70 100644 --- a/server/src/schema/queries/ListClones.js +++ b/server/src/schema/queries/ListClones.js @@ -1,4 +1,4 @@ -import { GraphQLList } from 'graphql' +import { GraphQLList, GraphQLString } from 'graphql' import { AuthentificationError, OperationsError } from '../../errors' import { CloneType } from '../types' import { Clone } from '../../models' @@ -8,9 +8,11 @@ import getCloneLogs from '../../kubernetes/getClonePodLogs' import cloneDetails from '../cloneDetails' import teamQuery from '../../graphQLCalls/teamQuery' -const args = {} +const args = { + botType: { type: GraphQLString } +} -const resolve = async(parent, args, context) => { +const resolve = async (parent, { botType }, context) => { logger.debug('List Clones -> Entering Fuction.') try { if (!context.userId) { @@ -32,7 +34,12 @@ const resolve = async(parent, args, context) => { clones[i].botType = clones[i].kind // Only for listing we show the teams value clones[i].botSlug = clones[i].botSlug } - return clones + if (botType) { + var filtered = clones.filter((value) => value.botType === botType) + return filtered + } else { + return clones + } } catch (err) { logger.error('List Clones error: %s', err.stack) throw new OperationsError('There has been an error listing the clones.') From 799def9d49dd0d08fa444f45736fef9d76e74c02 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 26 Mar 2019 18:59:30 +0100 Subject: [PATCH 27/42] Adding Begin Date to indicators --- client/package.json | 2 +- client/src/views/Clone/Add/index.js | 43 ++++++++++++++++++++++-- server/src/kubernetes/createClone.js | 49 +++++++++++++++------------- 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/client/package.json b/client/package.json index 75cfcd46e..8baf90ea8 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.22", + "version": "0.0.24", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 7cab25671..08ec9b9dc 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -25,7 +25,7 @@ class AddClone extends Component { user: JSON.parse(user), selectedBot: {'id':''}, mode: '', - resumeExecution: false, + resumeExecution: true, beginDatetime: DateTime.local().minus({ days: 8 }).startOf('day'), endDatetime: DateTime.local(), waitTime: 1, @@ -436,6 +436,44 @@ class AddClone extends Component { } + + { this.state.mode === "noTime" && + + + The Resume Execution option let's you pick up the context of + the last execution and continue from there. + + this.setState({resumeExecution:e.target.checked })} + value="resumeExecution" + color="primary" + /> + } + label="Resume Execution" + className={classNames(classes.form, classes.textField)} + /> + { !this.state.resumeExecution && + } + rightArrowIcon={} + value={this.state.beginDatetime} + label='Start Date' + onChange={newVal => this.setState({ beginDatetime: newVal })} + className={classNames(classes.form, classes.textField)} + fullWidth + /> + } + + + } } @@ -539,6 +577,7 @@ class AddClone extends Component { variables.clone.endYear = this.state.endYear variables.clone.month = this.state.month variables.clone.runAsTeam = true + variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000|0 } return this.props.addCloneMutation({ @@ -568,7 +607,7 @@ class AddClone extends Component { this.setState({ selectedBot: {'id':''}, mode: '', - resumeExecution: false, + resumeExecution: true, beginDatetime: DateTime.local().minus({ days: 8 }).startOf('day'), endDatetime: DateTime.local(), waitTime: 1, diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 2ab718fc5..4f68af15b 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -9,7 +9,7 @@ import { Trading, Indicator, Sensor } from '../enums/BotTypes' const createClone = async (clone) => { try { logger.debug('createClone %s', clone.id) - const client = new Client({config: config.fromKubeconfig(), version: '1.9'}) + const client = new Client({ config: config.fromKubeconfig(), version: '1.9' }) deploymentManifest.metadata.name = clone.id logger.debug('createClone Environment and Auth Configuration.') @@ -131,7 +131,12 @@ const createClone = async (clone) => { }) } } else if (clone.botType === Indicator || clone.botType === Sensor) { - if (clone.mode !== NO_TIME) { + if (clone.mode === NO_TIME) { + env.push({ + 'name': 'BEGIN_DATE_TIME', + 'value': isDefined(clone.startYear) ? clone.startYear.toString() : '' + }) + } else { env.push({ 'name': 'MIN_YEAR', 'value': isDefined(clone.startYear) ? clone.startYear.toString() : '' @@ -162,27 +167,27 @@ const createClone = async (clone) => { } } -function datasetNames(){ +function datasetNames() { let dataSetMap = new Map() - dataSetMap.set("24-hs","Multi-Period-Market") - dataSetMap.set("12-hs","Multi-Period-Market") - dataSetMap.set("08-hs","Multi-Period-Market") - dataSetMap.set("06-hs","Multi-Period-Market") - dataSetMap.set("04-hs","Multi-Period-Market") - dataSetMap.set("03-hs","Multi-Period-Market") - dataSetMap.set("02-hs","Multi-Period-Market") - dataSetMap.set("01-hs","Multi-Period-Market") - dataSetMap.set("45-min","Multi-Period-Daily") - dataSetMap.set("40-min","Multi-Period-Daily") - dataSetMap.set("30-min","Multi-Period-Daily") - dataSetMap.set("20-min","Multi-Period-Daily") - dataSetMap.set("15-min","Multi-Period-Daily") - dataSetMap.set("10-min","Multi-Period-Daily") - dataSetMap.set("05-min","Multi-Period-Daily") - dataSetMap.set("04-min","Multi-Period-Daily") - dataSetMap.set("03-min","Multi-Period-Daily") - dataSetMap.set("02-min","Multi-Period-Daily") - dataSetMap.set("01-min","Multi-Period-Daily") + dataSetMap.set("24-hs", "Multi-Period-Market") + dataSetMap.set("12-hs", "Multi-Period-Market") + dataSetMap.set("08-hs", "Multi-Period-Market") + dataSetMap.set("06-hs", "Multi-Period-Market") + dataSetMap.set("04-hs", "Multi-Period-Market") + dataSetMap.set("03-hs", "Multi-Period-Market") + dataSetMap.set("02-hs", "Multi-Period-Market") + dataSetMap.set("01-hs", "Multi-Period-Market") + dataSetMap.set("45-min", "Multi-Period-Daily") + dataSetMap.set("40-min", "Multi-Period-Daily") + dataSetMap.set("30-min", "Multi-Period-Daily") + dataSetMap.set("20-min", "Multi-Period-Daily") + dataSetMap.set("15-min", "Multi-Period-Daily") + dataSetMap.set("10-min", "Multi-Period-Daily") + dataSetMap.set("05-min", "Multi-Period-Daily") + dataSetMap.set("04-min", "Multi-Period-Daily") + dataSetMap.set("03-min", "Multi-Period-Daily") + dataSetMap.set("02-min", "Multi-Period-Daily") + dataSetMap.set("01-min", "Multi-Period-Daily") return dataSetMap } From 4a34ca3cdafd5a349134650837708a5c6952eca8 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 26 Mar 2019 23:35:00 +0100 Subject: [PATCH 28/42] Fixing begin time --- server/src/kubernetes/createClone.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 4f68af15b..4be157ae3 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -134,7 +134,7 @@ const createClone = async (clone) => { if (clone.mode === NO_TIME) { env.push({ 'name': 'BEGIN_DATE_TIME', - 'value': isDefined(clone.startYear) ? clone.startYear.toString() : '' + 'value': isDefined(clone.beginDatetime) ? clone.beginDatetime.toString() : '' }) } else { env.push({ From 26ea666c543fe3b7dd33df37107a2e316f5a75c9 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 26 Mar 2019 23:48:56 +0100 Subject: [PATCH 29/42] Fixing begin time --- server/src/kubernetes/createClone.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 4be157ae3..750b75d4b 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -134,7 +134,7 @@ const createClone = async (clone) => { if (clone.mode === NO_TIME) { env.push({ 'name': 'BEGIN_DATE_TIME', - 'value': isDefined(clone.beginDatetime) ? clone.beginDatetime.toString() : '' + 'value': toPlatformDatetime(clone.beginDatetime) }) } else { env.push({ From 39f2e205bd0c6eac9e8dd24b6577fb81ec5e874b Mon Sep 17 00:00:00 2001 From: Matias Date: Wed, 27 Mar 2019 12:03:55 +0100 Subject: [PATCH 30/42] Adding time only when resumeExecution is false --- server/src/kubernetes/createClone.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 750b75d4b..775888a4e 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -132,10 +132,12 @@ const createClone = async (clone) => { } } else if (clone.botType === Indicator || clone.botType === Sensor) { if (clone.mode === NO_TIME) { - env.push({ - 'name': 'BEGIN_DATE_TIME', - 'value': toPlatformDatetime(clone.beginDatetime) - }) + if (!clone.resumeExecution) { + env.push({ + 'name': 'BEGIN_DATE_TIME', + 'value': toPlatformDatetime(clone.beginDatetime) + }) + } } else { env.push({ 'name': 'MIN_YEAR', From a913686e04d0b9ac2fc53a759c3be79b8fa333cf Mon Sep 17 00:00:00 2001 From: Matias Date: Wed, 27 Mar 2019 18:54:41 +0100 Subject: [PATCH 31/42] Improving clone listing --- client/package.json | 2 +- client/src/GraphQL/Calls/clones.js | 2 +- server/src/graphQLCalls/teamQuery.js | 45 ++++++++------- server/src/kubernetes/getClonePodStatus.js | 4 +- server/src/schema/cloneDetails.js | 64 +++++++--------------- server/src/schema/queries/HistoryClones.js | 20 +++++-- server/src/schema/queries/ListClones.js | 43 ++++++++++----- 7 files changed, 91 insertions(+), 89 deletions(-) diff --git a/client/package.json b/client/package.json index 8baf90ea8..5b7406958 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.24", + "version": "0.0.25", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/Calls/clones.js b/client/src/GraphQL/Calls/clones.js index 7d4c1aff6..54becf398 100644 --- a/client/src/GraphQL/Calls/clones.js +++ b/client/src/GraphQL/Calls/clones.js @@ -12,7 +12,7 @@ const OPERATIONS_ADD_CLONE = gql` const OPERATIONS_LIST_CLONES = gql` query Operations_Clones{ - operations_Clones { + operations_Clones(queryLogs: true) { ...clone } } diff --git a/server/src/graphQLCalls/teamQuery.js b/server/src/graphQLCalls/teamQuery.js index b38833ee5..ed7b2a35e 100644 --- a/server/src/graphQLCalls/teamQuery.js +++ b/server/src/graphQLCalls/teamQuery.js @@ -1,7 +1,7 @@ import logger from '../config/logger' import axios from 'axios' -const teamQuery = (authorization, teamId) => { +const teamQuery = (authorization, botId) => { logger.debug('teamQuery -> Entering function') return axios({ @@ -9,32 +9,35 @@ const teamQuery = (authorization, teamId) => { method: 'post', data: { query: ` - query Teams_Team($teamId: String!){ - teams_TeamById(teamId:$teamId) { - id - name - slug - fb { - id - name - slug - kind - avatar - } - members { - member { - alias - authId + query teams_FbByOwner($fbId: String){ + teams_FbByOwner(fbId: $fbId) { + edges{ + node{ + id + kind + name + slug + avatar + team{ + id + name + slug + profile{ + avatar + } + members{ + member{ + alias + } + } + } } } - profile{ - avatar - } } } `, variables: { - teamId: teamId + fbId: botId } }, headers: { diff --git a/server/src/kubernetes/getClonePodStatus.js b/server/src/kubernetes/getClonePodStatus.js index e2f70932e..cad8cc97a 100644 --- a/server/src/kubernetes/getClonePodStatus.js +++ b/server/src/kubernetes/getClonePodStatus.js @@ -4,7 +4,7 @@ import { Client, config } from 'kubernetes-client' const getClonePodStatus = async (cloneName) => { try { - logger.debug('getClonePodStatus on kubernates started. ') + logger.debug('getClonePodStatus on kubernates started.') const client = new Client({ config: config.fromKubeconfig(), version: '1.9' }) let query = { @@ -26,7 +26,7 @@ const getClonePodStatus = async (cloneName) => { return JSON.stringify(clonePodStatus, null, 2) } else { - logger.warn('getClonePodStatus pod not found %s: ', cloneName) + logger.warn('getClonePodStatus pod not found: %s', cloneName) return " Clone not found on the server. " } } catch (err) { diff --git a/server/src/schema/cloneDetails.js b/server/src/schema/cloneDetails.js index b8cab3c23..ae5d37f1b 100644 --- a/server/src/schema/cloneDetails.js +++ b/server/src/schema/cloneDetails.js @@ -1,54 +1,28 @@ import logger from '../config/logger' -import { isDefined } from '../config/utils' -import { AutorizationError } from '../errors' -const cloneDetails = (authId, team, clone) => { +const cloneDetails = (authId, selectedBot, clone) => { logger.debug('cloneDetails -> Entering function.') - if (!(authId === (process.env.AUTH_CLIENT_ID + '@clients') || isAuthorized(team, authId))) { - logger.debug('User %s is not authorized to manage team %s.', authId, team.slug) - throw new AutorizationError() + if (selectedBot !== undefined) { + clone.botId = selectedBot.id + clone.kind = selectedBot.kind + clone.botName = selectedBot.name + clone.botSlug = selectedBot.slug + clone.botAvatar = selectedBot.avatar + + clone.teamId = selectedBot.team.id + clone.teamName = selectedBot.team.name + clone.teamSlug = selectedBot.team.slug + + clone.teamAvatar = selectedBot.team.profile.avatar + + clone.userLoggedIn = selectedBot.team.members[0].member.alias // TODO change by context info if possible + + clone.botType = selectedBot.kind // Only for listing we show the teams value + + logger.debug('cloneDetails -> Retrieving clone details complete.') } - - let selectedBot = getSelectedBot(team, clone.botId) - clone.teamId = team.id - clone.botId = selectedBot.id - clone.kind = selectedBot.kind - clone.teamSlug = team.slug - clone.botSlug = selectedBot.slug - clone.teamName = team.name - clone.botName = selectedBot.name - clone.botAvatar = selectedBot.avatar - clone.teamAvatar = team.profile.avatar - clone.userLoggedIn = team.members[0].member.alias // TODO change by context info if possible - - logger.debug('cloneDetails -> Retrieving clone details complete.') return clone } -function getSelectedBot (team, selectedBotId) { - logger.debug('cloneDetails -> Getting selected bot.') - if (isDefined(team)) { - for (var i = 0; i < team.fb.length; i++) { - if (team.fb[i].id === selectedBotId) { - return team.fb[i] - } - } - } -} - -function isAuthorized (team, authId) { - logger.debug('cloneDetails -> Checking if the user is authorized by the teams module.') - let authorized = false - if (isDefined(team)) { - for (var i = 0; i < team.members.length; i++) { - if (team.members[i].member.authId === authId) { - authorized = true - break - } - } - } - return authorized -} - export default cloneDetails diff --git a/server/src/schema/queries/HistoryClones.js b/server/src/schema/queries/HistoryClones.js index de5ec8232..446124699 100644 --- a/server/src/schema/queries/HistoryClones.js +++ b/server/src/schema/queries/HistoryClones.js @@ -22,16 +22,26 @@ const resolve = async(parent, { botType }, context) => { active: false }).sort({createDatetime: -1}) + let cloneResponse = [] + let allUserBotsResponse = await teamQuery(context.authorization, null) + let allUserBots = allUserBotsResponse.data.data.teams_FbByOwner.edges + for (var i = 0; i < clones.length; i++) { - let team = await teamQuery(context.authorization, clones[i].teamId) - clones[i] = await cloneDetails(context.userId, team.data.data.teams_TeamById, clones[i]) - clones[i].botType = clones[i].kind // Only for listing we show the teams value + for (var j = 0; j < allUserBots.length; j++) { + let bot = allUserBots[j].node + if(clones[i].botId === bot.id){ + let clone = cloneDetails(context.userId, bot, clones[i]) + cloneResponse.push(clone) + break + } + } } + if (botType) { - var filtered = clones.filter((value) => value.botType === botType) + var filtered = cloneResponse.filter((value) => value.botType === botType) return filtered } else { - return clones + return cloneResponse } } catch (err) { logger.error('Retrieving History Clones error: %s', err.stack) diff --git a/server/src/schema/queries/ListClones.js b/server/src/schema/queries/ListClones.js index bb911dd70..390201f17 100644 --- a/server/src/schema/queries/ListClones.js +++ b/server/src/schema/queries/ListClones.js @@ -1,4 +1,4 @@ -import { GraphQLList, GraphQLString } from 'graphql' +import { GraphQLList, GraphQLString, GraphQLBoolean } from 'graphql' import { AuthentificationError, OperationsError } from '../../errors' import { CloneType } from '../types' import { Clone } from '../../models' @@ -9,10 +9,11 @@ import cloneDetails from '../cloneDetails' import teamQuery from '../../graphQLCalls/teamQuery' const args = { - botType: { type: GraphQLString } + botType: { type: GraphQLString }, + queryLogs: { type: GraphQLBoolean } } -const resolve = async (parent, { botType }, context) => { +const resolve = async (parent, { botType, queryLogs }, context) => { logger.debug('List Clones -> Entering Fuction.') try { if (!context.userId) { @@ -22,23 +23,37 @@ const resolve = async (parent, { botType }, context) => { let clones = await Clone.find({ authId: context.userId, active: true - }).sort({createDatetime: -1}) + }).sort({ createDatetime: -1 }) + + let cloneResponse = [] + let allUserBotsResponse = await teamQuery(context.authorization, null) + let allUserBots = allUserBotsResponse.data.data.teams_FbByOwner.edges for (var i = 0; i < clones.length; i++) { - let team = await teamQuery(context.authorization, clones[i].teamId) - clones[i] = await cloneDetails(context.userId, team.data.data.teams_TeamById, clones[i]) - let state = await getCloneStatus(clones[i].id) - clones[i].state = state.substring(1, state.length - 1) - let lastLogs = await getCloneLogs(clones[i].id) - clones[i].lastLogs = lastLogs.substring(1, lastLogs.length - 1) - clones[i].botType = clones[i].kind // Only for listing we show the teams value - clones[i].botSlug = clones[i].botSlug + for (var j = 0; j < allUserBots.length; j++) { + let bot = allUserBots[j].node + if(clones[i].botId === bot.id){ + let clone = cloneDetails(context.userId, bot, clones[i]) + cloneResponse.push(clone) + break + } + } + } + + if (queryLogs) { + for (var i = 0; i < cloneResponse.length; i++) { + let state = await getCloneStatus(cloneResponse[i].id) + cloneResponse[i].state = state.substring(1, state.length - 1) + + let lastLogs = await getCloneLogs(cloneResponse[i].id) + cloneResponse[i].lastLogs = lastLogs.substring(1, lastLogs.length - 1) + } } if (botType) { - var filtered = clones.filter((value) => value.botType === botType) + var filtered = cloneResponse.filter((value) => value.botType === botType) return filtered } else { - return clones + return cloneResponse } } catch (err) { logger.error('List Clones error: %s', err.stack) From a73805f222c008559b504aea0011eaf8cbc43549 Mon Sep 17 00:00:00 2001 From: Matias Date: Wed, 27 Mar 2019 19:38:42 +0100 Subject: [PATCH 32/42] Clone Details method update --- server/src/kubernetes/createClone.js | 2 +- server/src/schema/cloneDetails.js | 16 +++------------- server/src/schema/mutations/AddCloneMutation.js | 5 +++-- .../src/schema/mutations/RemoveCloneMutation.js | 5 +++-- .../schema/mutations/UpdateExecutionSummary.js | 5 +++-- server/src/schema/queries/HistoryClones.js | 2 +- server/src/schema/queries/ListClones.js | 2 +- 7 files changed, 15 insertions(+), 22 deletions(-) diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 775888a4e..cf5927177 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -159,7 +159,7 @@ const createClone = async (clone) => { } deploymentManifest.spec.template.spec.containers[0].env = env - + logger.debug('ENV %s: ', JSON.stringify(env)) await client.apis.batch.v1.namespaces('default').jobs.post( { body: deploymentManifest }) diff --git a/server/src/schema/cloneDetails.js b/server/src/schema/cloneDetails.js index ae5d37f1b..d0dff70b3 100644 --- a/server/src/schema/cloneDetails.js +++ b/server/src/schema/cloneDetails.js @@ -1,26 +1,16 @@ -import logger from '../config/logger' - -const cloneDetails = (authId, selectedBot, clone) => { - logger.debug('cloneDetails -> Entering function.') - +const cloneDetails = (selectedBot, clone) => { if (selectedBot !== undefined) { clone.botId = selectedBot.id clone.kind = selectedBot.kind clone.botName = selectedBot.name clone.botSlug = selectedBot.slug clone.botAvatar = selectedBot.avatar - clone.teamId = selectedBot.team.id clone.teamName = selectedBot.team.name clone.teamSlug = selectedBot.team.slug - clone.teamAvatar = selectedBot.team.profile.avatar - - clone.userLoggedIn = selectedBot.team.members[0].member.alias // TODO change by context info if possible - - clone.botType = selectedBot.kind // Only for listing we show the teams value - - logger.debug('cloneDetails -> Retrieving clone details complete.') + clone.userLoggedIn = selectedBot.team.members[0].member.alias + clone.botType = selectedBot.kind } return clone } diff --git a/server/src/schema/mutations/AddCloneMutation.js b/server/src/schema/mutations/AddCloneMutation.js index edaf47e4d..549f9651f 100644 --- a/server/src/schema/mutations/AddCloneMutation.js +++ b/server/src/schema/mutations/AddCloneMutation.js @@ -41,8 +41,9 @@ const resolve = async (parent, { clone }, context) => { } try { - let team = await teamQuery(context.authorization, clone.teamId) - clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) + let allUserBotsResponse = await teamQuery(context.authorization, clone.botId) + let bot = allUserBotsResponse.data.data.teams_FbByOwner.edges[0].node + clone = cloneDetails(bot, clone) clone.createDatetime = new Date().valueOf() / 1000 | 0 clone.active = true diff --git a/server/src/schema/mutations/RemoveCloneMutation.js b/server/src/schema/mutations/RemoveCloneMutation.js index 43eebde78..5e4fa9ed0 100644 --- a/server/src/schema/mutations/RemoveCloneMutation.js +++ b/server/src/schema/mutations/RemoveCloneMutation.js @@ -30,8 +30,9 @@ const resolve = async (parent, { id }, context) => { throw new OperationsError('You are not authorized to remove this clone.') } - let team = await teamQuery(context.authorization, clone.teamId) - clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) + let allUserBotsResponse = await teamQuery(context.authorization, clone.botId) + let bot = allUserBotsResponse.data.data.teams_FbByOwner.edges[0].node + clone = cloneDetails(bot, clone) if ((clone.mode === LIVE || clone.mode === COMPETITION) && isDefined(clone.keyId)) { logger.debug('removeClone -> Release the clone key.') diff --git a/server/src/schema/mutations/UpdateExecutionSummary.js b/server/src/schema/mutations/UpdateExecutionSummary.js index dfe434e7d..de5729f6d 100644 --- a/server/src/schema/mutations/UpdateExecutionSummary.js +++ b/server/src/schema/mutations/UpdateExecutionSummary.js @@ -44,8 +44,9 @@ const resolve = async (parent, return 'Clone not found.' } - let team = await teamQuery(context.authorization, clone.teamId) - clone = await cloneDetails(context.userId, team.data.data.teams_TeamById, clone) + let allUserBotsResponse = await teamQuery(context.authorization, clone.botId) + let bot = allUserBotsResponse.data.data.teams_FbByOwner.edges[0].node + clone = cloneDetails(bot, clone) const query = { _id: id } const options = { new: true } diff --git a/server/src/schema/queries/HistoryClones.js b/server/src/schema/queries/HistoryClones.js index 446124699..f9a3ee731 100644 --- a/server/src/schema/queries/HistoryClones.js +++ b/server/src/schema/queries/HistoryClones.js @@ -30,7 +30,7 @@ const resolve = async(parent, { botType }, context) => { for (var j = 0; j < allUserBots.length; j++) { let bot = allUserBots[j].node if(clones[i].botId === bot.id){ - let clone = cloneDetails(context.userId, bot, clones[i]) + let clone = cloneDetails(bot, clones[i]) cloneResponse.push(clone) break } diff --git a/server/src/schema/queries/ListClones.js b/server/src/schema/queries/ListClones.js index 390201f17..60f5e4e1a 100644 --- a/server/src/schema/queries/ListClones.js +++ b/server/src/schema/queries/ListClones.js @@ -33,7 +33,7 @@ const resolve = async (parent, { botType, queryLogs }, context) => { for (var j = 0; j < allUserBots.length; j++) { let bot = allUserBots[j].node if(clones[i].botId === bot.id){ - let clone = cloneDetails(context.userId, bot, clones[i]) + let clone = cloneDetails(bot, clones[i]) cloneResponse.push(clone) break } From 43cff60e9532f130816d8a20c9c703f7fd0f30b4 Mon Sep 17 00:00:00 2001 From: Matias Date: Wed, 27 Mar 2019 22:18:58 +0100 Subject: [PATCH 33/42] Changing authorization on the update execution --- .../schema/mutations/UpdateExecutionSummary.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/server/src/schema/mutations/UpdateExecutionSummary.js b/server/src/schema/mutations/UpdateExecutionSummary.js index de5729f6d..876f2b07d 100644 --- a/server/src/schema/mutations/UpdateExecutionSummary.js +++ b/server/src/schema/mutations/UpdateExecutionSummary.js @@ -8,8 +8,6 @@ import { import { OperationsError } from '../../errors' import { Clone } from '../../models' import logger from '../../config/logger' -import teamQuery from '../../graphQLCalls/teamQuery' -import cloneDetails from '../cloneDetails' import { isDefined } from '../../config/utils' const args = { @@ -25,15 +23,20 @@ const args = { } const resolve = async (parent, - { id, summaryDate, buyAverage, sellAverage, marketRate, combinedProfitsA, - combinedProfitsB, assetA, assetB - }, context) => { + { id, summaryDate, buyAverage, sellAverage, marketRate, combinedProfitsA, + combinedProfitsB, assetA, assetB + }, context) => { logger.debug('UpdateExecutionSummary -> Entering Function.') if (!context.userId) { throw new AuthentificationError() } + if (!(context.userId === process.env.AACLOUD_ID)) { + logger.debug('User %s is not authorized to manage team %s.', authId, team.slug) + throw new AutorizationError() + } + try { let clone = await Clone.findOne({ _id: id, @@ -44,10 +47,6 @@ const resolve = async (parent, return 'Clone not found.' } - let allUserBotsResponse = await teamQuery(context.authorization, clone.botId) - let bot = allUserBotsResponse.data.data.teams_FbByOwner.edges[0].node - clone = cloneDetails(bot, clone) - const query = { _id: id } const options = { new: true } const update = { From 8f6c7d7cf1dcd067ab7dea18aba8bb9e7b159c09 Mon Sep 17 00:00:00 2001 From: Matias Date: Wed, 27 Mar 2019 23:03:02 +0100 Subject: [PATCH 34/42] Extraction Type --- server/src/enums/BotTypes.js | 4 ++-- server/src/kubernetes/createClone.js | 4 ++-- server/src/schema/cloneDetails.js | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/server/src/enums/BotTypes.js b/server/src/enums/BotTypes.js index 5c716da7d..02145b032 100644 --- a/server/src/enums/BotTypes.js +++ b/server/src/enums/BotTypes.js @@ -1,11 +1,11 @@ export const Trading = 'Trading' export const Indicator = 'Indicator' -export const Sensor = 'Extraction' +export const Extraction = 'Extraction' export const BotTypesEnum = [ Trading, Indicator, - Sensor + Extraction ] export default BotTypesEnum diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index cf5927177..ccab8aa6d 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -4,7 +4,7 @@ import { KubernateError } from '../errors' import { Client, config } from 'kubernetes-client' import deploymentManifest from '../config/clone-deployment.json' import { BACKTEST, COMPETITION, LIVE, NO_TIME } from '../enums/CloneMode' -import { Trading, Indicator, Sensor } from '../enums/BotTypes' +import { Trading, Indicator, Extraction } from '../enums/BotTypes' const createClone = async (clone) => { try { @@ -130,7 +130,7 @@ const createClone = async (clone) => { 'value': clone.keyId }) } - } else if (clone.botType === Indicator || clone.botType === Sensor) { + } else if (clone.botType === Indicator || clone.botType === Extraction) { if (clone.mode === NO_TIME) { if (!clone.resumeExecution) { env.push({ diff --git a/server/src/schema/cloneDetails.js b/server/src/schema/cloneDetails.js index d0dff70b3..1d8acc9f6 100644 --- a/server/src/schema/cloneDetails.js +++ b/server/src/schema/cloneDetails.js @@ -10,7 +10,6 @@ const cloneDetails = (selectedBot, clone) => { clone.teamSlug = selectedBot.team.slug clone.teamAvatar = selectedBot.team.profile.avatar clone.userLoggedIn = selectedBot.team.members[0].member.alias - clone.botType = selectedBot.kind } return clone } From b64b61c01bff64221ca3b8dbf518e81d3050d67a Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 28 Mar 2019 11:15:54 +0100 Subject: [PATCH 35/42] Adding bot kind on list --- server/src/schema/queries/HistoryClones.js | 1 + server/src/schema/queries/ListClones.js | 1 + 2 files changed, 2 insertions(+) diff --git a/server/src/schema/queries/HistoryClones.js b/server/src/schema/queries/HistoryClones.js index f9a3ee731..9cd860499 100644 --- a/server/src/schema/queries/HistoryClones.js +++ b/server/src/schema/queries/HistoryClones.js @@ -31,6 +31,7 @@ const resolve = async(parent, { botType }, context) => { let bot = allUserBots[j].node if(clones[i].botId === bot.id){ let clone = cloneDetails(bot, clones[i]) + clone.botType = bot.kind cloneResponse.push(clone) break } diff --git a/server/src/schema/queries/ListClones.js b/server/src/schema/queries/ListClones.js index 60f5e4e1a..afb70d263 100644 --- a/server/src/schema/queries/ListClones.js +++ b/server/src/schema/queries/ListClones.js @@ -34,6 +34,7 @@ const resolve = async (parent, { botType, queryLogs }, context) => { let bot = allUserBots[j].node if(clones[i].botId === bot.id){ let clone = cloneDetails(bot, clones[i]) + clone.botType = bot.kind cloneResponse.push(clone) break } From 9a2d671a97a618c1b4bb323bc7e4e7fbcaa27342 Mon Sep 17 00:00:00 2001 From: Matias Date: Mon, 1 Apr 2019 12:09:16 +0200 Subject: [PATCH 36/42] Sync with latest version of clone executor --- client/package.json | 2 +- client/src/GraphQL/Fragments/clone.js | 36 - client/src/GraphQL/Fragments/index.js | 39 +- client/src/GraphQL/models.js | 40 +- client/src/views/Clone/Add/index.js | 768 +++++++++++---------- server/.gitignore | 2 - server/README.md | 14 +- server/src/config/clone-deployment.json | 31 + server/src/enums/BotTypes.js | 4 +- server/src/kubernetes/createClone.js | 10 +- server/src/schema/cloneDetails.js | 1 + server/src/schema/queries/HistoryClones.js | 1 - server/src/schema/queries/ListClones.js | 1 - server/src/schema/types/input/Clone.js | 3 +- 14 files changed, 500 insertions(+), 452 deletions(-) delete mode 100644 client/src/GraphQL/Fragments/clone.js create mode 100644 server/src/config/clone-deployment.json diff --git a/client/package.json b/client/package.json index 5b7406958..a1fdc2e36 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.25", + "version": "0.0.27", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/Fragments/clone.js b/client/src/GraphQL/Fragments/clone.js deleted file mode 100644 index 3fc772000..000000000 --- a/client/src/GraphQL/Fragments/clone.js +++ /dev/null @@ -1,36 +0,0 @@ -import gql from 'graphql-tag' - -export const clone = gql` - fragment clone on operations_Clone { - id - authId - teamId - botId - mode - resumeExecution - beginDatetime - endDatetime - waitTime - state - stateDatetime - createDatetime - lastLogs - runAsTeam - summaryDate - buyAverage - sellAverage - marketRate - combinedProfitsA - combinedProfitsB - assetA - assetB - botType - teamName - botName - botAvatar - teamAvatar - processName - keyId - botSlug - } -` diff --git a/client/src/GraphQL/Fragments/index.js b/client/src/GraphQL/Fragments/index.js index d916b776d..3fc772000 100644 --- a/client/src/GraphQL/Fragments/index.js +++ b/client/src/GraphQL/Fragments/index.js @@ -1,5 +1,36 @@ -import { clone } from './clone' +import gql from 'graphql-tag' -export { - clone -} +export const clone = gql` + fragment clone on operations_Clone { + id + authId + teamId + botId + mode + resumeExecution + beginDatetime + endDatetime + waitTime + state + stateDatetime + createDatetime + lastLogs + runAsTeam + summaryDate + buyAverage + sellAverage + marketRate + combinedProfitsA + combinedProfitsB + assetA + assetB + botType + teamName + botName + botAvatar + teamAvatar + processName + keyId + botSlug + } +` diff --git a/client/src/GraphQL/models.js b/client/src/GraphQL/models.js index 0ce6667fc..4704c7b65 100644 --- a/client/src/GraphQL/models.js +++ b/client/src/GraphQL/models.js @@ -29,22 +29,36 @@ const tradingStartModesList = { const indicatorStartModes = { allMonths: 'All Months', oneMonth: 'One Month', - noTime: 'No Time' + noTime: 'Head of the Market' } -const processNames = { +const sensorProcessNames = { + Live: "Live-Trades", + HoleFixing: "Hole-Fixing" +} + +const indicatorProcessNames = { Daily: 'Multi-Period-Daily', - Market: 'Multi-Period-Market', - Min: "One-Min-Daily-Candles-Volumes", - Live: "Poloniex-Live-Trades", - HoleFixing: "Poloniex-Hole-Fixing" + Market: 'Multi-Period-Market' } -const exchanges = [ - { - id: '1', - name: 'Poloniex' - } -] +const tradingProcessNames = { + TradingProcess: "Trading-Process" +} -export { tradingStartModes, tradingStartModesList, exchanges, indicatorStartModes, availableMonths, processNames, availableTimePeriods } +const botTypes = { + Trading: "Trading", + Indicator: "Indicator", + Sensor: "Sensor" +} + +const exchanges = { + Coss: "Coss", + Poloniex: "Poloniex", + Binance: "Binance" +} + +export { + tradingStartModes, tradingStartModesList, exchanges, indicatorStartModes, availableMonths, + availableTimePeriods, sensorProcessNames, indicatorProcessNames, tradingProcessNames, botTypes +} diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 08ec9b9dc..99aa9ae77 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -6,24 +6,28 @@ import TopBar from '../../BannerTopBar' import { withStyles } from '@material-ui/core/styles' import classNames from 'classnames' import styles from './styles' -import { tradingStartModes, indicatorStartModes, availableMonths, processNames, availableTimePeriods } from '../../../GraphQL/models' import { isDefined, getIndicatorYears } from '../../../utils' import { - MenuItem, Button, TextField, FormControl, InputLabel, Input, Typography, - Paper, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, - Select, FormControlLabel, Checkbox, FormHelperText + tradingStartModes, indicatorStartModes, availableMonths, availableTimePeriods, + sensorProcessNames, indicatorProcessNames, tradingProcessNames, botTypes, exchanges +} from '../../../GraphQL/models' + +import { + MenuItem, Button, TextField, FormControl, InputLabel, Input, Typography, + Paper, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, + Select, FormControlLabel, Checkbox, FormHelperText } from '@material-ui/core' import { DateTimePicker } from 'material-ui-pickers' import { ChevronLeft, ChevronRight } from '@material-ui/icons' class AddClone extends Component { - constructor(props){ + constructor(props) { super(props) let user = localStorage.getItem('user') this.state = { user: JSON.parse(user), - selectedBot: {'id':''}, + selectedBot: { 'id': '' }, mode: '', resumeExecution: true, beginDatetime: DateTime.local().minus({ days: 8 }).startOf('day'), @@ -36,12 +40,13 @@ class AddClone extends Component { teams: [], teamId: '', keyId: '', + exchangeName: exchanges.Coss, + processName: '', // Indicator Bot startYear: 2019, endYear: 2019, month: 1, - processName: '', //TradingBot timePeriod: '01-hs', @@ -61,7 +66,7 @@ class AddClone extends Component { render() { const { classes } = this.props - if( !isDefined(this.state.user) ) { + if (!isDefined(this.state.user)) { return ( ) } else return ( - - + + -
+
-
+ Create a Bot Clone @@ -114,31 +119,31 @@ class AddClone extends Component { ) } - if(!isDefined(data.teams_TeamsByOwner)){ - return ( - - ) - } else{ + if (!isDefined(data.teams_TeamsByOwner)) { + return ( + + ) + } else { this.teams = data.teams_TeamsByOwner } return ( - this.setState({ botError: false })} + error={this.state.botError} + onChange={e => this.setSelectedBot(e.target.value)} + > { data.teams_TeamsByOwner.map(team => ( team.fb.map(financialBeing => ( @@ -148,347 +153,356 @@ class AddClone extends Component { )) )) } - + ) }} {this.state.selectedBot.kind} - { this.state.selectedBot.kind === "Trading" && - - - Available Running Modes are Backtest and Live. + {this.state.selectedBot.kind === botTypes.Trading && + + + Available Running Modes are Backtest and Live.
    -
  • Backtest mode does NOT put real orders at the exchange; - it simulates the order execution at the specified price. - +
  • Backtest mode does NOT put real orders at the exchange; + it simulates the order execution at the specified price.
  • -
  • - Live mode DOES put real orders at the exchange. +
  • + Live mode DOES put real orders at the exchange.
  • -
-
+ +
- this.setState({mode:e.target.value})} - onBlur={(e)=>this.setState({modeError:false})} - error={this.state.modeError} - fullWidth - > - {Object.keys(tradingStartModes).map(option => ( - - {tradingStartModes[option]} - - ))} - - { this.state.mode == "backtest" && - - } - rightArrowIcon={} - value={this.state.beginDatetime} - label='Backtest Start Date' - onChange={newVal => this.setState({ beginDatetime: newVal })} - className={classNames(classes.form, classes.textField)} - fullWidth - /> + this.setState({ mode: e.target.value })} + onBlur={(e) => this.setState({ modeError: false })} + error={this.state.modeError} + fullWidth + > + {Object.keys(tradingStartModes).map(option => ( + + {tradingStartModes[option]} + + ))} + - } - rightArrowIcon={} - value={this.state.endDatetime} - label='Backtest End Date' - onChange={newVal => this.setState({ endDatetime: newVal })} - className={classNames(classes.form, classes.textField)} - fullWidth - /> - - } + {this.state.mode == "backtest" && + + } + rightArrowIcon={} + value={this.state.beginDatetime} + label='Backtest Start Date' + onChange={newVal => this.setState({ beginDatetime: newVal })} + className={classNames(classes.form, classes.textField)} + fullWidth + /> - { this.state.mode == "live" && - - - Select one of your available Exchange API Keys to be used by this clone. + } + rightArrowIcon={} + value={this.state.endDatetime} + label='Backtest End Date' + onChange={newVal => this.setState({ endDatetime: newVal })} + className={classNames(classes.form, classes.textField)} + fullWidth + /> + + } + + {this.state.mode == "live" && + + + Select one of your available Exchange API Keys to be used by this clone. - - {({ loading, error, data }) => { - if (loading) return ( - this.setState({keyId:e.target.value})} - onBlur={(e)=>this.setState({keyIdError:false})} - error={this.state.keyIdError} - fullWidth - > - - 'Loading keys...' + + {({ loading, error, data }) => { + if (loading) return ( + this.setState({ keyId: e.target.value })} + onBlur={(e) => this.setState({ keyIdError: false })} + error={this.state.keyIdError} + fullWidth + > + + 'Loading keys...' - - ); - if (error) return `Error! ${error.message}`; - const list = data.keyVault_AvailableKeys.map((key) => ( - - {key.key} - - )); - return ( - this.setState({keyId:e.target.value})} - onBlur={(e)=>this.setState({keyIdError:false})} - error={this.state.keyIdError} - fullWidth - > - { list } - - ); - }} - + + ); + if (error) return `Error! ${error.message}`; + const list = data.keyVault_AvailableKeys.map((key) => ( + + {key.key} + + )); + return ( + this.setState({ keyId: e.target.value })} + onBlur={(e) => this.setState({ keyIdError: false })} + error={this.state.keyIdError} + fullWidth + > + {list} + + ); + }} + - - Because we are still in early alpha-testing phase, - Live Trading Clones are limited to an initial investment - of 0.001 BTC. If you choose to run this bot or any modified - version of the code, you are doing it at your own risk. + + Because we are still in early alpha-testing phase, + Live Trading Clones are limited to an initial investment + of 0.001 BTC. If you choose to run this bot or any modified + version of the code, you are doing it at your own risk. - - } + + } - - - - The Time Period in which the bot will operate. + + The Time Period in which the bot will operate. - this.setState({timePeriod:e.target.value})} - fullWidth - > - {availableTimePeriods.map((option, index) => ( + this.setState({ timePeriod: e.target.value })} + fullWidth + > + {availableTimePeriods.map((option, index) => ( + + {option} + + ))} + + +
+ } + + {this.state.selectedBot.kind === botTypes.Indicator && + + this.setState({ processName: e.target.value })} + onBlur={(e) => this.setState({ processNameError: false })} + error={this.state.processNameError} + fullWidth + > + {Object.keys(indicatorProcessNames).map((option, index) => ( + + {indicatorProcessNames[option]} + + ))} + + + } + + {this.state.selectedBot.kind === botTypes.Sensor && + + this.setState({ processName: e.target.value })} + onBlur={(e) => this.setState({ processNameError: false })} + error={this.state.processNameError} + fullWidth + > + {Object.keys(sensorProcessNames).map((option, index) => ( + + {sensorProcessNames[option]} + + ))} + + + } + + {(this.state.selectedBot.kind === botTypes.Indicator + || this.state.selectedBot.kind === botTypes.Sensor) && + + this.setState({ mode: e.target.value })} + onBlur={(e) => this.setState({ modeError: false })} + error={this.state.modeError} + fullWidth + > + {Object.keys(indicatorStartModes).map(option => ( + + {indicatorStartModes[option]} + + ))} + + + {this.state.mode === "allMonths" && + + this.setState({ startYear: e.target.value })} + fullWidth + > + {getIndicatorYears().map((option, index) => ( + + {option} + + ))} + + + this.setState({ endYear: e.target.value })} + fullWidth + > + {getIndicatorYears().map((option, index) => ( + + {option} + + ))} + + + } + + {this.state.mode === "oneMonth" && + + this.setState({ startYear: e.target.value })} + fullWidth + > + {getIndicatorYears().map((option, index) => ( {option} ))} - - - { false && - - - If Run as Team is selected, the clone will be taken from the - team respository instead of your own team member folder. - Competitions runs from the team respository. - - - this.setState({runAsTeam:e.target.checked })} - value="runAsTeam" - color="primary" - /> - } - label="Run as Team" - className={classNames(classes.form, classes.textField)} - /> - - } - - - } - - { (this.state.selectedBot.kind === "Indicator" - || this.state.selectedBot.kind === "Sensor") && - - this.setState({processName:e.target.value})} - onBlur={(e)=>this.setState({processNameError:false})} - error={this.state.processNameError} - fullWidth - > - {Object.keys(processNames).map(option => ( - - {processNames[option]} - - ))} - - this.setState({mode:e.target.value})} - onBlur={(e)=>this.setState({modeError:false})} - error={this.state.modeError} - fullWidth - > - {Object.keys(indicatorStartModes).map(option => ( - - {indicatorStartModes[option]} - - ))} - - - { this.state.mode === "allMonths" && - - this.setState({startYear:e.target.value})} - fullWidth - > - {getIndicatorYears().map((option, index) => ( - - {option} - - ))} - - - this.setState({endYear:e.target.value})} - fullWidth - > - {getIndicatorYears().map((option, index) => ( - - {option} - - ))} - - - } - - { this.state.mode === "oneMonth" && - - this.setState({startYear:e.target.value})} - fullWidth - > - {getIndicatorYears().map((option, index) => ( - - {option} - - ))} - - - this.setState({month:e.target.value})} - fullWidth - > - {availableMonths.map((option, index) => ( - - {option} - - ))} - - - } - - { this.state.mode === "noTime" && - - - The Resume Execution option let's you pick up the context of - the last execution and continue from there. - - this.setState({resumeExecution:e.target.checked })} - value="resumeExecution" - color="primary" - /> - } - label="Resume Execution" - className={classNames(classes.form, classes.textField)} - /> - { !this.state.resumeExecution && - } - rightArrowIcon={} - value={this.state.beginDatetime} - label='Start Date' - onChange={newVal => this.setState({ beginDatetime: newVal })} - className={classNames(classes.form, classes.textField)} - fullWidth - /> - } - - - } - + this.setState({ month: e.target.value })} + fullWidth + > + {availableMonths.map((option, index) => ( + + {option} + + ))} + + + } + } - - You will be able to see the clone information under Active Clones. - Whenever you decide to stop the clone you can delete it. On History Clones will find all deleted clones. + + {(this.state.mode === "noTime" && this.state.selectedBot.kind !== botTypes.Sensor ) && + + + The Resume Execution option let's you pick up the context of + the last execution and continue from there. + + this.setState({ resumeExecution: e.target.checked })} + value="resumeExecution" + color="primary" + /> + } + label="Resume Execution" + className={classNames(classes.form, classes.textField)} + /> + {!this.state.resumeExecution && + } + rightArrowIcon={} + value={this.state.beginDatetime} + label='Start Date' + onChange={newVal => this.setState({ beginDatetime: newVal })} + className={classNames(classes.form, classes.textField)} + fullWidth + /> + } + + + } + + this.setState({ exchangeName: e.target.value })} + fullWidth + > + {Object.keys(exchanges).map((option, index) => ( + + {option} + + ))} + + + + You will be able to see the clone information under Active Clones. + Whenever you decide to stop the clone you can delete it. On History Clones will find all deleted clones.
- -
+
@@ -511,19 +525,19 @@ class AddClone extends Component { - +
); } - setSelectedBot(botId){ - if(isDefined(this.teams)){ + setSelectedBot(botId) { + if (isDefined(this.teams)) { for (var j = 0; j < this.teams.length; j++) { for (var i = 0; i < this.teams[j].fb.length; i++) { - if(this.teams[j].fb[i].id === botId){ - this.setState({selectedBot:this.teams[j].fb[i]}) - this.setState({teamId:this.teams[j].id}) + if (this.teams[j].fb[i].id === botId) { + this.setState({ selectedBot: this.teams[j].fb[i] }) + this.setState({ teamId: this.teams[j].id }) return } } @@ -531,16 +545,16 @@ class AddClone extends Component { } } - async submitForm(e){ + async submitForm(e) { e.preventDefault() let error = this.validate() - if (!error){ + if (!error) { let serverResponse = await this.createCloneOnServer() error = serverResponse.errors || !isDefined(serverResponse.data.operations_AddClone) - if(error){ + if (error) { this.state.serverResponse = serverResponse.errors[0].message || serverResponse.errors[0] this.state.serverError = true - }else{ + } else { this.state.serverResponse = "The new clone was sucessfully created." this.state.serverError = false } @@ -549,24 +563,25 @@ class AddClone extends Component { } } - async createCloneOnServer(){ + async createCloneOnServer() { let variables = { - clone:{ + clone: { teamId: this.state.teamId, botId: this.state.selectedBot.id, mode: this.state.mode, resumeExecution: this.state.resumeExecution, - botType: this.getBotTypeFromKind(this.state.selectedBot.kind) + botType: this.state.selectedBot.kind, + exchangeName: this.state.exchangeName } } - if(this.state.selectedBot.kind === "Trading"){ + if (this.state.selectedBot.kind === "Trading") { variables.clone.runAsTeam = this.state.runAsTeam variables.clone.processName = 'Trading-Process' variables.clone.timePeriod = this.state.timePeriod - if(this.state.mode === "backtest"){ - variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000|0 - variables.clone.endDatetime = this.state.endDatetime.valueOf() / 1000|0 + if (this.state.mode === "backtest") { + variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000 | 0 + variables.clone.endDatetime = this.state.endDatetime.valueOf() / 1000 | 0 variables.clone.waitTime = this.state.waitTime } else { variables.clone.keyId = this.state.keyId @@ -577,7 +592,7 @@ class AddClone extends Component { variables.clone.endYear = this.state.endYear variables.clone.month = this.state.month variables.clone.runAsTeam = true - variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000|0 + variables.clone.beginDatetime = this.state.beginDatetime.valueOf() / 1000 | 0 } return this.props.addCloneMutation({ @@ -585,15 +600,6 @@ class AddClone extends Component { }) } - getBotTypeFromKind(kind){ - if(kind === 'Trading') - return 'Trading' - else if(kind === 'Indicator') - return 'Indicator' - else if(kind === 'Sensor') - return 'Extraction' - } - handleNewCloneConfirmationOpen = () => { this.setState({ isNewCloneConfirmationOpen: true }) }; @@ -603,15 +609,15 @@ class AddClone extends Component { isNewCloneConfirmationOpen: false }) - if(!this.state.serverError) + if (!this.state.serverError) this.setState({ - selectedBot: {'id':''}, + selectedBot: { 'id': '' }, mode: '', resumeExecution: true, beginDatetime: DateTime.local().minus({ days: 8 }).startOf('day'), endDatetime: DateTime.local(), waitTime: 1, - state : '', + state: '', stateDatetime: 0, createDatetime: 0, runAsTeam: false, @@ -633,21 +639,21 @@ class AddClone extends Component { }) }; - validate(){ + validate() { let isError = false - if(this.state.selectedBot.length < 1) { + if (this.state.selectedBot.length < 1) { isError = true this.setState(state => ({ selectedBotError: true })); } - if(this.state.mode.length < 1) { + if (this.state.mode.length < 1) { isError = true this.setState(state => ({ modeError: true })); } - if(this.state.selectedBot.kind !== "Trading" - && this.state.processName.length < 1 ) { + if (this.state.selectedBot.kind !== "Trading" + && this.state.processName.length < 1) { isError = true this.setState(state => ({ processNameError: true })); } @@ -658,6 +664,6 @@ class AddClone extends Component { } export default compose( - graphql(clones.OPERATIONS_ADD_CLONE, { name:'addCloneMutation' }), + graphql(clones.OPERATIONS_ADD_CLONE, { name: 'addCloneMutation' }), withStyles(styles) )(AddClone) diff --git a/server/.gitignore b/server/.gitignore index f53991e89..cd5f56af4 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -3,8 +3,6 @@ # dependencies /node_modules -/src/config/clone-deployment.json - # testing /coverage diff --git a/server/README.md b/server/README.md index 6d5616a45..ef43b765f 100644 --- a/server/README.md +++ b/server/README.md @@ -4,10 +4,10 @@ The Superalgos Operations Server manages the clone life cycle inside the **Super The main function includes storing the metadata information of the clones and handling the interaction with the orchestration software which is [Kubernetes](https://Kubernetes.io). # Execution sequence -The operations module (or Clones) integrates with other system modules to enable secure and encapsulated execution. On the clone creation process the encapsulation is achieved by deploying a **Cloud** Image on a **Kubernates** container. +The operations module (or Clones) integrates with other system modules to enable secure and encapsulated execution. On the clone creation process the encapsulation is achieved by deploying a **Clone Executor** Image on a **Kubernates** container. - [Keys](https://github.com/Superalgos/KeyVaultModule): Manages the signature of the messages sent to the external exchanges. - [Teams](https://github.com/Superalgos/TeamsModule): Provide team and bot authorization. -- [Cloud](https://github.com/Superalgos/AACloud): Receive the execution parameters and runs an independent instance of the platform. +- [Clone Executor](https://github.com/Superalgos/CloneExecutor): Receive the execution parameters and runs an independent instance of the platform. ```mermaid sequenceDiagram @@ -19,13 +19,13 @@ Clones ->> Keys: authorizeCloneToUseKey Keys ->> Clones: geCloneTeamAndBot Keys ->> Teams: getTeamMembers Keys -->> Clones: authorizeCloneToUseKey -Clones ->> Cloud: createClone -Cloud ->> Keys: signTransaction -Cloud ->> Clones: updateExection +Clones ->> Clone Executor: createClone +Clone Executor ->> Keys: signTransaction +Clone Executor ->> Clones: updateExection -Note left of Cloud: signTransaction and
updateExection are
called n number
of times +Note left of Clone Executor: signTransaction and
updateExection are
called n number
of times User ->> Clones: getCloneExecutionInformation -Cloud ->> Clones: cloneExecutionComplete +Clone Executor ->> Clones: cloneExecutionComplete User ->> Clones: deleteClone Clones ->> Keys: releaseKey ``` diff --git a/server/src/config/clone-deployment.json b/server/src/config/clone-deployment.json new file mode 100644 index 000000000..e350cc3c9 --- /dev/null +++ b/server/src/config/clone-deployment.json @@ -0,0 +1,31 @@ +{ + "apiVersion": "batch/v1", + "kind": "Job", + "metadata": { + "labels": { + "app": "clone-executor" + }, + "name": "clone-executor" + }, + "spec": { + "template": { + "spec": { + "restartPolicy": "OnFailure", + "containers": [ + { + "name": "clone-executor", + "image": "superalgos/clone-executor:v1.0", + "command": ["node", "Run.js"], + "env": [ + ] + } + ] + }, + "metadata": { + "labels": { + "app": "clone-executor" + } + } + } + } +} diff --git a/server/src/enums/BotTypes.js b/server/src/enums/BotTypes.js index 02145b032..d6993d277 100644 --- a/server/src/enums/BotTypes.js +++ b/server/src/enums/BotTypes.js @@ -1,11 +1,11 @@ export const Trading = 'Trading' export const Indicator = 'Indicator' -export const Extraction = 'Extraction' +export const Sensor = 'Sensor' export const BotTypesEnum = [ Trading, Indicator, - Extraction + Sensor ] export default BotTypesEnum diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index ccab8aa6d..7a748540c 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -4,7 +4,7 @@ import { KubernateError } from '../errors' import { Client, config } from 'kubernetes-client' import deploymentManifest from '../config/clone-deployment.json' import { BACKTEST, COMPETITION, LIVE, NO_TIME } from '../enums/CloneMode' -import { Trading, Indicator, Extraction } from '../enums/BotTypes' +import { Trading, Indicator, Sensor } from '../enums/BotTypes' const createClone = async (clone) => { try { @@ -80,6 +80,10 @@ const createClone = async (clone) => { 'name': 'PROCESS', 'value': clone.processName }) + env.push({ + 'name': 'EXCHANGE_NAME', + 'value': clone.exchangeName + }) logger.debug('createClone Trading Configuration.') if (clone.botType === Trading) { @@ -130,7 +134,7 @@ const createClone = async (clone) => { 'value': clone.keyId }) } - } else if (clone.botType === Indicator || clone.botType === Extraction) { + } else if (clone.botType === Indicator || clone.botType === Sensor) { if (clone.mode === NO_TIME) { if (!clone.resumeExecution) { env.push({ @@ -159,7 +163,7 @@ const createClone = async (clone) => { } deploymentManifest.spec.template.spec.containers[0].env = env - logger.debug('ENV %s: ', JSON.stringify(env)) + await client.apis.batch.v1.namespaces('default').jobs.post( { body: deploymentManifest }) diff --git a/server/src/schema/cloneDetails.js b/server/src/schema/cloneDetails.js index 1d8acc9f6..d0dff70b3 100644 --- a/server/src/schema/cloneDetails.js +++ b/server/src/schema/cloneDetails.js @@ -10,6 +10,7 @@ const cloneDetails = (selectedBot, clone) => { clone.teamSlug = selectedBot.team.slug clone.teamAvatar = selectedBot.team.profile.avatar clone.userLoggedIn = selectedBot.team.members[0].member.alias + clone.botType = selectedBot.kind } return clone } diff --git a/server/src/schema/queries/HistoryClones.js b/server/src/schema/queries/HistoryClones.js index 9cd860499..f9a3ee731 100644 --- a/server/src/schema/queries/HistoryClones.js +++ b/server/src/schema/queries/HistoryClones.js @@ -31,7 +31,6 @@ const resolve = async(parent, { botType }, context) => { let bot = allUserBots[j].node if(clones[i].botId === bot.id){ let clone = cloneDetails(bot, clones[i]) - clone.botType = bot.kind cloneResponse.push(clone) break } diff --git a/server/src/schema/queries/ListClones.js b/server/src/schema/queries/ListClones.js index afb70d263..60f5e4e1a 100644 --- a/server/src/schema/queries/ListClones.js +++ b/server/src/schema/queries/ListClones.js @@ -34,7 +34,6 @@ const resolve = async (parent, { botType, queryLogs }, context) => { let bot = allUserBots[j].node if(clones[i].botId === bot.id){ let clone = cloneDetails(bot, clones[i]) - clone.botType = bot.kind cloneResponse.push(clone) break } diff --git a/server/src/schema/types/input/Clone.js b/server/src/schema/types/input/Clone.js index 3b106dafa..d4ad654b4 100644 --- a/server/src/schema/types/input/Clone.js +++ b/server/src/schema/types/input/Clone.js @@ -25,7 +25,8 @@ const Type = new GraphQLInputObjectType({ processName: { type: new GraphQLNonNull(GraphQLString) }, botType: { type: new GraphQLNonNull(GraphQLString) }, keyId: { type: GraphQLString }, - timePeriod: { type: GraphQLString } + timePeriod: { type: GraphQLString }, + exchangeName: { type: GraphQLString } }) }) From a5c3426372bb556064f8cc91085d6fe072a9d0b9 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 4 Apr 2019 18:08:05 +0200 Subject: [PATCH 37/42] Adding testing scripts --- .gitignore | 10 + client/package.json | 2 +- client/src/GraphQL/models.js | 1 + package-lock.json | 1903 ++++++++++++++++++++++++++++++++++ package.json | 17 + server/.env.sample | 27 + test/cloneAdminTest.js | 142 +++ 7 files changed, 2101 insertions(+), 1 deletion(-) create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server/.env.sample create mode 100644 test/cloneAdminTest.js diff --git a/.gitignore b/.gitignore index 66374a65a..208fa65b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,12 @@ # See https://help.github.com/ignore-files/ for more about ignoring files. .scannerwork + +\.env + +\.nyc_output/ + +coverage/ + +node_modules/** + +test/activeCloneList\.js diff --git a/client/package.json b/client/package.json index a1fdc2e36..91748be1d 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.27", + "version": "0.0.28", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/models.js b/client/src/GraphQL/models.js index 4704c7b65..4ce450894 100644 --- a/client/src/GraphQL/models.js +++ b/client/src/GraphQL/models.js @@ -38,6 +38,7 @@ const sensorProcessNames = { } const indicatorProcessNames = { + Single: 'Single-Period-Daily', Daily: 'Multi-Period-Daily', Market: 'Multi-Period-Market' } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..efb7b319c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1903 @@ +{ + "name": "operations-test", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + } + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "requires": { + "debug": "^3.2.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "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" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.0.2.tgz", + "integrity": "sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ==", + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "findup-sync": "2.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.12.0", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.4", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "12.0.5", + "yargs-parser": "11.1.1", + "yargs-unparser": "1.5.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "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" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-environment-flags": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.4.tgz", + "integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==", + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "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-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..f3fbb3174 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "operations-test", + "version": "1.0.0", + "description": "Superalgos Operations backend API", + "main": "src/index.js", + "scripts": { + "test": "./node_modules/.bin/mocha --reporter spec" + }, + "author": "", + "license": "ISC", + "dependencies": { + "axios": "0.18.0", + "chai": "^4.2.0", + "dotenv": "^7.0.0", + "mocha": "^6.0.2" + } +} diff --git a/server/.env.sample b/server/.env.sample new file mode 100644 index 000000000..f25d5149a --- /dev/null +++ b/server/.env.sample @@ -0,0 +1,27 @@ +NODE_ENV=production + +VIRTUAL_HOST=VIRTUAL_HOST +LETSENCRYPT_HOST=LETSENCRYPT_HOST +LETSENCRYPT_EMAIL=LETSENCRYPT_EMAIL +VIRTUAL_PORT=4003 + +PORT=4003 + +DB_USERNAME=DB_USERNAME +DB_PASSWORD=DB_PASSWORD +DB_DOMAIN=DB_DOMAIN + +GATEWAY_ENDPOINT=GATEWAY_ENDPOINT +OPERATIONS_API_PRESHARED=OPERATIONS_API_PRESHARED + +# Clone Executor Integration +PLATFORM_ENVIRONMENT=PLATFORM_ENVIRONMENT +STORAGE_BASE_URL=STORAGE_BASE_URL +STORAGE_CONNECTION_STRING=STORAGE_CONNECTION_STRING + +# Auth Config +AUTH_URL=AUTH_URL +AUTH_CLIENT_ID=AUTH_CLIENT_ID +AUTH_CLIENT_SECRET=AUTH_CLIENT_SECRET +AUTH_AUDIENCE=AUTH_AUDIENCE + diff --git a/test/cloneAdminTest.js b/test/cloneAdminTest.js new file mode 100644 index 000000000..d83fe3e6d --- /dev/null +++ b/test/cloneAdminTest.js @@ -0,0 +1,142 @@ +var assert = require('chai').assert +const axios = require('axios') +const { activeCloneList } = require('activeCloneList') +require('dotenv').config() + +describe('Admin clones Clones', function () { + it('Remove clones', async function () { + this.timeout(300000) + var error + try { + var clones = await getClones() + for (let clone of clones) { + await removeClone(clone.id, clone.botName) + } + } catch (err) { + console.log('Error: ' + err) + error = err + } + assert.equal(error, undefined) + }) + it('Add COSS Live Indicator Clones', async function () { + this.timeout(300000) + var error + var clones = activeCloneList("Coss") + try { + for (let clone of clones) { + await removeClone(clone.id, clone.botName) + } + } catch (err) { + console.log('Error: ' + err) + error = err + } + assert.equal(error, undefined) + }) + it('Add POLONIEX Live Indicator Clones', async function () { + this.timeout(300000) + var error + var clones = activeCloneList("Poloniex") + try { + for (let clone of clones) { + await removeClone(clone.id, clone.botName) + } + } catch (err) { + console.log('Error: ' + err) + error = err + } + assert.equal(error, undefined) + }) +}) + +async function getClones() { + try { + const clones = await axios({ + url: process.env.GATEWAY_ENDPOINT, + method: 'post', + data: { + query: ` + query { + operations_Clones(queryLogs: false) { + id + botName + } + } + `, + }, + headers: { + authorization: 'Bearer ' + process.env.ACCESS_TOKEN + } + }) + + console.log('getClones ok ') + return clones.data.data.operations_Clones + } catch (error) { + console.log('getClones error: ' + error.response.data.errors[0]) + throw error + } +} + +async function removeClone(cloneId, botName) { + try { + await axios({ + url: process.env.GATEWAY_ENDPOINT, + method: 'post', + data: { + query: ` + mutation ($id: ID!){ + operations_RemoveClone( + id: $id + ) + } + `, + variables: { + id: cloneId + }, + }, + headers: { + authorization: 'Bearer ' + process.env.ACCESS_TOKEN + } + }) + + console.log('removeClone ok: ' + botName) + return true + } catch (error) { + console.log('removeClone error: ' + error.response.data.errors[0]) + throw error + } +} + +async function createClone(clone) { + try { + const clones = await axios({ + url: process.env.GATEWAY_ENDPOINT, + method: 'post', + data: { + query: ` + mutation ($clone: operations_CloneInput){ + operations_AddClone( + clone: $clone + ) { + id + teamName + botName + processName + } + } + `, + variables: { + clone: clone + }, + }, + headers: { + authorization: 'Bearer ' + process.env.ACCESS_TOKEN + } + }) + + console.log('createClone id: ' + clones.data.data.operations_AddClone.id + ', botId: ' + clone.botId) + return clones.data.data.operations_AddClone + } catch (error) { + console.log('createClone error: ' + error.response.data.errors[0]) + throw error + } +} From 2e12d4d01ec865cf2d356e40933e62991a94c79f Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 4 Apr 2019 22:50:58 +0200 Subject: [PATCH 38/42] Require issue --- test/cloneAdminTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cloneAdminTest.js b/test/cloneAdminTest.js index d83fe3e6d..150f3ccd1 100644 --- a/test/cloneAdminTest.js +++ b/test/cloneAdminTest.js @@ -1,6 +1,6 @@ var assert = require('chai').assert const axios = require('axios') -const { activeCloneList } = require('activeCloneList') +const { activeCloneList } = require('./activeCloneList') require('dotenv').config() describe('Admin clones Clones', function () { From e1c1a5139ffead13ccb634145c6714ef9de5fdb8 Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 5 Apr 2019 17:39:08 +0200 Subject: [PATCH 39/42] Adding coss exchange --- client/package-lock.json | 2 +- client/package.json | 2 +- client/src/GraphQL/Calls/clones.js | 2 +- client/src/GraphQL/Calls/keys.js | 1 + client/src/GraphQL/models.js | 3 +- client/src/views/Clone/Add/index.js | 46 ++++++++++++++--------------- test/cloneAdminTest.js | 4 +-- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index ee733b83d..5e17d3b9d 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.21", + "version": "0.0.29", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/client/package.json b/client/package.json index 91748be1d..a6356f216 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.28", + "version": "0.0.30", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/Calls/clones.js b/client/src/GraphQL/Calls/clones.js index 54becf398..b215a578d 100644 --- a/client/src/GraphQL/Calls/clones.js +++ b/client/src/GraphQL/Calls/clones.js @@ -21,7 +21,7 @@ const OPERATIONS_LIST_CLONES = gql` const OPERATIONS_HISTORY_CLONES = gql` query Operations_HistoryClones{ - operations_HistoryClones { + operations_HistoryClones(botType: "Trading") { ...clone } } diff --git a/client/src/GraphQL/Calls/keys.js b/client/src/GraphQL/Calls/keys.js index 0f6e8006a..23d3ffed3 100644 --- a/client/src/GraphQL/Calls/keys.js +++ b/client/src/GraphQL/Calls/keys.js @@ -6,6 +6,7 @@ export const GET_ALL_KEYS = gql` id key description + exchange } } ` diff --git a/client/src/GraphQL/models.js b/client/src/GraphQL/models.js index 4ce450894..022fb3ada 100644 --- a/client/src/GraphQL/models.js +++ b/client/src/GraphQL/models.js @@ -55,8 +55,7 @@ const botTypes = { const exchanges = { Coss: "Coss", - Poloniex: "Poloniex", - Binance: "Binance" + Poloniex: "Poloniex" } export { diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 99aa9ae77..2bacda39d 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -160,6 +160,20 @@ class AddClone extends Component { {this.state.selectedBot.kind} + this.setState({ exchangeName: e.target.value })} + fullWidth + > + {Object.keys(exchanges).map((option, index) => ( + + {option} + + ))} + + {this.state.selectedBot.kind === botTypes.Trading && @@ -253,9 +267,9 @@ class AddClone extends Component { ); if (error) return `Error! ${error.message}`; const list = data.keyVault_AvailableKeys.map((key) => ( - - {key.key} - + + {key.key.substr(0, 32) + "..." + " - " + key.exchange} + )); return ( this.setState({ startYear: e.target.value })} fullWidth > - {getIndicatorYears().map((option, index) => ( - + {getIndicatorYears().map(option => ( + {option} ))} @@ -391,8 +405,8 @@ class AddClone extends Component { onChange={(e) => this.setState({ endYear: e.target.value })} fullWidth > - {getIndicatorYears().map((option, index) => ( - + {getIndicatorYears().map(option => ( + {option} ))} @@ -411,8 +425,8 @@ class AddClone extends Component { onChange={(e) => this.setState({ startYear: e.target.value })} fullWidth > - {getIndicatorYears().map((option, index) => ( - + {getIndicatorYears().map(option => ( + {option} ))} @@ -477,20 +491,6 @@ class AddClone extends Component { } - this.setState({ exchangeName: e.target.value })} - fullWidth - > - {Object.keys(exchanges).map((option, index) => ( - - {option} - - ))} - - You will be able to see the clone information under Active Clones. Whenever you decide to stop the clone you can delete it. On History Clones will find all deleted clones. diff --git a/test/cloneAdminTest.js b/test/cloneAdminTest.js index 150f3ccd1..d1ef7fbc8 100644 --- a/test/cloneAdminTest.js +++ b/test/cloneAdminTest.js @@ -24,7 +24,7 @@ describe('Admin clones Clones', function () { var clones = activeCloneList("Coss") try { for (let clone of clones) { - await removeClone(clone.id, clone.botName) + await createClone(clone) } } catch (err) { console.log('Error: ' + err) @@ -38,7 +38,7 @@ describe('Admin clones Clones', function () { var clones = activeCloneList("Poloniex") try { for (let clone of clones) { - await removeClone(clone.id, clone.botName) + await createClone(clone) } } catch (err) { console.log('Error: ' + err) From bbec65837efee72f223140056e1b21d029e6b822 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 9 Apr 2019 21:30:51 +0200 Subject: [PATCH 40/42] Updating module description and adding minio config --- client/src/views/Clone/Add/index.js | 4 ++-- client/src/views/Clone/History/index.js | 16 +++++++-------- client/src/views/Clone/List/index.js | 16 +++++++-------- client/src/views/Home.js | 27 +++++++++++++++++-------- server/src/kubernetes/createClone.js | 22 ++++++++++++++++++++ 5 files changed, 59 insertions(+), 26 deletions(-) diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index 2bacda39d..c8448728a 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -72,7 +72,7 @@ class AddClone extends Component { size='big' title='Create a bot clone' text="Please login to create a bot clone." - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else return ( @@ -81,7 +81,7 @@ class AddClone extends Component { size='medium' title='Create a bot clone' text='Create a bot clone here.' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' />
diff --git a/client/src/views/Clone/History/index.js b/client/src/views/Clone/History/index.js index 4ccaed243..170c34094 100644 --- a/client/src/views/Clone/History/index.js +++ b/client/src/views/Clone/History/index.js @@ -23,7 +23,7 @@ class HistoryClones extends Component { size='big' title='Bot Clone History' text='Loading your Bot Clones...' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else if (data.operations_HistoryClones && data.operations_HistoryClones.length > 0) { @@ -33,7 +33,7 @@ class HistoryClones extends Component { size='medium' title='Bot Clone History' text='All your Bot Clones are here.' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' />
@@ -53,7 +53,7 @@ class HistoryClones extends Component { size='big' title='Bot Clone History' text='Please login to gain access to your Bot Clones.' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else { @@ -62,7 +62,7 @@ class HistoryClones extends Component { size='big' title='Bot Clone History' text="You don't have any Clone yet. Once you create one you will find it here." - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } @@ -75,7 +75,7 @@ class HistoryClones extends Component { size='big' title='Manage your Bot Clones' text='Loading Bot Clones...' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else if (data.operations_HistoryClones && data.operations_HistoryClones.length > 0) { @@ -85,7 +85,7 @@ class HistoryClones extends Component { size='big' title='Manage your Bot Clones' text='Loading Bot Clones...' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' />
@@ -105,7 +105,7 @@ class HistoryClones extends Component { size='big' title='No Bot Clones to display' text='Please Login to access your Bot Clones.' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else { @@ -115,7 +115,7 @@ class HistoryClones extends Component { size='big' title='No Bot Clones to display' text="You don't have any Bot Clone yet. After you create a new Clone, it will be listed here." - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } diff --git a/client/src/views/Clone/List/index.js b/client/src/views/Clone/List/index.js index 6df628fa4..4cf60b48b 100644 --- a/client/src/views/Clone/List/index.js +++ b/client/src/views/Clone/List/index.js @@ -23,7 +23,7 @@ class BrowseClones extends Component { size='big' title='Your Bot Clones' text='Loading your Bot Clones...' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else if (data.operations_Clones && data.operations_Clones.length > 0) { @@ -33,7 +33,7 @@ class BrowseClones extends Component { size='medium' title='Your Bot Clones' text='All your Bot Clones are here.' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' />
@@ -53,7 +53,7 @@ class BrowseClones extends Component { size='big' title='Your Bot Clones' text='Please login to gain access to your Bot Clones.' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else { @@ -62,7 +62,7 @@ class BrowseClones extends Component { size='big' title='Your Bot Clones' text="You don't have any Bot Clone yet. Once you create one you will find it here." - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } @@ -75,7 +75,7 @@ class BrowseClones extends Component { size='big' title='Manage your Bot Clones' text='Loading Bot Clones...' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else if (data.operations_Clones && data.operations_Clones.length > 0) { @@ -85,7 +85,7 @@ class BrowseClones extends Component { size='big' title='Manage your Bot Clones' text='Loading Bot Clones...' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' />
@@ -105,7 +105,7 @@ class BrowseClones extends Component { size='big' title='No Bot Clones to display' text='Please Login to access your Bot Clones.' - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } else { @@ -115,7 +115,7 @@ class BrowseClones extends Component { size='big' title='No Bot Clones to display' text="You don't have any Bot Clone yet. After you create a new Clone, it will be listed here." - backgroundUrl='https://superalgos.org/img/photos/ecosystem.jpg' + backgroundUrl='https://superalgos.org/img/photos/clones-original.jpg' /> ) } diff --git a/client/src/views/Home.js b/client/src/views/Home.js index 02e13a7cf..90892a4c8 100644 --- a/client/src/views/Home.js +++ b/client/src/views/Home.js @@ -4,31 +4,42 @@ import TopBar from './BannerTopBar' class Home extends Component { - render () { + render() { return (
- Welcome to the Clones Module! + Clones Module - Responsible for manage bot clones. + Creating and managing bot clones
- The Clones module allows you to create instances of your bots - that will be executed on a virtual machine. + The clones module allows creating and managing the execution of bot’s code. + It also stores the metadata information of the clones and handles the interaction + with the orchestration software. + + + It integrates with other system modules to enable secure and encapsulated execution of the + bots. On the clone creation process the encapsulation is achieved by deploying a Clone Executor + Image on a Kubernetes container.
- + + Bots are executed using the common framework called Clone Executor which provides support for commonly used resources. + + + When creating a new clone, specific execution parameters are selected, for example the exchange and the time period that the bot will operate in. +
diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 7a748540c..00bbcd394 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -47,6 +47,28 @@ const createClone = async (clone) => { 'value': process.env.AUTH_AUDIENCE }) + // MINIO + env.push({ + 'name': 'MINIO_END_POINT', + 'value': process.env.MINIO_END_POINT + }) + env.push({ + 'name': 'MINIO_PORT', + 'value': process.env.MINIO_PORT + }) + env.push({ + 'name': 'MINIO_USE_SSL', + 'value': process.env.MINIO_USE_SSL + }) + env.push({ + 'name': 'MINIO_ACCESS_KEY', + 'value': process.env.MINIO_ACCESS_KEY + }) + env.push({ + 'name': 'MINIO_SECRET_KEY', + 'value': process.env.MINIO_SECRET_KEY + }) + logger.debug('createClone General Financial Being Configuration.') env.push({ 'name': 'DEV_TEAM', From 540f29093e02bc1c095edb3643e16aa5f7d570d7 Mon Sep 17 00:00:00 2001 From: Matias Date: Tue, 9 Apr 2019 21:45:37 +0200 Subject: [PATCH 41/42] Changing to minio --- server/src/kubernetes/createClone.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/kubernetes/createClone.js b/server/src/kubernetes/createClone.js index 00bbcd394..86ab0839f 100644 --- a/server/src/kubernetes/createClone.js +++ b/server/src/kubernetes/createClone.js @@ -48,6 +48,10 @@ const createClone = async (clone) => { }) // MINIO + env.push({ + 'name': 'STORAGE_PROVIDER', + 'value': process.env.STORAGE_PROVIDER + }) env.push({ 'name': 'MINIO_END_POINT', 'value': process.env.MINIO_END_POINT @@ -69,6 +73,7 @@ const createClone = async (clone) => { 'value': process.env.MINIO_SECRET_KEY }) + logger.debug('createClone General Financial Being Configuration.') env.push({ 'name': 'DEV_TEAM', From 37d4e5e5a5c95264692a9786c901ce837b9590d1 Mon Sep 17 00:00:00 2001 From: Matias Date: Wed, 10 Apr 2019 11:09:54 +0200 Subject: [PATCH 42/42] Demo preparation --- client/package.json | 2 +- client/src/GraphQL/models.js | 1 - client/src/views/Clone/Add/index.js | 123 +++--------------- .../src/schema/mutations/AddCloneMutation.js | 24 +++- 4 files changed, 38 insertions(+), 112 deletions(-) diff --git a/client/package.json b/client/package.json index a6356f216..a79bd9079 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@superalgos/operations-client", - "version": "0.0.30", + "version": "0.0.31", "description": "Superalgos Operations client-side web app", "main": "src/index.js", "dependencies": { diff --git a/client/src/GraphQL/models.js b/client/src/GraphQL/models.js index 022fb3ada..997c57bc1 100644 --- a/client/src/GraphQL/models.js +++ b/client/src/GraphQL/models.js @@ -38,7 +38,6 @@ const sensorProcessNames = { } const indicatorProcessNames = { - Single: 'Single-Period-Daily', Daily: 'Multi-Period-Daily', Market: 'Multi-Period-Market' } diff --git a/client/src/views/Clone/Add/index.js b/client/src/views/Clone/Add/index.js index c8448728a..013b752f9 100644 --- a/client/src/views/Clone/Add/index.js +++ b/client/src/views/Clone/Add/index.js @@ -28,8 +28,8 @@ class AddClone extends Component { this.state = { user: JSON.parse(user), selectedBot: { 'id': '' }, - mode: '', - resumeExecution: true, + mode: "noTime", + resumeExecution: false, beginDatetime: DateTime.local().minus({ days: 8 }).startOf('day'), endDatetime: DateTime.local(), waitTime: 1, @@ -41,7 +41,7 @@ class AddClone extends Component { teamId: '', keyId: '', exchangeName: exchanges.Coss, - processName: '', + processName: indicatorProcessNames.Daily, // Indicator Bot startYear: 2019, @@ -267,9 +267,9 @@ class AddClone extends Component { ); if (error) return `Error! ${error.message}`; const list = data.keyVault_AvailableKeys.map((key) => ( - - {key.key.substr(0, 32) + "..." + " - " + key.exchange} - + + {key.key.substr(0, 32) + "..." + " - " + key.exchange} + )); return ( } - {(this.state.selectedBot.kind === botTypes.Indicator - || this.state.selectedBot.kind === botTypes.Sensor) && - - this.setState({ mode: e.target.value })} - onBlur={(e) => this.setState({ modeError: false })} - error={this.state.modeError} - fullWidth - > - {Object.keys(indicatorStartModes).map(option => ( - - {indicatorStartModes[option]} - - ))} - - - {this.state.mode === "allMonths" && - - this.setState({ startYear: e.target.value })} - fullWidth - > - {getIndicatorYears().map(option => ( - - {option} - - ))} - - - this.setState({ endYear: e.target.value })} - fullWidth - > - {getIndicatorYears().map(option => ( - - {option} - - ))} - - - } - - {this.state.mode === "oneMonth" && - - this.setState({ startYear: e.target.value })} - fullWidth - > - {getIndicatorYears().map(option => ( - - {option} - - ))} - - - this.setState({ month: e.target.value })} - fullWidth - > - {availableMonths.map((option, index) => ( - - {option} - - ))} - - - } - - } - - - {(this.state.mode === "noTime" && this.state.selectedBot.kind !== botTypes.Sensor ) && + {(this.state.mode === "noTime" && this.state.selectedBot.kind !== botTypes.Sensor) && The Resume Execution option let's you pick up the context of @@ -612,8 +518,8 @@ class AddClone extends Component { if (!this.state.serverError) this.setState({ selectedBot: { 'id': '' }, - mode: '', - resumeExecution: true, + mode: 'noTime', + resumeExecution: false, beginDatetime: DateTime.local().minus({ days: 8 }).startOf('day'), endDatetime: DateTime.local(), waitTime: 1, @@ -621,11 +527,20 @@ class AddClone extends Component { stateDatetime: 0, createDatetime: 0, runAsTeam: false, - processName: '', + exchangeName: exchanges.Coss, + processName: indicatorProcessNames.Daily, teams: [], teamId: '', keyId: '', + // Indicator Bot + startYear: 2019, + endYear: 2019, + month: 1, + + //TradingBot + timePeriod: '01-hs', + //Error handlers nameError: false, teamError: false, diff --git a/server/src/schema/mutations/AddCloneMutation.js b/server/src/schema/mutations/AddCloneMutation.js index 549f9651f..5f72a3739 100644 --- a/server/src/schema/mutations/AddCloneMutation.js +++ b/server/src/schema/mutations/AddCloneMutation.js @@ -40,13 +40,25 @@ const resolve = async (parent, { clone }, context) => { throw new WrongArgumentsError('The key was not provided to run the clone.') } - try { - let allUserBotsResponse = await teamQuery(context.authorization, clone.botId) - let bot = allUserBotsResponse.data.data.teams_FbByOwner.edges[0].node - clone = cloneDetails(bot, clone) - clone.createDatetime = new Date().valueOf() / 1000 | 0 - clone.active = true + let allUserBotsResponse = await teamQuery(context.authorization, clone.botId) + let bot = allUserBotsResponse.data.data.teams_FbByOwner.edges[0].node + clone = cloneDetails(bot, clone) + clone.createDatetime = new Date().valueOf() / 1000 | 0 + clone.active = true + // TODO Temporary Limitation on bot creation + if (!(clone.teamSlug === "AAMasters" || clone.teamSlug === "AAVikings")) { + let clones = await Clone.find({ + authId: context.userId, + active: true + }) + + if (clones !== undefined && clones.length >= 5) { + throw new Error('Currently maximum number of clones per user is 5. You can delete an existing clone and try again.') + } + } + + try { let newClone = new Clone(clone) newClone.authId = context.userId clone.id = newClone._id