From 5a468dc7cae4bba8e7f35f3e8965bbca0412990b Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 6 Nov 2019 11:29:23 +0100 Subject: [PATCH] Update production (#75) * added node install to docker * run npm install correct * don't copy modules * use env variables for testnet * Update pr.yml * github workflows changes * Update pr.yml * Update pr.yml * Update pr.yml * Update pr.yml * Update pr.yml * Update pr.yml * Update pr.yml * Update pr.yml * Update pr.yml * Make search case-insensitive (#36) Modify variable names for clarity. * Query balance by denomination (#48) * colw/subscription-fix (#47) * Fix transaction destructure * Lint * Rename for consistency * Override method for V2 * Colw/fix denom and votes (#49) * Use larger denom for governance parameters * Lint * Fix: Leave in big number format for line #86 * Fabo/minor fixes (#51) * gracefully handle no rewards * always return balance * prevent error when no rewards * fix wrong delegation amount showing * log transaction if tag is empty (#58) * fix tally for running proposals (#54) * Fabo/move testnet definition into network configs file (#56) * move testnet definition into network configs file * use configs for endpoints * update cache key per block (#57) * colw/minor-fixes (#59) * Export testnet data for use in LunieDB Source * Fix get query * Mario/32 add proposal proposer (#52) * Add proposal proposer * Add proposer to proposals page * Revert package.js mod, use Promise.all * Call all queries at same time in getProposalById * Api error 500 fix * Fabo suggestions * Add cross-env * Resolve merge conflict * Fix merge error * deliver correct testnet url (#60) * Latest proposal should be on top (#61) * Colin's magic * const proposals * fix to not crash if no denom * Fabo/wait for stargate to be up (#62) * debug missing denom * do not call validators * await for the remote instance to be up before loading static data * remove logs * remove fallback * comment * Update cosmosV0-source.js * Update cosmosV0-source.js * Update cosmosV0-source.js * colw/subscription-refactor (#63) * Factor out subscription object * WIP * Reenable subs * Do not pre-populate cache (temp) This is run on every request. * Reenable static data * Fix * Remove comment * WIP * Use API class within subscription object * Update file and parameter naming * Load API classes once. * Revert "Load API classes once." ca567095360dbd7a8d81c7a53fe4fe885f3b63d2 * Set headers in separate method * format comment * Rename class variable * Split static data up * Adjust cache timing, default 5 * Update lib/schema.js Co-Authored-By: Fabian * Change client name to TendermintClient * Comment and rename for clarity * Cache specific blocks longer * Move Tendermint client to CosmosNodeSubscription * Comments for clarity * Clear memory after handling each new block (#66) * Fix typo and no return. (#68) * Aleksei/sentry added (#67) * only sentry init code added * docker-compose changes * inspect removed * colw/Decrease validator list loading time (#69) * Fetch validators each new block and store them * Store block, and sync validator map with block * Add block to store * Remove unused parameters * Retrieve a single validator form the map * Review fix: remove height parameter * Review fix: Change variable name for clarity * Return delegations and rewards from store (#70) * Return delegations and rewards from store * overview values * Remove unnecessary Promise.all --- .github/workflows/development.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/production.yml | 4 +- Caddyfile | 6 +- Caddyfile.prod | 4 + Dockerfile | 4 +- config.js | 5 +- data/network-configs.js | 35 +- docker-compose.prod.yml | 9 +- docker-compose.yml | 7 +- index.js | 59 +- lib/block-store.js | 29 + lib/cosmos-node-subscription.js | 58 ++ lib/cosmosV0-source.js | 187 +++--- lib/cosmosV2-source.js | 18 +- lib/helpers/PerBlockCacheDataSource.js | 28 + lib/luniedb-source.js | 68 +- lib/queries.js | 5 +- lib/reducers/cosmosV0-reducers.js | 60 +- lib/reducers/cosmosV2-reducers.js | 4 +- lib/resolvers.js | 87 ++- lib/schema.js | 27 +- lib/{chain-pubsub.js => subscriptions.js} | 4 +- package-lock.json | 765 ++++++++++++++-------- package.json | 7 +- 25 files changed, 970 insertions(+), 514 deletions(-) create mode 100644 lib/block-store.js create mode 100644 lib/cosmos-node-subscription.js create mode 100644 lib/helpers/PerBlockCacheDataSource.js rename lib/{chain-pubsub.js => subscriptions.js} (84%) diff --git a/.github/workflows/development.yml b/.github/workflows/development.yml index 3a92d64e58..eb27e108f4 100644 --- a/.github/workflows/development.yml +++ b/.github/workflows/development.yml @@ -25,6 +25,6 @@ jobs: - name: Installing Docker Compose run: ssh root@157.245.121.175 "sudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose; sudo chmod +x /usr/local/bin/docker-compose" - name: Run on Digital Ocean - run: ssh root@157.245.121.175 "docker image prune -a -f; docker load < lunieapi.tgz; docker container stop lunieapi;docker container stop caddy; docker container stop node_exporter; docker container prune -f; export HASURA_URL="https://staging-db.lunie.io/v1/graphql"; export HASURA_ADMIN_KEY="${{ secrets.LUNIE_STAGING_DB_KEY }}"; docker-compose -f docker-compose.yml up --build -d" + run: ssh root@157.245.121.175 "docker image prune -a -f; docker load < lunieapi.tgz; docker container stop lunieapi;docker container stop caddy; docker container stop node_exporter; docker container prune -f; export HASURA_URL="https://staging-db.lunie.io/v1/graphql"; export HASURA_ADMIN_KEY="${{ secrets.LUNIE_STAGING_DB_KEY }}"; export SENTRY_DSN="${{ secrets.SENTRY_DSN }}"; docker-compose -f docker-compose.yml up --build -d" - name: Setting up cron job for pm2 metrics export run: ssh root@157.245.121.175 "mkdir /logs -p; touch /logs/show; line='*/1 * * * * docker exec lunieapi pm2 show 0 > /logs/show; perl /root/pm2metrics.pl'; crontab -l | grep -q 'lunieapi pm2' && true || (crontab -l; echo "$line" ) | crontab -" diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c2e43f3298..56a86f645e 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,4 +13,4 @@ jobs: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_CHANNEL: 'pr_alerts' SLACK_USERNAME: 'luniebot' - SLACK_MESSAGE: 'New pull request to lunie-api' \ No newline at end of file + SLACK_MESSAGE: ${{ github.event.pull_request.title }} | ${{ github.event.pull_request.body }} | ${{ github.event.pull_request._links.html.href }} diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml index c01b864c3c..bee11b98b9 100644 --- a/.github/workflows/production.yml +++ b/.github/workflows/production.yml @@ -21,10 +21,10 @@ jobs: - name: prepare to push to Digital Ocean run: mkdir -p ~/.ssh && echo "${{ secrets.DO_PRIVATE_KEY }}" | tr -d '\r' > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa && eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa && ssh-keyscan -H 167.71.107.214 >> ~/.ssh/known_hosts - name: push to Digital Ocean - run: rsync -4 lunieapi.tgz root@167.71.107.214:~/ && rsync -4 pm2metrics.pl root@167.71.107.214:~/ && rsync -4 docker-compose.prod.yml root@167.71.107.214:~/ && rsync -4 Caddyfile.prod root@167.71.107.214:~/ + run: rsync -4 lunieapi.tgz root@167.71.107.214:~/ && rsync -4 pm2metrics.pl root@167.71.107.214:~/ && rsync -4 docker-compose.prod.yml root@167.71.107.214:~/docker-compose.yml && rsync -4 Caddyfile.prod root@167.71.107.214:~/Caddyfile - name: Installing Docker Compose run: ssh root@167.71.107.214 "sudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose; sudo chmod +x /usr/local/bin/docker-compose" - name: Run on Digital Ocean - run: ssh root@167.71.107.214 "docker image prune -a -f; docker load < lunieapi.tgz; docker container stop lunieapi;docker container stop caddy; docker container stop node_exporter; docker container prune -f;export HASURA_URL="https://production-db.lunie.io/v1/graphql"; export HASURA_ADMIN_KEY="${{ secrets.LUNIE_PRODUCTION_DB_KEY }}"; docker-compose -f docker-compose.yml up --build -d" + run: ssh root@167.71.107.214 "docker image prune -a -f; docker load < lunieapi.tgz; docker container stop lunieapi;docker container stop caddy; docker container stop node_exporter; docker container prune -f;export HASURA_URL="https://production-db.lunie.io/v1/graphql"; export HASURA_ADMIN_KEY="${{ secrets.LUNIE_PRODUCTION_DB_KEY }}"; export SENTRY_DSN="${{ secrets.SENTRY_DSN }}"; docker-compose -f docker-compose.yml up --build -d" - name: Setting up cron job for pm2 metrics export run: ssh root@167.71.107.214 "mkdir /logs -p; touch /logs/show; line='*/1 * * * * docker exec lunieapi pm2 show 0 > /logs/show; perl /root/pm2metrics.pl'; crontab -l | grep -q 'lunieapi pm2' && true || (crontab -l; echo "$line" ) | crontab -" diff --git a/Caddyfile b/Caddyfile index c277cc2341..ef71680001 100644 --- a/Caddyfile +++ b/Caddyfile @@ -2,4 +2,8 @@ staging-api.lunie.io { proxy / lunieapi:4000 { websocket } -} \ No newline at end of file +} +:9100 { + basicauth / admin lunie1234 + proxy / node_exporter:9100 +} diff --git a/Caddyfile.prod b/Caddyfile.prod index 666c5361ef..3f2f8103f4 100644 --- a/Caddyfile.prod +++ b/Caddyfile.prod @@ -3,3 +3,7 @@ production-api.lunie.io { websocket } } +:9100 { + basicauth / admin lunie1234 + proxy / node_exporter:9100 +} diff --git a/Dockerfile b/Dockerfile index 894ed4539a..656bbac268 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,8 +2,6 @@ FROM keymetrics/pm2:latest-alpine WORKDIR /var/www/server -COPY ./node_modules ./node_modules - COPY ./lib ./lib COPY ./data ./data @@ -16,6 +14,8 @@ COPY pm2.json . COPY index.js . +RUN npm install + CMD [ "pm2-runtime", "start", "pm2.json", "--format"] EXPOSE 4200 \ No newline at end of file diff --git a/config.js b/config.js index e9015d8bf6..97d1e764a3 100644 --- a/config.js +++ b/config.js @@ -10,5 +10,8 @@ module.exports = { redis_url: process.env.REDIS_URL || '', hasura_admin_key: process.env.HASURA_ADMIN_KEY || '', hasura_url: process.env.HASURA_URL || 'http://localhost:8080/v1/graphql', - enableTestnet: process.env.TESTNET === 'true' + enableTestnet: process.env.TESTNET === 'true', + testnetRPC: process.env.TESTNET_RPC_URL || 'ws://localhost:26657/websocket', + testnetAPI: process.env.TESTNET_API_URL || 'http://localhost:9071', + SENTRY_DSN: process.env.SENTRY_DSN || '', } diff --git a/data/network-configs.js b/data/network-configs.js index 6a76a89b74..6d4586fa01 100644 --- a/data/network-configs.js +++ b/data/network-configs.js @@ -1,5 +1,31 @@ const config = require('../config') +const testnet = { + id: 'local-cosmos-hub-testnet', + title: 'Local Cosmos Testnet', + chain_id: 'testnet', + rpc_url: config.testnetRPC, + api_url: config.testnetAPI, + bech32_prefix: 'cosmos', + testnet: true, + feature_session: true, + feature_portfolio: true, + feature_validators: true, + feature_proposals: true, + feature_activity: true, + feature_explorer: true, + action_send: true, + action_claim_rewards: true, + action_delegate: true, + action_redelegate: true, + action_undelegate: true, + action_deposit: true, + action_vote: true, + action_proposal: true, + experimental: true, + stakingDenom: 'STAKE' +} + let networks = { 'cosmos-hub-testnet': { id: 'cosmos-hub-testnet', @@ -14,13 +40,10 @@ let networks = { } if (config.enableTestnet) { - networks['local-cosmos-hub-testnet'] = { - id: 'local-cosmos-hub-testnet', - api_url: 'http://localhost:9070', - rpc_url: 'ws://localhost:26657/websocket' - } + networks['local-cosmos-hub-testnet'] = testnet } module.exports = { - networks + networks, + testnet } diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index e053b69054..073f275a93 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -8,13 +8,13 @@ services: - /logs:/var/www/server/logs networks: - general - ports: - - "4000:4000" deploy: replicas: 1 environment: - HASURA_URL=$HASURA_URL - HASURA_ADMIN_KEY=$HASURA_ADMIN_KEY + - SENTRY_DSN=$SENTRY_DSN + - NODE_ENV=production node-exporter: image: prom/node-exporter container_name: node_exporter @@ -29,8 +29,6 @@ services: - --collector.textfile.directory=/var/www - --collector.filesystem.ignored-mount-points - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/) - ports: - - 9100:9100 restart: always networks: - general @@ -49,8 +47,9 @@ services: ports: - "80:80" - "443:443" + - "9100:9100" volumes: - - ./Caddyfile.prod:/etc/Caddyfile + - ./Caddyfile:/etc/Caddyfile - ./caddy_certs:/root/.caddy volumes: caddy_certs: diff --git a/docker-compose.yml b/docker-compose.yml index a0348a3290..a78bb83f8a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,13 +8,13 @@ services: - /logs:/var/www/server/logs networks: - general - ports: - - "4000:4000" deploy: replicas: 1 environment: - HASURA_URL=$HASURA_URL - HASURA_ADMIN_KEY=$HASURA_ADMIN_KEY + - SENTRY_DSN=$SENTRY_DSN + - NODE_ENV=staging node-exporter: image: prom/node-exporter container_name: node_exporter @@ -29,8 +29,6 @@ services: - --collector.textfile.directory=/var/www - --collector.filesystem.ignored-mount-points - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/) - ports: - - 9100:9100 restart: always networks: - general @@ -49,6 +47,7 @@ services: ports: - "80:80" - "443:443" + - "9100:9100" volumes: - ./Caddyfile:/etc/Caddyfile - ./caddy_certs:/root/.caddy diff --git a/index.js b/index.js index e0c8f6282d..642de082c7 100644 --- a/index.js +++ b/index.js @@ -1,41 +1,72 @@ const { ApolloServer } = require('apollo-server') +const responseCachePlugin = require('apollo-server-plugin-response-cache') +const { mapValues } = require('lodash') const typeDefs = require('./lib/schema') const resolvers = require('./lib/resolvers') +const CosmosNodeSubscription = require('./lib/cosmos-node-subscription') const CosmosV0API = require('./lib/cosmosV0-source') const CosmosV2API = require('./lib/cosmosV2-source') const LunieDBAPI = require('./lib/luniedb-source') +const BlockStore = require('./lib/block-store') + const { networks } = require('./data/network-configs') const config = require('./config') -const cosmosHubMainnetAPI = new CosmosV0API(networks['cosmos-hub-mainnet']) -const cosmosHubTestnetAPI = new CosmosV2API(networks['cosmos-hub-testnet']) -const lunieDBAPI = new LunieDBAPI() - -const dataSources = { - CosmosHubMainnetAPI: cosmosHubMainnetAPI, - CosmosHubTestnetAPI: cosmosHubTestnetAPI, - LunieDBAPI: lunieDBAPI +if(config.SENTRY_DSN){ + const Sentry = require('@sentry/node'); + Sentry.init({ dsn: config.SENTRY_DSN }); } + +const store = mapValues(networks, network => new BlockStore(network.id)) + +new CosmosNodeSubscription( + networks['cosmos-hub-mainnet'], + CosmosV0API, + store['cosmos-hub-mainnet'] +) +new CosmosNodeSubscription( + networks['cosmos-hub-testnet'], + CosmosV2API, + store['cosmos-hub-testnet'] +) + if (config.enableTestnet) { - const localCosmosTestnetAPI = new CosmosV0API( - networks['local-cosmos-hub-testnet'] + new CosmosNodeSubscription( + networks['local-cosmos-hub-testnet'], + CosmosV0API, + store['local-cosmos-hub-testnet'] ) - dataSources.TestnetAPI = localCosmosTestnetAPI +} + +function createDataSources() { + const dataSources = { + CosmosHubMainnetAPI: new CosmosV0API(networks['cosmos-hub-mainnet']), + CosmosHubTestnetAPI: new CosmosV2API(networks['cosmos-hub-testnet']), + LunieDBAPI: new LunieDBAPI(), + store: store + } + if (config.enableTestnet) { + dataSources.TestnetAPI = new CosmosV0API( + networks['local-cosmos-hub-testnet'] + ) + } + return dataSources } let options = { typeDefs, resolvers, - dataSources: () => dataSources, + dataSources: createDataSources, cacheControl: { - defaultMaxAge: 5000 + defaultMaxAge: 10 }, introspection: true, playground: true, engine: { apiKey: config.apollo_engine_api_key, schemaTag: 'production' - } + }, + plugins: [responseCachePlugin()] } if (config.enable_cache) { diff --git a/lib/block-store.js b/lib/block-store.js new file mode 100644 index 0000000000..45639cbf99 --- /dev/null +++ b/lib/block-store.js @@ -0,0 +1,29 @@ +class BlockStore { + constructor(networkId) { + this.networkId = networkId + this.latestHeight = 0 + this.block = {} + this.stakingDenom = '' + this.annualProvision = 0 + this.signedBlocksWindow = 0 + this.validators = {} + } + + update({ + height, + block = this.block, + stakingDenom = this.stakingDenom, + annualProvision = this.annualProvision, + signedBlocksWindow = this.signedBlocksWindow, + validators = this.validators + }) { + this.latestHeight = Number(height) + this.block = block + this.stakingDenom = stakingDenom + this.annualProvision = Number(annualProvision) + this.signedBlocksWindow = Number(signedBlocksWindow) + this.validators = validators + } +} + +module.exports = BlockStore diff --git a/lib/cosmos-node-subscription.js b/lib/cosmos-node-subscription.js new file mode 100644 index 0000000000..fea1164dba --- /dev/null +++ b/lib/cosmos-node-subscription.js @@ -0,0 +1,58 @@ +const _ = require('lodash') +const Tendermint = require('./helpers/tendermint') +const { + publishBlockAdded, + publishUserTransactionAdded +} = require('./subscriptions') + +// This class establishes an rpc connection to Tendermint. +// Used for listening to events, such as new blocks. +class CosmosNodeSubscription { + constructor(network, CosmosApiClass, store) { + this.network = network + this.cosmosAPI = new CosmosApiClass(network) + this.store = store + + // Create a RPC subscription for each network that will react to new block events. + Tendermint() + .connect(this.network.rpc_url) + .then(connectedClient => { + connectedClient.subscribe({ query: "tm.event='NewBlock'" }, event => + this.newBlockHandler(event.block.header.height) + ) + }) + } + + // For each block event, we fetch the block information and publish a message. + // A GraphQL resolver is listening for these messages and sends the block to + // each subscribed user. + async newBlockHandler(height) { + const block = await this.cosmosAPI.getBlockByHeight({ + blockHeight: height + }) + const validatorMap = await this.getLatestBlockData() + this.store.update({ height, block, validators: validatorMap }) + publishBlockAdded(this.network.id, block) + + // For each transaction listed in a block we fetch the transaction and + // extract the relevant addresses. This is published to the network. + // A GraphQL resolver is listening for these messages and sends the + // transaction to each subscribed user. + const txs = await this.cosmosAPI.getTransactionsByHeight(height) + txs.forEach(tx => { + this.cosmosAPI.extractInvolvedAddresses(tx.raw).forEach(address => { + publishUserTransactionAdded(this.network.id, address, tx) + }) + }) + + this.cosmosAPI.clearMemory() + } + + async getLatestBlockData() { + const validators = await this.cosmosAPI.getAllValidators() + const validatorMap = _.keyBy(validators, 'operatorAddress') + return validatorMap + } +} + +module.exports = CosmosNodeSubscription diff --git a/lib/cosmosV0-source.js b/lib/cosmosV0-source.js index bcaa65de41..94184936cc 100644 --- a/lib/cosmosV0-source.js +++ b/lib/cosmosV0-source.js @@ -1,11 +1,10 @@ -const { RESTDataSource } = require('apollo-datasource-rest') +const { PerBlockCacheDataSource } = require('./helpers/PerBlockCacheDataSource') const BigNumber = require('bignumber.js') const _ = require('lodash') -const chainpubsub = require('./chain-pubsub') const { uniqWith, sortBy, reverse } = require('lodash') const { encodeB32, decodeB32, pubkeyToAddress } = require('./tools') -class CosmosAPI extends RESTDataSource { +class CosmosV0API extends PerBlockCacheDataSource { constructor(network) { super() this.baseURL = network.api_url @@ -13,11 +12,6 @@ class CosmosAPI extends RESTDataSource { this.networkId = network.id this.setReducers() - this.subscribeToBlocks(network) - this.loadStaticData() - - // prepopulate cache - this.getAllValidators() } setReducers() { @@ -31,36 +25,23 @@ class CosmosAPI extends RESTDataSource { return this.get(url) } - async loadStaticData() { - this.stakingDenom = (await this.query('/staking/parameters')).bond_denom - this.signedBlocksWindow = (await this.query( - '/slashing/parameters' - )).signed_blocks_window + async getStakinDenom() { + const stakingParameters = await this.query('/staking/parameters') + return stakingParameters.bond_denom } - // subscribe to blocks via Tendermint - async subscribeToBlocks(network) { - this.wsClient = await chainpubsub.client(network.rpc_url) - this.wsClient.subscribe({ query: "tm.event='NewBlock'" }, async event => { - const block = await this.getBlockByHeight({ - blockHeight: event.block.header.height - }) - chainpubsub.publishBlockAdded(network.id, block) - this.reactToNewTransactions(network, event.block.header.height) - }) - } - - async reactToNewTransactions(network, height) { - const txs = await this.getTransactionsByHeight(height) - txs.forEach(tx => { - this.extractInvolvedAddresses(tx.raw).forEach(address => { - chainpubsub.publishUserTransactionAdded(network.id, address, tx) - }) - }) + async getSignedBlockWindow() { + const slashingParams = await this.query('/slashing/parameters') + return slashingParams.signed_blocks_window } extractInvolvedAddresses(transaction) { const involvedAddresses = transaction.tags.reduce((addresses, tag) => { + // temporary in here to identify why this fails + if (!tag.value) { + console.log(JSON.stringify(transaction)) + return addresses + } if (tag.value.startsWith(`cosmos`)) { addresses.push(tag.value) } @@ -70,7 +51,7 @@ class CosmosAPI extends RESTDataSource { } async getTransactionsByHeight(height) { - const { txs } = await this.get(`txs?tx.height=${height}`) + const txs = await this.get(`txs?tx.height=${height}`) return Array.isArray(txs) ? txs.map(transaction => this.reducers.transactionReducer(transaction)) : [] @@ -93,7 +74,6 @@ class CosmosAPI extends RESTDataSource { `cosmosvalconspub1zcjduepqlzmd0spn9m0m3eq9zp93d4w6e5tugamv44yqjzyacelnvra634fqnfec0r` ] if (exceptions.indexOf(validatorConsensusPubKey) !== -1) { - console.log(`Ignore Validator ${validatorConsensusPubKey}`) throw Error() } const response = await this.query( @@ -119,14 +99,20 @@ class CosmosAPI extends RESTDataSource { } async getAllValidators() { - let [validators, annualProvision, validatorSet] = await Promise.all([ + let [ + validators, + annualProvision, + validatorSet, + signedBlocksWindow + ] = await Promise.all([ Promise.all([ this.query(`staking/validators?status=unbonding`), this.query(`staking/validators?status=bonded`), this.query(`staking/validators?status=unbonded`) ]).then(validatorGroups => [].concat(...validatorGroups)), this.getAnnualProvision(), - this.getAllValidatorSets() + this.getAllValidatorSets(), + this.getSignedBlockWindow() ]) // create a dictionary to reduce array lookups @@ -146,8 +132,8 @@ class CosmosAPI extends RESTDataSource { const consensusAddress = pubkeyToAddress(validator.consensus_pubkey) validator.voting_power = consensusValidators[consensusAddress] ? BigNumber(consensusValidators[consensusAddress].voting_power) - .div(totalVotingPower) - .toNumber() + .div(totalVotingPower) + .toNumber() : 0 validator.signing_info = signingInfos[consensusAddress] }) @@ -155,7 +141,7 @@ class CosmosAPI extends RESTDataSource { return validators.map(validator => this.reducers.validatorReducer( this.networkId, - this.signedBlocksWindow, + signedBlocksWindow, validator, annualProvision ) @@ -193,10 +179,11 @@ class CosmosAPI extends RESTDataSource { '/staking/pool' ) if (!Array.isArray(response)) return [] - const proposals = response.map(async proposal => { + const proposals = response.map(proposal => { return this.reducers.proposalReducer( this.networkId, proposal, + {}, //TODO also add tally to overview when we need it totalBondedTokens ) }) @@ -204,13 +191,24 @@ class CosmosAPI extends RESTDataSource { } async getProposalById({ proposalId }) { - const response = await this.query(`gov/proposals/${proposalId}`) - const { bonded_tokens: totalBondedTokens } = await this.query( - '/staking/pool' - ) + const [ + proposal, + tally, + proposer, + { bonded_tokens: totalBondedTokens } + ] = await Promise.all([ + this.query(`gov/proposals/${proposalId}`), + this.query(`/gov/proposals/${proposalId}/tally`), + this.query(`gov/proposals/${proposalId}/proposer`).catch(() => { + return { proposer: `unknown` } + }), + this.query(`/staking/pool`) + ]) return this.reducers.proposalReducer( this.networkId, - response, + proposal, + tally, + proposer, totalBondedTokens ) } @@ -218,15 +216,11 @@ class CosmosAPI extends RESTDataSource { async getGovernanceParameters() { const depositParameters = await this.query(`gov/parameters/deposit`) const tallyingParamers = await this.query(`gov/parameters/tallying`) - return { - votingThreshold: tallyingParamers.threshold, - vetoThreshold: tallyingParamers.veto, - // for now assuming one deposit denom - depositDenom: depositParameters.min_deposit[0].denom.toUpperCase(), - depositThreshold: BigNumber(depositParameters.min_deposit[0].amount).div( - 1000000 - ) - } + + return this.reducers.governanceParameterReducer( + depositParameters, + tallyingParamers + ) } async getDelegatorVote({ proposalId, address }) { @@ -256,16 +250,14 @@ class CosmosAPI extends RESTDataSource { return this.reducers.blockReducer(this.networkId, block, transactions) } - async getBalanceFromAddress(address) { + async getBalancesFromAddress(address) { const response = await this.query(`bank/balances/${address}`) return response.map(this.reducers.coinReducer) } - async getDelegationsForDelegatorAddress(address) { + async getDelegationsForDelegatorAddress(address, validatorsDictionary) { let delegations = (await this.query(`staking/delegators/${address}/delegations`)) || [] - const validators = await this.getAllValidators() - const validatorsDictionary = _.keyBy(validators, 'operatorAddress') return delegations.map(delegation => this.reducers.delegationReducer( @@ -275,13 +267,11 @@ class CosmosAPI extends RESTDataSource { ) } - async getUndelegationsForDelegatorAddress(address) { + async getUndelegationsForDelegatorAddress(address, validatorsDictionary) { let undelegations = (await this.query( `staking/delegators/${address}/unbonding_delegations` )) || [] - const validators = await this.getAllValidators() - const validatorsDictionary = _.keyBy(validators, 'operatorAddress') // undelegations come in a nested format { validator_address, delegator_address, entries } // we flatten the format to be able to easier iterate over the list @@ -307,17 +297,15 @@ class CosmosAPI extends RESTDataSource { ) } - async getDelegationForValidator(delegatorAddress, operatorAddress) { - const [delegation, validator] = await Promise.all([ - this.query( - `staking/delegators/${delegatorAddress}/delegations/${operatorAddress}` - ).catch(() => ({ - validator_address: operatorAddress, - delegator_address: delegatorAddress, - shares: 0 - })), - this.getValidatorByAddress(operatorAddress) - ]) + async getDelegationForValidator(delegatorAddress, validator) { + const operatorAddress = validator.operatorAddress + const delegation = await this.query( + `staking/delegators/${delegatorAddress}/delegations/${operatorAddress}` + ).catch(() => ({ + validator_address: operatorAddress, + delegator_address: delegatorAddress, + shares: 0 + })) return this.reducers.delegationReducer(delegation, validator) } @@ -326,10 +314,11 @@ class CosmosAPI extends RESTDataSource { return response } - async getRewards(delegatorAddress, delegations) { + async getRewards(delegatorAddress, validatorsDictionary, delegations = null) { if (!delegations) { delegations = await this.getDelegationsForDelegatorAddress( - delegatorAddress + delegatorAddress, + validatorsDictionary ) } const rewards = await Promise.all( @@ -341,22 +330,32 @@ class CosmosAPI extends RESTDataSource { )) || [] })) ) - return rewards.map(({ rewards, validator }) => - this.reducers.rewardReducer(rewards[0], validator) - ) + return rewards + .filter(({ rewards }) => rewards.length > 0) + .map(({ rewards, validator }) => + this.reducers.rewardReducer(rewards[0], validator) + ) } - async getOverview(delegatorAddress) { - const [balances, delegations] = await Promise.all([ - this.getBalanceFromAddress(delegatorAddress), - this.getDelegationsForDelegatorAddress(delegatorAddress) + async getOverview(delegatorAddress, validatorsDictionary) { + const [balances, delegations, stakingDenom] = await Promise.all([ + this.getBalancesFromAddress(delegatorAddress), + this.getDelegationsForDelegatorAddress( + delegatorAddress, + validatorsDictionary + ), + this.getStakinDenom() ]) - const rewards = await this.getRewards(delegatorAddress, delegations) + const rewards = await this.getRewards( + delegatorAddress, + validatorsDictionary, + delegations + ) return this.reducers.overviewReducer( balances, delegations, rewards, - this.stakingDenom + stakingDenom ) } @@ -391,6 +390,26 @@ class CosmosAPI extends RESTDataSource { const reversedTxs = reverse(sortedTxs) return reversedTxs.map(this.reducers.transactionReducer) } + + async awaitUp() { + const start = new Date().getTime() + // we need to wait until the stargate API is up and has the expected shema + let up = false + while (!up) { + if (new Date().getTime() - start > 90000) { + throw new Error('Timed out waiting for stargarte API to be up.') + } + try { + // test if the stargate API has the expected schema by probing one setup table + await this.get('/blocks/latest') + up = true + } catch (err) { + console.log(err) + await new Promise(resolve => setTimeout(resolve, 1000)) + console.log('Waiting for stargate API to be up') + } + } + } } -module.exports = CosmosAPI +module.exports = CosmosV0API diff --git a/lib/cosmosV2-source.js b/lib/cosmosV2-source.js index 1fafd12290..ecafe46feb 100644 --- a/lib/cosmosV2-source.js +++ b/lib/cosmosV2-source.js @@ -61,19 +61,23 @@ class CosmosV2API extends CosmosV0API { return involvedAddresses } - async getRewards(delegatorAddress) { + async getTransactionsByHeight(height) { + const { txs } = await this.get(`txs?tx.height=${height}`) + return Array.isArray(txs) + ? txs.map(transaction => this.reducers.transactionReducer(transaction)) + : [] + } + + async getRewards(delegatorAddress, validatorsDictionary) { const { rewards } = await this.query( `distribution/delegators/${delegatorAddress}/rewards` ) - const validators = await this.getAllValidators() - return rewards - .filter(({ rewards }) => !!rewards) + return (rewards || []) + .filter(({ rewards }) => rewards.length > 0) .map(({ rewards, validator_address }) => this.reducers.rewardReducer( rewards[0], - validators.find( - ({ operatorAddress }) => validator_address === operatorAddress - ) + validatorsDictionary[validator_address] ) ) } diff --git a/lib/helpers/PerBlockCacheDataSource.js b/lib/helpers/PerBlockCacheDataSource.js new file mode 100644 index 0000000000..38ceca8a61 --- /dev/null +++ b/lib/helpers/PerBlockCacheDataSource.js @@ -0,0 +1,28 @@ +// HACK! Stupid Apollo doesn't support proper caching logic +// This appends the cache key of every request by the height so that every new block serves fresh data + +const { RESTDataSource } = require('apollo-datasource-rest') + +class PerBlockCacheDataSource extends RESTDataSource { + constructor() { + super() + this.cacheKey = 0 + } + + cacheKeyFor(request) { + return `${request.url}_${this.blockHeight}` + } + + clearMemory() { + // The memoizedResults map used for caching requests is never + // cleared automatically. The RESTDataSource assumes it will be + // created a new for each request. + // We maintain instances for parsing new block events on a network, + // so we have a need to call this manually. + this.memoizedResults.clear() + } +} + +module.exports = { + PerBlockCacheDataSource +} diff --git a/lib/luniedb-source.js b/lib/luniedb-source.js index 95bb1c8774..651e280ad0 100644 --- a/lib/luniedb-source.js +++ b/lib/luniedb-source.js @@ -1,32 +1,7 @@ const { RESTDataSource } = require('apollo-datasource-rest') const config = require('../config') const queries = require('./queries') - -const testnet = { - id: 'local-cosmos-hub-testnet', - title: 'Local Cosmos Testnet', - chain_id: 'testnet', - rpc_url: 'http://localhost:26657', - api_url: 'http://localhost:9071', - bech32_prefix: 'cosmos', - testnet: true, - feature_session: true, - feature_portfolio: true, - feature_validators: true, - feature_proposals: true, - feature_activity: true, - feature_explorer: true, - action_send: true, - action_claim_rewards: true, - action_delegate: true, - action_redelegate: true, - action_undelegate: true, - action_deposit: true, - action_vote: true, - action_proposal: true, - experimental: true, - stakingDenom: 'STAKE' -} +const { testnet } = require('../data/network-configs') class LunieDBAPI extends RESTDataSource { constructor() { @@ -34,20 +9,16 @@ class LunieDBAPI extends RESTDataSource { this.baseURL = config.hasura_url } + willSendRequest(request) { + request.headers.set('Content-Type', 'application/json') + request.headers.set('x-hasura-admin-secret', config.hasura_admin_key) + } + async getData(type, selection = '') { - const data = await this.post( - '', - { - query: - typeof queries[type] !== 'undefined' ? queries[type](selection) : '' - }, - { - headers: { - 'Content-Type': 'application/json', - 'x-hasura-admin-secret': config.hasura_admin_key - } - } - ) + const data = await this.post('', { + query: + typeof queries[type] !== 'undefined' ? queries[type](selection) : '' + }) if (data.errors) { throw new Error(data.errors.map(({ message }) => message).join('\n')) } @@ -58,14 +29,27 @@ class LunieDBAPI extends RESTDataSource { const response = await this.getData('networks') if (config.enableTestnet) { - response.push(testnet) + response.push( + // HACK: network.api_url for the testnet has to be different for internal + // (docker DNS to access the testnet container) and external (this frontend to + // access the docker container from the outside via it's port) + Object.assign({}, testnet, { + api_url: 'http://localhost:9071' + }) + ) } return response } async getNetwork(networkID) { - if (networkID === testnet.id) return testnet + if (networkID === testnet.id) + // HACK: network.api_url for the testnet has to be different for internal + // (docker DNS to access the testnet container) and external (this frontend to + // access the docker container from the outside via it's port) + return Object.assign({}, testnet, { + api_url: 'http://localhost:9071' + }) const selection = networkID ? `(where: {id: {_eq: "${networkID}"}})` : '' const response = await this.getData('networks', selection) @@ -94,7 +78,7 @@ class LunieDBAPI extends RESTDataSource { async getValidatorsInfo(networkID) { return await this.getData( - networkID.replace('-', '_') + '_validatorprofiles' + networkID.replace(/-/g, '_') + '_validatorprofiles' ) } } diff --git a/lib/queries.js b/lib/queries.js index 099bc33626..862bb24ef5 100644 --- a/lib/queries.js +++ b/lib/queries.js @@ -51,11 +51,8 @@ const queries = { cosmos_hub_mainnet_validatorprofiles: selection => ` query { cosmos_hub_mainnet_validatorprofiles${selection} { - details - name - picture operator_address - website + picture } } ` diff --git a/lib/reducers/cosmosV0-reducers.js b/lib/reducers/cosmosV0-reducers.js index 7f20eb8c14..7bb9175a7b 100644 --- a/lib/reducers/cosmosV0-reducers.js +++ b/lib/reducers/cosmosV0-reducers.js @@ -20,12 +20,17 @@ function proposalEndTime(proposal) { return proposal.voting_start_time case 'votingperiod': // the end time lives in the past already if the proposal is finalized + // eslint-disable-next-line no-fallthrough case 'passed': case 'rejected': return proposal.voting_end_time } } +function proposalFinalized(proposal) { + return ['Passed', 'Rejected'].indexOf(proposal.proposal_status) !== -1 +} + function atoms(nanoAtoms) { return BigNumber(nanoAtoms) .div(1000000) @@ -81,27 +86,32 @@ function getDeposit(proposal, bondDenom) { function getTotalVotePercentage(proposal, totalBondedTokens, totalVoted) { // for passed proposals we can't calculate the total voted percentage, as we don't know the totalBondedTokens in the past - if (['Passed', 'Rejected'].indexOf(proposal.proposal_status) !== -1) return -1 - if (totalVoted.eq(0)) return 0 + if (proposalFinalized(proposal)) return -1 + if (BigNumber(totalVoted).eq(0)) return 0 if (!totalBondedTokens) return -1 return BigNumber(totalBondedTokens) .div(atoms(totalVoted)) .toNumber() } -function tallyReducer(proposal, totalBondedTokens) { +function tallyReducer(proposal, tally, totalBondedTokens) { + // if the proposal is out of voting, use the final result for the tally + if (proposalFinalized(proposal)) { + tally = proposal.final_tally_result + } + const totalVoted = atoms( - BigNumber(proposal.final_tally_result.yes) - .plus(proposal.final_tally_result.no) - .plus(proposal.final_tally_result.abstain) - .plus(proposal.final_tally_result.no_with_veto) + BigNumber(tally.yes) + .plus(tally.no) + .plus(tally.abstain) + .plus(tally.no_with_veto) ) return { - yes: atoms(proposal.final_tally_result.yes), - no: atoms(proposal.final_tally_result.no), - abstain: atoms(proposal.final_tally_result.abstain), - veto: atoms(proposal.final_tally_result.no_with_veto), + yes: atoms(tally.yes), + no: atoms(tally.no), + abstain: atoms(tally.abstain), + veto: atoms(tally.no_with_veto), total: totalVoted, totalVotedPercentage: getTotalVotePercentage( proposal, @@ -111,7 +121,13 @@ function tallyReducer(proposal, totalBondedTokens) { } } -function proposalReducer(networkId, proposal, totalBondedTokens) { +function proposalReducer( + networkId, + proposal, + tally, + proposer, + totalBondedTokens +) { return { networkId, id: Number(proposal.proposal_id), @@ -122,8 +138,21 @@ function proposalReducer(networkId, proposal, totalBondedTokens) { status: proposal.proposal_status, statusBeginTime: proposalBeginTime(proposal), statusEndTime: proposalEndTime(proposal), - tally: tallyReducer(proposal, totalBondedTokens), - deposit: getDeposit(proposal, 'uatom') // TODO use denom lookup + tally: tallyReducer(proposal, tally, totalBondedTokens), + deposit: getDeposit(proposal, 'uatom'), // TODO use denom lookup + proposer: proposer.proposer + } +} + +function governanceParameterReducer(depositParameters, tallyingParamers) { + return { + votingThreshold: tallyingParamers.threshold, + vetoThreshold: tallyingParamers.veto, + // for now assuming one deposit denom + depositDenom: denomLookup(depositParameters.min_deposit[0].denom), + depositThreshold: BigNumber(depositParameters.min_deposit[0].amount).div( + 1000000 + ) } } @@ -240,7 +269,7 @@ function delegationReducer(delegation, validator) { validatorAddress: delegation.validator_address, delegatorAddress: delegation.delegator_address, validator, - amount: atoms(balance) + amount: balance } } @@ -338,6 +367,7 @@ function transactionReducer(transaction) { module.exports = { proposalReducer, + governanceParameterReducer, tallyReducer, validatorReducer, blockReducer, diff --git a/lib/reducers/cosmosV2-reducers.js b/lib/reducers/cosmosV2-reducers.js index 646f9f9d9a..02428f4399 100644 --- a/lib/reducers/cosmosV2-reducers.js +++ b/lib/reducers/cosmosV2-reducers.js @@ -9,7 +9,7 @@ const { expectedRewardsPerToken } = cosmosV0Reducers -function proposalReducer(networkId, proposal, totalBondedTokens) { +function proposalReducer(networkId, proposal, tally, totalBondedTokens) { return { networkId, id: Number(proposal.id), @@ -20,7 +20,7 @@ function proposalReducer(networkId, proposal, totalBondedTokens) { status: proposal.proposal_status, statusBeginTime: proposalBeginTime(proposal), statusEndTime: proposalEndTime(proposal), - tally: tallyReducer(proposal, totalBondedTokens), + tally: tallyReducer(proposal, tally, totalBondedTokens), deposit: getDeposit(proposal, 'stake') // TODO use denom lookup + use network config } } diff --git a/lib/resolvers.js b/lib/resolvers.js index 5a35064dad..33679d0c09 100644 --- a/lib/resolvers.js +++ b/lib/resolvers.js @@ -1,4 +1,5 @@ -const { blockAdded, userTransactionAdded } = require('./chain-pubsub') +const { keyBy } = require('lodash') +const { blockAdded, userTransactionAdded } = require('./subscriptions') function selectFrom(dataSources, networkId) { switch (networkId) { @@ -23,36 +24,49 @@ async function enrichValidator(dataSources, networkId, validator) { ) { return { ...validator, - picture: validatorInfo.picture, - name: validatorInfo.name + picture: validatorInfo.picture } } return validator } -async function validators(_, { networkId, all, query }, { dataSources }) { - let validators = await selectFrom(dataSources, networkId).getAllValidators() - if (!all) { +async function validators( + _, + { networkId, searchTerm, activeOnly }, + { dataSources } +) { + let validators = Object.values(dataSources.store[networkId].validators) + if (activeOnly) { validators = validators.filter(({ status }) => status === 'ACTIVE') } - if (query) { + if (searchTerm) { validators = validators.filter(({ name, operatorAddress }) => { - return name.indexOf(query) !== -1 || operatorAddress.indexOf(query) !== -1 + return ( + name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1 || + operatorAddress.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1 + ) }) } - return Promise.all( - validators.map(validator => - enrichValidator(dataSources, networkId, validator) - ) + const validatorInfo = await dataSources.LunieDBAPI.getValidatorsInfo( + networkId ) + const validatorInfoMap = keyBy(validatorInfo, 'operator_address') + + return validators.map(validator => { + const validatorProfile = validatorInfoMap[validator.operatorAddress] + if (validatorProfile && validatorProfile.picture) { + validator.picture = validatorProfile.picture + } else { + validator.picture = '' + } + return validator + }) } async function validator(_, { networkId, operatorAddress }, { dataSources }) { - const dataSource = selectFrom(dataSources, networkId) - const validator = await dataSource.getValidatorByAddress(operatorAddress) - + const validator = dataSources.store[networkId].validators[operatorAddress] return enrichValidator(dataSources, networkId, validator) } @@ -61,9 +75,10 @@ function delegation( { networkId, delegatorAddress, operatorAddress }, { dataSources } ) { + const validator = dataSources.store[networkId].validators[operatorAddress] return selectFrom(dataSources, networkId).getDelegationForValidator( delegatorAddress, - operatorAddress + validator ) } @@ -72,10 +87,11 @@ async function delegations( { networkId, delegatorAddress }, { dataSources } ) { + const validatorsDictionary = dataSources.store[networkId].validators const delegations = await selectFrom( dataSources, networkId - ).getDelegationsForDelegatorAddress(delegatorAddress) + ).getDelegationsForDelegatorAddress(delegatorAddress, validatorsDictionary) return Promise.all( delegations.map(async delegation => ({ @@ -94,10 +110,11 @@ async function undelegations( { networkId, delegatorAddress }, { dataSources } ) { + const validatorsDictionary = dataSources.store[networkId].validators const undelegations = await selectFrom( dataSources, networkId - ).getUndelegationsForDelegatorAddress(delegatorAddress) + ).getUndelegationsForDelegatorAddress(delegatorAddress, validatorsDictionary) return Promise.all( undelegations.map(async undelegation => ({ @@ -126,17 +143,28 @@ const resolvers = { selectFrom(dataSources, networkId).getGovernanceParameters(), validators, validator, - block: (_, { networkId, height }, { dataSources }) => - selectFrom(dataSources, networkId).getBlockByHeight({ + block: (_, { networkId, height }, { dataSources }, { cacheControl }) => { + const maxAge = height ? 60 : 10 + cacheControl.setCacheHint({ maxAge }) + return selectFrom(dataSources, networkId).getBlockByHeight({ blockHeight: height - }), + }) + }, network: (_, { id }, { dataSources }) => dataSources.LunieDBAPI.getNetwork(id), networks: (_, __, { dataSources }) => dataSources.LunieDBAPI.getNetworks(), maintenance: (_, __, { dataSources }) => dataSources.LunieDBAPI.getMaintenance(), - balance: (_, { networkId, address }, { dataSources }) => - selectFrom(dataSources, networkId).getBalanceFromAddress(address), + balances: async (_, { networkId, address }, { dataSources }) => + selectFrom(dataSources, networkId).getBalancesFromAddress(address), + balance: async (_, { networkId, address, denom }, { dataSources }) => { + const balances = await selectFrom( + dataSources, + networkId + ).getBalancesFromAddress(address) + const balance = balances.find(balance => balance.denom === denom) + return balance || { denom, amount: 0 } + }, delegations, undelegations, delegation, @@ -149,8 +177,10 @@ const resolvers = { { networkId, delegatorAddress, operatorAddress }, { dataSources } ) => { + const validatorsDictionary = dataSources.store[networkId].validators let rewards = await selectFrom(dataSources, networkId).getRewards( - delegatorAddress + delegatorAddress, + validatorsDictionary ) // filter to a specific validator @@ -161,8 +191,13 @@ const resolvers = { } return rewards }, - overview: (_, { networkId, address }, { dataSources }) => - selectFrom(dataSources, networkId).getOverview(address), + overview: (_, { networkId, address }, { dataSources }) => { + const validatorsDictionary = dataSources.store[networkId].validators + return selectFrom(dataSources, networkId).getOverview( + address, + validatorsDictionary + ) + }, transactions: (_, { networkId, address }, { dataSources }) => selectFrom(dataSources, networkId).getTransactions(address) }, diff --git a/lib/schema.js b/lib/schema.js index 6c4e7941b5..0498254fac 100644 --- a/lib/schema.js +++ b/lib/schema.js @@ -36,6 +36,7 @@ const typeDefs = gql` statusEndTime: String tally: Tally deposit: String # BigNumber + proposer: String } type Validator { @@ -65,7 +66,7 @@ const typeDefs = gql` picture: String } - type Block { + type Block @cacheControl(maxAge: 10) { networkId: String! height: Int hash: String @@ -157,22 +158,6 @@ const typeDefs = gql` totalRewards: String! } - type BankTransaction { - hash: String! - height: Int! - timestamp: String - gasUsed: Int - gasWanted: Int - senderAddress: String! - recipientAddress: String! - amount: Coin - success: Boolean - log: String - memo: String - fee: Coin - signature: String - } - type Subscription { blockAdded(networkId: String!): Block userTransactionAdded(networkId: String!, address: String!): Transaction @@ -184,9 +169,8 @@ const typeDefs = gql` proposals(networkId: String!): [Proposal] validators( networkId: String! - delegatorAddress: String - all: Boolean - query: String + searchTerm: String + activeOnly: Boolean ): [Validator] vote(networkId: String!, proposalId: Int!, address: String!): Vote governanceParameters(networkId: String!): GovernanceParameters @@ -194,7 +178,8 @@ const typeDefs = gql` networks: [Network] network(id: String): Network maintenance: [Maintenance] - balance(networkId: String!, address: String!): [Coin] + balances(networkId: String!, address: String!): [Coin] + balance(networkId: String!, address: String!, denom: String!): Coin overview(networkId: String!, address: String!): Overview delegation( networkId: String! diff --git a/lib/chain-pubsub.js b/lib/subscriptions.js similarity index 84% rename from lib/chain-pubsub.js rename to lib/subscriptions.js index a8b06929fb..f3b8d21602 100644 --- a/lib/chain-pubsub.js +++ b/lib/subscriptions.js @@ -1,12 +1,12 @@ const { PubSub } = require('apollo-server') const pubsub = new PubSub() -let Tendermint = require('./helpers/tendermint') const NEW_BLOCK = 'NEW_BLOCK' const NEW_USER_TRANSACTION = 'NEW_USER_TRANSACTION' +// This file exports functions used to listen and publish data to +// particular message channels. Used to handle GraphQL subscriptions. module.exports = { - client: url => Tendermint().connect(url), blockAdded: networkId => pubsub.asyncIterator([`${networkId}_${NEW_BLOCK}`]), publishBlockAdded: (networkId, block) => diff --git a/package-lock.json b/package-lock.json index 8cb3fe2d00..401025040d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "@apollographql/apollo-tools": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.0.tgz", - "integrity": "sha512-7wEO+S+zgz/wVe3ilFQqICufRBYYDSNUkd1V03JWvXuSydbYq2SM5EgvWmFF+04iadt+aQ0XCCsRzCzRPQODfQ==", + "integrity": "sha1-ihoKt6C7EszAO3LkoQTPpdlp/V8=", "requires": { "apollo-env": "0.5.1" } @@ -15,12 +15,12 @@ "@apollographql/graphql-playground-html": { "version": "1.6.24", "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz", - "integrity": "sha512-8GqG48m1XqyXh4mIZrtB5xOhUwSsh1WsrrsaZQOEYYql3YN9DEu9OOSg0ILzXHZo/h2Q74777YE4YzlArQzQEQ==" + "integrity": "sha1-POk5yxJ/uKqj/8HpDf+bivny49w=" }, "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "integrity": "sha1-vAeC9tafe31JUxIZaZuYj2aaj50=", "dev": true, "requires": { "@babel/highlight": "^7.0.0" @@ -29,7 +29,7 @@ "@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "integrity": "sha1-VtETEr2SSPphlZHQJHK+boyzJUA=", "dev": true, "requires": { "chalk": "^2.0.0", @@ -45,12 +45,12 @@ "@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=" }, "@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=" }, "@protobufjs/eventemitter": { "version": "1.1.0", @@ -91,10 +91,78 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, + "@sentry/core": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.7.1.tgz", + "integrity": "sha512-AOn3k3uVWh2VyajcHbV9Ta4ieDIeLckfo7UMLM+CTk2kt7C89SayDGayJMSsIrsZlL4qxBoLB9QY4W2FgAGJrg==", + "requires": { + "@sentry/hub": "5.7.1", + "@sentry/minimal": "5.7.1", + "@sentry/types": "5.7.1", + "@sentry/utils": "5.7.1", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.7.1.tgz", + "integrity": "sha512-evGh323WR073WSBCg/RkhlUmCQyzU0xzBzCZPscvcoy5hd4SsLE6t9Zin+WACHB9JFsRQIDwNDn+D+pj3yKsig==", + "requires": { + "@sentry/types": "5.7.1", + "@sentry/utils": "5.7.1", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.7.1.tgz", + "integrity": "sha512-nS/Dg+jWAZtcxQW8wKbkkw4dYvF6uyY/vDiz/jFCaux0LX0uhgXAC9gMOJmgJ/tYBLJ64l0ca5LzpZa7BMJQ0g==", + "requires": { + "@sentry/hub": "5.7.1", + "@sentry/types": "5.7.1", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.7.1.tgz", + "integrity": "sha512-hVM10asFStrOhYZzMqFM7V1lrHkr1ydc2n/SFG0ZmIQxfTjCVElyXV/BJASIdqadM1fFIvvtD/EfgkTcZmub1g==", + "requires": { + "@sentry/core": "5.7.1", + "@sentry/hub": "5.7.1", + "@sentry/types": "5.7.1", + "@sentry/utils": "5.7.1", + "cookie": "^0.3.1", + "https-proxy-agent": "^3.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + } + } + }, + "@sentry/types": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.7.1.tgz", + "integrity": "sha512-tbUnTYlSliXvnou5D4C8Zr+7/wJrHLbpYX1YkLXuIJRU0NSi81bHMroAuHWILcQKWhVjaV/HZzr7Y/hhWtbXVQ==" + }, + "@sentry/utils": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.7.1.tgz", + "integrity": "sha512-nhirUKj/qFLsR1i9kJ5BRvNyzdx/E2vorIsukuDrbo8e3iZ11JMgCOVrmC8Eq9YkHBqgwX4UnrPumjFyvGMZ2Q==", + "requires": { + "@sentry/types": "5.7.1", + "tslib": "^1.9.3" + } + }, "@types/accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "integrity": "sha1-w0vsEVz8dG4E/loFnfTOfns5FXU=", "requires": { "@types/node": "*" } @@ -102,7 +170,7 @@ "@types/body-parser": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", - "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", + "integrity": "sha1-GPz2F2j7XDDMxQjCHW/S6LO/eJc=", "requires": { "@types/connect": "*", "@types/node": "*" @@ -111,7 +179,7 @@ "@types/connect": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "integrity": "sha1-qg6WFrlDXMrQK8UrW0VP/Cxwuig=", "requires": { "@types/node": "*" } @@ -130,7 +198,7 @@ "@types/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg==", + "integrity": "sha1-z6qzPEnBWx3tMvI1ERzpEjAJvQI=", "requires": { "@types/express": "*" } @@ -138,7 +206,7 @@ "@types/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.1.tgz", - "integrity": "sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==", + "integrity": "sha1-TPeEmuO0cSWlZ9/uGL/KQlS4jFw=", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "*", @@ -148,7 +216,7 @@ "@types/express-serve-static-core": { "version": "4.16.9", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz", - "integrity": "sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ==", + "integrity": "sha1-aeAGQ7CBmwJL3t6VztP/I5u1RVg=", "requires": { "@types/node": "*", "@types/range-parser": "*" @@ -157,7 +225,7 @@ "@types/fs-capacitor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", - "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", + "integrity": "sha1-FxE+JYF/WE9YEA+3oI7tKIuBlW4=", "requires": { "@types/node": "*" } @@ -165,7 +233,7 @@ "@types/graphql-upload": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-8.0.3.tgz", - "integrity": "sha512-hmLg9pCU/GmxBscg8GCr1vmSoEmbItNNxdD5YH2TJkXm//8atjwuprB+xJBK714JG1dkxbbhp5RHX+Pz1KsCMA==", + "integrity": "sha1-s3HttfMFoqH3t4Q6iQoqetxVw+w=", "requires": { "@types/express": "*", "@types/fs-capacitor": "*", @@ -176,7 +244,7 @@ "@types/http-assert": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", - "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==" + "integrity": "sha1-13XpNjDCRpwvmA/CfjFDJAM12zs=" }, "@types/keygrip": { "version": "1.0.1", @@ -186,7 +254,7 @@ "@types/koa": { "version": "2.0.50", "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.0.50.tgz", - "integrity": "sha512-TcgOD2lh0EISSadAk1DOBYw7kNoY9XdeB3vEMOKiDDaTMYm+V54nyPsU7Ulb/htb5OBIR79RgTeCWntCcophLw==", + "integrity": "sha1-wpXLvVn0iY56h5TA8uQuYNqDqrI=", "requires": { "@types/accepts": "*", "@types/cookies": "*", @@ -199,7 +267,7 @@ "@types/koa-compose": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.4.tgz", - "integrity": "sha512-ioou0rxkuWL+yBQYsHUQAzRTfVxAg8Y2VfMftU+Y3RA03/MzuFL0x/M2sXXj3PkfnENbHsjeHR1aMdezLYpTeA==", + "integrity": "sha1-dqRhY0pZw+E0SYMXCLubNV+xVI4=", "requires": { "@types/koa": "*" } @@ -207,12 +275,12 @@ "@types/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", - "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" + "integrity": "sha1-cZVR0jUtMBrIuB23Mqy2vcKNve8=" }, "@types/mime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" + "integrity": "sha1-3EiIQjEqfwdRSTEpBbXjwLBUx50=" }, "@types/node": { "version": "12.7.7", @@ -222,12 +290,12 @@ "@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + "integrity": "sha1-fuMwunyq+5gJC+zoal7kQRWQTCw=" }, "@types/serve-static": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", - "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "integrity": "sha1-634cQcRGgnJVfol+kXHe1eLe2dE=", "requires": { "@types/express-serve-static-core": "*", "@types/mime": "*" @@ -236,7 +304,7 @@ "@types/ws": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.3.tgz", - "integrity": "sha512-yBTM0P05Tx9iXGq00BbJPo37ox68R5vaGTXivs6RGh/BQ6QP5zqZDGWdAO6JbRE/iR1l80xeGAwCQS2nMV9S/w==", + "integrity": "sha1-t3I3W6WdeQZlYcjYdQAUTWdLprM=", "requires": { "@types/node": "*" } @@ -244,7 +312,7 @@ "@wry/equality": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.9.tgz", - "integrity": "sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ==", + "integrity": "sha1-sT4Yt6gFPGhYqmyFtUkR+zHjqQk=", "requires": { "tslib": "^1.9.3" } @@ -252,12 +320,12 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" @@ -266,19 +334,27 @@ "acorn": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "integrity": "sha1-lJ028sKSU12mAig1hsJHfFfrLWw=", "dev": true }, "acorn-jsx": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "integrity": "sha1-hLaOpEs3PE+GhgI6VR9hoht8Sk8=", "dev": true }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -298,7 +374,7 @@ "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", "dev": true }, "ansi-regex": { @@ -310,7 +386,7 @@ "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==", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "requires": { "color-convert": "^1.9.0" } @@ -318,7 +394,7 @@ "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -337,7 +413,7 @@ "apollo-cache-control": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.4.tgz", - "integrity": "sha512-IZ1d3AXZtkZhLYo0kWqTbZ6nqLFaeUvLdMESs+9orMadBZ7mvzcAfBwrhKyCWPGeAAZ/jKv8FtYHybpchHgFAg==", + "integrity": "sha1-o2UNXkFzlT4qOvmVvqYhR/H/5Nc=", "requires": { "apollo-server-env": "^2.4.3", "graphql-extensions": "^0.10.3" @@ -346,7 +422,7 @@ "apollo-datasource": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.6.3.tgz", - "integrity": "sha512-gRYyFVpJgHE2hhS+VxMeOerxXQ/QYxWG7T6QddfugJWYAG9DRCl65e2b7txcGq2NP3r+O1iCm4GNwhRBDJbd8A==", + "integrity": "sha1-sx4InlKtuS+rtTarhQHFAlc//hM=", "requires": { "apollo-server-caching": "^0.5.0", "apollo-server-env": "^2.4.3" @@ -355,7 +431,7 @@ "apollo-datasource-rest": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/apollo-datasource-rest/-/apollo-datasource-rest-0.6.4.tgz", - "integrity": "sha512-jPPnJd+ZtGTjIDd2LpBrny/CJgg6DyW6jPc5dESdIxA829pNYDjKHugA59G0ZlgnFGbwzjM2h2Vemo+HifnUYA==", + "integrity": "sha1-fULYtB6ejQAf9JJd95nDJvRO63g=", "requires": { "apollo-datasource": "^0.6.3", "apollo-server-caching": "^0.5.0", @@ -367,7 +443,7 @@ "apollo-engine-reporting": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.4.6.tgz", - "integrity": "sha512-acfb7oFnru/8YQdY4x6+7WJbZfzdVETI8Cl+9ImgUrvUnE8P+f2SsGTKXTC1RuUvve4c56PAvaPgE+z8X1a1Mw==", + "integrity": "sha1-g69micSrgtHGLD9d3nZRl1UIEU8=", "requires": { "apollo-engine-reporting-protobuf": "^0.4.0", "apollo-graphql": "^0.3.3", @@ -381,7 +457,7 @@ "apollo-engine-reporting-protobuf": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.0.tgz", - "integrity": "sha512-cXHZSienkis8v4RhqB3YG3DkaksqLpcxApRLTpRMs7IXNozgV7CUPYGFyFBEra1ZFgUyHXx4G9MpelV+n2cCfA==", + "integrity": "sha1-40wZLYZJOzOnMYH9a+dXIVWREew=", "requires": { "protobufjs": "^6.8.6" } @@ -389,7 +465,7 @@ "apollo-env": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.5.1.tgz", - "integrity": "sha512-fndST2xojgSdH02k5hxk1cbqA9Ti8RX4YzzBoAB4oIe1Puhq7+YlhXGXfXB5Y4XN0al8dLg+5nAkyjNAR2qZTw==", + "integrity": "sha1-ubAZXBb+rfD+n9VWPtsLm32el9M=", "requires": { "core-js": "^3.0.1", "node-fetch": "^2.2.0", @@ -408,7 +484,7 @@ "apollo-link": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.13.tgz", - "integrity": "sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw==", + "integrity": "sha1-3/APvxnfzZD928FLaj+adxrKxsQ=", "requires": { "apollo-utilities": "^1.3.0", "ts-invariant": "^0.4.0", @@ -431,7 +507,7 @@ "apollo-server-cache-redis": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/apollo-server-cache-redis/-/apollo-server-cache-redis-1.1.4.tgz", - "integrity": "sha512-bWZbUTKf2NlLhTnOezLWcdP/h1te5UtEZ+LuMcrtpHidVFeKKImnHo1f9Qlc8eFrumstgBDQTMLfeG9lwWS66A==", + "integrity": "sha1-8KcS+8Ze3rpyIbusNPlFjI7gAhg=", "requires": { "apollo-server-caching": "^0.5.0", "apollo-server-env": "^2.4.3", @@ -442,7 +518,7 @@ "apollo-server-caching": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.0.tgz", - "integrity": "sha512-l7ieNCGxUaUAVAAp600HjbUJxVaxjJygtPV0tPTe1Q3HkPy6LEWoY6mNHV7T268g1hxtPTxcdRu7WLsJrg7ufw==", + "integrity": "sha1-RGo3zi1OJMgYM+J2Y4MwpjT3vUY=", "requires": { "lru-cache": "^5.0.0" } @@ -488,7 +564,7 @@ "apollo-server-env": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.3.tgz", - "integrity": "sha512-23R5Xo9OMYX0iyTu2/qT0EUb+AULCBriA9w8HDfMoChB8M+lFClqUkYtaTTHDfp6eoARLW8kDBhPOBavsvKAjA==", + "integrity": "sha1-m87tquB+r7lr7N/UePjZJhfYJdI=", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" @@ -497,7 +573,7 @@ "apollo-server-errors": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.3.3.tgz", - "integrity": "sha512-MO4oJ129vuCcbqwr5ZwgxqGGiLz3hCyowz0bstUF7MR+vNGe4oe3DWajC9lv4CxrhcqUHQOeOPViOdIo1IxE3g==" + "integrity": "sha1-g3Y7ADUsENxo+7DUF0St5m3lSf8=" }, "apollo-server-express": { "version": "2.9.4", @@ -525,15 +601,72 @@ "apollo-server-plugin-base": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.4.tgz", - "integrity": "sha512-4rY+cBAIpQomGWYBtk8hHkLQWHrh5hgIBPQqmhXh00YFdcY+Ob1/cU2/2iqTcIzhtcaezsc8OZ63au6ahSBQqg==", + "integrity": "sha1-Y+pP0Lu2xFELyNDSrQoGhMjQ2ow=", "requires": { "apollo-server-types": "^0.2.4" } }, + "apollo-server-plugin-response-cache": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-response-cache/-/apollo-server-plugin-response-cache-0.3.5.tgz", + "integrity": "sha512-DP5PS/uiHlUAzddI2dHpGwrKy8Vx4GlvZxVoFVZMOjIdIZf3y1vaO1JynTL+abwGqV6o2/K5k893j0RvPXhfyw==", + "requires": { + "apollo-cache-control": "^0.8.5", + "apollo-server-caching": "^0.5.0", + "apollo-server-plugin-base": "^0.6.5" + }, + "dependencies": { + "apollo-cache-control": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.5.tgz", + "integrity": "sha512-2yQ1vKgJQ54SGkoQS/ZLZrDX3La6cluAYYdruFYJMJtL4zQrSdeOCy11CQliCMYEd6eKNyE70Rpln51QswW2Og==", + "requires": { + "apollo-server-env": "^2.4.3", + "graphql-extensions": "^0.10.4" + } + }, + "apollo-engine-reporting-protobuf": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.1.tgz", + "integrity": "sha512-d7vFFZ2oUrvGaN0Hpet8joe2ZG0X0lIGilN+SwgVP38dJnOuadjsaYMyrD9JudGQJg0bJA5wVQfYzcCVy0slrw==", + "requires": { + "protobufjs": "^6.8.6" + } + }, + "apollo-server-plugin-base": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.5.tgz", + "integrity": "sha512-z2ve7HEPWmZI3EzL0iiY9qyt1i0hitT+afN5PzssCw594LB6DfUQWsI14UW+W+gcw8hvl8VQUpXByfUntAx5vw==", + "requires": { + "apollo-server-types": "^0.2.5" + } + }, + "apollo-server-types": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.5.tgz", + "integrity": "sha512-6iJQsPh59FWu4K7ABrVmpnQVgeK8Ockx8BcawBh+saFYWTlVczwcLyGSZPeV1tPSKwFwKZutyEslrYSafcarXQ==", + "requires": { + "apollo-engine-reporting-protobuf": "^0.4.1", + "apollo-server-caching": "^0.5.0", + "apollo-server-env": "^2.4.3" + } + }, + "graphql-extensions": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.4.tgz", + "integrity": "sha512-lE6MroluEYocbR/ICwccv39w+Pz4cBPadJ11z1rJkbZv5wstISEganbDOwl9qN21rcZGiWzh7QUNxUiFUXXEDw==", + "requires": { + "@apollographql/apollo-tools": "^0.4.0", + "apollo-server-env": "^2.4.3", + "apollo-server-types": "^0.2.5" + } + } + } + }, "apollo-server-types": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.4.tgz", - "integrity": "sha512-G4FvBVgGQcTW6ZBS2+hvcDQkSfdOIKV+cHADduXA275v+5zl42g+bCaGd/hCCKTDRjmQvObLiMxH/BJ6pDMQgA==", + "integrity": "sha1-KIZJAP/H+XEahZKXwUOoM/22qkM=", "requires": { "apollo-engine-reporting-protobuf": "^0.4.0", "apollo-server-caching": "^0.5.0", @@ -543,7 +676,7 @@ "apollo-tracing": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.8.4.tgz", - "integrity": "sha512-DjbFW0IvHicSlTVG+vK+1WINfBMRCdPPHJSW/j65JMir9Oe56WGeqL8qz8hptdUUmLYEb+azvcyyGsJsiR3zpQ==", + "integrity": "sha1-AReCDD8K06ptr3vxPdu5I8vvpt4=", "requires": { "apollo-server-env": "^2.4.3", "graphql-extensions": "^0.10.3" @@ -552,7 +685,7 @@ "apollo-utilities": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.2.tgz", - "integrity": "sha512-JWNHj8XChz7S4OZghV6yc9FNnzEXj285QYp/nLNh943iObycI5GTDO3NGR9Dth12LRrSFMeDOConPfPln+WGfg==", + "integrity": "sha1-jL3PiwEvZkzWy1dn9hMPWu2RFck=", "requires": { "@wry/equality": "^0.1.2", "fast-json-stable-stringify": "^2.0.0", @@ -563,7 +696,7 @@ "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -577,7 +710,7 @@ "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==" + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" }, "arr-union": { "version": "3.1.0", @@ -602,23 +735,23 @@ "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", "dev": true }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=" }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=" }, "async-retry": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", - "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", + "integrity": "sha1-plIfM4NY0yKxoAEreQMMb0EdHOA=", "requires": { "retry": "0.12.0" } @@ -626,7 +759,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=" }, "backo2": { "version": "1.0.2", @@ -641,7 +774,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -663,7 +796,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } @@ -671,7 +804,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } @@ -679,7 +812,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -691,7 +824,7 @@ "bech32": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", - "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==" + "integrity": "sha1-vUeomGu7Puw0pWoJeoS40+mi380=" }, "bignumber.js": { "version": "9.0.0", @@ -701,12 +834,12 @@ "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=" }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", "requires": { "bytes": "3.1.0", "content-type": "~1.0.4", @@ -723,7 +856,7 @@ "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -742,7 +875,7 @@ "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", "requires": { "ansi-align": "^2.0.0", "camelcase": "^4.0.0", @@ -756,7 +889,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -765,7 +898,7 @@ "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -792,7 +925,7 @@ "busboy": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "integrity": "sha1-FwiZJ0xb84quJ9XGK3EmjNWF/Rs=", "requires": { "dicer": "0.3.0" } @@ -800,12 +933,12 @@ "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -821,7 +954,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", "dev": true }, "camelcase": { @@ -832,12 +965,12 @@ "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10=" }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -847,13 +980,13 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", "dev": true }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -872,12 +1005,12 @@ "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=" }, "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==", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -918,7 +1051,7 @@ "cluster-key-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", - "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" + "integrity": "sha1-MEdLKpgfsSFyaVgzBSvA0BM20Q0=" }, "collection-visit": { "version": "1.0.0", @@ -932,7 +1065,7 @@ "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==", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", "requires": { "color-name": "1.1.3" } @@ -945,7 +1078,7 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=" }, "concat-map": { "version": "0.0.1", @@ -955,7 +1088,7 @@ "configstore": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", @@ -968,7 +1101,7 @@ "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", "requires": { "safe-buffer": "5.1.2" }, @@ -976,19 +1109,19 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" } } }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" }, "cookie-signature": { "version": "1.0.6", @@ -1003,7 +1136,7 @@ "core-js": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", - "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==" + "integrity": "sha1-zUHzhTTabMWffbBQ/mcwfemGiwk=" }, "core-util-is": { "version": "1.0.2", @@ -1013,7 +1146,7 @@ "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "integrity": "sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=", "requires": { "object-assign": "^4", "vary": "^1" @@ -1027,6 +1160,52 @@ "capture-stack-trace": "^1.0.0" } }, + "cross-env": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "requires": { + "cross-spawn": "^7.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -1040,7 +1219,7 @@ "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -1061,12 +1240,12 @@ "dataloader": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + "integrity": "sha1-vKEdhn9dPxue2fc3vRWXDGXf9cg=" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "requires": { "ms": "2.0.0" } @@ -1079,7 +1258,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=" }, "deep-is": { "version": "0.1.3", @@ -1090,7 +1269,7 @@ "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==", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", "requires": { "object-keys": "^1.0.12" } @@ -1098,7 +1277,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -1107,7 +1286,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } @@ -1115,7 +1294,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } @@ -1123,7 +1302,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1135,7 +1314,7 @@ "denque": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + "integrity": "sha1-Z0T/dkHBSMP4ppwwflEjXB9KN88=" }, "depd": { "version": "1.1.2", @@ -1155,7 +1334,7 @@ "dicer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "integrity": "sha1-6s2Ys7+/kuirXC/bcaqsRLsGuHI=", "requires": { "streamsearch": "0.1.2" } @@ -1163,7 +1342,7 @@ "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", "dev": true, "requires": { "esutils": "^2.0.2" @@ -1172,7 +1351,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", "requires": { "is-obj": "^1.0.0" } @@ -1180,7 +1359,7 @@ "dotenv": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", - "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" + "integrity": "sha1-2BHheGUr+4oeWTxt1wTsfpDYXqI=" }, "duplexer3": { "version": "0.1.4", @@ -1195,7 +1374,7 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", "dev": true }, "encodeurl": { @@ -1223,13 +1402,26 @@ "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==", + "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1243,7 +1435,7 @@ "eslint": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", - "integrity": "sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==", + "integrity": "sha1-go5MRpaX1Du1hhRL4VIZi5HpbtY=", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1288,7 +1480,7 @@ "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -1301,7 +1493,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", "dev": true } } @@ -1309,7 +1501,7 @@ "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", "dev": true, "requires": { "ms": "^2.1.1" @@ -1318,7 +1510,7 @@ "glob-parent": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "integrity": "sha1-X0wdHnSNMM1zrSlEs1d6gbCB6MI=", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -1327,19 +1519,19 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", "dev": true }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", "dev": true }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "integrity": "sha1-hXE5dakfuHvxswXMp3OV5A0qZKc=", "dev": true } } @@ -1347,7 +1539,7 @@ "eslint-config-prettier": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.4.0.tgz", - "integrity": "sha512-YrKucoFdc7SEko5Sxe4r6ixqXPDP1tunGw91POeZTTRKItf/AMFYt/YLEQtZMkR2LVpAVhcAcZgcWpm1oGPW7w==", + "integrity": "sha1-CgTxR+MdM8bBYbLdCXFBisUtBHc=", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -1356,7 +1548,7 @@ "eslint-plugin-prettier": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz", - "integrity": "sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA==", + "integrity": "sha1-UHuFYkENAqA/DdyUnGFvh3hS8ro=", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -1365,7 +1557,7 @@ "eslint-scope": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "integrity": "sha1-6HyIh8c+jR7ITxylkWRcNYv8j7k=", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1375,7 +1567,7 @@ "eslint-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "integrity": "sha1-FmpRgO9qt+tGLxYv0ObyRj1zCas=", "dev": true, "requires": { "eslint-visitor-keys": "^1.0.0" @@ -1384,13 +1576,13 @@ "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "integrity": "sha1-4qgs6oT/JGrW+1f5veW0ZiFFnsI=", "dev": true }, "espree": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", - "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "integrity": "sha1-f4Dl9yV/xH20UAItcj41ba6x5d4=", "dev": true, "requires": { "acorn": "^7.0.0", @@ -1401,13 +1593,13 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", "dev": true }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", "dev": true, "requires": { "estraverse": "^4.0.0" @@ -1416,7 +1608,7 @@ "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", "dev": true, "requires": { "estraverse": "^4.1.0" @@ -1425,13 +1617,13 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", "dev": true }, "etag": { @@ -1442,7 +1634,7 @@ "eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "integrity": "sha1-LT1I+cNGaY/Og6hdfWZOmFNd9uc=" }, "execa": { "version": "0.7.0", @@ -1493,7 +1685,7 @@ "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", @@ -1530,7 +1722,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" } } }, @@ -1546,7 +1738,7 @@ "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==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "^2.0.4" } @@ -1556,7 +1748,7 @@ "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", "dev": true, "requires": { "chardet": "^0.7.0", @@ -1567,7 +1759,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -1598,7 +1790,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } @@ -1606,7 +1798,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } @@ -1614,7 +1806,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1632,7 +1824,7 @@ "fast-diff": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "integrity": "sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM=", "dev": true }, "fast-json-stable-stringify": { @@ -1658,7 +1850,7 @@ "file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", "dev": true, "requires": { "flat-cache": "^2.0.1" @@ -1688,7 +1880,7 @@ "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -1702,7 +1894,7 @@ "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", "dev": true, "requires": { "flatted": "^2.0.0", @@ -1713,7 +1905,7 @@ "flatted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "integrity": "sha1-aeV8qo8OrLwoHS4stFjUb9tEngg=", "dev": true }, "for-in": { @@ -1742,7 +1934,7 @@ "fs-capacitor": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", - "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" + "integrity": "sha1-WiLnLUCuUHi0/mT+TQjA0/yIrTw=" }, "fs.realpath": { "version": "1.0.0", @@ -2300,7 +2492,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" }, "functional-red-black-tree": { "version": "1.0.1", @@ -2311,7 +2503,7 @@ "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "integrity": "sha1-ngm/cSs2CrkiXoEgSPcf3pyJZXs=", "dev": true }, "get-stream": { @@ -2327,7 +2519,7 @@ "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2368,7 +2560,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", "dev": true }, "got": { @@ -2392,12 +2584,12 @@ "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + "integrity": "sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI=" }, "graphql": { "version": "14.5.8", "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.8.tgz", - "integrity": "sha512-MMwmi0zlVLQKLdGiMfWkgQD7dY/TUKt4L+zgJ/aR0Howebod3aNgP5JkgvAULiR2HPVZaP2VEElqtdidHweLkg==", + "integrity": "sha1-UE89MRTLmgo/NZu7zzjZ5b9qazw=", "requires": { "iterall": "^1.2.2" } @@ -2405,7 +2597,7 @@ "graphql-extensions": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.3.tgz", - "integrity": "sha512-kwU0gUe+Qdfr8iZYT91qrPSwQNgPhB/ClF1m1LEPdxlptk5FhFmjpxAcbMZ8q7j0kjfnbp2IeV1OhRDCEPqz2w==", + "integrity": "sha1-njfzvSYwnECwOgvg5j4Cs/mdUuo=", "requires": { "@apollographql/apollo-tools": "^0.4.0", "apollo-server-env": "^2.4.3", @@ -2415,7 +2607,7 @@ "graphql-subscriptions": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", - "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", + "integrity": "sha1-Xy+kIz7aRM91cFJq3888FpN67xE=", "requires": { "iterall": "^1.2.1" } @@ -2423,12 +2615,12 @@ "graphql-tag": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", - "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" + "integrity": "sha1-EKpB8c2PrlNz6vEfH2cmCjytXgI=" }, "graphql-tools": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.5.tgz", - "integrity": "sha512-kQCh3IZsMqquDx7zfIGWBau42xe46gmqabwYkpPlCLIjcEY1XK+auP7iGRD9/205BPyoQdY8hT96MPpgERdC9Q==", + "integrity": "sha1-0rQe4KMwv++DPlza5+HwsNhrF1Q=", "requires": { "apollo-link": "^1.2.3", "apollo-utilities": "^1.0.1", @@ -2451,7 +2643,7 @@ "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", "requires": { "function-bind": "^1.1.1" } @@ -2498,12 +2690,12 @@ "http-cache-semantics": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" + "integrity": "sha1-SVcEdzJ37u9uQ/mrLCx9JZ3aJcU=" }, "http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -2512,10 +2704,34 @@ "toidentifier": "1.0.0" } }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -2523,7 +2739,7 @@ "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", "dev": true }, "ignore-by-default": { @@ -2534,7 +2750,7 @@ "import-fresh": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "integrity": "sha1-bTP6Hc7235MPrgA0RvM0Fa+QURg=", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -2564,17 +2780,17 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=" }, "inquirer": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "integrity": "sha1-rVCUI3XQNtMn/1KMCL1fqwiZKMo=", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -2595,7 +2811,7 @@ "ioredis": { "version": "4.14.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.14.1.tgz", - "integrity": "sha512-94W+X//GHM+1GJvDk6JPc+8qlM7Dul+9K+lg3/aHixPN7ZGkW6qlvX0DG6At9hWtH2v3B32myfZqWoANUJYGJA==", + "integrity": "sha1-tz3tlfzyIPEG0zElqS72ITqjExg=", "requires": { "cluster-key-slot": "^1.1.0", "debug": "^4.1.1", @@ -2611,7 +2827,7 @@ "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", "requires": { "ms": "^2.1.1" } @@ -2619,14 +2835,14 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" } } }, "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "integrity": "sha1-N9905DCg5HVQ/lSi3v4w2KzZX2U=" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -2657,17 +2873,17 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=" }, "is-ci": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", "requires": { "ci-info": "^1.5.0" } @@ -2698,7 +2914,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -2708,7 +2924,7 @@ "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==" + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" } } }, @@ -2730,7 +2946,7 @@ "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", "requires": { "is-extglob": "^2.1.1" } @@ -2783,7 +2999,7 @@ "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==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "requires": { "isobject": "^3.0.1" } @@ -2810,7 +3026,7 @@ "is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + "integrity": "sha1-13hIi9CkZmo76KFIK58rqv7eqLQ=" }, "is-stream": { "version": "1.1.0", @@ -2820,7 +3036,7 @@ "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", "requires": { "has-symbols": "^1.0.0" } @@ -2833,7 +3049,7 @@ "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==" + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" }, "isarray": { "version": "1.0.0", @@ -2853,18 +3069,18 @@ "iterall": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", - "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + "integrity": "sha1-ktcN64Ao4MOf8xZP2/TYsIgTDNc=" }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", "dev": true, "requires": { "argparse": "^1.0.7", @@ -2874,7 +3090,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -2886,7 +3102,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" }, "latest-version": { "version": "3.1.0", @@ -2909,7 +3125,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" }, "lodash.defaults": { "version": "4.2.0", @@ -2929,25 +3145,30 @@ "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=" }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=" }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", "requires": { "yallist": "^3.0.2" } }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" + }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", "requires": { "pify": "^3.0.0" } @@ -2983,7 +3204,7 @@ "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -3003,17 +3224,17 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" }, "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=" }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", "requires": { "mime-db": "1.40.0" } @@ -3021,13 +3242,13 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { "brace-expansion": "^1.1.7" } @@ -3035,7 +3256,7 @@ "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -3044,7 +3265,7 @@ "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==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { "is-plain-object": "^2.0.4" } @@ -3087,7 +3308,7 @@ "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -3111,18 +3332,18 @@ "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", "dev": true }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "integrity": "sha1-5jNFY4bUqlWGP2dqerDaqP3ssP0=" }, "nodemon": { "version": "1.19.2", @@ -3144,7 +3365,7 @@ "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", "requires": { "ms": "^2.1.1" } @@ -3152,7 +3373,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" } } }, @@ -3167,7 +3388,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=" }, "npm-run-path": { "version": "2.0.2", @@ -3213,12 +3434,12 @@ "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" + "integrity": "sha1-xwtsv3LydKq0w0wMgvUWe/gs8Vs=" }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" }, "object-path": { "version": "0.11.4", @@ -3315,7 +3536,7 @@ "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", "dev": true, "requires": { "callsites": "^3.0.0" @@ -3324,7 +3545,7 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" }, "pascalcase": { "version": "0.1.1", @@ -3380,13 +3601,13 @@ "prettier": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", - "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", + "integrity": "sha1-aCPnxZAAF7S9Os9G/prEtNe9qeo=", "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "integrity": "sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=", "dev": true, "requires": { "fast-diff": "^1.1.2" @@ -3395,18 +3616,18 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", "dev": true }, "protobufjs": { "version": "6.8.8", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", - "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "integrity": "sha1-yLTxKC/XqQ5vWxCe0RyEr4KQjnw=", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -3433,7 +3654,7 @@ "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "integrity": "sha1-NMvWSi2B9LH9IedvnwbIpFKZ7jQ=", "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.9.0" @@ -3447,28 +3668,28 @@ "pstree.remy": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", - "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" + "integrity": "sha1-x2ljooBH7WFULcNhqibuVaf6FfM=" }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", "dev": true }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" }, "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", "requires": { "bytes": "3.1.0", "http-errors": "1.7.2", @@ -3479,7 +3700,7 @@ "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -3498,7 +3719,7 @@ "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -3516,7 +3737,7 @@ "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3530,14 +3751,14 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" } } }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -3547,7 +3768,7 @@ "redis-commands": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", - "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==" + "integrity": "sha1-gNLiBpj+aI8icSf/nlFkp90X54U=" }, "redis-errors": { "version": "1.2.0", @@ -3565,7 +3786,7 @@ "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -3574,13 +3795,13 @@ "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", "dev": true }, "registry-auth-token": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "integrity": "sha1-10RoFUM/XV7WQxzV3KIQSPZrOX4=", "requires": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" @@ -3602,7 +3823,7 @@ "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=" }, "repeat-string": { "version": "1.6.1", @@ -3612,7 +3833,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", "dev": true }, "resolve-url": { @@ -3633,7 +3854,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" }, "retry": { "version": "0.12.0", @@ -3643,7 +3864,7 @@ "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", "dev": true, "requires": { "glob": "^7.1.3" @@ -3661,7 +3882,7 @@ "rxjs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "integrity": "sha1-UQ4mMX9NuRp+sd532d2boKSJmjo=", "dev": true, "requires": { "tslib": "^1.9.0" @@ -3670,7 +3891,7 @@ "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk=" }, "safe-regex": { "version": "1.1.0", @@ -3683,12 +3904,12 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" }, "semver-diff": { "version": "2.1.0", @@ -3701,7 +3922,7 @@ "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -3721,14 +3942,14 @@ "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==" + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" } } }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -3739,7 +3960,7 @@ "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -3760,12 +3981,12 @@ "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -3792,7 +4013,7 @@ "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -3803,7 +4024,7 @@ "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -3836,7 +4057,7 @@ "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==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -3854,7 +4075,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { "kind-of": "^6.0.0" } @@ -3862,7 +4083,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { "kind-of": "^6.0.0" } @@ -3870,7 +4091,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -3882,7 +4103,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "requires": { "kind-of": "^3.2.0" }, @@ -3905,7 +4126,7 @@ "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==", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -3922,7 +4143,7 @@ "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==", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "requires": { "extend-shallow": "^3.0.0" } @@ -3936,7 +4157,7 @@ "standard-as-callback": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.0.1.tgz", - "integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg==" + "integrity": "sha1-7YuyVkjhWDF1m2Ajvbh+a2CzgSY=" }, "static-extend": { "version": "0.1.2", @@ -3970,7 +4191,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -3994,7 +4215,7 @@ "string.prototype.trimleft": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "integrity": "sha1-bMR/DX641isPNwFhFxWjlUWR1jQ=", "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -4003,7 +4224,7 @@ "string.prototype.trimright": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "integrity": "sha1-Zp0WS+nfm291WfqOiZRbFopabFg=", "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -4012,7 +4233,7 @@ "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "requires": { "safe-buffer": "~5.1.0" }, @@ -4020,7 +4241,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" } } }, @@ -4046,7 +4267,7 @@ "subscriptions-transport-ws": { "version": "0.9.16", "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz", - "integrity": "sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw==", + "integrity": "sha1-kKQi8HcdnDIGkpTAhgivLUf1luw=", "requires": { "backo2": "^1.0.2", "eventemitter3": "^3.1.0", @@ -4058,7 +4279,7 @@ "ws": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "integrity": "sha1-3/7xSGa46NyRM1glFNG++vlumA8=", "requires": { "async-limiter": "~1.0.0" } @@ -4068,7 +4289,7 @@ "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "requires": { "has-flag": "^3.0.0" } @@ -4076,12 +4297,12 @@ "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + "integrity": "sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ=" }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", "dev": true, "requires": { "ajv": "^6.10.2", @@ -4093,7 +4314,7 @@ "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -4131,7 +4352,7 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -4158,7 +4379,7 @@ "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -4178,12 +4399,12 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", "requires": { "nopt": "~1.0.10" } @@ -4191,7 +4412,7 @@ "ts-invariant": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "integrity": "sha1-l6UjUYaI+TqvrQGw6A64A+sqvYY=", "requires": { "tslib": "^1.9.3" } @@ -4199,7 +4420,7 @@ "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=" }, "type-check": { "version": "0.3.2", @@ -4213,7 +4434,7 @@ "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -4238,7 +4459,7 @@ "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -4303,12 +4524,12 @@ "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=" }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "integrity": "sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y=", "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -4325,7 +4546,7 @@ "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", "dev": true, "requires": { "punycode": "^2.1.0" @@ -4347,7 +4568,7 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=" }, "util-deprecate": { "version": "1.0.2", @@ -4357,7 +4578,7 @@ "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", "requires": { "define-properties": "^1.1.2", "object.getownpropertydescriptors": "^2.0.3" @@ -4371,12 +4592,12 @@ "uuid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + "integrity": "sha1-RWjwIW54dg7h2/Ok0s9T4iQRKGY=" }, "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "integrity": "sha1-4U3jezGm0ZT1aQ1n78Tn9vxqsw4=", "dev": true }, "vary": { @@ -4398,7 +4619,7 @@ "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", "requires": { "isexe": "^2.0.0" } @@ -4406,7 +4627,7 @@ "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "integrity": "sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w=", "requires": { "string-width": "^2.1.1" } @@ -4426,7 +4647,7 @@ "write": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", "dev": true, "requires": { "mkdirp": "^0.5.1" @@ -4435,7 +4656,7 @@ "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "integrity": "sha1-H9Lprh3z51uNjDZ0Q8aS1MqB9IE=", "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -4460,12 +4681,12 @@ "zen-observable": { "version": "0.8.14", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.14.tgz", - "integrity": "sha512-kQz39uonEjEESwh+qCi83kcC3rZJGh4mrZW7xjkSQYXkq//JZHTtKo+6yuVloTgMtzsIWOJrjIrKvk/dqm0L5g==" + "integrity": "sha1-0zBYNZ0zW8DbHwr2YVizKHKvO/c=" }, "zen-observable-ts": { "version": "0.8.20", "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz", - "integrity": "sha512-2rkjiPALhOtRaDX6pWyNqK1fnP5KkJJybYebopNSn6wDG1lxBoFs2+nwwXKoA6glHIrtwrfBBy6da0stkKtTAA==", + "integrity": "sha1-RAkeM10/y8l/ZJfmPn9X1bUWsWM=", "requires": { "tslib": "^1.9.3", "zen-observable": "^0.8.0" diff --git a/package.json b/package.json index 65cb3c2b60..c15c099eb5 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ }, "main": "index.js", "scripts": { - "dev": "NODE_ENV=development nodemon index.js", - "dev-cache": "NODE_ENV=development ENABLE_CACHE=true nodemon index.js", + "dev": "cross-env NODE_ENV=development nodemon index.js", + "dev-cache": "cross-env NODE_ENV=development ENABLE_CACHE=true nodemon index.js", "dev-docker": "docker build -t lunie-api-dev . && docker run --init -it -p 4000:4000 lunie-api-dev", "lint": "eslint index.js lib data", "lint-fix": "npm run lint --fix", @@ -19,11 +19,14 @@ "author": "", "license": "ISC", "dependencies": { + "@sentry/node": "^5.7.1", "apollo-datasource-rest": "^0.6.4", "apollo-server": "^2.9.4", "apollo-server-cache-redis": "^1.1.4", + "apollo-server-plugin-response-cache": "^0.3.5", "bech32": "^1.1.3", "bignumber.js": "^9.0.0", + "cross-env": "^6.0.3", "dotenv": "^8.1.0", "graphql": "^14.5.8", "lodash": "^4.17.15",