From b1b1e512f57fe4efe825b7fcb04b6cdb6ba59860 Mon Sep 17 00:00:00 2001 From: Alys Date: Fri, 16 Mar 2018 04:27:59 +1000 Subject: [PATCH 01/37] adjust word order in mod slack flag message (#10137) --- test/api/v3/unit/libs/slack.js | 2 +- website/server/libs/slack.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/api/v3/unit/libs/slack.js b/test/api/v3/unit/libs/slack.js index 6c827d4958..e660a340d2 100644 --- a/test/api/v3/unit/libs/slack.js +++ b/test/api/v3/unit/libs/slack.js @@ -47,7 +47,7 @@ describe('slack', () => { expect(IncomingWebhook.prototype.send).to.be.calledOnce; expect(IncomingWebhook.prototype.send).to.be.calledWith({ - text: 'flagger (flagger-id) flagged a message (language: flagger-lang)', + text: 'flagger (flagger-id; language: flagger-lang) flagged a message', attachments: [{ fallback: 'Flag Message', color: 'danger', diff --git a/website/server/libs/slack.js b/website/server/libs/slack.js index aec1ef51ae..44dbd9e95b 100644 --- a/website/server/libs/slack.js +++ b/website/server/libs/slack.js @@ -32,7 +32,7 @@ function sendFlagNotification ({ let titleLink; let authorName; let title = `Flag in ${group.name}`; - let text = `${flagger.profile.name} (${flagger.id}) flagged a message (language: ${flagger.preferences.language})`; + let text = `${flagger.profile.name} (${flagger.id}; language: ${flagger.preferences.language}) flagged a message`; if (userComment) { text += ` and commented: ${userComment}`; From cb42a31c4344ae7c47358613087f7893a81ed06a Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Thu, 15 Mar 2018 19:59:36 +0100 Subject: [PATCH 02/37] Node 8 (WIP) (#9946) * start upgrade to node 8 * upgrade travis * improve travis * Remove bluebird, babel (except for modules) from server (WIP) (#9947) * remove bluebird, babel from server (except for modules) * fixes * fix path * fix path * fix export * fix export * fix test * fix tests * remove plugin for transform-object-rest-spread since it is supported in node8 * babel: correct syntax rest spread * remove bluebird * update migrations archive readme * fix package-lock.json * fix typo * add package-loc --- .babelrc | 8 +- .nodemonignore | 1 + .nvmrc | 2 +- .travis.yml | 4 +- Dockerfile | 2 +- Dockerfile-Production | 2 +- gulp/taskHelper.js | 3 +- .../archive/2016/20160529_fix_challenges.js | 1 - ...ks_from_null_value_in_challenges_broken.js | 1 - .../2016/20160602_convert_quest_collection.js | 1 - ...20160605_convert_quest_collection_again.js | 1 - .../archive/2016/20160615_fix_bad_emails.js | 1 - .../2016/20161002_add_missing_webhook_type.js | 1 - ...unce_collection_quest_change_in_parties.js | 1 - migrations/archive/README.md | 4 +- migrations/challenges/sync-all-challenges.js | 6 +- migrations/groups/create-group.js | 4 +- migrations/groups/habitrpg-jackalopes.js | 3 +- .../groups/update-groups-with-group-plans.js | 4 +- migrations/migration-runner.js | 4 +- migrations/s3-upload.js | 3 +- package-lock.json | 1914 ++++++----------- package.json | 8 +- scripts/paypalBillingSetup.js | 1 - .../GET-export_userdata.xml.test.js | 4 +- .../POST-groups_groupId_quests_accept.test.js | 4 +- ...-groups_groupId_quests_force-start.test.js | 12 +- .../POST-groups_groupid_quests_reject.test.js | 4 +- .../shops/GET-shops_market.test.js | 7 +- ...allengeId_tasks_id_score_direction.test.js | 10 +- .../v3/integration/user/DELETE-user.test.js | 3 +- test/api/v3/unit/libs/cron.test.js | 9 +- test/api/v3/unit/middlewares/language.test.js | 3 +- test/api/v3/unit/models/user.test.js | 5 +- .../api-integration/v3/object-generators.js | 9 +- test/helpers/globals.helper.js | 3 - test/helpers/sleep.js | 8 +- test/helpers/start-server.js | 2 - test/mocha.opts | 1 - vagrant_scripts/install_node.sh | 6 +- .../server/controllers/api-v3/challenges.js | 13 +- website/server/controllers/api-v3/chat.js | 3 +- website/server/controllers/api-v3/content.js | 10 +- website/server/controllers/api-v3/groups.js | 13 +- website/server/controllers/api-v3/members.js | 3 +- website/server/controllers/api-v3/quests.js | 11 +- website/server/controllers/api-v3/tasks.js | 13 +- .../server/controllers/api-v3/tasks/groups.js | 5 +- website/server/controllers/api-v3/user.js | 9 +- .../controllers/top-level/dataexport.js | 3 +- website/server/index.js | 6 - website/server/libs/amazonPayments.js | 20 +- website/server/libs/analyticsService.js | 13 +- website/server/libs/challenges/index.js | 3 +- website/server/libs/cron.js | 4 +- website/server/libs/csvStringify.js | 3 +- website/server/libs/inAppPurchases.js | 6 +- website/server/libs/paypalPayments.js | 16 +- website/server/libs/pushNotifications.js | 3 +- website/server/libs/sleep.js | 7 + website/server/libs/spells.js | 10 +- website/server/libs/taskManager.js | 7 +- website/server/middlewares/cron.js | 3 +- website/server/models/challenge.js | 19 +- website/server/models/group.js | 38 +- website/server/models/user/hooks.js | 5 +- website/server/models/user/methods.js | 3 +- website/server/server.js | 3 - 68 files changed, 786 insertions(+), 1536 deletions(-) create mode 100644 website/server/libs/sleep.js diff --git a/.babelrc b/.babelrc index 04af60f9a1..4c8702e887 100644 --- a/.babelrc +++ b/.babelrc @@ -1,10 +1,6 @@ { - "presets": ["es2015"], "plugins": [ - "transform-object-rest-spread", - ["transform-async-to-module-method", { - "module": "bluebird", - "method": "coroutine" - }] + "transform-es2015-modules-commonjs", + "syntax-object-rest-spread", ] } diff --git a/.nodemonignore b/.nodemonignore index efb42543ee..7bde46b5e4 100644 --- a/.nodemonignore +++ b/.nodemonignore @@ -4,6 +4,7 @@ node_modules/** .bower-registry/** website/client-old/** website/client/** +website/client/store/** website/views/** website/build/** dist/** diff --git a/.nvmrc b/.nvmrc index 62f9457511..301160a930 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -6 \ No newline at end of file +8 \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 537e118839..c150993057 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - '6' + - '8' services: - mongodb cache: @@ -8,8 +8,6 @@ cache: - 'node_modules' addons: chrome: stable -before_install: - - npm install -g npm@5 before_script: - npm run test:build - cp config.json.example config.json diff --git a/Dockerfile b/Dockerfile index befa3bdb55..168de8b0b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:boron +FROM node:8 # Upgrade NPM to v5 (Yarn is needed because of this bug https://github.com/npm/npm/issues/16807) # The used solution is suggested here https://github.com/npm/npm/issues/16807#issuecomment-313591975 diff --git a/Dockerfile-Production b/Dockerfile-Production index 4dac0ae835..1b4c47dbc2 100644 --- a/Dockerfile-Production +++ b/Dockerfile-Production @@ -1,4 +1,4 @@ -FROM node:boron +FROM node:8 ENV ADMIN_EMAIL admin@habitica.com ENV AMAZON_PAYMENTS_CLIENT_ID amzn1.application-oa2-client.68ed9e6904ef438fbc1bf86bf494056e diff --git a/gulp/taskHelper.js b/gulp/taskHelper.js index 83560d3f46..270573ba70 100644 --- a/gulp/taskHelper.js +++ b/gulp/taskHelper.js @@ -2,7 +2,6 @@ import { exec } from 'child_process'; import psTree from 'ps-tree'; import nconf from 'nconf'; import net from 'net'; -import Bluebird from 'bluebird'; import { post } from 'superagent'; import { sync as glob } from 'glob'; import Mocha from 'mocha'; @@ -45,7 +44,7 @@ export function kill (proc) { * before failing. */ export function awaitPort (port, max = 60) { - return new Bluebird((rej, res) => { + return new Promise((rej, res) => { let socket; let timeout; let interval; diff --git a/migrations/archive/2016/20160529_fix_challenges.js b/migrations/archive/2016/20160529_fix_challenges.js index 035a5c30ed..714b716a3f 100644 --- a/migrations/archive/2016/20160529_fix_challenges.js +++ b/migrations/archive/2016/20160529_fix_challenges.js @@ -16,7 +16,6 @@ const authorName = 'Blade'; const authorUuid = '75f270e8-c5db-4722-a5e6-a83f1b23f76b'; -global.Promise = require('bluebird'); const MongoClient = require('mongodb').MongoClient; const TaskQueue = require('cwait').TaskQueue; const logger = require('./utils/logger'); diff --git a/migrations/archive/2016/20160530_fix_tasks_from_null_value_in_challenges_broken.js b/migrations/archive/2016/20160530_fix_tasks_from_null_value_in_challenges_broken.js index e010e34b35..fbb3d1bcfb 100644 --- a/migrations/archive/2016/20160530_fix_tasks_from_null_value_in_challenges_broken.js +++ b/migrations/archive/2016/20160530_fix_tasks_from_null_value_in_challenges_broken.js @@ -11,7 +11,6 @@ * pm'ed each user asking if they would like their tasks reset to the previous day ***************************************/ -global.Promise = require('bluebird'); const MongoClient = require('mongodb').MongoClient; const TaskQueue = require('cwait').TaskQueue; const logger = require('./utils/logger'); diff --git a/migrations/archive/2016/20160602_convert_quest_collection.js b/migrations/archive/2016/20160602_convert_quest_collection.js index 04db90f1c2..b70c85659e 100644 --- a/migrations/archive/2016/20160602_convert_quest_collection.js +++ b/migrations/archive/2016/20160602_convert_quest_collection.js @@ -12,7 +12,6 @@ * from an object to a number, hence this migration. ***************************************/ -global.Promise = require('bluebird'); const TaskQueue = require('cwait').TaskQueue; const logger = require('./utils/logger'); const Timer = require('./utils/timer'); diff --git a/migrations/archive/2016/20160605_convert_quest_collection_again.js b/migrations/archive/2016/20160605_convert_quest_collection_again.js index 5b9cc1e95c..7c0af7be3f 100644 --- a/migrations/archive/2016/20160605_convert_quest_collection_again.js +++ b/migrations/archive/2016/20160605_convert_quest_collection_again.js @@ -9,7 +9,6 @@ * and transfers a group's progress to it ***************************************/ -global.Promise = require('bluebird'); const TaskQueue = require('cwait').TaskQueue; const logger = require('./utils/logger'); const Timer = require('./utils/timer'); diff --git a/migrations/archive/2016/20160615_fix_bad_emails.js b/migrations/archive/2016/20160615_fix_bad_emails.js index 97f29cefcf..4fa7802526 100644 --- a/migrations/archive/2016/20160615_fix_bad_emails.js +++ b/migrations/archive/2016/20160615_fix_bad_emails.js @@ -12,7 +12,6 @@ * @example.com ***************************************/ -global.Promise = require('bluebird'); const TaskQueue = require('cwait').TaskQueue; const logger = require('./utils/logger'); const Timer = require('./utils/timer'); diff --git a/migrations/archive/2016/20161002_add_missing_webhook_type.js b/migrations/archive/2016/20161002_add_missing_webhook_type.js index 8a0dd5ecbe..94e87a1d5b 100644 --- a/migrations/archive/2016/20161002_add_missing_webhook_type.js +++ b/migrations/archive/2016/20161002_add_missing_webhook_type.js @@ -9,7 +9,6 @@ * they support a type and options and label * ***************************************/ -global.Promise = require('bluebird'); const TaskQueue = require('cwait').TaskQueue; const logger = require('./utils/logger'); const Timer = require('./utils/timer'); diff --git a/migrations/archive/2017/20170111_announce_collection_quest_change_in_parties.js b/migrations/archive/2017/20170111_announce_collection_quest_change_in_parties.js index 35361d4094..19bda0bd77 100644 --- a/migrations/archive/2017/20170111_announce_collection_quest_change_in_parties.js +++ b/migrations/archive/2017/20170111_announce_collection_quest_change_in_parties.js @@ -12,7 +12,6 @@ * message into the chat for affected parties. ***************************************/ -global.Promise = require('bluebird'); const uuid = require('uuid'); const TaskQueue = require('cwait').TaskQueue; const logger = require('./utils/logger'); diff --git a/migrations/archive/README.md b/migrations/archive/README.md index 9330a6dbf8..c1d79a81da 100644 --- a/migrations/archive/README.md +++ b/migrations/archive/README.md @@ -1,4 +1,6 @@ If you need to use a migration from this folder, move it to /migrations. Note that /migrations files (excluding /archive) are linted, so to pass test you'll have to make sure -that the file is written correctly. \ No newline at end of file +that the file is written correctly. + +They might also be using some old deps that we don't use anymore like Bluebird, mongoskin, ... \ No newline at end of file diff --git a/migrations/challenges/sync-all-challenges.js b/migrations/challenges/sync-all-challenges.js index 3be7a74bb0..7998aecdd1 100644 --- a/migrations/challenges/sync-all-challenges.js +++ b/migrations/challenges/sync-all-challenges.js @@ -1,5 +1,3 @@ -import Bluebird from 'Bluebird'; - import { model as Challenges } from '../../website/server/models/challenge'; import { model as User } from '../../website/server/models/user'; @@ -17,10 +15,10 @@ async function syncChallengeToMembers (challenges) { promises.push(user.save()); }); - return Bluebird.all(promises); + return Promise.all(promises); }); - return await Bluebird.all(challengSyncPromises); + return await Promise.all(challengSyncPromises); } async function syncChallenges (lastChallengeDate) { diff --git a/migrations/groups/create-group.js b/migrations/groups/create-group.js index d1cedcc4fc..b1d266890f 100644 --- a/migrations/groups/create-group.js +++ b/migrations/groups/create-group.js @@ -1,5 +1,3 @@ -import Bluebird from 'bluebird'; - import { model as Group } from '../../website/server/models/group'; import { model as User } from '../../website/server/models/user'; @@ -16,7 +14,7 @@ async function createGroup (name, privacy, type, leaderId) { group.leader = user._id; user.guilds.push(group._id); - return Bluebird.all([group.save(), user.save()]); + return Promise.all([group.save(), user.save()]); } module.exports = async function groupCreator () { diff --git a/migrations/groups/habitrpg-jackalopes.js b/migrations/groups/habitrpg-jackalopes.js index 50c6da4673..a33ae3a2f3 100644 --- a/migrations/groups/habitrpg-jackalopes.js +++ b/migrations/groups/habitrpg-jackalopes.js @@ -3,7 +3,6 @@ /* * This migration will find users with unlimited subscriptions who are also eligible for Jackalope mounts, and award them */ -import Bluebird from 'bluebird'; import { model as Group } from '../../website/server/models/group'; import { model as User } from '../../website/server/models/user'; @@ -38,7 +37,7 @@ async function handOutJackalopes () { cursor.on('close', async () => { console.log('done'); - return await Bluebird.all(promises); + return await Promise.all(promises); }); } diff --git a/migrations/groups/update-groups-with-group-plans.js b/migrations/groups/update-groups-with-group-plans.js index 921c9bbb99..d544f389ab 100644 --- a/migrations/groups/update-groups-with-group-plans.js +++ b/migrations/groups/update-groups-with-group-plans.js @@ -9,8 +9,6 @@ let authorUuid = ''; // ... own data is done * subscription to all members */ -import Bluebird from 'bluebird'; - import { model as Group } from '../../website/server/models/group'; import * as payments from '../../website/server/libs/payments'; @@ -28,7 +26,7 @@ async function updateGroupsWithGroupPlans () { }); cursor.on('close', async () => { - return await Bluebird.all(promises); + return await Promise.all(promises); }); } diff --git a/migrations/migration-runner.js b/migrations/migration-runner.js index 59a2a32a27..1d3e651d77 100644 --- a/migrations/migration-runner.js +++ b/migrations/migration-runner.js @@ -1,14 +1,14 @@ require('babel-register'); -require('babel-polyfill'); // This file must use ES5, everything required can be in ES6 function setUpServer () { const nconf = require('nconf'); // eslint-disable-line global-require, no-unused-vars const mongoose = require('mongoose'); // eslint-disable-line global-require, no-unused-vars - const Bluebird = require('bluebird'); // eslint-disable-line global-require, no-unused-vars const setupNconf = require('../website/server/libs/setupNconf'); // eslint-disable-line global-require + setupNconf(); + // We require src/server and npt src/index because // 1. nconf is already setup // 2. we don't need clustering diff --git a/migrations/s3-upload.js b/migrations/s3-upload.js index 7538e83f6d..4a2d2efcd2 100644 --- a/migrations/s3-upload.js +++ b/migrations/s3-upload.js @@ -1,4 +1,3 @@ -let Bluebird = require('bluebird'); let request = require('superagent'); let last = require('lodash/last'); let AWS = require('aws-sdk'); @@ -74,7 +73,7 @@ function uploadToS3 (start, end, filesUrls) { }); console.log(promises.length); - return Bluebird.all(promises) + return Promise.all(promises) .then(() => { currentIndex += 50; uploadToS3(currentIndex, currentIndex + 50, filesUrls); diff --git a/package-lock.json b/package-lock.json index 8d64233952..3af616b041 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,19 +5,19 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz", - "integrity": "sha512-eVXQSbu/RimU6OKcK2/gDJVTFcxXJI4sHbIqw2mhwMZeQ2as/8AhS9DGkEDoHMBBNJZ5B0US63lF56x+KDcxiA==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.41.tgz", + "integrity": "sha512-omQT0n9EW38xfMCY7cCW/PAT55igUX9c9cMq6QN4EjxCcelcrocwMJ6H4JP4BGrQ+OHdJAQPM9/Eaa2Yce4Aug==", "requires": { - "@babel/highlight": "7.0.0-beta.40" + "@babel/highlight": "7.0.0-beta.41" } }, "@babel/generator": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.40.tgz", - "integrity": "sha512-c91BQcXyTq/5aFV4afgOionxZS1dxWt8OghEx5Q52SKssdGRFSiMKnk9tGkev1pYULPJBqjSDZU2Pcuc58ffZw==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.41.tgz", + "integrity": "sha512-j1hBM7K53RqAwPzPkS3GK9ggxJUBaUHevkpnt9iKBPHVlTrO3owMMlT8wH/GmOjr0HyBGFlL8cSlygx8RLdD7A==", "requires": { - "@babel/types": "7.0.0-beta.40", + "@babel/types": "7.0.0-beta.41", "jsesc": "2.5.1", "lodash": "4.17.5", "source-map": "0.5.7", @@ -37,27 +37,35 @@ } }, "@babel/helper-function-name": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.40.tgz", - "integrity": "sha512-cK9BVLtOfisSISTTHXKGvBc2OBh65tjEk4PgXhsSnnH0i8RP2v+5RCxoSlh2y/i+l2fxQqKqv++Qo5RMiwmRCA==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.41.tgz", + "integrity": "sha512-oN/ljgS1InIpOp2bDkj8X5gIoiWnYBdhaAb2y/nPSMX4t0C6nIdbd0qYhG8uAKFm6mQBmm1cvNxPzcSB3F19aQ==", "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.40", - "@babel/template": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40" + "@babel/helper-get-function-arity": "7.0.0-beta.41", + "@babel/template": "7.0.0-beta.41", + "@babel/types": "7.0.0-beta.41" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.40.tgz", - "integrity": "sha512-MwquaPznI4cUoZEgHC/XGkddOXtqKqD4DvZDOyJK2LR9Qi6TbMbAhc6IaFoRX7CRTFCmtGeu8gdXW2dBotBBTA==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.41.tgz", + "integrity": "sha512-B4Vwv02jCSjCws0jmBwR+c5y3MXs5dDyjEVZ8wlIeOaMvwXNxVrBGl+OaLuuPlxVNDrESNvpGFXxh+rlqf+w5Q==", "requires": { - "@babel/types": "7.0.0-beta.40" + "@babel/types": "7.0.0-beta.41" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.41.tgz", + "integrity": "sha512-eAyEJr4u3FWR5r0+gJWgE2Npu4d7BCXnXP+zw89n02x2DyewW0IHrED2HVlbhBAMWVt083VyGKjoVUMyH945wg==", + "requires": { + "@babel/types": "7.0.0-beta.41" } }, "@babel/highlight": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.40.tgz", - "integrity": "sha512-mOhhTrzieV6VO7odgzFGFapiwRK0ei8RZRhfzHhb6cpX3QM8XXuCLXWjN8qBB7JReDdUR80V3LFfFrGUYevhNg==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.41.tgz", + "integrity": "sha512-5RURdqgHmXdg775Dr6GIFaVatHaPtaVgMF29jvWgkm8LP/B3MjZR/TOhkpbIBChqFzTn7uQKiBR3002pGjKY7Q==", "requires": { "chalk": "2.3.2", "esutils": "2.0.2", @@ -65,43 +73,44 @@ } }, "@babel/template": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.40.tgz", - "integrity": "sha512-RlQiVB7eL7fxsKN6JvnCCwEwEL28CBYalXSgWWULuFlEHjtMoXBqQanSie3bNyhrANJx67sb+Sd/vuGivoMwLQ==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.41.tgz", + "integrity": "sha512-EiFgrLPJQ64+Im0+fg9fHcos0eooRG/iuTM6vlF4X9b+j/9Z/VCZejbvgqLYtuseT67GKQHEeEoXM07HK6in2Q==", "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", + "@babel/code-frame": "7.0.0-beta.41", + "@babel/types": "7.0.0-beta.41", + "babylon": "7.0.0-beta.41", "lodash": "4.17.5" }, "dependencies": { "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==" + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.41.tgz", + "integrity": "sha512-AfQfqR9hbNSpY/9yyGaUAiT1tmyHzaJbHJpqkfn8DGAUkPTG5VwPoulajQu3FUQXTr8NGm4MFaupVzmWkvln4Q==" } } }, "@babel/traverse": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.40.tgz", - "integrity": "sha512-h96SQorjvdSuxQ6hHFIuAa3oxnad1TA5bU1Zz88+XqzwmM5QM0/k2D+heXGGy/76gT5ajl7xYLKGiPA/KTyVhQ==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.41.tgz", + "integrity": "sha512-EkWyDxYvaGaFjV+7xsGBeTsryqj5+oMo6noN/fhT5j5C4bpPuNwWnl47Ivvg10bk6v1NpfCoI6NHOWj3x+v9Ag==", "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/generator": "7.0.0-beta.40", - "@babel/helper-function-name": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", + "@babel/code-frame": "7.0.0-beta.41", + "@babel/generator": "7.0.0-beta.41", + "@babel/helper-function-name": "7.0.0-beta.41", + "@babel/helper-split-export-declaration": "7.0.0-beta.41", + "@babel/types": "7.0.0-beta.41", + "babylon": "7.0.0-beta.41", "debug": "3.1.0", "globals": "11.3.0", - "invariant": "2.2.3", + "invariant": "2.2.4", "lodash": "4.17.5" }, "dependencies": { "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==" + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.41.tgz", + "integrity": "sha512-AfQfqR9hbNSpY/9yyGaUAiT1tmyHzaJbHJpqkfn8DGAUkPTG5VwPoulajQu3FUQXTr8NGm4MFaupVzmWkvln4Q==" }, "debug": { "version": "3.1.0", @@ -119,9 +128,9 @@ } }, "@babel/types": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.40.tgz", - "integrity": "sha512-uXCGCzTgMZxcSUzutCPtZmXbVC+cvENgS2e0tRuhn+Y1hZnMb8IHP0Trq7Q2MB/eFmG5pKrAeTIUfQIe5kA4Tg==", + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.41.tgz", + "integrity": "sha512-q+Jf57E089a98CjAN5x0C5PAn7fqhVrEHTVAeVWHviyauASWgqff3F+t8migYEagnn5PcJ9lmtr5Mgmi3sV8PA==", "requires": { "esutils": "2.0.2", "lodash": "4.17.5", @@ -142,7 +151,7 @@ }, "@sinonjs/formatio": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", "dev": true, "requires": { @@ -206,9 +215,9 @@ } }, "acorn": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" }, "acorn-dynamic-import": { "version": "2.0.2", @@ -263,7 +272,7 @@ "integrity": "sha512-efP54n3d1aLfjL2UMdaXa6DsswwzJeI5rqhbFvXMrKiJ6eJFpf+7R0zN7t8IC+XKn2YOAFAv6xbBNgHUkoHWLw==", "dev": true, "requires": { - "acorn": "5.4.1", + "acorn": "5.5.3", "xtend": "4.0.1" } }, @@ -295,7 +304,7 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { "co": "4.6.0", - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1" } @@ -335,7 +344,7 @@ "resolved": "https://registry.npmjs.org/amazon-payments/-/amazon-payments-0.2.6.tgz", "integrity": "sha1-4e34TDjOJXzApFwnPaByaHVhs20=", "requires": { - "request": "2.83.0", + "request": "2.85.0", "xml2js": "0.4.4" }, "dependencies": { @@ -422,7 +431,7 @@ "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "qs": { @@ -431,9 +440,9 @@ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", @@ -454,7 +463,7 @@ "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" } @@ -642,7 +651,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "micromatch": "3.1.8", + "micromatch": "3.1.9", "normalize-path": "2.1.1" } }, @@ -757,7 +766,7 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { "delegates": "1.0.0", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "argparse": { @@ -965,9 +974,9 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.1.tgz", - "integrity": "sha512-BAlXqqeEhVEajhgz7rgerupI8sb695KpCaJ/w4Sb9s2LoUci8sSMhXw93Jp8MsOufWGJOY/P2jpUEVw4RlSzNw==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", "dev": true }, "astw": { @@ -1050,18 +1059,13 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=" }, - "attempt-x": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/attempt-x/-/attempt-x-1.1.1.tgz", - "integrity": "sha512-hIp37ojJRRW8ExWSxxLpkDHUufk/DFfsb7/cUC1cVbBg7JV4gJTkCTRa44dlL9e5jx1P3VNrjL7QOQfi4MyltA==" - }, "autoprefixer": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.1.0.tgz", "integrity": "sha512-b6mjq6VZ0guW6evRkKXL5sSSvIXICAE9dyWReZ3l/riidU7bVaJMe5cQ512SmaLA4Pvgnhi5MFsMs/Mvyh9//Q==", "requires": { "browserslist": "3.1.2", - "caniuse-lite": "1.0.30000814", + "caniuse-lite": "1.0.30000815", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "6.0.19", @@ -1199,18 +1203,18 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.2.tgz", "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", "requires": { - "@babel/code-frame": "7.0.0-beta.40", - "@babel/traverse": "7.0.0-beta.40", - "@babel/types": "7.0.0-beta.40", - "babylon": "7.0.0-beta.40", + "@babel/code-frame": "7.0.0-beta.41", + "@babel/traverse": "7.0.0-beta.41", + "@babel/types": "7.0.0-beta.41", + "babylon": "7.0.0-beta.41", "eslint-scope": "3.7.1", "eslint-visitor-keys": "1.0.0" }, "dependencies": { "babylon": { - "version": "7.0.0-beta.40", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.40.tgz", - "integrity": "sha512-AVxF2EcxvGD5hhOuLTOLAXBb0VhwWpEX0HyHdAI2zU+AAP4qEwtQj8voz1JR3uclGai0rfcE+dCTHnNMOnimFg==" + "version": "7.0.0-beta.41", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.41.tgz", + "integrity": "sha512-AfQfqR9hbNSpY/9yyGaUAiT1tmyHzaJbHJpqkfn8DGAUkPTG5VwPoulajQu3FUQXTr8NGm4MFaupVzmWkvln4Q==" } } }, @@ -1307,18 +1311,6 @@ "lodash": "4.17.5" } }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, "babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", @@ -1377,35 +1369,6 @@ "find-up": "2.1.0", "istanbul-lib-instrument": "1.10.1", "test-exclude": "4.2.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", - "dev": true, - "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } } }, "babel-plugin-syntax-async-functions": { @@ -1423,17 +1386,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, - "babel-plugin-transform-async-to-module-method": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-module-method/-/babel-plugin-transform-async-to-module-method-6.24.1.tgz", - "integrity": "sha1-kQmgiYd5S0EcshOFDOk17C8CnNs=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", @@ -1767,7 +1719,7 @@ "babylon": "6.18.0", "debug": "2.6.9", "globals": "9.18.0", - "invariant": "2.2.3", + "invariant": "2.2.4", "lodash": "4.17.5" } }, @@ -1854,7 +1806,7 @@ "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-0.1.3.tgz", "integrity": "sha1-drA3C3ebuBbRL9QXZKa4Vz61/sM=", "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "base64id": { @@ -2038,7 +1990,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "blob": { @@ -2189,10 +2141,10 @@ "isobject": "3.0.1", "kind-of": "6.0.2", "repeat-element": "1.1.2", - "snapdragon": "0.8.1", + "snapdragon": "0.8.2", "snapdragon-node": "2.1.1", "split-string": "3.1.0", - "to-regex": "3.0.1" + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2229,7 +2181,7 @@ "defined": "1.0.0", "safe-buffer": "5.1.1", "through2": "2.0.3", - "umd": "3.0.1" + "umd": "3.0.3" } }, "browser-resolve": { @@ -2281,7 +2233,7 @@ "htmlescape": "1.1.1", "https-browserify": "1.0.0", "inherits": "2.0.3", - "insert-module-globals": "7.0.1", + "insert-module-globals": "7.0.2", "labeled-stream-splicer": "2.0.0", "module-deps": "4.1.1", "os-browserify": "0.3.0", @@ -2291,12 +2243,12 @@ "punycode": "1.4.1", "querystring-es3": "0.2.1", "read-only-stream": "2.0.0", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "resolve": "1.5.0", "shasum": "1.0.2", "shell-quote": "1.6.1", "stream-browserify": "2.0.1", - "stream-http": "2.8.0", + "stream-http": "2.8.1", "string_decoder": "1.0.3", "subarg": "1.0.0", "syntax-error": "1.4.0", @@ -2462,21 +2414,14 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.1.2.tgz", "integrity": "sha512-iO5MiK7MZXejqfnCK8onktxxb+mcW+KMiL/5gGF/UCWvVgPzbgbkA5cyYfqj/IIHHo7X1z0znrSHPw9AIfpvrw==", "requires": { - "caniuse-lite": "1.0.30000814", + "caniuse-lite": "1.0.30000815", "electron-to-chromium": "1.3.37" - }, - "dependencies": { - "electron-to-chromium": { - "version": "1.3.37", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.37.tgz", - "integrity": "sha1-SpJzTgBEyM8LFVO+V+riGkxuX6s=" - } } }, "bson": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", - "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", + "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" }, "buffer": { "version": "4.9.1", @@ -2499,13 +2444,10 @@ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" }, "buffer-from": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.1.tgz", - "integrity": "sha1-V7GLHaChnsBvM4N6UnWiQjUb114=", - "optional": true, - "requires": { - "is-array-buffer-x": "1.7.0" - } + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", + "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==", + "optional": true }, "buffer-more-ints": { "version": "0.0.2", @@ -2525,7 +2467,7 @@ "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", "requires": { "file-type": "3.9.0", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "uuid": "2.0.3", "vinyl": "1.2.0" }, @@ -2668,11 +2610,6 @@ } } }, - "cached-constructors-x": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cached-constructors-x/-/cached-constructors-x-1.0.0.tgz", - "integrity": "sha512-JVP0oilYlPgBTD8bkQ+of7hSIJRtydCCJiMtzdRMXVQ98gdj0NyrJTZzbu5wtlO26Ev/1HXRTtbBNsVlLJ3+3A==" - }, "cached-path-relative": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", @@ -2736,7 +2673,7 @@ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000810", + "caniuse-db": "1.0.30000815", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" }, @@ -2746,21 +2683,21 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000810", - "electron-to-chromium": "1.3.34" + "caniuse-db": "1.0.30000815", + "electron-to-chromium": "1.3.37" } } } }, "caniuse-db": { - "version": "1.0.30000810", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000810.tgz", - "integrity": "sha1-vSWDDEHvq2Qzmi44H0lnc0PIRQk=" + "version": "1.0.30000815", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000815.tgz", + "integrity": "sha1-DiGPoTPQ0HHIhqoEG0NSWMx0aJE=" }, "caniuse-lite": { - "version": "1.0.30000814", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000814.tgz", - "integrity": "sha512-Kt4dBhVlnTZ+jj+C8Bd4WT6RT4EJoX5/tlktHQfpqIMgLVrG1KBQlLf010ipMvuNrpQiAJ2A54e6MMbA0BaKxg==" + "version": "1.0.30000815", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000815.tgz", + "integrity": "sha512-PGSOPK6gFe5fWd+eD0u2bG0aOsN1qC4B1E66tl3jOsIoKkTIcBYAc2+O6AeNzKW8RsFykWgnhkTlfOyuTzgI9A==" }, "capture-stack-trace": { "version": "1.0.0", @@ -2802,13 +2739,6 @@ "requires": { "align-text": "0.1.4", "lazy-cache": "1.0.4" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - } } }, "chai": { @@ -3054,7 +2984,7 @@ "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", "readdirp": "2.1.0", - "upath": "1.0.2" + "upath": "1.0.4" } }, "chromedriver": { @@ -3164,7 +3094,7 @@ "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "qs": { @@ -3198,7 +3128,7 @@ "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" } @@ -3333,9 +3263,9 @@ } }, "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { "source-map": "0.5.7" }, @@ -3415,20 +3345,13 @@ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" }, "cloneable-readable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", - "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "requires": { "inherits": "2.0.3", - "process-nextick-args": "1.0.7", - "through2": "2.0.3" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - } + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.5" } }, "co": { @@ -3575,15 +3498,21 @@ } }, "commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", + "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==" }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, + "compare-versions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", + "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", + "dev": true + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -3611,7 +3540,7 @@ }, "compression": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "requires": { "accepts": "1.3.5", @@ -3629,12 +3558,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "typedarray": "0.0.6" } }, @@ -3661,6 +3590,29 @@ "finalhandler": "1.1.0", "parseurl": "1.3.2", "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } } }, "connect-history-api-fallback": { @@ -3855,7 +3807,7 @@ "lcov-parse": "0.0.10", "log-driver": "1.2.7", "minimist": "1.2.0", - "request": "2.83.0" + "request": "2.85.0" }, "dependencies": { "assert-plus": { @@ -3952,7 +3904,7 @@ "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "minimist": { @@ -3968,9 +3920,9 @@ "dev": true }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "dev": true, "requires": { "aws-sign2": "0.7.0", @@ -3992,7 +3944,7 @@ "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" } @@ -4072,7 +4024,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "shebang-command": "1.2.0", "which": "1.3.0" } @@ -4321,7 +4273,7 @@ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000810", + "caniuse-db": "1.0.30000815", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "5.2.18", @@ -4333,8 +4285,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000810", - "electron-to-chromium": "1.3.34" + "caniuse-db": "1.0.30000815", + "electron-to-chromium": "1.3.37" } }, "chalk": { @@ -4478,7 +4430,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.39" + "es5-ext": "0.10.40" } }, "dashdash": { @@ -4546,7 +4498,7 @@ "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", "requires": { "buffer-to-vinyl": "1.1.0", - "concat-stream": "1.6.0", + "concat-stream": "1.6.1", "decompress-tar": "3.1.0", "decompress-tarbz2": "3.1.0", "decompress-targz": "3.1.0", @@ -4714,7 +4666,7 @@ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", "requires": { "is-stream": "1.1.0", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "replace-ext": { @@ -4750,7 +4702,7 @@ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "requires": { - "duplexify": "3.5.3", + "duplexify": "3.5.4", "glob-stream": "5.3.5", "graceful-fs": "4.1.11", "gulp-sourcemaps": "1.6.0", @@ -4760,7 +4712,7 @@ "merge-stream": "1.0.1", "mkdirp": "0.5.1", "object-assign": "4.1.1", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "strip-bom": "2.0.0", "strip-bom-stream": "1.0.0", "through2": "2.0.3", @@ -5109,7 +5061,7 @@ "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", "dev": true, "requires": { - "ast-types": "0.11.1", + "ast-types": "0.11.3", "escodegen": "1.3.3", "esprima": "3.1.3" }, @@ -5200,7 +5152,7 @@ "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", "dev": true, "requires": { - "acorn": "5.4.1", + "acorn": "5.5.3", "defined": "1.0.0" } }, @@ -5335,7 +5287,7 @@ "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", "requires": { "caw": "1.2.0", - "concat-stream": "1.6.0", + "concat-stream": "1.6.1", "each-async": "1.1.1", "filenamify": "1.2.1", "got": "5.7.1", @@ -5344,7 +5296,7 @@ "is-url": "1.2.2", "object-assign": "4.1.1", "read-all-stream": "3.1.0", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "stream-combiner2": "1.1.1", "vinyl": "1.2.0", "vinyl-fs": "2.4.4", @@ -5468,7 +5420,7 @@ "parse-json": "2.2.0", "pinkie-promise": "2.0.1", "read-all-stream": "3.1.0", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "timed-out": "3.1.3", "unzip-response": "1.0.2", "url-parse-lax": "1.0.0" @@ -5531,7 +5483,7 @@ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", "requires": { "is-stream": "1.1.0", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "replace-ext": { @@ -5580,7 +5532,7 @@ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "requires": { - "duplexify": "3.5.3", + "duplexify": "3.5.4", "glob-stream": "5.3.5", "graceful-fs": "4.1.11", "gulp-sourcemaps": "1.6.0", @@ -5590,7 +5542,7 @@ "merge-stream": "1.0.1", "mkdirp": "0.5.1", "object-assign": "4.1.1", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "strip-bom": "2.0.0", "strip-bom-stream": "1.0.0", "through2": "2.0.3", @@ -5611,7 +5563,7 @@ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "duplexer3": { @@ -5620,13 +5572,13 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "duplexify": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", - "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", "requires": { "end-of-stream": "1.4.1", "inherits": "2.0.3", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "stream-shift": "1.0.0" } }, @@ -5641,7 +5593,7 @@ "dependencies": { "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" } } @@ -5747,9 +5699,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.34", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.34.tgz", - "integrity": "sha1-2TSY9AORuwwWpgPYJBuZUUBBV+0=" + "version": "1.3.37", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.37.tgz", + "integrity": "sha1-SpJzTgBEyM8LFVO+V+riGkxuX6s=" }, "elliptic": { "version": "6.4.0", @@ -5835,9 +5787,9 @@ } }, "engine.io-client": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.5.tgz", - "integrity": "sha512-Rv9vgb83zrNVhRircUXHi4mtbJhgy2oWtJOCZEbCLFs2HiDSWmh/aOEj8TwoKsn8zXGqTuQuPSoU4v3E10bR6A==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", + "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", "dev": true, "requires": { "component-emitter": "1.2.1", @@ -5955,9 +5907,9 @@ } }, "es5-ext": { - "version": "0.10.39", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz", - "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==", + "version": "0.10.40", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.40.tgz", + "integrity": "sha512-S9Fh3oya5OOvYSNGvPZJ+vyrs6VYpe1IXPowVe3N1OhaiwVaGlwfn3Zf5P5klYcWOA0toIwYQW8XEv/QqhdHvQ==", "requires": { "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" @@ -5969,7 +5921,7 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.39", + "es5-ext": "0.10.40", "es6-symbol": "3.1.1" } }, @@ -5979,7 +5931,7 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.39", + "es5-ext": "0.10.40", "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -5987,10 +5939,9 @@ } }, "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=", - "dev": true + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" }, "es6-promisify": { "version": "5.0.0", @@ -5999,14 +5950,6 @@ "dev": true, "requires": { "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", - "dev": true - } } }, "es6-set": { @@ -6015,7 +5958,7 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.39", + "es5-ext": "0.10.40", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -6027,7 +5970,7 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.39" + "es5-ext": "0.10.40" } }, "es6-weak-map": { @@ -6036,7 +5979,7 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.39", + "es5-ext": "0.10.40", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } @@ -6095,7 +6038,7 @@ "requires": { "es6-map": "0.1.5", "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", + "esrecurse": "4.2.1", "estraverse": "4.2.0" } }, @@ -6108,7 +6051,7 @@ "ajv": "5.5.2", "babel-code-frame": "6.26.0", "chalk": "2.3.2", - "concat-stream": "1.6.0", + "concat-stream": "1.6.1", "cross-spawn": "5.1.0", "debug": "3.1.0", "doctrine": "2.1.0", @@ -6156,7 +6099,7 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "shebang-command": "1.2.0", "which": "1.3.0" } @@ -6301,7 +6244,7 @@ "domutils": "1.5.1", "entities": "1.1.1", "inherits": "2.0.3", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } } } @@ -6330,7 +6273,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "requires": { - "esrecurse": "4.2.0", + "esrecurse": "4.2.1", "estraverse": "4.2.0" } }, @@ -6347,14 +6290,6 @@ "requires": { "acorn": "5.5.3", "acorn-jsx": "3.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", - "dev": true - } } }, "esprima": { @@ -6372,12 +6307,11 @@ } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "4.2.0" } }, "estraverse": { @@ -6401,12 +6335,12 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { "d": "1.0.0", - "es5-ext": "0.10.39" + "es5-ext": "0.10.40" } }, "event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "requires": { "duplexer": "0.1.1", @@ -6485,7 +6419,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "shebang-command": "1.2.0", "which": "1.3.0" } @@ -6567,8 +6501,8 @@ "extend-shallow": "2.0.1", "posix-character-classes": "0.1.1", "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -6737,20 +6671,6 @@ "vary": "1.1.2" }, "dependencies": { - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" - } - }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", @@ -6825,8 +6745,8 @@ "extend-shallow": "2.0.1", "fragment-cache": "0.2.1", "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -6879,6 +6799,16 @@ "yauzl": "2.4.1" }, "dependencies": { + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + } + }, "mkdirp": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", @@ -6912,7 +6842,7 @@ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", "requires": { - "acorn": "5.4.1", + "acorn": "5.5.3", "foreach": "2.0.5", "isarray": "0.0.1", "object-keys": "1.0.11" @@ -6936,9 +6866,9 @@ } }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "fast-json-stable-stringify": { "version": "2.0.0", @@ -6996,7 +6926,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", "requires": { - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1" } @@ -7095,26 +7025,17 @@ } }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", "encodeurl": "1.0.2", "escape-html": "1.0.3", "on-finished": "2.3.0", "parseurl": "1.3.2", - "statuses": "1.3.1", + "statuses": "1.4.0", "unpipe": "1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } } }, "find-cache-dir": { @@ -7159,7 +7080,7 @@ "requires": { "detect-file": "1.0.0", "is-glob": "3.1.0", - "micromatch": "3.1.8", + "micromatch": "3.1.9", "resolve-dir": "1.0.1" }, "dependencies": { @@ -7255,7 +7176,7 @@ "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "follow-redirects": { @@ -7319,9 +7240,9 @@ } }, "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.0.tgz", + "integrity": "sha512-hr9aT30rAi7kf8Q2aaTpSP7xGMhlJ+MdrUDVZs3rxbD3L/K46A86s2VY7qC2D2kGYGBtiT/3j6wTx1eeUq5xAQ==" }, "forwarded": { "version": "0.1.2", @@ -7352,7 +7273,7 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "fs-access": { @@ -7391,7 +7312,7 @@ "graceful-fs": "4.1.11", "iferr": "0.1.5", "imurmurhash": "0.1.4", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "fs.realpath": { @@ -8440,7 +8361,7 @@ "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", "requires": { - "rc": "1.2.5" + "rc": "1.2.6" } }, "get-res": { @@ -8473,7 +8394,7 @@ "extend": "3.0.1", "file-uri-to-path": "1.0.0", "ftp": "0.3.10", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" }, "dependencies": { "data-uri-to-buffer": { @@ -8621,7 +8542,7 @@ "is-negated-glob": "1.0.0", "ordered-read-streams": "1.0.1", "pumpify": "1.4.0", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "remove-trailing-separator": "1.1.0", "to-absolute-glob": "2.0.2", "unique-stream": "2.2.1" @@ -8818,7 +8739,7 @@ "archy": "1.0.0", "array-sort": "1.0.0", "color-support": "1.1.3", - "concat-stream": "1.6.0", + "concat-stream": "1.6.1", "copy-props": "2.0.1", "fancy-log": "1.3.2", "gulplog": "1.0.0", @@ -8830,7 +8751,7 @@ "pretty-hrtime": "1.0.3", "replace-homedir": "1.0.0", "semver-greatest-satisfied-range": "1.1.0", - "v8flags": "3.0.1", + "v8flags": "3.0.2", "yargs": "7.1.0" } } @@ -8862,7 +8783,7 @@ "archive-type": "3.2.0", "decompress": "3.0.0", "gulp-util": "3.0.8", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "gulp-imagemin": { @@ -8937,7 +8858,7 @@ "colors": "1.0.3", "event-stream": "3.3.4", "gulp": "3.9.1", - "nodemon": "1.15.1" + "nodemon": "1.17.2" }, "dependencies": { "chalk": { @@ -9349,7 +9270,7 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "requires": { "chalk": "1.1.3", - "commander": "2.14.1", + "commander": "2.15.0", "is-my-json-valid": "2.17.2", "pinkie-promise": "2.0.1" }, @@ -9425,21 +9346,10 @@ "sparkles": "1.0.0" } }, - "has-own-property-x": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/has-own-property-x/-/has-own-property-x-3.2.0.tgz", - "integrity": "sha512-HtRQTYpRFz/YVaQ7jh2mU5iorMAxFcML9FNOLMI1f8VNJ2K0hpOlXoi1a+nmVl6oUcGnhd6zYOFAVe7NUFStyQ==", - "optional": true, - "requires": { - "cached-constructors-x": "1.0.0", - "to-object-x": "1.5.0", - "to-property-key-x": "2.0.2" - } - }, "has-symbol-support-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", - "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" }, "has-symbols": { "version": "1.0.0", @@ -9451,7 +9361,7 @@ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "requires": { - "has-symbol-support-x": "1.4.1" + "has-symbol-support-x": "1.4.2" } }, "has-unicode": { @@ -9584,9 +9494,9 @@ } }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, "html-comment-regex": { "version": "1.1.1", @@ -9600,26 +9510,26 @@ "dev": true }, "html-minifier": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.9.tgz", - "integrity": "sha512-EZqO91XJwkj8BeLx9C12sKB/AHoTANaZax39vEOP9f/X/9jgJ3r1O2+neabuHqpz5kJO71TapP9JrtCY39su1A==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.11.tgz", + "integrity": "sha512-kIi9C090qWW5cGxEf+EwNUczduyVR6krk29WB3zDSWBQN6xuh/1jCXgmY4SvqzaJMOZFCnf8wcNzA8iPsfLiUQ==", "requires": { "camel-case": "3.0.0", - "clean-css": "4.1.9", - "commander": "2.14.1", + "clean-css": "4.1.11", + "commander": "2.15.0", "he": "1.1.1", "ncname": "1.0.0", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.3.12" + "uglify-js": "3.3.15" }, "dependencies": { "uglify-js": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.12.tgz", - "integrity": "sha512-4jxrTXlV0HaXTsNILfXW0eey7Qo8qHYM6ih5ZNh45erDWU2GHmKDmekwBTskDb12h+kdd2DBvdzqVb47YzNmTA==", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.15.tgz", + "integrity": "sha512-bqtBCAINYXX/OkdnqMGpbXr+OPWc00hsozRpk+dAtfnbdk2jjKiLmyOkQ7zamg648lVMnzATL8JrSN6LmaVpYA==", "requires": { - "commander": "2.14.1", + "commander": "2.15.0", "source-map": "0.6.1" } } @@ -9631,7 +9541,7 @@ "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", "requires": { "bluebird": "3.5.1", - "html-minifier": "3.5.9", + "html-minifier": "3.5.11", "loader-utils": "0.2.17", "lodash": "4.17.5", "pretty-error": "2.1.1", @@ -9872,7 +9782,7 @@ "requires": { "assert-plus": "0.2.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "httpntlm": { @@ -10026,7 +9936,7 @@ "integrity": "sha512-xwjBZQKpbkklHtJYnCOwRJjTRJA/nR0hQzKMh+CUZRvm/L0QwKKPJQ9tkPWQHrg+cydPu2i1vLgHuy2E0hKEkg==", "optional": true, "requires": { - "buffer-from": "0.1.1", + "buffer-from": "0.1.2", "is-svg": "2.1.0", "svgo": "1.0.5" } @@ -10134,7 +10044,7 @@ "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "qs": { @@ -10166,7 +10076,7 @@ "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" } @@ -10212,12 +10122,6 @@ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, - "infinity-x": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/infinity-x/-/infinity-x-1.0.0.tgz", - "integrity": "sha512-wjy2TupBtZ+aAniKt+xs/PO0xOkuaL6wBysUKbgD7aL1PMW/qY5xXDG59zXZ7dU+gk3zwXOu4yIEWPCEFBTgHQ==", - "optional": true - }, "inflection": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.10.0.tgz", @@ -10325,9 +10229,9 @@ } }, "insert-module-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", - "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.2.tgz", + "integrity": "sha512-p3s7g96Nm62MbHRuj9ZXab0DuJNWD7qcmdUXCOQ/ZZn42DtDXfsLill7bq19lDCx3K3StypqUnuE3H2VmIJFUw==", "dev": true, "requires": { "JSONStream": "1.3.2", @@ -10429,9 +10333,9 @@ "integrity": "sha1-LtyjftaoqSi5amXa/ySMhDK6cbU=" }, "invariant": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", - "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { "loose-envify": "1.3.1" } @@ -10490,19 +10394,6 @@ "kind-of": "6.0.2" } }, - "is-array-buffer-x": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/is-array-buffer-x/-/is-array-buffer-x-1.7.0.tgz", - "integrity": "sha512-ufSZRMY2WZX5xyNvk0NOZAG7cgi35B/sGQDGqv8w0X7MoQ2GC9vedanJhuYTPaC4PUCqLQsda1w7NF+dPZmAJw==", - "optional": true, - "requires": { - "attempt-x": "1.1.1", - "has-to-string-tag-x": "1.4.1", - "is-object-like-x": "1.7.0", - "object-get-own-property-descriptor-x": "3.2.0", - "to-string-tag-x": "1.4.2" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -10606,14 +10497,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, - "is-falsey-x": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-falsey-x/-/is-falsey-x-1.0.1.tgz", - "integrity": "sha512-XWNZC4A+3FX1ECoMjspuEFgSdio82IWjqY/suE0gZ10QA7nzHd/KraRq7Tc5VEHtFRgTRyTdY6W+ykPrDnyoAQ==", - "requires": { - "to-boolean-x": "1.0.1" - } - }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -10622,16 +10505,6 @@ "number-is-nan": "1.0.1" } }, - "is-finite-x": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-finite-x/-/is-finite-x-3.0.2.tgz", - "integrity": "sha512-HyFrxJZsgmP5RtR1PVlVvHSP4VslZOqr4uoq4x3rDrSOFaYp4R9tfmiWtAzQxPzixXhac3cYEno3NuVn0OHk2Q==", - "optional": true, - "requires": { - "infinity-x": "1.0.0", - "is-nan-x": "1.0.1" - } - }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -10640,21 +10513,6 @@ "number-is-nan": "1.0.1" } }, - "is-function-x": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is-function-x/-/is-function-x-3.3.0.tgz", - "integrity": "sha512-SreSSU1dlgYaXR5c0mm4qJHKYHIiGiEY+7Cd8/aRLLoMP/VvofD2XcWgBnP833ajpU5XzXbUSpfysnfKZLJFlg==", - "requires": { - "attempt-x": "1.1.1", - "has-to-string-tag-x": "1.4.1", - "is-falsey-x": "1.0.1", - "is-primitive": "2.0.0", - "normalize-space-x": "3.0.0", - "replace-comments-x": "2.0.0", - "to-boolean-x": "1.0.1", - "to-string-tag-x": "1.4.2" - } - }, "is-gif": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", @@ -10674,19 +10532,6 @@ "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=" }, - "is-index-x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-index-x/-/is-index-x-1.1.0.tgz", - "integrity": "sha512-qULKLMepQLGC8rSVdi8uF2vI4LiDrU9XSDg1D+Aa657GIB7GV1jHpga7uXgQvkt/cpQ5mVBHUFTpSehYSqT6+A==", - "optional": true, - "requires": { - "math-clamp-x": "1.2.0", - "max-safe-integer": "1.0.1", - "to-integer-x": "3.0.0", - "to-number-x": "2.0.0", - "to-string-symbols-supported-x": "1.0.0" - } - }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", @@ -10719,11 +10564,6 @@ "xtend": "4.0.1" } }, - "is-nan-x": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-nan-x/-/is-nan-x-1.0.1.tgz", - "integrity": "sha512-VfNJgfuT8USqKCYQss8g7sFvCzDnL+OOVMQoXhVoulZAyp0ZTj3oyZaaPrn2dxepAkKSQI2BiKHbBabX1DqVtw==" - }, "is-natural-number": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", @@ -10734,15 +10574,6 @@ "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" }, - "is-nil-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-nil-x/-/is-nil-x-1.4.1.tgz", - "integrity": "sha512-cfTKWI5iSR04SSCzzugTH5tS2rYG7kwI8yl/AqWkyuxZ7k55cbA47Y7Lezdg1N9aaELd+UxLg628bdQeNQ6BUw==", - "requires": { - "lodash.isnull": "3.0.0", - "validate.io-undefined": "1.0.3" - } - }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -10776,24 +10607,6 @@ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, - "is-object-like-x": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/is-object-like-x/-/is-object-like-x-1.7.0.tgz", - "integrity": "sha512-B8Bi1F34O1LxZltWAS+V4SHcOphLD1WHRqe800h2bOfQUBE9azkkKlOQUh8OJviT5/f1ZX43k4yi8DW7OOKPxg==", - "optional": true, - "requires": { - "is-function-x": "3.3.0", - "is-primitive": "3.0.0" - }, - "dependencies": { - "is-primitive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.0.tgz", - "integrity": "sha512-Qch+MMfMdu7DMY6XElM7LUJKPmkbXdTqNhqyehVflzis2a8Zd9V6U8qZybb32uUSmlO/dNmg3fsA5t0Q9TC0mA==", - "optional": true - } - } - }, "is-odd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", @@ -10906,12 +10719,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "optional": true - }, "is-svg": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", @@ -11002,7 +10809,7 @@ "requires": { "abbrev": "1.0.9", "async": "1.5.2", - "istanbul-api": "1.2.2", + "istanbul-api": "1.3.1", "js-yaml": "3.7.0", "mkdirp": "0.5.1", "nopt": "3.0.6", @@ -11034,19 +10841,20 @@ } }, "istanbul-api": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.2.tgz", - "integrity": "sha512-kH5YRdqdbs5hiH4/Rr1Q0cSAGgjh3jTtg8vu9NLebBAoK3adVO4jk81J+TYOkTr2+Q4NLeb1ACvmEt65iG/Vbw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "dev": true, "requires": { "async": "2.6.0", + "compare-versions": "3.1.0", "fileset": "2.0.3", - "istanbul-lib-coverage": "1.1.2", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.9.2", - "istanbul-lib-report": "1.1.3", - "istanbul-lib-source-maps": "1.2.3", - "istanbul-reports": "1.1.4", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", "js-yaml": "3.7.0", "mkdirp": "0.5.1", "once": "1.4.0" @@ -11064,24 +10872,24 @@ } }, "istanbul-lib-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", - "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, "istanbul-lib-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", - "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "dev": true, "requires": { "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz", - "integrity": "sha512-nz8t4HQ2206a/3AXi+NHFWEa844DMpPsgbcUteJbt1j8LX1xg56H9rOMnhvcvVvPbW60qAIyrSk44H8ZDqaSSA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { "babel-generator": "6.26.1", @@ -11089,7 +10897,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-coverage": "1.2.0", "semver": "5.5.0" }, "dependencies": { @@ -11102,12 +10910,12 @@ } }, "istanbul-lib-report": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz", - "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", "path-parse": "1.0.5", "supports-color": "3.2.3" @@ -11131,13 +10939,13 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", "dev": true, "requires": { "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.2", + "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", "rimraf": "2.6.2", "source-map": "0.5.7" @@ -11161,9 +10969,9 @@ } }, "istanbul-reports": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.4.tgz", - "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { "handlebars": "4.0.11" @@ -11378,7 +11186,7 @@ "body-parser": "1.18.2", "browserify": "14.5.0", "chokidar": "1.7.0", - "colors": "1.1.2", + "colors": "1.2.1", "combine-lists": "1.0.1", "connect": "3.6.6", "core-js": "2.5.3", @@ -11458,9 +11266,9 @@ } }, "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", + "integrity": "sha512-s8+wktIuDSLffCywiwSxQOMqtPxML11a/dtHE17tMn4B1MSWw/C22EKf7M2KGUBcDaVFEGT+S8N02geDXeuNKg==", "dev": true }, "expand-brackets": { @@ -11869,13 +11677,13 @@ "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", "dev": true, "requires": { - "colors": "1.1.2" + "colors": "1.2.1" }, "dependencies": { "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", + "integrity": "sha512-s8+wktIuDSLffCywiwSxQOMqtPxML11a/dtHE17tMn4B1MSWw/C22EKf7M2KGUBcDaVFEGT+S8N02geDXeuNKg==", "dev": true } } @@ -12014,12 +11822,9 @@ } }, "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "0.1.0" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lazy-req": { "version": "1.1.0", @@ -12032,7 +11837,7 @@ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "lcid": { @@ -12236,7 +12041,7 @@ "dev": true, "requires": { "is-stream": "1.1.0", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "replace-ext": { @@ -12266,7 +12071,7 @@ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "dev": true, "requires": { - "duplexify": "3.5.3", + "duplexify": "3.5.4", "glob-stream": "5.3.5", "graceful-fs": "4.1.11", "gulp-sourcemaps": "1.6.0", @@ -12276,7 +12081,7 @@ "merge-stream": "1.0.1", "mkdirp": "0.5.1", "object-assign": "4.1.1", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "strip-bom": "2.0.0", "strip-bom-stream": "1.0.0", "through2": "2.0.3", @@ -12641,11 +12446,6 @@ } } }, - "lodash.endswith": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", - "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=" - }, "lodash.escape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", @@ -12674,26 +12474,11 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "lodash.isnull": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnull/-/lodash.isnull-3.0.0.tgz", - "integrity": "sha1-+vvlnqHcon7teGU0A53YTC4HxW4=" - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", @@ -12736,11 +12521,6 @@ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", "integrity": "sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=" }, - "lodash.startswith": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", - "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=" - }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", @@ -13018,7 +12798,7 @@ "oauth-sign": "0.8.2", "qs": "6.2.3", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.4.3" } }, @@ -13088,9 +12868,9 @@ } }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -13248,41 +13028,16 @@ "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "requires": { "findup-sync": "2.0.0", - "micromatch": "3.1.8", + "micromatch": "3.1.9", "resolve": "1.5.0", "stack-trace": "0.0.10" } }, - "math-clamp-x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/math-clamp-x/-/math-clamp-x-1.2.0.tgz", - "integrity": "sha512-tqpjpBcIf9UulApz3EjWXqTZpMlr2vLN9PryC9ghoyCuRmqZaf3JJhPddzgQpJnKLi2QhoFnvKBFtJekAIBSYg==", - "optional": true, - "requires": { - "to-number-x": "2.0.0" - } - }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, - "math-sign-x": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/math-sign-x/-/math-sign-x-3.0.0.tgz", - "integrity": "sha512-OzPas41Pn4d16KHnaXmGxxY3/l3zK4OIXtmIwdhgZsxz4FDDcNnbrABYPg2vGfxIkaT9ezGnzDviRH7RfF44jQ==", - "optional": true, - "requires": { - "is-nan-x": "1.0.1", - "to-number-x": "2.0.0" - } - }, - "max-safe-integer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/max-safe-integer/-/max-safe-integer-1.0.1.tgz", - "integrity": "sha1-84BgvixWPYwC5tSK85Ei/YO29BA=", - "optional": true - }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -13332,7 +13087,7 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { "errno": "0.1.7", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "meow": { @@ -13369,7 +13124,7 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "method-override": { @@ -13389,9 +13144,9 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.8.tgz", - "integrity": "sha512-/XeuOQqYg+B5kwjDWekXseSwGS7CzE0w9Gjo4Cjkf/uFitNh47NrZHAY2vp/oS2YQVfebPIdbEIvgdy+kIcAog==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -13404,8 +13159,8 @@ "nanomatch": "1.2.9", "object.pick": "1.3.0", "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "miller-rabin": { @@ -13685,7 +13440,7 @@ "duplexer2": "0.1.4", "inherits": "2.0.3", "parents": "1.0.1", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "resolve": "1.5.0", "stream-combiner2": "1.1.1", "subarg": "1.0.0", @@ -13748,16 +13503,99 @@ } }, "mongodb": { - "version": "2.2.34", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.34.tgz", - "integrity": "sha1-o09Zu+thdUrsQy3nLD/iFSakTBo=", - "dev": true, + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.4.tgz", + "integrity": "sha512-90YIIs7A4ko4kCGafxxXj3foexCAlJBC0YLwwIKgSLoE7Vni2IqUMz6HSsZ3zbXOfR1KWtxfnc0RyAMAY/ViLg==", "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.18", - "readable-stream": "2.2.7" + "mongodb-core": "3.0.4" + } + }, + "mongodb-core": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.4.tgz", + "integrity": "sha512-OTH267FjfwBdEufSnrgd+u8HuLWRuQ6p8DR0XirPl2BdlLEMh4XwjJf1RTlruILp5p2m1w8dDC8rCxibC3W8qQ==", + "requires": { + "bson": "1.0.6", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.0.10.tgz", + "integrity": "sha512-vBfFP6hOHBdsWogc84cLofclWVAiu0+q0/oLxL/y61RUpW4K3BIGH2QhI+7lPBrGpGS1Yk/KfnumndWQI7wZiA==", + "requires": { + "async": "2.1.4", + "bson": "1.0.6", + "kareem": "2.0.5", + "lodash.get": "4.4.2", + "mongodb": "3.0.4", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.3.0", + "mquery": "3.0.0", + "ms": "2.0.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" }, "dependencies": { + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.5" + } + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "monk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/monk/-/monk-6.0.5.tgz", + "integrity": "sha512-NEygZ2fhRkPE9zxyOT/GhEYKIGClMCQ+StsTruZSlAWf1aRsgvdu8suVvOj3KWfdiOtsIMs9gg8eyyVHPNWRwg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "mongodb": "2.2.35", + "monk-middleware-cast-ids": "0.2.1", + "monk-middleware-fields": "0.2.0", + "monk-middleware-handle-callback": "0.2.2", + "monk-middleware-options": "0.2.1", + "monk-middleware-query": "0.2.0", + "monk-middleware-wait-for-connection": "0.2.0", + "object-assign": "4.1.1" + }, + "dependencies": { + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=", + "dev": true + }, + "mongodb": { + "version": "2.2.35", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.35.tgz", + "integrity": "sha512-3HGLucDg/8EeYMin3k+nFWChTA85hcYDCw1lPsWR6yV9A6RgKb24BkLiZ9ySZR+S0nfBjWoIUS7cyV6ceGx5Gg==", + "dev": true, + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.19", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.19.tgz", + "integrity": "sha512-Jt4AtWUkpuW03kRdYGxga4O65O1UHlFfvvInslEfLlGi+zDMxbBe3J2NVmN9qPJ957Mn6Iz0UpMtV80cmxCVxw==", + "dev": true, + "requires": { + "bson": "1.0.6", + "require_optional": "1.0.1" + } + }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", @@ -13781,83 +13619,6 @@ } } }, - "mongodb-core": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.18.tgz", - "integrity": "sha1-TEYTm986HwMt7ZHbSfOO7AFlkFA=", - "dev": true, - "requires": { - "bson": "1.0.4", - "require_optional": "1.0.1" - } - }, - "mongoose": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.0.10.tgz", - "integrity": "sha512-vBfFP6hOHBdsWogc84cLofclWVAiu0+q0/oLxL/y61RUpW4K3BIGH2QhI+7lPBrGpGS1Yk/KfnumndWQI7wZiA==", - "requires": { - "async": "2.1.4", - "bson": "1.0.4", - "kareem": "2.0.5", - "lodash.get": "4.4.2", - "mongodb": "3.0.4", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.3.0", - "mquery": "3.0.0", - "ms": "2.0.0", - "regexp-clone": "0.0.1", - "sliced": "1.0.1" - }, - "dependencies": { - "async": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", - "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", - "requires": { - "lodash": "4.17.5" - } - }, - "mongodb": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.4.tgz", - "integrity": "sha512-90YIIs7A4ko4kCGafxxXj3foexCAlJBC0YLwwIKgSLoE7Vni2IqUMz6HSsZ3zbXOfR1KWtxfnc0RyAMAY/ViLg==", - "requires": { - "mongodb-core": "3.0.4" - } - }, - "mongodb-core": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.4.tgz", - "integrity": "sha512-OTH267FjfwBdEufSnrgd+u8HuLWRuQ6p8DR0XirPl2BdlLEMh4XwjJf1RTlruILp5p2m1w8dDC8rCxibC3W8qQ==", - "requires": { - "bson": "1.0.4", - "require_optional": "1.0.1" - } - } - } - }, - "mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, - "monk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/monk/-/monk-6.0.5.tgz", - "integrity": "sha512-NEygZ2fhRkPE9zxyOT/GhEYKIGClMCQ+StsTruZSlAWf1aRsgvdu8suVvOj3KWfdiOtsIMs9gg8eyyVHPNWRwg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "mongodb": "2.2.34", - "monk-middleware-cast-ids": "0.2.1", - "monk-middleware-fields": "0.2.0", - "monk-middleware-handle-callback": "0.2.2", - "monk-middleware-options": "0.2.1", - "monk-middleware-query": "0.2.0", - "monk-middleware-wait-for-connection": "0.2.0", - "object-assign": "4.1.1" - } - }, "monk-middleware-cast-ids": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz", @@ -14008,11 +13769,6 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" }, - "nan-x": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nan-x/-/nan-x-1.0.0.tgz", - "integrity": "sha512-yw4Fhe2/UTzanQ4f0yHWkRnfTuHZFAi4GZDjXS4G+qv5BqXTqPJBbSxpa7MyyW9v4Y4ZySZQik1vcbNkhdnIOg==" - }, "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", @@ -14028,8 +13784,8 @@ "kind-of": "6.0.2", "object.pick": "1.3.0", "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.1" + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "native-promise-only": { @@ -14186,9 +13942,9 @@ } }, "nise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.0.tgz", - "integrity": "sha512-U+Krdzhsw4losPP/Rij5UGTLQgS9gaWmXdRIbZQIQWVsUGDBo+N0m9mrY9CCEnmwssgswwydxLJUZtFfouC0gA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.1.tgz", + "integrity": "sha512-kIH3X5YCj1vvj/32zDa9KNgzvfZd51ItGbiaCbtYhpnsCedLo0tIkb9zl169a41ATzF4z7kwMLz35XXDypma3g==", "dev": true, "requires": { "@sinonjs/formatio": "2.0.0", @@ -14333,7 +14089,7 @@ "qs": "6.4.0", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" } @@ -14402,9 +14158,9 @@ "process": "0.11.10", "punycode": "1.4.1", "querystring-es3": "0.2.1", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "stream-browserify": "2.0.1", - "stream-http": "2.8.0", + "stream-http": "2.8.1", "string_decoder": "1.0.3", "timers-browserify": "2.0.6", "tty-browserify": "0.0.0", @@ -14432,9 +14188,9 @@ } }, "node-loggly-bulk": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-2.2.1.tgz", - "integrity": "sha512-7kd74XsTz+sEwnGCAAAQW57zHKzM0N9LWJctv9aMyC5Sw8lTBTlNyCoBhG7dgaJdTu9+bnHQu8p1trlh9O+Kog==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-2.2.2.tgz", + "integrity": "sha512-1mjTyyiNID8WXpN1afvsuK4Qp7JX/JsKdnO5xMJpRfEo8ePleCBvWVyaDpJgWuypxZ4BGHcH2MKMe4TClbb5dA==", "requires": { "json-stringify-safe": "5.0.1", "moment": "2.21.0", @@ -14449,8 +14205,8 @@ "mkdirp": "0.5.1", "nopt": "4.0.1", "npmlog": "4.1.2", - "rc": "1.2.5", - "request": "2.83.0", + "rc": "1.2.6", + "request": "2.85.0", "rimraf": "2.6.2", "semver": "5.5.0", "tar": "2.2.1", @@ -14540,7 +14296,7 @@ "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "qs": { @@ -14549,9 +14305,9 @@ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", @@ -14572,7 +14328,7 @@ "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" } @@ -14601,9 +14357,9 @@ } }, "node-rdkafka": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-rdkafka/-/node-rdkafka-2.3.0.tgz", - "integrity": "sha1-Qvlwmc6Z1/so2y4QUaiyuFlHkRA=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/node-rdkafka/-/node-rdkafka-2.3.1.tgz", + "integrity": "sha1-HBC4XJlyQ9UKFLCcA+6PI3DfjVY=", "optional": true, "requires": { "bindings": "1.3.0", @@ -14653,7 +14409,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "which": "1.3.0" } }, @@ -14702,7 +14458,7 @@ "oauth-sign": "0.8.2", "qs": "6.3.2", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.4.3", "uuid": "3.2.1" } @@ -14776,9 +14532,9 @@ "dev": true }, "nodemon": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.15.1.tgz", - "integrity": "sha512-zWNke/X74j3ljDRCXnhURTLJaCxew31ax4azoPQyRYAoUBqNIlZGaNpMcyi/A/ylkGKWFiUzf7HHFyA/cveTcQ==", + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.17.2.tgz", + "integrity": "sha512-v1fVfgaZanBHP/ZOc9V72uKKIF4dcRfZV7GISNVi/w/g5pwB7nIvOK+RGULjrzhs97cwUX41cM4+dlw+bg2igw==", "requires": { "chokidar": "2.0.2", "debug": "3.1.0", @@ -14786,6 +14542,7 @@ "minimatch": "3.0.4", "pstree.remy": "1.1.0", "semver": "5.5.0", + "supports-color": "5.3.0", "touch": "3.1.0", "undefsafe": "2.0.2", "update-notifier": "2.3.0" @@ -14803,6 +14560,14 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "requires": { + "has-flag": "3.0.0" + } } } }, @@ -14851,10 +14616,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "2.5.0", + "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", "semver": "5.0.3", - "validate-npm-package-license": "3.0.1" + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { @@ -14870,16 +14635,6 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, - "normalize-space-x": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-space-x/-/normalize-space-x-3.0.0.tgz", - "integrity": "sha512-tbCJerqZCCHPst4rRKgsTanLf45fjOyeAU5zE3mhDxJtFJKt66q39g2XArWhXelgTFVib8mNBUm6Wrd0LxYcfQ==", - "requires": { - "cached-constructors-x": "1.0.0", - "trim-x": "3.0.0", - "white-space-x": "3.0.0" - } - }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -15029,24 +14784,6 @@ } } }, - "object-get-own-property-descriptor-x": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/object-get-own-property-descriptor-x/-/object-get-own-property-descriptor-x-3.2.0.tgz", - "integrity": "sha512-Z/0fIrptD9YuzN+SNK/1kxAEaBcPQM4gSrtOSMSi9eplnL/AbyQcAyAlreAoAzmBon+DQ1Z+AdhxyQSvav5Fyg==", - "optional": true, - "requires": { - "attempt-x": "1.1.1", - "has-own-property-x": "3.2.0", - "has-symbol-support-x": "1.4.1", - "is-falsey-x": "1.0.1", - "is-index-x": "1.1.0", - "is-primitive": "2.0.0", - "is-string": "1.0.4", - "property-is-enumerable-x": "1.1.0", - "to-object-x": "1.5.0", - "to-property-key-x": "2.0.2" - } - }, "object-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.2.0.tgz", @@ -15362,7 +15099,7 @@ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "os-browserify": { @@ -15662,7 +15399,7 @@ "resolved": "https://registry.npmjs.org/parse-cookie-phantomjs/-/parse-cookie-phantomjs-1.2.0.tgz", "integrity": "sha1-YNS782NpHYDLK3LE+vfUDekOS9c=", "requires": { - "tough-cookie": "2.3.3" + "tough-cookie": "2.3.4" } }, "parse-data-uri": { @@ -15709,17 +15446,6 @@ } } }, - "parse-int-x": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-int-x/-/parse-int-x-2.0.0.tgz", - "integrity": "sha512-NIMm52gmd1+0qxJK8lV3OZ4zzWpRH1xcz9xCHXl+DNzddwUdS4NEtd7BmTeK7iCIXoaK5e6BoDMHgieH2eNIhg==", - "requires": { - "cached-constructors-x": "1.0.0", - "nan-x": "1.0.0", - "to-string-x": "1.4.2", - "trim-left-x": "3.0.0" - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -15971,7 +15697,7 @@ "hasha": "2.2.0", "kew": "0.7.0", "progress": "1.1.8", - "request": "2.83.0", + "request": "2.85.0", "request-progress": "2.0.1", "which": "1.3.0" }, @@ -16017,11 +15743,6 @@ } } }, - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" - }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", @@ -16074,7 +15795,7 @@ "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, "jsonfile": { @@ -16091,9 +15812,9 @@ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", @@ -16114,7 +15835,7 @@ "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" } @@ -16149,7 +15870,7 @@ }, "pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "resolved": "http://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { "pinkie": "2.0.4" @@ -16281,13 +16002,13 @@ "requires": { "chalk": "2.3.2", "source-map": "0.6.1", - "supports-color": "5.2.0" + "supports-color": "5.3.0" }, "dependencies": { "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "requires": { "has-flag": "3.0.0" } @@ -17014,8 +16735,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000810", - "electron-to-chromium": "1.3.34" + "caniuse-db": "1.0.30000815", + "electron-to-chromium": "1.3.37" } }, "chalk": { @@ -17992,16 +17713,6 @@ "asap": "2.0.6" } }, - "property-is-enumerable-x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/property-is-enumerable-x/-/property-is-enumerable-x-1.1.0.tgz", - "integrity": "sha512-22cKy3w3OpRswU6to9iKWDDlg+F9vF2REcwGlGW23jyLjHb1U/jJEWA44sWupOnkhGfDgotU6Lw+N2oyhNi+5A==", - "optional": true, - "requires": { - "to-object-x": "1.5.0", - "to-property-key-x": "2.0.2" - } - }, "protocolify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/protocolify/-/protocolify-2.0.0.tgz", @@ -18243,7 +17954,7 @@ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", "requires": { - "duplexify": "3.5.3", + "duplexify": "3.5.4", "inherits": "2.0.3", "pump": "2.0.1" } @@ -18423,7 +18134,7 @@ "oauth-sign": "0.8.2", "qs": "6.2.3", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.4.3" } }, @@ -18582,9 +18293,9 @@ } }, "rc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", - "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -18605,7 +18316,7 @@ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", "requires": { "pinkie-promise": "2.0.1", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "read-cache": { @@ -18629,7 +18340,7 @@ "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", "dev": true, "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "read-pkg": { @@ -18671,9 +18382,9 @@ } }, "readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -18691,7 +18402,7 @@ "requires": { "graceful-fs": "4.1.11", "minimatch": "3.0.4", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "set-immediate-shim": "1.0.1" } }, @@ -18720,14 +18431,14 @@ "optional": true, "requires": { "double-ended-queue": "2.1.0-0", - "redis-commands": "1.3.1", + "redis-commands": "1.3.5", "redis-parser": "2.6.0" } }, "redis-commands": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.1.tgz", - "integrity": "sha1-gdgm9F+pyLIBH0zXoP5ZfSQdRCs=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==", "dev": true, "optional": true }, @@ -18827,7 +18538,7 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "1.2.5", + "rc": "1.2.6", "safe-buffer": "5.1.1" } }, @@ -18836,7 +18547,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "1.2.5" + "rc": "1.2.6" } }, "regjsgen": { @@ -18936,15 +18647,6 @@ "is-finite": "1.0.2" } }, - "replace-comments-x": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-comments-x/-/replace-comments-x-2.0.0.tgz", - "integrity": "sha512-+vMP4jqU+8HboLWms6YMNEiaZG5hh1oR6ENCnGYDF/UQ7aYiJUK/8tcl3+KZAHRCKKa3gqzrfiarlUBHQSgRlg==", - "requires": { - "require-coercible-to-string-x": "1.0.0", - "to-string-x": "1.4.2" - } - }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -18983,7 +18685,7 @@ "oauth-sign": "0.8.2", "qs": "6.3.2", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.4.3" }, "dependencies": { @@ -19021,15 +18723,6 @@ "integrity": "sha1-7W2Lm9Y4wTMosV3YOL1mYRHdeBw=", "dev": true }, - "require-coercible-to-string-x": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/require-coercible-to-string-x/-/require-coercible-to-string-x-1.0.0.tgz", - "integrity": "sha512-Rpfd4sMdflPAKecdKhfAtQHlZzzle4UMUgxJ01hXtTcNWMV8w9GeZnKhEyrT73kgrflBOP1zg41amUPZGcNspA==", - "requires": { - "require-object-coercible-x": "1.4.1", - "to-string-x": "1.4.2" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -19045,14 +18738,6 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, - "require-object-coercible-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/require-object-coercible-x/-/require-object-coercible-x-1.4.1.tgz", - "integrity": "sha512-0YHa2afepsLfQvwQ1P2XvDZnGOUia5sC07ZijIRU2dnsRxnuilXWF6B2CFaKGDA9eZl39lJHrXCDsnfgroRd6Q==", - "requires": { - "is-nil-x": "1.4.1" - } - }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -19421,14 +19106,6 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "requires": { - "to-object-path": "0.3.0" - } - }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", @@ -19568,16 +19245,16 @@ "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=" }, "sinon": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.4.5.tgz", - "integrity": "sha512-vsg06IyB4gM5ry1qq13cQQk2U5ZqbL40ygDRNklYx2kokZktakyfinPDJP00WY0WjizRg2p0yhKLuTsCRpwCUA==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.4.6.tgz", + "integrity": "sha512-bzQag30yErCC4lJPv+C2HcmD1+3ula4JQNePZldKcagi0Exq6XDfcC2yqXVfEwtfTIq1rYGujrUIZbwHPpKjog==", "dev": true, "requires": { "@sinonjs/formatio": "2.0.0", "diff": "3.2.0", "lodash.get": "4.4.2", "lolex": "2.3.2", - "nise": "1.3.0", + "nise": "1.3.1", "supports-color": "5.3.0", "type-detect": "4.0.8" }, @@ -19665,9 +19342,9 @@ } }, "snapdragon": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", - "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { "base": "0.11.2", "debug": "2.6.9", @@ -19676,7 +19353,7 @@ "map-cache": "0.2.2", "source-map": "0.5.7", "source-map-resolve": "0.5.1", - "use": "2.0.2" + "use": "3.1.0" }, "dependencies": { "define-property": { @@ -19809,7 +19486,7 @@ "engine.io": "3.1.5", "socket.io-adapter": "1.1.1", "socket.io-client": "2.0.4", - "socket.io-parser": "3.1.2" + "socket.io-parser": "3.1.3" } }, "socket.io-adapter": { @@ -19829,28 +19506,37 @@ "component-bind": "1.0.0", "component-emitter": "1.2.1", "debug": "2.6.9", - "engine.io-client": "3.1.5", + "engine.io-client": "3.1.6", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "3.1.2", + "socket.io-parser": "3.1.3", "to-array": "0.1.4" } }, "socket.io-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", - "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", + "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", "dev": true, "requires": { "component-emitter": "1.2.1", - "debug": "2.6.9", + "debug": "3.1.0", "has-binary2": "1.0.2", "isarray": "2.0.1" }, "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", @@ -19949,22 +19635,32 @@ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "split": { "version": "0.3.3", @@ -20080,9 +19776,9 @@ } }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { "asn1": "0.2.3", "assert-plus": "1.0.0", @@ -20229,7 +19925,7 @@ "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", "requires": { - "concat-stream": "1.6.0", + "concat-stream": "1.6.1", "duplexer2": "0.0.2", "escodegen": "1.3.3", "falafel": "2.1.0", @@ -20318,7 +20014,7 @@ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", "requires": { - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "stream-browserify": { @@ -20327,7 +20023,7 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "stream-combiner": { @@ -20344,7 +20040,7 @@ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "requires": { "duplexer2": "0.1.4", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "stream-consume": { @@ -20358,13 +20054,13 @@ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" }, "stream-http": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", "requires": { "builtin-status-codes": "3.0.0", "inherits": "2.0.3", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "to-arraybuffer": "1.0.1", "xtend": "4.0.1" } @@ -20381,7 +20077,7 @@ "dev": true, "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "streamroller": { @@ -20393,7 +20089,7 @@ "date-format": "1.2.0", "debug": "3.1.0", "mkdirp": "0.5.1", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" }, "dependencies": { "debug": { @@ -20603,11 +20299,11 @@ "debug": "3.1.0", "extend": "3.0.1", "form-data": "2.3.2", - "formidable": "1.1.1", + "formidable": "1.2.0", "methods": "1.1.2", "mime": "1.6.0", "qs": "6.5.1", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" }, "dependencies": { "debug": { @@ -20854,7 +20550,7 @@ "fstream": "1.0.11", "fstream-ignore": "1.0.5", "once": "1.4.0", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "rimraf": "2.6.2", "tar": "2.2.1", "uid-number": "0.0.6" @@ -20867,7 +20563,7 @@ "requires": { "bl": "1.2.1", "end-of-stream": "1.4.1", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "xtend": "4.0.1" } }, @@ -20902,7 +20598,7 @@ "dev": true, "requires": { "arrify": "1.0.1", - "micromatch": "3.1.8", + "micromatch": "3.1.9", "object-assign": "4.1.1", "read-pkg-up": "1.0.1", "require-main-filename": "1.0.1" @@ -20935,7 +20631,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "xtend": "4.0.1" } }, @@ -21023,40 +20719,11 @@ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, - "to-boolean-x": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-boolean-x/-/to-boolean-x-1.0.1.tgz", - "integrity": "sha512-PstxY3K6hVEHnY3FITs8XBoJbt0RI1e4MLIhAL9hWa3BtVLCrb86vU5z6lEKh7uZZjiPiLqIKMmfMro1nNgtXQ==" - }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, - "to-integer-x": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/to-integer-x/-/to-integer-x-3.0.0.tgz", - "integrity": "sha512-794L2Lpwjtynm7RxahJi2YdbRY75gTxUW27TMuN26UgwPkmJb/+HPhkFEFbz+E4vNoiP0dxq5tq5fkXoXLaK/w==", - "optional": true, - "requires": { - "is-finite-x": "3.0.2", - "is-nan-x": "1.0.1", - "math-sign-x": "3.0.0", - "to-number-x": "2.0.0" - } - }, - "to-number-x": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-number-x/-/to-number-x-2.0.0.tgz", - "integrity": "sha512-lGOnCoccUoSzjZ/9Uen8TC4+VFaQcFGhTroWTv2tYWxXgyJV1zqAZ8hEIMkez/Eo790fBMOjidTnQ/OJSCvAoQ==", - "requires": { - "cached-constructors-x": "1.0.0", - "nan-x": "1.0.0", - "parse-int-x": "2.0.0", - "to-primitive-x": "1.1.0", - "trim-x": "3.0.0" - } - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -21075,117 +20742,15 @@ } } }, - "to-object-x": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/to-object-x/-/to-object-x-1.5.0.tgz", - "integrity": "sha512-AKn5GQcdWky+s20vjWkt+Wa6y3dxQH3yQyMBhOfBOPldUwqwhgvlqcIg5H092ntNc+TX8/Cxzs1kMHH19pyCnA==", - "requires": { - "cached-constructors-x": "1.0.0", - "require-object-coercible-x": "1.4.1" - } - }, - "to-primitive-x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-primitive-x/-/to-primitive-x-1.1.0.tgz", - "integrity": "sha512-gyMY0gi3wjK3e4MUBKqv9Zl8QGcWguIkaUr2VJmoBEsOpDcpDZSEyljR773eVG4maS48uX7muLkoQoh/BA82OQ==", - "requires": { - "has-symbol-support-x": "1.4.1", - "is-date-object": "1.0.1", - "is-function-x": "3.3.0", - "is-nil-x": "1.4.1", - "is-primitive": "2.0.0", - "is-symbol": "1.0.1", - "require-object-coercible-x": "1.4.1", - "validate.io-undefined": "1.0.3" - } - }, - "to-property-key-x": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-property-key-x/-/to-property-key-x-2.0.2.tgz", - "integrity": "sha512-YISLpZFYIazNm0P8hLsKEEUEZ3m8U3+eDysJZqTu3+B9tQp+2TrMpaEGT8Agh4fZ5LSoums60/glNEzk5ozqrg==", - "requires": { - "has-symbol-support-x": "1.4.1", - "to-primitive-x": "1.1.0", - "to-string-x": "1.4.2" - } - }, "to-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", - "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "regex-not": "1.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "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==" - } + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -21197,34 +20762,6 @@ "repeat-string": "1.6.1" } }, - "to-string-symbols-supported-x": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-string-symbols-supported-x/-/to-string-symbols-supported-x-1.0.0.tgz", - "integrity": "sha512-HbVH673pybrUmhzESGHUm17BBJvqb7BU8HciOvuEYm9ipuDyjmddhvkVqpVW6sM/C5/zhJo17n7O7I/24loJIQ==", - "optional": true, - "requires": { - "cached-constructors-x": "1.0.0", - "has-symbol-support-x": "1.4.1", - "is-symbol": "1.0.1" - } - }, - "to-string-tag-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/to-string-tag-x/-/to-string-tag-x-1.4.2.tgz", - "integrity": "sha512-ytO9eLigxsQQLGuab0C1iSSTzKdJNVSlBg0Spg4J/rGAVrQJ5y774mo0SSzgGeTT4RJGGyJNfObXaTMzX0XDOQ==", - "requires": { - "lodash.isnull": "3.0.0", - "validate.io-undefined": "1.0.3" - } - }, - "to-string-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/to-string-x/-/to-string-x-1.4.2.tgz", - "integrity": "sha512-/WP5arlwtCpAAexCCHiQBW0eXwse84osWyP1Qtaz71nsYSuUpOkT6tBm8nQ4IIUfSh5hji0hDupUCD2xbbOL6A==", - "requires": { - "is-symbol": "1.0.1" - } - }, "to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", @@ -21262,23 +20799,13 @@ } }, "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { "punycode": "1.4.1" } }, - "trim-left-x": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-left-x/-/trim-left-x-3.0.0.tgz", - "integrity": "sha512-+m6cqkppI+CxQBTwWEZliOHpOBnCArGyMnS1WCLb6IRgukhTkiQu/TNEN5Lj2eM9jk8ewJsc7WxFZfmwNpRXWQ==", - "requires": { - "cached-constructors-x": "1.0.0", - "require-coercible-to-string-x": "1.0.0", - "white-space-x": "3.0.0" - } - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -21297,25 +20824,6 @@ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, - "trim-right-x": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-right-x/-/trim-right-x-3.0.0.tgz", - "integrity": "sha512-iIqEsWEbWVodqdixJHi4FoayJkUxhoL4AvSNGp4FF4FfQKRPGizt8++/RnyC9od75y7P/S6EfONoVqP+NddiKA==", - "requires": { - "cached-constructors-x": "1.0.0", - "require-coercible-to-string-x": "1.0.0", - "white-space-x": "3.0.0" - } - }, - "trim-x": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-x/-/trim-x-3.0.0.tgz", - "integrity": "sha512-w8s38RAUScQ6t3XqMkS75iz5ZkIYLQpVnv2lp3IuTS36JdlVzC54oe6okOf4Wz3UH4rr3XAb2xR3kR5Xei82fw==", - "requires": { - "trim-left-x": "3.0.0", - "trim-right-x": "3.0.0" - } - }, "true-case-path": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", @@ -21488,9 +20996,9 @@ "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" }, "umd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", - "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", "dev": true }, "unc-path-regex": { @@ -21679,15 +21187,9 @@ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" }, "upath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.2.tgz", - "integrity": "sha512-fCmij7T5LnwUme3dbnVSejvOHHlARjB3ikJFwgZfz386pHmf/gueuTLRFU94FZEaeCLlbQrweiUU700gG41tUw==", - "requires": { - "lodash.endswith": "4.2.1", - "lodash.isfunction": "3.0.9", - "lodash.isstring": "4.0.1", - "lodash.startswith": "4.2.1" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==" }, "update-notifier": { "version": "2.3.0", @@ -21799,74 +21301,11 @@ } }, "use": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", - "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "requires": { - "define-property": "0.2.5", - "isobject": "3.0.1", - "lazy-cache": "2.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "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==" - } + "kind-of": "6.0.2" } }, "user-home": { @@ -21879,7 +21318,7 @@ "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", "requires": { - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "tmp": "0.0.33" } }, @@ -21935,9 +21374,9 @@ "optional": true }, "v8flags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", - "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", + "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", "requires": { "homedir-polyfill": "1.0.1" } @@ -21948,19 +21387,14 @@ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, - "validate.io-undefined": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/validate.io-undefined/-/validate.io-undefined-1.0.3.tgz", - "integrity": "sha1-fif8uzFbhB54JDQxiXZxkp4gt/Q=" - }, "validator": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", @@ -22011,7 +21445,7 @@ "clone": "2.1.1", "clone-buffer": "1.0.0", "clone-stats": "1.0.0", - "cloneable-readable": "1.0.0", + "cloneable-readable": "1.1.2", "remove-trailing-separator": "1.1.0", "replace-ext": "1.0.0" }, @@ -22029,7 +21463,7 @@ "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", "requires": { "object-assign": "4.1.1", - "readable-stream": "2.3.4" + "readable-stream": "2.3.5" } }, "vinyl-buffer": { @@ -22087,7 +21521,7 @@ "lead": "1.0.0", "object.assign": "4.1.0", "pumpify": "1.4.0", - "readable-stream": "2.3.4", + "readable-stream": "2.3.5", "remove-bom-buffer": "3.0.0", "remove-bom-stream": "1.2.0", "resolve-options": "1.1.0", @@ -22163,7 +21597,7 @@ "consolidate": "0.14.5", "hash-sum": "1.0.2", "loader-utils": "1.1.0", - "lru-cache": "4.1.1", + "lru-cache": "4.1.2", "postcss": "6.0.19", "postcss-load-config": "1.2.0", "postcss-selector-parser": "2.2.3", @@ -22274,136 +21708,13 @@ } }, "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "1.1.0" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "requires": { - "lodash": "4.17.5" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - } + "chokidar": "2.0.2", + "graceful-fs": "4.1.11", + "neo-async": "2.5.0" } }, "wcwidth": { @@ -22419,9 +21730,9 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "requires": { - "acorn": "5.4.1", + "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", - "ajv": "6.1.1", + "ajv": "6.2.1", "ajv-keywords": "3.1.0", "async": "2.6.0", "enhanced-resolve": "3.4.1", @@ -22438,17 +21749,17 @@ "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", + "watchpack": "1.5.0", "webpack-sources": "1.1.0", "yargs": "8.0.2" }, "dependencies": { "ajv": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.1.1.tgz", - "integrity": "sha1-l41Zf7wrfQ5aXD3esUmmgvKr+g4=", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", + "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", "requires": { - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1" } @@ -22610,10 +21921,10 @@ "integrity": "sha512-VKUVkVMc6TWVXmF1OxsBXoiRjYiDRA4XT0KqtbLMDK+891VX7FCuklYwzldND8J2upUcHHnuXYNTP+4mSFi4Kg==", "dev": true, "requires": { - "acorn": "5.4.1", + "acorn": "5.5.3", "bfj-node4": "5.2.1", "chalk": "2.3.2", - "commander": "2.14.1", + "commander": "2.15.0", "ejs": "2.5.7", "express": "4.16.3", "filesize": "3.6.0", @@ -22731,11 +22042,6 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, - "white-space-x": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/white-space-x/-/white-space-x-3.0.0.tgz", - "integrity": "sha512-nMPVXGMdi/jQepXKryxqzEh/vCwdOYY/u6NZy40glMHvZfEr7/+vQKnDhEq4rZ1nniOFq9GWohQYB30uW/5Olg==" - }, "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", @@ -22811,7 +22117,7 @@ "resolved": "https://registry.npmjs.org/winston-loggly-bulk/-/winston-loggly-bulk-2.0.2.tgz", "integrity": "sha512-Rj5ivuPcaedHziIDJcllYdH7Tqjo3rUtqTiLSDE0s75rOJcVPwKTS9zZK1ZWaPPhMHOcocLYuHqUjAK3SHcU4g==", "requires": { - "node-loggly-bulk": "2.2.1", + "node-loggly-bulk": "2.2.2", "winston": "2.4.1" } }, diff --git a/package.json b/package.json index a502aed892..20e11cfd09 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "babel-loader": "^7.1.4", "babel-plugin-syntax-async-functions": "^6.13.0", "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-async-to-module-method": "^6.8.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", "babel-plugin-transform-object-rest-spread": "^6.16.0", "babel-plugin-transform-regenerator": "^6.16.1", "babel-polyfill": "^6.6.1", @@ -26,7 +26,6 @@ "babel-register": "^6.6.0", "babel-runtime": "^6.11.6", "bcrypt": "^1.0.2", - "bluebird": "^3.3.5", "body-parser": "^1.15.0", "bootstrap": "^4.0.0", "bootstrap-vue": "^2.0.0-rc.2", @@ -113,8 +112,8 @@ }, "private": true, "engines": { - "node": "^6.9.1", - "npm": "^5.0.0" + "node": "^8.9.4", + "npm": "^5.6.0" }, "scripts": { "lint": "eslint --ext .js,.vue .", @@ -141,6 +140,7 @@ "apidoc": "gulp apidoc" }, "devDependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", "babel-plugin-istanbul": "^4.1.6", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", diff --git a/scripts/paypalBillingSetup.js b/scripts/paypalBillingSetup.js index b941254420..72bec34d61 100644 --- a/scripts/paypalBillingSetup.js +++ b/scripts/paypalBillingSetup.js @@ -1,5 +1,4 @@ require('babel-register'); -require('babel-polyfill'); // This file is used for creating paypal billing plans. PayPal doesn't have a web interface for setting up recurring // payment plan definitions, instead you have to create it via their REST SDK and keep it updated the same way. So this diff --git a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js index 19d25764a5..001748baca 100644 --- a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js +++ b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js @@ -2,9 +2,9 @@ import { generateUser, } from '../../../../helpers/api-v3-integration.helper'; import xml2js from 'xml2js'; -import Bluebird from 'bluebird'; +import util from 'util'; -let parseStringAsync = Bluebird.promisify(xml2js.parseString, {context: xml2js}); +let parseStringAsync = util.promisify(xml2js.parseString).bind(xml2js); describe('GET /export/userdata.xml', () => { // TODO disabled because it randomly causes the build to fail diff --git a/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js b/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js index 9faa405054..ba030e09ab 100644 --- a/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js @@ -2,8 +2,8 @@ import { createAndPopulateGroup, translate as t, generateUser, + sleep, } from '../../../../helpers/api-v3-integration.helper'; -import Bluebird from 'bluebird'; describe('POST /groups/:groupId/quests/accept', () => { const PET_QUEST = 'whale'; @@ -140,7 +140,7 @@ describe('POST /groups/:groupId/quests/accept', () => { // quest will start after everyone has accepted await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); - await Bluebird.delay(500); + await sleep(0.5); await rejectingMember.sync(); diff --git a/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js b/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js index bcbf6a6cf1..2c5dee2ef3 100644 --- a/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js @@ -2,8 +2,8 @@ import { createAndPopulateGroup, translate as t, generateUser, + sleep, } from '../../../../helpers/api-v3-integration.helper'; -import Bluebird from 'bluebird'; describe('POST /groups/:groupId/quests/force-start', () => { const PET_QUEST = 'whale'; @@ -135,7 +135,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { await leader.post(`/groups/${questingGroup._id}/quests/force-start`); - await Bluebird.delay(500); + await sleep(0.5); await Promise.all([ partyMemberThatRejects.sync(), @@ -161,7 +161,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { await leader.post(`/groups/${questingGroup._id}/quests/force-start`); - await Bluebird.delay(500); + await sleep(0.5); await questingGroup.sync(); @@ -184,7 +184,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { await leader.post(`/groups/${questingGroup._id}/quests/force-start`); - await Bluebird.delay(500); + await sleep(0.5); await questingGroup.sync(); @@ -201,7 +201,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { await leader.post(`/groups/${questingGroup._id}/quests/force-start`); - await Bluebird.delay(500); + await sleep(0.5); await questingGroup.sync(); @@ -222,7 +222,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { await leader.post(`/groups/${questingGroup._id}/quests/force-start`); - await Bluebird.delay(500); + await sleep(0.5); await questingGroup.sync(); diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js index aacec2598b..471946489b 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js @@ -2,9 +2,9 @@ import { createAndPopulateGroup, translate as t, generateUser, + sleep, } from '../../../../helpers/api-v3-integration.helper'; import { v4 as generateUUID } from 'uuid'; -import Bluebird from 'bluebird'; describe('POST /groups/:groupId/quests/reject', () => { let questingGroup; @@ -168,7 +168,7 @@ describe('POST /groups/:groupId/quests/reject', () => { // quest will start after everyone has accepted or rejected await rejectingMember.post(`/groups/${questingGroup._id}/quests/reject`); - await Bluebird.delay(500); + await sleep(0.5); await questingGroup.sync(); diff --git a/test/api/v3/integration/shops/GET-shops_market.test.js b/test/api/v3/integration/shops/GET-shops_market.test.js index 04a19f8479..8c9c941fcc 100644 --- a/test/api/v3/integration/shops/GET-shops_market.test.js +++ b/test/api/v3/integration/shops/GET-shops_market.test.js @@ -2,7 +2,6 @@ import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import Bluebird from 'bluebird'; describe('GET /shops/market', () => { let user; @@ -42,13 +41,13 @@ describe('GET /shops/market', () => { return array; }, []); - let results = await Bluebird.each(items, (item) => { + let results = await Promise.all(items.map((item) => { let { purchaseType, key } = item; return user.post(`/user/purchase/${purchaseType}/${key}`); - }); + })); expect(results.length).to.be.greaterThan(0); - results.forEach((item) => { + items.forEach((item) => { expect(item).to.include.keys('key', 'text', 'notes', 'class', 'value', 'currency'); }); }); diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js index e02e6dd2fe..66c868a62e 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js @@ -2,8 +2,8 @@ import { generateUser, generateGroup, generateChallenge, + sleep, } from '../../../../../helpers/api-integration/v3'; -import Bluebird from 'bluebird'; import { find } from 'lodash'; describe('POST /tasks/:id/score/:direction', () => { @@ -27,7 +27,7 @@ describe('POST /tasks/:id/score/:direction', () => { text: 'test habit', type: 'habit', }); - await Bluebird.delay(1000); + await sleep(1); let updatedUser = await user.get('/user'); usersChallengeTaskId = updatedUser.tasksOrder.habits[0]; }); @@ -65,7 +65,7 @@ describe('POST /tasks/:id/score/:direction', () => { text: 'test daily', type: 'daily', }); - await Bluebird.delay(1000); + await sleep(1); let updatedUser = await user.get('/user'); usersChallengeTaskId = updatedUser.tasksOrder.dailys[0]; }); @@ -109,7 +109,7 @@ describe('POST /tasks/:id/score/:direction', () => { text: 'test todo', type: 'todo', }); - await Bluebird.delay(1000); + await sleep(1); let updatedUser = await user.get('/user'); usersChallengeTaskId = updatedUser.tasksOrder.todos[0]; }); @@ -134,7 +134,7 @@ describe('POST /tasks/:id/score/:direction', () => { text: 'test reward', type: 'reward', }); - await Bluebird.delay(1000); + await sleep(1); let updatedUser = await user.get('/user'); usersChallengeTaskId = updatedUser.tasksOrder.todos[0]; }); diff --git a/test/api/v3/integration/user/DELETE-user.test.js b/test/api/v3/integration/user/DELETE-user.test.js index d11fa679ae..ea9b79f92a 100644 --- a/test/api/v3/integration/user/DELETE-user.test.js +++ b/test/api/v3/integration/user/DELETE-user.test.js @@ -11,7 +11,6 @@ import { each, map, } from 'lodash'; -import Bluebird from 'bluebird'; import { sha1MakeSalt, sha1Encrypt as sha1EncryptPassword, @@ -104,7 +103,7 @@ describe('DELETE /user', () => { password, }); - await Bluebird.all(map(ids, id => { + await Promise.all(map(ids, id => { return expect(checkExistence('tasks', id)).to.eventually.eql(false); })); }); diff --git a/test/api/v3/unit/libs/cron.test.js b/test/api/v3/unit/libs/cron.test.js index 76990aa20a..3699a3d54a 100644 --- a/test/api/v3/unit/libs/cron.test.js +++ b/test/api/v3/unit/libs/cron.test.js @@ -1,7 +1,6 @@ /* eslint-disable global-require */ import moment from 'moment'; import nconf from 'nconf'; -import Bluebird from 'bluebird'; import requireAgain from 'require-again'; import { recoverCron, cron } from '../../../../../website/server/libs/cron'; import { model as User } from '../../../../../website/server/models/user'; @@ -1363,7 +1362,7 @@ describe('recoverCron', () => { }); it('throws an error if user cannot be found', async () => { - execStub.returns(Bluebird.resolve(null)); + execStub.returns(Promise.resolve(null)); try { await recoverCron(status, locals); @@ -1374,8 +1373,8 @@ describe('recoverCron', () => { }); it('increases status.times count and reruns up to 4 times', async () => { - execStub.returns(Bluebird.resolve({_cronSignature: 'RUNNING_CRON'})); - execStub.onCall(4).returns(Bluebird.resolve({_cronSignature: 'NOT_RUNNING'})); + execStub.returns(Promise.resolve({_cronSignature: 'RUNNING_CRON'})); + execStub.onCall(4).returns(Promise.resolve({_cronSignature: 'NOT_RUNNING'})); await recoverCron(status, locals); @@ -1384,7 +1383,7 @@ describe('recoverCron', () => { }); it('throws an error if recoverCron runs 5 times', async () => { - execStub.returns(Bluebird.resolve({_cronSignature: 'RUNNING_CRON'})); + execStub.returns(Promise.resolve({_cronSignature: 'RUNNING_CRON'})); try { await recoverCron(status, locals); diff --git a/test/api/v3/unit/middlewares/language.test.js b/test/api/v3/unit/middlewares/language.test.js index 18caad8527..5a1136bd0c 100644 --- a/test/api/v3/unit/middlewares/language.test.js +++ b/test/api/v3/unit/middlewares/language.test.js @@ -8,7 +8,6 @@ import { attachTranslateFunction, } from '../../../../../website/server/middlewares/language'; import common from '../../../../../website/common'; -import Bluebird from 'bluebird'; import { model as User } from '../../../../../website/server/models/user'; const i18n = common.i18n; @@ -162,7 +161,7 @@ describe('language middleware', () => { return this; }, exec () { - return Bluebird.resolve({ + return Promise.resolve({ preferences: { language: 'it', }, diff --git a/test/api/v3/unit/models/user.test.js b/test/api/v3/unit/models/user.test.js index 14959bd823..00ea3f5607 100644 --- a/test/api/v3/unit/models/user.test.js +++ b/test/api/v3/unit/models/user.test.js @@ -1,4 +1,3 @@ -import Bluebird from 'bluebird'; import moment from 'moment'; import { model as User } from '../../../../../website/server/models/user'; import { model as Group } from '../../../../../website/server/models/group'; @@ -123,7 +122,7 @@ describe('User Model', () => { it('adds notifications without data for all given users via static method', async () => { let user = new User(); let otherUser = new User(); - await Bluebird.all([user.save(), otherUser.save()]); + await Promise.all([user.save(), otherUser.save()]); await User.pushNotification({_id: {$in: [user._id, otherUser._id]}}, 'CRON'); @@ -149,7 +148,7 @@ describe('User Model', () => { it('adds notifications with data and seen status for all given users via static method', async () => { let user = new User(); let otherUser = new User(); - await Bluebird.all([user.save(), otherUser.save()]); + await Promise.all([user.save(), otherUser.save()]); await User.pushNotification({_id: {$in: [user._id, otherUser._id]}}, 'CRON', {field: 1}, true); diff --git a/test/helpers/api-integration/v3/object-generators.js b/test/helpers/api-integration/v3/object-generators.js index 8322ae1098..dd8c4ef3fe 100644 --- a/test/helpers/api-integration/v3/object-generators.js +++ b/test/helpers/api-integration/v3/object-generators.js @@ -1,7 +1,6 @@ import { times, } from 'lodash'; -import Bluebird from 'bluebird'; import { v4 as generateUUID } from 'uuid'; import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes'; import { requester } from '../requester'; @@ -106,7 +105,7 @@ export async function createAndPopulateGroup (settings = {}) { guild: { guilds: [group._id] }, }; - let members = await Bluebird.all( + let members = await Promise.all( times(numberOfMembers, () => { return generateUser(groupMembershipTypes[group.type]); }) @@ -114,7 +113,7 @@ export async function createAndPopulateGroup (settings = {}) { await group.update({ memberCount: numberOfMembers + 1}); - let invitees = await Bluebird.all( + let invitees = await Promise.all( times(numberOfInvites, () => { return generateUser(); }) @@ -126,9 +125,9 @@ export async function createAndPopulateGroup (settings = {}) { }); }); - await Bluebird.all(invitationPromises); + await Promise.all(invitationPromises); - await Bluebird.map(invitees, (invitee) => invitee.sync()); + await Promise.all(invitees.map((invitee) => invitee.sync())); return { groupLeader, diff --git a/test/helpers/globals.helper.js b/test/helpers/globals.helper.js index 16b4e97558..b34b589ed1 100644 --- a/test/helpers/globals.helper.js +++ b/test/helpers/globals.helper.js @@ -2,8 +2,6 @@ /* eslint-disable global-require */ /* eslint-disable no-process-env */ -import Bluebird from 'bluebird'; - //------------------------------ // Global modules //------------------------------ @@ -16,7 +14,6 @@ global.sinon = require('sinon'); let sinonStubPromise = require('sinon-stub-promise'); sinonStubPromise(global.sinon); global.sandbox = sinon.sandbox.create(); -global.Promise = Bluebird; import setupNconf from '../../website/server/libs/setupNconf'; setupNconf('./config.json.example'); diff --git a/test/helpers/sleep.js b/test/helpers/sleep.js index a33970dfa2..74acac27a9 100644 --- a/test/helpers/sleep.js +++ b/test/helpers/sleep.js @@ -1,7 +1 @@ -export async function sleep (seconds = 1) { - let milliseconds = seconds * 1000; - - return new Promise((resolve) => { - setTimeout(resolve, milliseconds); - }); -} +export { default as sleep } from '../../website/server/libs/sleep'; \ No newline at end of file diff --git a/test/helpers/start-server.js b/test/helpers/start-server.js index 7e0ea3c00a..49383b55e9 100644 --- a/test/helpers/start-server.js +++ b/test/helpers/start-server.js @@ -1,13 +1,11 @@ /* eslint-disable no-process-env */ import nconf from 'nconf'; import mongoose from 'mongoose'; -import Bluebird from 'bluebird'; import setupNconf from '../../website/server/libs/setupNconf'; if (process.env.LOAD_SERVER === '0') { // when the server is in a different process we simply connect to mongoose setupNconf('./config.json'); // Use Q promises instead of mpromise in mongoose - mongoose.Promise = Bluebird; mongoose.connect(nconf.get('TEST_DB_URI')); } else { // When running tests and the server in the same process setupNconf('./config.json.example'); diff --git a/test/mocha.opts b/test/mocha.opts index 63c3988a56..28345d5049 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -3,7 +3,6 @@ --timeout 8000 --check-leaks --globals io --r babel-polyfill --require babel-register --require ./test/helpers/globals.helper --exit diff --git a/vagrant_scripts/install_node.sh b/vagrant_scripts/install_node.sh index 5ef143d1a4..e27fa26e8d 100755 --- a/vagrant_scripts/install_node.sh +++ b/vagrant_scripts/install_node.sh @@ -11,12 +11,12 @@ source /home/vagrant/.profile echo Setting up node... cd /vagrant -nvm install -nvm use +nvm install 8 +nvm use 8 nvm alias default current echo Update npm... -npm install -g npm@4 +npm install -g npm@5 echo Installing global modules... npm install -g gulp mocha node-pre-gyp diff --git a/website/server/controllers/api-v3/challenges.js b/website/server/controllers/api-v3/challenges.js index 326a66d5e4..2b9aacdcc9 100644 --- a/website/server/controllers/api-v3/challenges.js +++ b/website/server/controllers/api-v3/challenges.js @@ -16,7 +16,6 @@ import { NotAuthorized, } from '../../libs/errors'; import * as Tasks from '../../models/task'; -import Bluebird from 'bluebird'; import csvStringify from '../../libs/csvStringify'; import { createTasks, @@ -254,7 +253,7 @@ api.joinChallenge = { addUserJoinChallengeNotification(user); // Add all challenge's tasks to user's tasks and save the challenge - let results = await Bluebird.all([challenge.syncToUser(user), challenge.save()]); + let results = await Promise.all([challenge.syncToUser(user), challenge.save()]); let response = results[1].toJSON(); response.group = getChallengeGroupResponse(group); @@ -306,7 +305,7 @@ api.leaveChallenge = { if (!challenge.isMember(user)) throw new NotAuthorized(res.t('challengeMemberNotFound')); // Unlink challenge's tasks from user's tasks and save the challenge - await Bluebird.all([challenge.unlinkTasks(user, keep), challenge.save()]); + await Promise.all([challenge.unlinkTasks(user, keep), challenge.save()]); res.analytics.track('challenge leave', { uuid: user._id, @@ -364,8 +363,8 @@ api.getUserChallenges = { let resChals = challenges.map(challenge => challenge.toJSON()); // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 - await Bluebird.all(resChals.map((chal, index) => { - return Bluebird.all([ + await Promise.all(resChals.map((chal, index) => { + return Promise.all([ User.findById(chal.leader).select(nameFields).exec(), Group.findById(chal.group).select(basicGroupFields).exec(), ]).then(populatedData => { @@ -419,7 +418,7 @@ api.getGroupChallenges = { let resChals = challenges.map(challenge => challenge.toJSON()); // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 - await Bluebird.all(resChals.map((chal, index) => { + await Promise.all(resChals.map((chal, index) => { return User .findById(chal.leader) .select(nameFields) @@ -511,7 +510,7 @@ api.exportChallengeCsv = { // In v2 this used the aggregation framework to run some computation on MongoDB but then iterated through all // results on the server so the perf difference isn't that big (hopefully) - let [members, tasks] = await Bluebird.all([ + let [members, tasks] = await Promise.all([ User.find({challenges: challengeId}) .select(nameFields) .sort({_id: 1}) diff --git a/website/server/controllers/api-v3/chat.js b/website/server/controllers/api-v3/chat.js index fba5277d49..de48a80c47 100644 --- a/website/server/controllers/api-v3/chat.js +++ b/website/server/controllers/api-v3/chat.js @@ -14,7 +14,6 @@ import pusher from '../../libs/pusher'; import { getAuthorEmailFromMessage } from '../../libs/chat'; import { chatReporterFactory } from '../../libs/chatReporting/chatReporterFactory'; import nconf from 'nconf'; -import Bluebird from 'bluebird'; import bannedWords from '../../libs/bannedWords'; import guildsAllowingBannedWords from '../../libs/guildsAllowingBannedWords'; import { getMatchesByWordArray } from '../../libs/stringUtils'; @@ -184,7 +183,7 @@ api.postChat = { toSave.push(user.save()); } - let [savedGroup] = await Bluebird.all(toSave); + let [savedGroup] = await Promise.all(toSave); // realtime chat is only enabled for private groups (for now only for parties) if (savedGroup.privacy === 'private' && savedGroup.type === 'party') { diff --git a/website/server/controllers/api-v3/content.js b/website/server/controllers/api-v3/content.js index 05a7e800bc..ed1ede77e2 100644 --- a/website/server/controllers/api-v3/content.js +++ b/website/server/controllers/api-v3/content.js @@ -1,17 +1,17 @@ import common from '../../../common'; import _ from 'lodash'; import { langCodes } from '../../libs/i18n'; -import Bluebird from 'bluebird'; import fsCallback from 'fs'; import path from 'path'; import logger from '../../libs/logger'; +import util from 'util'; // Transform fs methods that accept callbacks in ones that return promises const fs = { - readFile: Bluebird.promisify(fsCallback.readFile, {context: fsCallback}), - writeFile: Bluebird.promisify(fsCallback.writeFile, {context: fsCallback}), - stat: Bluebird.promisify(fsCallback.stat, {context: fsCallback}), - mkdir: Bluebird.promisify(fsCallback.mkdir, {context: fsCallback}), + readFile: util.promisify(fsCallback.readFile).bind(fsCallback), + writeFile: util.promisify(fsCallback.writeFile).bind(fsCallback), + stat: util.promisify(fsCallback.stat).bind(fsCallback), + mkdir: util.promisify(fsCallback.mkdir).bind(fsCallback), }; let api = {}; diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index 67512a51bb..3a5bf907e2 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -1,5 +1,4 @@ import { authWithHeaders } from '../../middlewares/auth'; -import Bluebird from 'bluebird'; import _ from 'lodash'; import nconf from 'nconf'; import { @@ -137,7 +136,7 @@ api.createGroup = { user.party._id = group._id; } - let results = await Bluebird.all([user.save(), group.save()]); + let results = await Promise.all([user.save(), group.save()]); let savedGroup = results[1]; // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 @@ -194,7 +193,7 @@ api.createGroupPlan = { group.leader = user._id; user.guilds.push(group._id); - let results = await Bluebird.all([user.save(), group.save()]); + let results = await Promise.all([user.save(), group.save()]); let savedGroup = results[1]; // Analytics @@ -617,7 +616,7 @@ api.joinGroup = { } } - promises = await Bluebird.all(promises); + promises = await Promise.all(promises); let response = Group.toJSONCleanChat(promises[0], user); let leader = await User.findById(response.leader).select(nameFields).exec(); @@ -915,7 +914,7 @@ api.removeGroupMember = { let message = req.query.message || req.body.message; _sendMessageToRemoved(group, member, message, isInGroup); - await Bluebird.all([ + await Promise.all([ member.save(), group.save(), ]); @@ -1167,7 +1166,7 @@ api.inviteToGroup = { if (uuids) { let uuidInvites = uuids.map((uuid) => _inviteByUUID(uuid, group, user, req, res)); - let uuidResults = await Bluebird.all(uuidInvites); + let uuidResults = await Promise.all(uuidInvites); results.push(...uuidResults); } @@ -1175,7 +1174,7 @@ api.inviteToGroup = { let emailInvites = emails.map((invite) => _inviteByEmail(invite, group, user, req, res)); user.invitesSent += emails.length; await user.save(); - let emailResults = await Bluebird.all(emailInvites); + let emailResults = await Promise.all(emailInvites); results.push(...emailResults); } diff --git a/website/server/controllers/api-v3/members.js b/website/server/controllers/api-v3/members.js index 279f759ee7..61e0e3ec19 100644 --- a/website/server/controllers/api-v3/members.js +++ b/website/server/controllers/api-v3/members.js @@ -18,7 +18,6 @@ import { getUserInfo, sendTxn as sendTxnEmail, } from '../../libs/email'; -import Bluebird from 'bluebird'; import { sendNotification as sendPushNotification } from '../../libs/pushNotifications'; import { achievements } from '../../../../website/common/'; @@ -552,7 +551,7 @@ api.transferGems = { receiver.balance += amount; sender.balance -= amount; let promises = [receiver.save(), sender.save()]; - await Bluebird.all(promises); + await Promise.all(promises); // generate the message in both languages, so both users can understand it let receiverLang = receiver.preferences.language; diff --git a/website/server/controllers/api-v3/quests.js b/website/server/controllers/api-v3/quests.js index 792c37e124..7ae92b1b3a 100644 --- a/website/server/controllers/api-v3/quests.js +++ b/website/server/controllers/api-v3/quests.js @@ -1,5 +1,4 @@ import _ from 'lodash'; -import Bluebird from 'bluebird'; import { authWithHeaders } from '../../middlewares/auth'; import analytics from '../../libs/analyticsService'; import { @@ -109,7 +108,7 @@ api.inviteToQuest = { await group.startQuest(user); } - let [savedGroup] = await Bluebird.all([ + let [savedGroup] = await Promise.all([ group.save(), user.save(), ]); @@ -312,7 +311,7 @@ api.forceStart = { await group.startQuest(user); - let [savedGroup] = await Bluebird.all([ + let [savedGroup] = await Promise.all([ group.save(), user.save(), ]); @@ -372,7 +371,7 @@ api.cancelQuest = { group.quest = Group.cleanGroupQuest(); group.markModified('quest'); - let [savedGroup] = await Bluebird.all([ + let [savedGroup] = await Promise.all([ group.save(), User.update( {'party._id': groupId}, @@ -441,7 +440,7 @@ api.abortQuest = { group.quest = Group.cleanGroupQuest(); group.markModified('quest'); - let [groupSaved] = await Bluebird.all([group.save(), memberUpdates, questLeaderUpdate]); + let [groupSaved] = await Promise.all([group.save(), memberUpdates, questLeaderUpdate]); res.respond(200, groupSaved.quest); }, @@ -486,7 +485,7 @@ api.leaveQuest = { user.party.quest = Group.cleanQuestProgress(); user.markModified('party.quest'); - let [savedGroup] = await Bluebird.all([ + let [savedGroup] = await Promise.all([ group.save(), user.save(), ]); diff --git a/website/server/controllers/api-v3/tasks.js b/website/server/controllers/api-v3/tasks.js index 8b9672afd0..348a9e6870 100644 --- a/website/server/controllers/api-v3/tasks.js +++ b/website/server/controllers/api-v3/tasks.js @@ -20,7 +20,6 @@ import { setNextDue, } from '../../libs/taskManager'; import common from '../../../common'; -import Bluebird from 'bluebird'; import _ from 'lodash'; import logger from '../../libs/logger'; import moment from 'moment'; @@ -598,7 +597,7 @@ api.scoreTask = { }); managerPromises.push(task.save()); - await Bluebird.all(managerPromises); + await Promise.all(managerPromises); throw new NotAuthorized(res.t('taskApprovalHasBeenRequested')); } @@ -647,7 +646,7 @@ api.scoreTask = { task.save(), ]; if (taskOrderPromise) promises.push(taskOrderPromise); - let results = await Bluebird.all(promises); + let results = await Promise.all(promises); let savedUser = results[0]; @@ -1132,7 +1131,7 @@ api.unlinkAllTasks = { if (!validTasks) throw new BadRequest(res.t('cantOnlyUnlinkChalTask')); if (keep === 'keep-all') { - await Bluebird.all(tasks.map(task => { + await Promise.all(tasks.map(task => { task.challenge = {}; return task.save(); })); @@ -1149,7 +1148,7 @@ api.unlinkAllTasks = { toSave.push(user.save()); - await Bluebird.all(toSave); + await Promise.all(toSave); } res.respond(200, {}); @@ -1199,7 +1198,7 @@ api.unlinkOneTask = { } else { // remove if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if removeFromArray(user.tasksOrder[`${task.type}s`], taskId); - await Bluebird.all([user.save(), task.remove()]); + await Promise.all([user.save(), task.remove()]); } else { await task.remove(); } @@ -1317,7 +1316,7 @@ api.deleteTask = { // See https://github.com/HabitRPG/habitica/pull/9321#issuecomment-354187666 for more info if (!challenge) user._v++; - await Bluebird.all([taskOrderUpdate, task.remove()]); + await Promise.all([taskOrderUpdate, task.remove()]); } else { await task.remove(); } diff --git a/website/server/controllers/api-v3/tasks/groups.js b/website/server/controllers/api-v3/tasks/groups.js index 449a0e39b0..45eb8839da 100644 --- a/website/server/controllers/api-v3/tasks/groups.js +++ b/website/server/controllers/api-v3/tasks/groups.js @@ -1,5 +1,4 @@ import { authWithHeaders } from '../../../middlewares/auth'; -import Bluebird from 'bluebird'; import * as Tasks from '../../../models/task'; import { model as Group } from '../../../models/group'; import { model as User } from '../../../models/user'; @@ -205,7 +204,7 @@ api.assignTask = { let promises = []; promises.push(group.syncTask(task, assignedUser)); promises.push(group.save()); - await Bluebird.all(promises); + await Promise.all(promises); res.respond(200, task); }, @@ -350,7 +349,7 @@ api.approveTask = { managerPromises.push(task.save()); managerPromises.push(assignedUser.save()); - await Bluebird.all(managerPromises); + await Promise.all(managerPromises); res.respond(200, task); }, diff --git a/website/server/controllers/api-v3/user.js b/website/server/controllers/api-v3/user.js index ac2e82722d..1ae8a17dfb 100644 --- a/website/server/controllers/api-v3/user.js +++ b/website/server/controllers/api-v3/user.js @@ -9,7 +9,6 @@ import { model as Group, } from '../../models/group'; import * as Tasks from '../../models/task'; -import Bluebird from 'bluebird'; import _ from 'lodash'; import * as passwordUtils from '../../libs/password'; import { @@ -415,7 +414,7 @@ api.deleteUser = { return group.leave(user, 'remove-all'); }); - await Bluebird.all(groupLeavePromises); + await Promise.all(groupLeavePromises); await Tasks.Task.remove({ userId: user._id, @@ -1470,7 +1469,7 @@ api.userRebirth = { toSave.push(user.save()); - await Bluebird.all(toSave); + await Promise.all(toSave); res.respond(200, ...rebirthRes); }, @@ -1627,7 +1626,7 @@ api.userReroll = { let promises = tasks.map(task => task.save()); promises.push(user.save()); - await Bluebird.all(promises); + await Promise.all(promises); res.respond(200, ...rerollRes); }, @@ -1668,7 +1667,7 @@ api.userReset = { let resetRes = common.ops.reset(user, tasks); - await Bluebird.all([ + await Promise.all([ Tasks.Task.remove({_id: {$in: resetRes[0].tasksToRemove}, userId: user._id}), user.save(), ]); diff --git a/website/server/controllers/top-level/dataexport.js b/website/server/controllers/top-level/dataexport.js index 9f075b27ab..7943355bb2 100644 --- a/website/server/controllers/top-level/dataexport.js +++ b/website/server/controllers/top-level/dataexport.js @@ -11,7 +11,6 @@ import js2xml from 'js2xmlparser'; import Pageres from 'pageres'; import nconf from 'nconf'; import got from 'got'; -import Bluebird from 'bluebird'; import md from 'habitica-markdown'; import { S3, @@ -244,7 +243,7 @@ api.exportUserAvatarPng = { Body: stream, }); - let s3res = await new Bluebird((resolve, reject) => { + let s3res = await new Promise((resolve, reject) => { s3upload.send((err, s3uploadRes) => { if (err) { reject(err); diff --git a/website/server/index.js b/website/server/index.js index df9493a08f..4c952caf77 100644 --- a/website/server/index.js +++ b/website/server/index.js @@ -7,12 +7,6 @@ if (process.env.NODE_ENV !== 'production') { require('babel-register'); } -// The BabelJS polyfill is needed in production too -require('babel-polyfill'); - -// Setup Bluebird as the global promise library -global.Promise = require('bluebird'); - // Initialize configuration BEFORE anything const setupNconf = require('./libs/setupNconf'); setupNconf(); diff --git a/website/server/libs/amazonPayments.js b/website/server/libs/amazonPayments.js index 75ccddcecc..c6865963ae 100644 --- a/website/server/libs/amazonPayments.js +++ b/website/server/libs/amazonPayments.js @@ -1,9 +1,9 @@ import amazonPayments from 'amazon-payments'; import nconf from 'nconf'; -import Bluebird from 'bluebird'; import moment from 'moment'; import cc from 'coupon-code'; import uuid from 'uuid'; +import util from 'util'; import common from '../../common'; import { @@ -51,15 +51,15 @@ api.constants = { PAYMENT_METHOD_GIFT: 'Amazon Payments (Gift)', }; -api.getTokenInfo = Bluebird.promisify(amzPayment.api.getTokenInfo, {context: amzPayment.api}); -api.createOrderReferenceId = Bluebird.promisify(amzPayment.offAmazonPayments.createOrderReferenceForId, {context: amzPayment.offAmazonPayments}); -api.setOrderReferenceDetails = Bluebird.promisify(amzPayment.offAmazonPayments.setOrderReferenceDetails, {context: amzPayment.offAmazonPayments}); -api.confirmOrderReference = Bluebird.promisify(amzPayment.offAmazonPayments.confirmOrderReference, {context: amzPayment.offAmazonPayments}); -api.closeOrderReference = Bluebird.promisify(amzPayment.offAmazonPayments.closeOrderReference, {context: amzPayment.offAmazonPayments}); -api.setBillingAgreementDetails = Bluebird.promisify(amzPayment.offAmazonPayments.setBillingAgreementDetails, {context: amzPayment.offAmazonPayments}); -api.getBillingAgreementDetails = Bluebird.promisify(amzPayment.offAmazonPayments.getBillingAgreementDetails, {context: amzPayment.offAmazonPayments}); -api.confirmBillingAgreement = Bluebird.promisify(amzPayment.offAmazonPayments.confirmBillingAgreement, {context: amzPayment.offAmazonPayments}); -api.closeBillingAgreement = Bluebird.promisify(amzPayment.offAmazonPayments.closeBillingAgreement, {context: amzPayment.offAmazonPayments}); +api.getTokenInfo = util.promisify(amzPayment.api.getTokenInfo).bind(amzPayment.api); +api.createOrderReferenceId = util.promisify(amzPayment.offAmazonPayments.createOrderReferenceForId).bind(amzPayment.offAmazonPayments); +api.setOrderReferenceDetails = util.promisify(amzPayment.offAmazonPayments.setOrderReferenceDetails).bind(amzPayment.offAmazonPayments); +api.confirmOrderReference = util.promisify(amzPayment.offAmazonPayments.confirmOrderReference).bind(amzPayment.offAmazonPayments); +api.closeOrderReference = util.promisify(amzPayment.offAmazonPayments.closeOrderReference).bind(amzPayment.offAmazonPayments); +api.setBillingAgreementDetails = util.promisify(amzPayment.offAmazonPayments.setBillingAgreementDetails).bind(amzPayment.offAmazonPayments); +api.getBillingAgreementDetails = util.promisify(amzPayment.offAmazonPayments.getBillingAgreementDetails).bind(amzPayment.offAmazonPayments); +api.confirmBillingAgreement = util.promisify(amzPayment.offAmazonPayments.confirmBillingAgreement).bind(amzPayment.offAmazonPayments); +api.closeBillingAgreement = util.promisify(amzPayment.offAmazonPayments.closeBillingAgreement).bind(amzPayment.offAmazonPayments); api.authorizeOnBillingAgreement = function authorizeOnBillingAgreement (inputSet) { return new Promise((resolve, reject) => { diff --git a/website/server/libs/analyticsService.js b/website/server/libs/analyticsService.js index ca2c9a154a..8a745f90e0 100644 --- a/website/server/libs/analyticsService.js +++ b/website/server/libs/analyticsService.js @@ -1,7 +1,6 @@ /* eslint-disable camelcase */ import nconf from 'nconf'; import Amplitude from 'amplitude'; -import Bluebird from 'bluebird'; import googleAnalytics from 'universal-analytics'; import useragent from 'useragent'; import { @@ -171,7 +170,7 @@ let _sendDataToAmplitude = (eventType, data) => { amplitudeData.event_type = eventType; - return new Bluebird((resolve, reject) => { + return new Promise((resolve, reject) => { amplitude.track(amplitudeData) .then(resolve) .catch(() => reject('Error while sending data to Amplitude.')); @@ -222,7 +221,7 @@ let _sendDataToGoogle = (eventType, data) => { eventData.ev = value; } - return new Bluebird((resolve, reject) => { + return new Promise((resolve, reject) => { ga.event(eventData, (err) => { if (err) return reject(err); resolve(); @@ -236,7 +235,7 @@ let _sendPurchaseDataToAmplitude = (data) => { amplitudeData.event_type = 'purchase'; amplitudeData.revenue = data.purchaseValue; - return new Bluebird((resolve, reject) => { + return new Promise((resolve, reject) => { amplitude.track(amplitudeData) .then(resolve) .catch(reject); @@ -261,7 +260,7 @@ let _sendPurchaseDataToGoogle = (data) => { ev: price, }; - return new Bluebird((resolve) => { + return new Promise((resolve) => { ga.event(eventData).send(); ga.transaction(data.uuid, price) @@ -273,14 +272,14 @@ let _sendPurchaseDataToGoogle = (data) => { }; function track (eventType, data) { - return Bluebird.all([ + return Promise.all([ _sendDataToAmplitude(eventType, data), _sendDataToGoogle(eventType, data), ]); } function trackPurchase (data) { - return Bluebird.all([ + return Promise.all([ _sendPurchaseDataToAmplitude(data), _sendPurchaseDataToGoogle(data), ]); diff --git a/website/server/libs/challenges/index.js b/website/server/libs/challenges/index.js index 84be475b87..00bcf9d8cc 100644 --- a/website/server/libs/challenges/index.js +++ b/website/server/libs/challenges/index.js @@ -1,7 +1,6 @@ // Currently this holds helpers for challenge api, but we should break this up into submodules as it expands import omit from 'lodash/omit'; import uuid from 'uuid'; -import Bluebird from 'bluebird'; import { model as Challenge } from '../../models/challenge'; import { model as Group, @@ -82,7 +81,7 @@ export async function createChallenge (user, req, res) { addUserJoinChallengeNotification(user); - let results = await Bluebird.all([challenge.save({ + let results = await Promise.all([challenge.save({ validateBeforeSave: false, // already validate }), group.save()]); let savedChal = results[0]; diff --git a/website/server/libs/cron.js b/website/server/libs/cron.js index 1e27c9ddb1..1c5855e6de 100644 --- a/website/server/libs/cron.js +++ b/website/server/libs/cron.js @@ -1,8 +1,8 @@ import moment from 'moment'; -import Bluebird from 'bluebird'; import { model as User } from '../models/user'; import common from '../../common/'; import { preenUserHistory } from '../libs/preening'; +import sleep from '../libs/sleep'; import _ from 'lodash'; import cloneDeep from 'lodash/cloneDeep'; import nconf from 'nconf'; @@ -29,7 +29,7 @@ function setIsDueNextDue (task, user, now) { export async function recoverCron (status, locals) { let {user} = locals; - await Bluebird.delay(300); + await sleep(0.3); let reloadedUser = await User.findOne({_id: user._id}).exec(); diff --git a/website/server/libs/csvStringify.js b/website/server/libs/csvStringify.js index 39fb7c16c8..8db0280d57 100644 --- a/website/server/libs/csvStringify.js +++ b/website/server/libs/csvStringify.js @@ -1,8 +1,7 @@ import csvStringify from 'csv-stringify'; -import Bluebird from 'bluebird'; module.exports = (input) => { - return new Bluebird((resolve, reject) => { + return new Promise((resolve, reject) => { csvStringify(input, (err, output) => { if (err) return reject(err); return resolve(output); diff --git a/website/server/libs/inAppPurchases.js b/website/server/libs/inAppPurchases.js index 8d0c676978..e75fbe5e5f 100644 --- a/website/server/libs/inAppPurchases.js +++ b/website/server/libs/inAppPurchases.js @@ -1,6 +1,6 @@ import nconf from 'nconf'; +import util from 'util'; import iap from 'in-app-purchase'; -import Bluebird from 'bluebird'; // Validation ERROR Codes // const INVALID_PAYLOAD = 6778001; @@ -18,8 +18,8 @@ iap.config({ }); module.exports = { - setup: Bluebird.promisify(iap.setup, { context: iap }), - validate: Bluebird.promisify(iap.validate, { context: iap }), + setup: util.promisify(iap.setup.bind(iap)), + validate: util.promisify(iap.validate.bind(iap)), isValidated: iap.isValidated, getPurchaseData: iap.getPurchaseData, GOOGLE: iap.GOOGLE, diff --git a/website/server/libs/paypalPayments.js b/website/server/libs/paypalPayments.js index 19bd2f2676..b1e4e4f217 100644 --- a/website/server/libs/paypalPayments.js +++ b/website/server/libs/paypalPayments.js @@ -1,13 +1,13 @@ /* eslint-disable camelcase */ import nconf from 'nconf'; import moment from 'moment'; +import util from 'util'; import _ from 'lodash'; import payments from './payments'; import ipn from 'paypal-ipn'; import paypal from 'paypal-rest-sdk'; import shared from '../../common'; import cc from 'coupon-code'; -import Bluebird from 'bluebird'; import { model as Coupon } from '../models/coupon'; import { model as User } from '../models/user'; import { @@ -60,14 +60,14 @@ api.constants = { // PAYMENT_METHOD_GIFT: 'Amazon Payments (Gift)', }; -api.paypalPaymentCreate = Bluebird.promisify(paypal.payment.create, {context: paypal.payment}); -api.paypalPaymentExecute = Bluebird.promisify(paypal.payment.execute, {context: paypal.payment}); -api.paypalBillingAgreementCreate = Bluebird.promisify(paypal.billingAgreement.create, {context: paypal.billingAgreement}); -api.paypalBillingAgreementExecute = Bluebird.promisify(paypal.billingAgreement.execute, {context: paypal.billingAgreement}); -api.paypalBillingAgreementGet = Bluebird.promisify(paypal.billingAgreement.get, {context: paypal.billingAgreement}); -api.paypalBillingAgreementCancel = Bluebird.promisify(paypal.billingAgreement.cancel, {context: paypal.billingAgreement}); +api.paypalPaymentCreate = util.promisify(paypal.payment.create.bind(paypal.payment)); +api.paypalPaymentExecute = util.promisify(paypal.payment.execute.bind(paypal.payment)); +api.paypalBillingAgreementCreate = util.promisify(paypal.billingAgreement.create.bind(paypal.billingAgreement)); +api.paypalBillingAgreementExecute = util.promisify(paypal.billingAgreement.execute.bind(paypal.billingAgreement)); +api.paypalBillingAgreementGet = util.promisify(paypal.billingAgreement.get.bind(paypal.billingAgreement)); +api.paypalBillingAgreementCancel = util.promisify(paypal.billingAgreement.cancel.bind(paypal.billingAgreement)); -api.ipnVerifyAsync = Bluebird.promisify(ipn.verify, {context: ipn}); +api.ipnVerifyAsync = util.promisify(ipn.verify.bind(ipn)); api.checkout = async function checkout (options = {}) { let {gift, user} = options; diff --git a/website/server/libs/pushNotifications.js b/website/server/libs/pushNotifications.js index 7e31d76660..52b0f55759 100644 --- a/website/server/libs/pushNotifications.js +++ b/website/server/libs/pushNotifications.js @@ -3,7 +3,6 @@ import nconf from 'nconf'; // @TODO remove this lib and use directly the apn module import pushNotify from 'push-notify'; import logger from './logger'; -import Bluebird from 'bluebird'; import { S3, } from './aws'; @@ -20,7 +19,7 @@ const APN_ENABLED = nconf.get('PUSH_CONFIGS:APN_ENABLED') === 'true'; const S3_BUCKET = nconf.get('S3:bucket'); if (APN_ENABLED) { - Bluebird.all([ + Promise.all([ S3.getObject({ Bucket: S3_BUCKET, Key: 'apple_apn/cert.pem', diff --git a/website/server/libs/sleep.js b/website/server/libs/sleep.js new file mode 100644 index 0000000000..2df97b91ff --- /dev/null +++ b/website/server/libs/sleep.js @@ -0,0 +1,7 @@ +export default async function (seconds = 1) { + let milliseconds = seconds * 1000; + + return new Promise((resolve) => { + setTimeout(resolve, milliseconds); + }); +} \ No newline at end of file diff --git a/website/server/libs/spells.js b/website/server/libs/spells.js index ba728e3664..61f4d83ccb 100644 --- a/website/server/libs/spells.js +++ b/website/server/libs/spells.js @@ -1,5 +1,3 @@ -import Bluebird from 'bluebird'; - import { model as User } from '../models/user'; import * as Tasks from '../models/task'; import { @@ -24,7 +22,7 @@ async function castTaskSpell (res, req, targetId, user, spell, quantity = 1) { spell.cast(user, task, req); } - const results = await Bluebird.all([ + const results = await Promise.all([ user.save(), task.save(), ]); @@ -46,7 +44,7 @@ async function castMultiTaskSpell (req, user, spell, quantity = 1) { .filter(t => t.isModified()) .map(t => t.save()); toSave.unshift(user.save()); - const saved = await Bluebird.all(toSave); + const saved = await Promise.all(toSave); const response = { tasks: saved, @@ -82,7 +80,7 @@ async function castPartySpell (req, party, partyMembers, user, spell, quantity = for (let i = 0; i < quantity; i += 1) { spell.cast(user, partyMembers, req); } - await Bluebird.all(partyMembers.map(m => m.save())); + await Promise.all(partyMembers.map(m => m.save())); return partyMembers; } @@ -107,7 +105,7 @@ async function castUserSpell (res, req, party, partyMembers, targetId, user, spe } if (partyMembers !== user) { - await Bluebird.all([ + await Promise.all([ user.save(), partyMembers.save(), ]); diff --git a/website/server/libs/taskManager.js b/website/server/libs/taskManager.js index fa3e5fa1fb..612a035881 100644 --- a/website/server/libs/taskManager.js +++ b/website/server/libs/taskManager.js @@ -3,7 +3,6 @@ import * as Tasks from '../models/task'; import { BadRequest, } from './errors'; -import Bluebird from 'bluebird'; import _ from 'lodash'; import shared from '../../common'; @@ -18,9 +17,9 @@ async function _validateTaskAlias (tasks, res) { throw new BadRequest(res.t('taskAliasAlreadyUsed')); } - await Bluebird.map(tasksWithAliases, (task) => { + await Promise.all(tasksWithAliases.map((task) => { return task.validate(); - }); + })); } export function setNextDue (task, user, dueDateOption) { @@ -137,7 +136,7 @@ export async function createTasks (req, res, options = {}) { toSave.unshift(owner.save()); - let tasks = await Bluebird.all(toSave); + let tasks = await Promise.all(toSave); tasks.splice(0, 1); // Remove user, challenge, or group promise return tasks; } diff --git a/website/server/middlewares/cron.js b/website/server/middlewares/cron.js index 0264c985de..750cf1ab8c 100644 --- a/website/server/middlewares/cron.js +++ b/website/server/middlewares/cron.js @@ -1,6 +1,5 @@ import moment from 'moment'; import * as Tasks from '../models/task'; -import Bluebird from 'bluebird'; import { model as Group } from '../models/group'; import { model as User } from '../models/user'; import { recoverCron, cron } from '../libs/cron'; @@ -99,7 +98,7 @@ async function cronAsync (req, res) { tasks.forEach(task => { if (task.isModified()) toSave.push(task.save()); }); - await Bluebird.all(toSave); + await Promise.all(toSave); await Group.processQuestProgress(user, progress); diff --git a/website/server/models/challenge.js b/website/server/models/challenge.js index b00ef33687..6d16d3b7ec 100644 --- a/website/server/models/challenge.js +++ b/website/server/models/challenge.js @@ -1,5 +1,4 @@ import mongoose from 'mongoose'; -import Bluebird from 'bluebird'; import validator from 'validator'; import baseModel from '../libs/baseModel'; import _ from 'lodash'; @@ -120,7 +119,7 @@ schema.methods.syncToUser = async function syncChallengeToUser (user) { }); } - let [challengeTasks, userTasks] = await Bluebird.all([ + let [challengeTasks, userTasks] = await Promise.all([ // Find original challenge tasks Tasks.Task.find({ userId: {$exists: false}, @@ -165,7 +164,7 @@ schema.methods.syncToUser = async function syncChallengeToUser (user) { }); toSave.push(user.save()); - return Bluebird.all(toSave); + return Promise.all(toSave); }; async function _fetchMembersIds (challengeId) { @@ -202,7 +201,7 @@ async function _addTaskFn (challenge, tasks, memberId) { // Update the user toSave.unshift(User.update({_id: memberId}, updateTasksOrderQ).exec()); - return await Bluebird.all(toSave); + return await Promise.all(toSave); } // Add a new task to challenge members @@ -210,11 +209,11 @@ schema.methods.addTasks = async function challengeAddTasks (tasks) { let challenge = this; let membersIds = await _fetchMembersIds(challenge._id); - let queue = new TaskQueue(Bluebird, 25); // process only 5 users concurrently + let queue = new TaskQueue(Promise, 25); // process only 5 users concurrently - await Bluebird.map(membersIds, queue.wrap((memberId) => { + await Promise.all(membersIds.map(queue.wrap((memberId) => { return _addTaskFn(challenge, tasks, memberId); - })); + }))); }; // Sync updated task to challenge members @@ -267,7 +266,7 @@ schema.methods.unlinkTasks = async function challengeUnlinkTasks (user, keep) { $set: {challenge: {}}, }, {multi: true}).exec(); - return Bluebird.all([user.save(), this.save()]); + return Promise.all([user.save(), this.save()]); } else { // keep = 'remove-all' let tasks = await Tasks.Task.find(findQuery).select('_id type completed').exec(); let taskPromises = tasks.map(task => { @@ -280,7 +279,7 @@ schema.methods.unlinkTasks = async function challengeUnlinkTasks (user, keep) { }); user.markModified('tasksOrder'); taskPromises.push(user.save(), this.save()); - return Bluebird.all(taskPromises); + return Promise.all(taskPromises); } }; @@ -358,7 +357,7 @@ schema.methods.closeChal = async function closeChal (broken = {}) { }, {multi: true}).exec(), ]; - Bluebird.all(backgroundTasks); + Promise.all(backgroundTasks); }; export let model = mongoose.model('Challenge', schema); diff --git a/website/server/models/group.js b/website/server/models/group.js index daa00269df..b3287153a3 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -19,7 +19,6 @@ import { } from '../libs/errors'; import baseModel from '../libs/baseModel'; import { sendTxn as sendTxnEmail } from '../libs/email'; -import Bluebird from 'bluebird'; import nconf from 'nconf'; import { sendNotification as sendPushNotification } from '../libs/pushNotifications'; import pusher from '../libs/pusher'; @@ -308,7 +307,7 @@ schema.statics.getGroups = async function getGroups (options = {}) { } }); - let groupsArray = _.reduce(await Bluebird.all(queries), (previousValue, currentValue) => { + let groupsArray = _.reduce(await Promise.all(queries), (previousValue, currentValue) => { if (_.isEmpty(currentValue)) return previousValue; // don't add anything to the results if the query returned null or an empty array return previousValue.concat(Array.isArray(currentValue) ? currentValue : [currentValue]); // otherwise concat the new results to the previousValue }, []); @@ -427,7 +426,7 @@ schema.methods.removeGroupInvitations = async function removeGroupInvitations () return user.save(); }); - return Bluebird.all(userUpdates); + return Promise.all(userUpdates); }; // Return true if user is a member of the group @@ -628,13 +627,18 @@ schema.methods.startQuest = async function startQuest (user) { // remove any users from quest.members who aren't in the party let partyId = this._id; let questMembers = this.quest.members; - await Bluebird.map(Object.keys(this.quest.members), async (memberId) => { - let member = await User.findOne({_id: memberId, 'party._id': partyId}).select('_id').lean().exec(); - - if (!member) { - delete questMembers[memberId]; - } - }); + await Promise.all(Object.keys(this.quest.members).map(memberId => { + return User.findOne({_id: memberId, 'party._id': partyId}) + .select('_id') + .lean() + .exec() + .then((member) => { + if (!member) { + delete questMembers[memberId]; + } + return; + }); + })); if (userIsParticipating) { user.party.quest.key = this.quest.key; @@ -871,7 +875,7 @@ schema.methods.finishQuest = async function finishQuest (quest) { })); } - return Bluebird.all(promises); + return Promise.all(promises); }; function _isOnQuest (user, progress, group) { @@ -1123,7 +1127,7 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all', keepC let challengesToRemoveUserFrom = challenges.map(chal => { return chal.unlinkTasks(user, keep); }); - await Bluebird.all(challengesToRemoveUserFrom); + await Promise.all(challengesToRemoveUserFrom); } // Unlink group tasks) @@ -1135,7 +1139,7 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all', keepC let assignedTasksToRemoveUserFrom = assignedTasks.map(task => { return this.unlinkTask(task, user, keep); }); - await Bluebird.all(assignedTasksToRemoveUserFrom); + await Promise.all(assignedTasksToRemoveUserFrom); let promises = []; @@ -1171,7 +1175,7 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all', keepC if (members.length === 0) { promises.push(group.remove()); - return await Bluebird.all(promises); + return await Promise.all(promises); } } else if (group.leader === user._id) { // otherwise If the leader is leaving (or if the leader previously left, and this wasn't accounted for) let query = group.type === 'party' ? {'party._id': group._id} : {guilds: group._id}; @@ -1193,7 +1197,7 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all', keepC } promises.push(group.update(update).exec()); - return await Bluebird.all(promises); + return await Promise.all(promises); }; /** @@ -1327,7 +1331,7 @@ schema.methods.syncTask = async function groupSyncTask (taskToSync, user) { if (matchingTask.tags.indexOf(group._id) === -1) matchingTask.tags.push(group._id); // add tag if missing toSave.push(matchingTask.save(), taskToSync.save(), user.save()); - return Bluebird.all(toSave); + return Promise.all(toSave); }; schema.methods.unlinkTask = async function groupUnlinkTask (unlinkingTask, user, keep) { @@ -1353,7 +1357,7 @@ schema.methods.unlinkTask = async function groupUnlinkTask (unlinkingTask, user, user.markModified('tasksOrder'); } - return Bluebird.all([task.remove(), user.save(), unlinkingTask.save()]); + return Promise.all([task.remove(), user.save(), unlinkingTask.save()]); } }; diff --git a/website/server/models/user/hooks.js b/website/server/models/user/hooks.js index d77c45cb61..0ebcfe6733 100644 --- a/website/server/models/user/hooks.js +++ b/website/server/models/user/hooks.js @@ -1,7 +1,6 @@ import common from '../../../common'; import _ from 'lodash'; import moment from 'moment'; -import Bluebird from 'bluebird'; import baseModel from '../../libs/baseModel'; import * as Tasks from '../task'; import { @@ -58,7 +57,7 @@ function _populateDefaultTasks (user, taskTypes) { // @TODO: default tasks are handled differently now, and not during registration. We should move this code let tasksToCreate = []; - if (user.registeredThrough === 'habitica-web') return Bluebird.all(tasksToCreate); + if (user.registeredThrough === 'habitica-web') return Promise.all(tasksToCreate); if (tagsI !== -1) { taskTypes = _.clone(taskTypes); @@ -89,7 +88,7 @@ function _populateDefaultTasks (user, taskTypes) { tasksToCreate.push(...tasksOfType); }); - return Bluebird.all(tasksToCreate) + return Promise.all(tasksToCreate) .then((tasksCreated) => { _.each(tasksCreated, (task) => { user.tasksOrder[`${task.type}s`].push(task._id); diff --git a/website/server/models/user/methods.js b/website/server/models/user/methods.js index fab636972d..1f8712fef2 100644 --- a/website/server/models/user/methods.js +++ b/website/server/models/user/methods.js @@ -1,7 +1,6 @@ import moment from 'moment'; import common from '../../../common'; -import Bluebird from 'bluebird'; import { chatDefaults, TAVERN_ID, @@ -132,7 +131,7 @@ schema.methods.sendMessage = async function sendMessage (userToReceiveMessage, o sender.markModified('inbox.messages'); let promises = [userToReceiveMessage.save(), sender.save()]; - await Bluebird.all(promises); + await Promise.all(promises); }; /** diff --git a/website/server/server.js b/website/server/server.js index 473cc4a284..b8a5783d62 100644 --- a/website/server/server.js +++ b/website/server/server.js @@ -2,9 +2,6 @@ import nconf from 'nconf'; import logger from './libs/logger'; import express from 'express'; import http from 'http'; -import Bluebird from 'bluebird'; - -global.Promise = Bluebird; const server = http.createServer(); const app = express(); From 3d4107db3ed12254b1ec9e742d442fcda2cddca5 Mon Sep 17 00:00:00 2001 From: negue Date: Sat, 17 Mar 2018 21:12:25 +0100 Subject: [PATCH 03/37] checkout of the Inn - banner (#9835) * show resting banner * resume damage * replace colors by variables * remove indentation --- website/client/app.vue | 95 +++++++++++++++++++-- website/client/components/groups/tavern.vue | 1 - website/client/store/actions/user.js | 6 +- website/common/locales/en/groups.json | 2 + 4 files changed, 94 insertions(+), 10 deletions(-) diff --git a/website/client/app.vue b/website/client/app.vue index 55400adec6..d8d36bddc0 100644 --- a/website/client/app.vue +++ b/website/client/app.vue @@ -14,10 +14,17 @@ div router-view(v-if="!isUserLoggedIn || isStaticPage") template(v-else) template(v-if="isUserLoaded") + div.resting-banner(v-if="showRestingBanner") + span.content + span.label {{ $t('innCheckOutBanner') }} + span.separator | + span.resume(@click="resumeDamage()") {{ $t('resumeDamage') }} + div.closepadding(@click="hideBanner()") + span.svg-icon.inline.icon-10(aria-hidden="true", v-html="icons.close") notifications-display - app-menu + app-menu(:class='{"restingInn": showRestingBanner}') .container-fluid - app-header + app-header(:class='{"restingInn": showRestingBanner}') buyModal( :item="selectedItemToBuy || {}", :withPin="true", @@ -34,13 +41,15 @@ div div(:class='{sticky: user.preferences.stickyHeader}') router-view - app-footer + app-footer audio#sound(autoplay, ref="sound") source#oggSource(type="audio/ogg", :src="sound.oggSource") source#mp3Source(type="audio/mp3", :src="sound.mp3Source") - diff --git a/website/client/components/groups/tavern.vue b/website/client/components/groups/tavern.vue index efdb65ef4a..919cfa9703 100644 --- a/website/client/components/groups/tavern.vue +++ b/website/client/components/groups/tavern.vue @@ -720,7 +720,6 @@ export default { this.newMessage = newText; }, toggleSleep () { - this.user.preferences.sleep = !this.user.preferences.sleep; this.$store.dispatch('user:sleep'); }, async sendMessage () { diff --git a/website/client/store/actions/user.js b/website/client/store/actions/user.js index ecbd5683a5..809407a63e 100644 --- a/website/client/store/actions/user.js +++ b/website/client/store/actions/user.js @@ -56,7 +56,11 @@ export async function set (store, changes) { // .catch((err) => console.error('set', err)); } -export async function sleep () { +export async function sleep (store) { + const user = store.state.user.data; + + user.preferences.sleep = !user.preferences.sleep; + let response = await axios.post('/api/v3/user/sleep'); return response.data.data; } diff --git a/website/common/locales/en/groups.json b/website/common/locales/en/groups.json index 8fd63fe398..74a3d422b2 100644 --- a/website/common/locales/en/groups.json +++ b/website/common/locales/en/groups.json @@ -5,6 +5,8 @@ "innCheckIn": "Rest in the Inn", "innText": "You're resting in the Inn! While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day. Be warned: If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies unless they are also in the Inn! Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn.", "innTextBroken": "You're resting in the Inn, I guess... While checked-in, your Dailies won't hurt you at the day's end, but they will still refresh every day... If you are participating in a Boss Quest, the Boss will still damage you for your Party mates' missed Dailies... unless they are also in the Inn... Also, your own damage to the Boss (or items collected) will not be applied until you check out of the Inn... so tired...", + "innCheckOutBanner": "You are currently checked into the Inn. Your Dailies won't damage you and you won't make progress towards Quests.", + "resumeDamage": "Resume Damage", "helpfulLinks": "Helpful Links", "communityGuidelinesLink": "Community Guidelines", "lookingForGroup": "Looking for Group (Party Wanted) Posts", From 1812f638122e736abe9c03654c08a721b6be80b7 Mon Sep 17 00:00:00 2001 From: negue Date: Sat, 17 Mar 2018 21:12:53 +0100 Subject: [PATCH 04/37] raise coverage for user api calls (#10099) * user integration tests * fix lint --- .../user/GET-user_inAppRewards.test.js | 24 +++++++++++++++++ .../user/GET-user_toggle-pinned-item.test.js | 27 +++++++++++++++++++ .../user/POST-user_class_cast_spellId.test.js | 24 +++++++++++++++-- test/api/v3/integration/user/PUT-user.test.js | 27 +++++++++++++++++++ 4 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 test/api/v3/integration/user/GET-user_inAppRewards.test.js create mode 100644 test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js diff --git a/test/api/v3/integration/user/GET-user_inAppRewards.test.js b/test/api/v3/integration/user/GET-user_inAppRewards.test.js new file mode 100644 index 0000000000..a2583dc43f --- /dev/null +++ b/test/api/v3/integration/user/GET-user_inAppRewards.test.js @@ -0,0 +1,24 @@ +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; + +describe('GET /user/in-app-rewards', () => { + let user; + + before(async () => { + user = await generateUser(); + }); + + it('returns the reward items available for purchase', async () => { + let buyList = await user.get('/user/in-app-rewards'); + + expect(_.find(buyList, item => { + return item.text === t('armorWarrior1Text'); + })).to.exist; + + expect(_.find(buyList, item => { + return item.text === t('armorWarrior2Text'); + })).to.not.exist; + }); +}); diff --git a/test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js b/test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js new file mode 100644 index 0000000000..c958c4f979 --- /dev/null +++ b/test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js @@ -0,0 +1,27 @@ +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; + +describe('GET /user/toggle-pinned-item', () => { + let user; + + before(async () => { + user = await generateUser(); + }); + + it('cannot unpin potion', async () => { + await expect(user.get('/user/toggle-pinned-item/potion/potion')) + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('cannotUnpinArmoirPotion'), + }); + }); + + it('can pin shield_rogue_5', async () => { + let result = await user.get('/user/toggle-pinned-item/marketGear/gear.flat.shield_rogue_5'); + + expect(result.pinnedItems.length).to.be.eql(user.pinnedItems.length + 1); + }); +}); diff --git a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js index d8cd074bc7..bf7d4fcf1a 100644 --- a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js +++ b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js @@ -258,11 +258,31 @@ describe('POST /user/class/cast/:spellId', () => { expect(user.achievements.birthday).to.equal(1); }); + it('passes correct target to spell when targetType === \'task\'', async () => { + await user.update({'stats.class': 'wizard', 'stats.lvl': 11}); + + let task = await user.post('/tasks/user', { + text: 'test habit', + type: 'habit', + }); + + let result = await user.post(`/user/class/cast/fireball?targetId=${task._id}`); + + expect(result.task._id).to.equal(task._id); + }); + + it('passes correct target to spell when targetType === \'self\'', async () => { + await user.update({'stats.class': 'wizard', 'stats.lvl': 14, 'stats.mp': 50}); + + let result = await user.post('/user/class/cast/frost'); + + expect(result.user.stats.mp).to.equal(10); + }); + + // TODO find a way to have sinon working in integration tests // it doesn't work when tests are running separately from server - it('passes correct target to spell when targetType === \'task\''); it('passes correct target to spell when targetType === \'tasks\''); - it('passes correct target to spell when targetType === \'self\''); it('passes correct target to spell when targetType === \'party\''); it('passes correct target to spell when targetType === \'user\''); it('passes correct target to spell when targetType === \'party\' and user is not in a party'); diff --git a/test/api/v3/integration/user/PUT-user.test.js b/test/api/v3/integration/user/PUT-user.test.js index ecd932a7dc..9642d3bb61 100644 --- a/test/api/v3/integration/user/PUT-user.test.js +++ b/test/api/v3/integration/user/PUT-user.test.js @@ -27,6 +27,33 @@ describe('PUT /user', () => { expect(user.stats.hp).to.eql(14); }); + it('tags must be an array', async () => { + await expect(user.put('/user', { + tags: { + tag: true, + }, + })).to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: 'mustBeArray', + }); + }); + + it('update tags', async () => { + let userTags = user.tags; + + await user.put('/user', { + tags: [...user.tags, { + name: 'new tag', + }], + }); + + await user.sync(); + + expect(user.tags.length).to.be.eql(userTags.length + 1); + }); + + it('profile.name cannot be an empty string or null', async () => { await expect(user.put('/user', { 'profile.name': ' ', // string should be trimmed From 9287098e701ca5b7483a7f9e677dc49aefcb57fe Mon Sep 17 00:00:00 2001 From: negue Date: Sat, 17 Mar 2018 21:13:12 +0100 Subject: [PATCH 05/37] fix #10116 (#10143) --- website/client/components/tasks/column.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/client/components/tasks/column.vue b/website/client/components/tasks/column.vue index d479466eff..364b478058 100644 --- a/website/client/components/tasks/column.vue +++ b/website/client/components/tasks/column.vue @@ -551,7 +551,7 @@ export default { return task; }); - this.quickAddText = null; + this.quickAddText = ''; this.quickAddRows = 1; this.createTask(tasks); }, From 0fcc1f2080d2318e383d9aea66944cef1e8afcd0 Mon Sep 17 00:00:00 2001 From: negue Date: Sat, 17 Mar 2018 21:13:35 +0100 Subject: [PATCH 06/37] correct position of pets in the profile overview - fixes #10104 (#10144) --- website/client/assets/scss/animals.scss | 20 +++++++++++++++++++ website/client/assets/scss/index.scss | 1 + .../components/inventory/stable/index.vue | 12 ----------- .../client/components/userMenu/profile.vue | 6 +----- 4 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 website/client/assets/scss/animals.scss diff --git a/website/client/assets/scss/animals.scss b/website/client/assets/scss/animals.scss new file mode 100644 index 0000000000..a75f6dcb17 --- /dev/null +++ b/website/client/assets/scss/animals.scss @@ -0,0 +1,20 @@ +.Pet { + margin: auto !important; + display: block; + position: relative; + right: 0; + bottom: 0; + left: 0; + + &:not([class*="FlyingPig"]) { + top: -28px !important; + } +} + +.Pet[class*="FlyingPig"] { + top: 7px !important; +} + +.Pet.Pet-Dragon-Hydra { + top: -16px !important; +} diff --git a/website/client/assets/scss/index.scss b/website/client/assets/scss/index.scss index 88df7bf699..6c2fa94f5a 100644 --- a/website/client/assets/scss/index.scss +++ b/website/client/assets/scss/index.scss @@ -33,3 +33,4 @@ @import './banner'; @import './progress-bar'; @import './pin'; +@import './animals'; diff --git a/website/client/components/inventory/stable/index.vue b/website/client/components/inventory/stable/index.vue index f9a37b95cb..51eb5078cb 100644 --- a/website/client/components/inventory/stable/index.vue +++ b/website/client/components/inventory/stable/index.vue @@ -276,18 +276,6 @@ display: inline-block; } - .stable .item .item-content.Pet:not(.FlyingPig) { - top: -28px; - } - - .stable .item .item-content.FlyingPig { - top: 7px; - } - - .stable .item .item-content.Pet-Dragon-Hydra { - top: -16px !important; - } - .hatchablePopover { width: 180px } diff --git a/website/client/components/userMenu/profile.vue b/website/client/components/userMenu/profile.vue index ee89f50450..531c374f1e 100644 --- a/website/client/components/userMenu/profile.vue +++ b/website/client/components/userMenu/profile.vue @@ -189,7 +189,7 @@ div .row.col-12 .col-12.col-md-4 .box(:class='{white: user.items.currentPet}') - .pet(:class="`Pet-${user.items.currentPet}`") + .Pet(:class="`Pet-${user.items.currentPet}`") .col-12.col-md-8 div | {{ formatAnimal(user.items.currentPet, 'pet') }} @@ -340,10 +340,6 @@ div margin-bottom: 2em; } - .pet { - margin-top: -1.4em !important; - } - .mount { margin-top: -0.2em !important; } From 29a9deaeb85a0f95c8a9bbc4084057649f5cfc16 Mon Sep 17 00:00:00 2001 From: Alys Date: Sun, 18 Mar 2018 06:13:55 +1000 Subject: [PATCH 07/37] prevent lint indent warning on multi-line reduce function (#10145) --- website/common/script/fns/randomDrop.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/common/script/fns/randomDrop.js b/website/common/script/fns/randomDrop.js index 3156c82590..deaf0127b3 100644 --- a/website/common/script/fns/randomDrop.js +++ b/website/common/script/fns/randomDrop.js @@ -41,9 +41,9 @@ module.exports = function randomDrop (user, options, req = {}, analytics) { (1 + (user.contributor.level / 40 || 0)) * // Contrib levels: +2.5% per level (1 + (user.achievements.rebirths / 20 || 0)) * // Rebirths: +5% per achievement (1 + (user.achievements.streak / 200 || 0)) * // Streak achievements: +0.5% per achievement - (user._tmp.crit || 1) * (1 + 0.5 * (reduce(task.checklist, (m, i) => { - return m + (i.completed ? 1 : 0); // +50% per checklist item complete. TODO: make this into X individual drop chances instead - }, 0) || 0)); + (user._tmp.crit || 1) * (1 + 0.5 * (reduce(task.checklist, (m, i) => { // +50% per checklist item complete. TODO: make this into X individual drop chances instead + return m + (i.completed ? 1 : 0); // eslint-disable-line indent + }, 0) || 0)); // eslint-disable-line indent chance = diminishingReturns(chance, 0.75); if (predictableRandom() < chance) { From 2a97915477d26403fcd8395d59a0f4163c7d37b1 Mon Sep 17 00:00:00 2001 From: negue Date: Sat, 17 Mar 2018 21:56:19 +0100 Subject: [PATCH 08/37] Purchase API Refactoring: Market Gear (#10010) * convert buyGear to buyMarketGearOperation + tests * move NotImplementedError --- .../ops/buy/{buyGear.js => buyMarketGear.js} | 35 ++++- website/common/script/libs/errors.js | 9 ++ .../script/ops/buy/abstractBuyOperation.js | 127 ++++++++++++++++++ website/common/script/ops/buy/buy.js | 9 +- website/common/script/ops/buy/buyGear.js | 82 ----------- .../common/script/ops/buy/buyMarketGear.js | 78 +++++++++++ 6 files changed, 253 insertions(+), 87 deletions(-) rename test/common/ops/buy/{buyGear.js => buyMarketGear.js} (86%) create mode 100644 website/common/script/ops/buy/abstractBuyOperation.js delete mode 100644 website/common/script/ops/buy/buyGear.js create mode 100644 website/common/script/ops/buy/buyMarketGear.js diff --git a/test/common/ops/buy/buyGear.js b/test/common/ops/buy/buyMarketGear.js similarity index 86% rename from test/common/ops/buy/buyGear.js rename to test/common/ops/buy/buyMarketGear.js index bd1798a673..48ce22ea1d 100644 --- a/test/common/ops/buy/buyGear.js +++ b/test/common/ops/buy/buyMarketGear.js @@ -4,14 +4,20 @@ import sinon from 'sinon'; // eslint-disable-line no-shadow import { generateUser, } from '../../../helpers/common.helper'; -import buyGear from '../../../../website/common/script/ops/buy/buyGear'; +import {BuyMarketGearOperation} from '../../../../website/common/script/ops/buy/buyMarketGear'; import shared from '../../../../website/common/script'; import { BadRequest, NotAuthorized, NotFound, } from '../../../../website/common/script/libs/errors'; import i18n from '../../../../website/common/script/i18n'; -describe('shared.ops.buyGear', () => { +function buyGear (user, req, analytics) { + let buyOp = new BuyMarketGearOperation(user, req, analytics); + + return buyOp.purchase(); +} + +describe('shared.ops.buyMarketGear', () => { let user; let analytics = {track () {}}; @@ -111,6 +117,31 @@ describe('shared.ops.buyGear', () => { } }); + it('does not buy equipment of different class', (done) => { + user.stats.gp = 82; + user.stats.class = 'warrior'; + + try { + buyGear(user, {params: {key: 'weapon_special_winter2018Rogue'}}); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('cannotBuyItem')); + done(); + } + }); + + it('does not buy equipment in bulk', (done) => { + user.stats.gp = 82; + + try { + buyGear(user, {params: {key: 'armor_warrior_1'}, quantity: 3}); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('messageNotAbleToBuyInBulk')); + done(); + } + }); + // TODO after user.ops.equip is done xit('removes one-handed weapon and shield if auto-equip is on and a two-hander is bought', () => { user.stats.gp = 100; diff --git a/website/common/script/libs/errors.js b/website/common/script/libs/errors.js index cb780d215b..8e82afa7a8 100644 --- a/website/common/script/libs/errors.js +++ b/website/common/script/libs/errors.js @@ -40,3 +40,12 @@ export class NotFound extends CustomError { this.message = customMessage || 'Not found.'; } } + +export class NotImplementedError extends CustomError { + constructor (str) { + super(); + this.name = this.constructor.name; + + this.message = `Method: '${str}' not implemented`; + } +} diff --git a/website/common/script/ops/buy/abstractBuyOperation.js b/website/common/script/ops/buy/abstractBuyOperation.js new file mode 100644 index 0000000000..d641372a5f --- /dev/null +++ b/website/common/script/ops/buy/abstractBuyOperation.js @@ -0,0 +1,127 @@ +import i18n from '../../i18n'; +import { + NotAuthorized, NotImplementedError, +} from '../../libs/errors'; +import _merge from 'lodash/merge'; +import _get from 'lodash/get'; + +export class AbstractBuyOperation { + /** + * @param {User} user - the User-Object + * @param {Request} req - the Request-Object + * @param {analytics} analytics + */ + constructor (user, req, analytics) { + this.user = user; + this.req = req || {}; + this.analytics = analytics; + + this.quantity = _get(req, 'quantity', 1); + } + + /** + * Shortcut to get the translated string without passing `req.language` + * @param {String} key - translation key + * @param {*=} params + * @returns {*|string} + */ + // eslint-disable-next-line no-unused-vars + i18n (key, params = {}) { + return i18n.t.apply(null, [...arguments, this.req.language]); + } + + /** + * If the Operation allows purchasing items by quantity + * @returns Boolean + */ + multiplePurchaseAllowed () { + throw new NotImplementedError('multiplePurchaseAllowed'); + } + + /** + * Method is called to save the params as class-fields in order to access them + */ + extractAndValidateParams () { + throw new NotImplementedError('extractAndValidateParams'); + } + + executeChanges () { + throw new NotImplementedError('executeChanges'); + } + + analyticsData () { + throw new NotImplementedError('sendToAnalytics'); + } + + purchase () { + if (!this.multiplePurchaseAllowed() && this.quantity > 1) { + throw new NotAuthorized(this.i18n('messageNotAbleToBuyInBulk')); + } + + this.extractAndValidateParams(this.user, this.req); + + let resultObj = this.executeChanges(this.user, this.item, this.req); + + if (this.analytics) { + this.sendToAnalytics(this.analyticsData()); + } + + return resultObj; + } + + sendToAnalytics (additionalData = {}) { + // spread-operator produces an "unexpected token" error + let analyticsData = _merge(additionalData, { + // ...additionalData, + uuid: this.user._id, + category: 'behavior', + headers: this.req.headers, + }); + + if (this.multiplePurchaseAllowed()) { + analyticsData.quantityPurchased = this.quantity; + } + + this.analytics.track('acquire item', analyticsData); + } +} + +export class AbstractGoldItemOperation extends AbstractBuyOperation { + constructor (user, req, analytics) { + super(user, req, analytics); + } + + getItemValue (item) { + return item.value; + } + + canUserPurchase (user, item) { + this.item = item; + let itemValue = this.getItemValue(item); + + let userGold = user.stats.gp; + + if (userGold < itemValue * this.quantity) { + throw new NotAuthorized(this.i18n('messageNotEnoughGold')); + } + + if (item.canOwn && !item.canOwn(user)) { + throw new NotAuthorized(this.i18n('cannotBuyItem')); + } + } + + substractCurrency (user, item, quantity = 1) { + let itemValue = this.getItemValue(item); + + user.stats.gp -= itemValue * quantity; + } + + analyticsData () { + return { + itemKey: this.item.key, + itemType: 'Market', + acquireMethod: 'Gold', + goldCost: this.getItemValue(this.item), + }; + } +} diff --git a/website/common/script/ops/buy/buy.js b/website/common/script/ops/buy/buy.js index 1ecb149c9c..51e054f5be 100644 --- a/website/common/script/ops/buy/buy.js +++ b/website/common/script/ops/buy/buy.js @@ -5,7 +5,7 @@ import { } from '../../libs/errors'; import buyHealthPotion from './buyHealthPotion'; import buyArmoire from './buyArmoire'; -import buyGear from './buyGear'; +import {BuyMarketGearOperation} from './buyMarketGear'; import buyMysterySet from './buyMysterySet'; import buyQuest from './buyQuest'; import buySpecialSpell from './buySpecialSpell'; @@ -58,9 +58,12 @@ module.exports = function buy (user, req = {}, analytics) { case 'special': buyRes = buySpecialSpell(user, req, analytics); break; - default: - buyRes = buyGear(user, req, analytics); + default: { + const buyOp = new BuyMarketGearOperation(user, req, analytics); + + buyRes = buyOp.purchase(); break; + } } return buyRes; diff --git a/website/common/script/ops/buy/buyGear.js b/website/common/script/ops/buy/buyGear.js deleted file mode 100644 index e811dd6fb4..0000000000 --- a/website/common/script/ops/buy/buyGear.js +++ /dev/null @@ -1,82 +0,0 @@ -import content from '../../content/index'; -import i18n from '../../i18n'; -import get from 'lodash/get'; -import pick from 'lodash/pick'; -import splitWhitespace from '../../libs/splitWhitespace'; -import { - BadRequest, - NotAuthorized, - NotFound, -} from '../../libs/errors'; -import handleTwoHanded from '../../fns/handleTwoHanded'; -import ultimateGear from '../../fns/ultimateGear'; - -import { removePinnedGearAddPossibleNewOnes } from '../pinnedGearUtils'; - -module.exports = function buyGear (user, req = {}, analytics) { - let key = get(req, 'params.key'); - if (!key) throw new BadRequest(i18n.t('missingKeyParam', req.language)); - - let item = content.gear.flat[key]; - - if (!item) throw new NotFound(i18n.t('itemNotFound', {key}, req.language)); - - if (user.stats.gp < item.value) { - throw new NotAuthorized(i18n.t('messageNotEnoughGold', req.language)); - } - - if (item.canOwn && !item.canOwn(user)) { - throw new NotAuthorized(i18n.t('cannotBuyItem', req.language)); - } - - let message; - - if (user.items.gear.owned[item.key]) { - throw new NotAuthorized(i18n.t('equipmentAlreadyOwned', req.language)); - } - - let itemIndex = Number(item.index); - - if (Number.isInteger(itemIndex) && content.classes.includes(item.klass)) { - let previousLevelGear = key.replace(/[0-9]/, itemIndex - 1); - let hasPreviousLevelGear = user.items.gear.owned[previousLevelGear]; - let checkIndexToType = itemIndex > (item.type === 'weapon' || item.type === 'shield' && item.klass === 'rogue' ? 0 : 1); - - if (checkIndexToType && !hasPreviousLevelGear) { - throw new NotAuthorized(i18n.t('previousGearNotOwned', req.language)); - } - } - - if (user.preferences.autoEquip) { - user.items.gear.equipped[item.type] = item.key; - message = handleTwoHanded(user, item, undefined, req); - } - - removePinnedGearAddPossibleNewOnes(user, `gear.flat.${item.key}`, item.key); - - if (item.last) ultimateGear(user); - - user.stats.gp -= item.value; - - if (!message) { - message = i18n.t('messageBought', { - itemText: item.text(req.language), - }, req.language); - } - - if (analytics) { - analytics.track('acquire item', { - uuid: user._id, - itemKey: key, - acquireMethod: 'Gold', - goldCost: item.value, - category: 'behavior', - headers: req.headers, - }); - } - - return [ - pick(user, splitWhitespace('items achievements stats flags pinnedItems')), - message, - ]; -}; diff --git a/website/common/script/ops/buy/buyMarketGear.js b/website/common/script/ops/buy/buyMarketGear.js new file mode 100644 index 0000000000..6ed3928089 --- /dev/null +++ b/website/common/script/ops/buy/buyMarketGear.js @@ -0,0 +1,78 @@ +import content from '../../content/index'; +import get from 'lodash/get'; +import pick from 'lodash/pick'; +import splitWhitespace from '../../libs/splitWhitespace'; +import { + BadRequest, + NotAuthorized, + NotFound, +} from '../../libs/errors'; +import handleTwoHanded from '../../fns/handleTwoHanded'; +import ultimateGear from '../../fns/ultimateGear'; + +import {removePinnedGearAddPossibleNewOnes} from '../pinnedGearUtils'; + +import { AbstractGoldItemOperation } from './abstractBuyOperation'; + +export class BuyMarketGearOperation extends AbstractGoldItemOperation { + constructor (user, req, analytics) { + super(user, req, analytics); + } + + multiplePurchaseAllowed () { + return false; + } + + extractAndValidateParams (user, req) { + let key = this.key = get(req, 'params.key'); + if (!key) throw new BadRequest(this.i18n('missingKeyParam')); + + let item = content.gear.flat[key]; + + if (!item) throw new NotFound(this.i18n('itemNotFound', {key})); + + this.canUserPurchase(user, item); + + if (user.items.gear.owned[item.key]) { + throw new NotAuthorized(this.i18n('equipmentAlreadyOwned')); + } + + let itemIndex = Number(item.index); + + if (Number.isInteger(itemIndex) && content.classes.includes(item.klass)) { + let previousLevelGear = key.replace(/[0-9]/, itemIndex - 1); + let hasPreviousLevelGear = user.items.gear.owned[previousLevelGear]; + let checkIndexToType = itemIndex > (item.type === 'weapon' || item.type === 'shield' && item.klass === 'rogue' ? 0 : 1); + + if (checkIndexToType && !hasPreviousLevelGear) { + throw new NotAuthorized(this.i18n('previousGearNotOwned')); + } + } + } + + executeChanges (user, item, req) { + let message; + + if (user.preferences.autoEquip) { + user.items.gear.equipped[item.type] = item.key; + message = handleTwoHanded(user, item, undefined, req); + } + + removePinnedGearAddPossibleNewOnes(user, `gear.flat.${item.key}`, item.key); + + if (item.last) ultimateGear(user); + + this.substractCurrency(user, item); + + if (!message) { + message = this.i18n('messageBought', { + itemText: item.text(req.language), + }); + } + + return [ + pick(user, splitWhitespace('items achievements stats flags pinnedItems')), + message, + ]; + } +} From b9a6d9ceec9717cb21e96d07c51e2999ee9c5eaf Mon Sep 17 00:00:00 2001 From: Zack Sunderland Date: Sat, 17 Mar 2018 15:13:31 -0600 Subject: [PATCH 09/37] Allow Un-subscribed Users to Claim Mystery Items (#9270) Remove restriction on mystery/special inventory items that prevents non-subscribed users from seeing the items. Organize the imports on the page. Resolves: Issue #9228 --- .../components/inventory/items/index.vue | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/website/client/components/inventory/items/index.vue b/website/client/components/inventory/items/index.vue index f0839b2d4d..da86d5711c 100644 --- a/website/client/components/inventory/items/index.vue +++ b/website/client/components/inventory/items/index.vue @@ -193,31 +193,32 @@ From 68ea28305d76885b854c94a0da9071acbe5ad9c3 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 17 Mar 2018 22:36:17 +0100 Subject: [PATCH 26/37] fix linting issues --- migrations/{ => archive/2017}/20171211_sanitize_emails.js | 0 website/client/components/inventory/items/index.vue | 4 ---- 2 files changed, 4 deletions(-) rename migrations/{ => archive/2017}/20171211_sanitize_emails.js (100%) diff --git a/migrations/20171211_sanitize_emails.js b/migrations/archive/2017/20171211_sanitize_emails.js similarity index 100% rename from migrations/20171211_sanitize_emails.js rename to migrations/archive/2017/20171211_sanitize_emails.js diff --git a/website/client/components/inventory/items/index.vue b/website/client/components/inventory/items/index.vue index da86d5711c..8fef525b43 100644 --- a/website/client/components/inventory/items/index.vue +++ b/website/client/components/inventory/items/index.vue @@ -206,10 +206,6 @@ import HatchedPetDialog from '../stable/hatchedPetDialog'; import startQuestModal from '../../groups/startQuestModal'; import QuestInfo from '../../shops/quests/questInfo.vue'; -import Item from 'client/components/inventory/item'; -import ItemRows from 'client/components/ui/itemRows'; -import CountBadge from 'client/components/ui/countBadge'; - import { mapState } from 'client/libs/store'; import createAnimal from 'client/libs/createAnimal'; From e18e89bc10e4514a077794a71c45ede13d529b4f Mon Sep 17 00:00:00 2001 From: kartik adur Date: Sun, 18 Mar 2018 20:53:58 +0530 Subject: [PATCH 27/37] Task page - task filters v2 (#10053) * update column.vue, getters/task.js, getters/user.js and add unittests and helpers * add vue-test-utils pkg + unit test for column.vue * add unit test column.vue * update unit tests * fix linting errors --- package-lock.json | 9 + package.json | 1 + .../unit/specs/components/tasks/column.js | 211 +++++++++++++++ .../specs/libs/store/helpers/filterTasks.js | 62 +++++ .../specs/libs/store/helpers/orderTasks.js | 43 +++ .../specs/store/getters/tasks/getTasks.js | 118 +++++++++ website/client/components/tasks/column.vue | 244 ++++++++---------- .../client/libs/store/helpers/filterTasks.js | 68 +++++ .../client/libs/store/helpers/orderTasks.js | 31 +++ website/client/store/getters/tasks.js | 50 ++++ website/client/store/getters/user.js | 14 +- 11 files changed, 714 insertions(+), 137 deletions(-) create mode 100644 test/client/unit/specs/components/tasks/column.js create mode 100644 test/client/unit/specs/libs/store/helpers/filterTasks.js create mode 100644 test/client/unit/specs/libs/store/helpers/orderTasks.js create mode 100644 test/client/unit/specs/store/getters/tasks/getTasks.js create mode 100644 website/client/libs/store/helpers/filterTasks.js create mode 100644 website/client/libs/store/helpers/orderTasks.js diff --git a/package-lock.json b/package-lock.json index e999b62810..f55b1b974e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -190,6 +190,15 @@ "@types/babel-types": "7.0.1" } }, + "@vue/test-utils": { + "version": "1.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.12.tgz", + "integrity": "sha512-457S/w+VuHnh4jw03ingrVAx8jMbxRz+jGGjoTeEFPZzv20GDzPUauQQqDy71EYw6BiNscC0RGOaLvAcS6BZ9Q==", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, "JSONStream": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", diff --git a/package.json b/package.json index 61d0ca2ecc..c40824439b 100644 --- a/package.json +++ b/package.json @@ -140,6 +140,7 @@ "apidoc": "gulp apidoc" }, "devDependencies": { + "@vue/test-utils": "^1.0.0-beta.12", "babel-plugin-syntax-object-rest-spread": "^6.13.0", "babel-plugin-istanbul": "^4.1.6", "chai": "^4.1.2", diff --git a/test/client/unit/specs/components/tasks/column.js b/test/client/unit/specs/components/tasks/column.js new file mode 100644 index 0000000000..268fc08cd3 --- /dev/null +++ b/test/client/unit/specs/components/tasks/column.js @@ -0,0 +1,211 @@ +import { shallow, createLocalVue } from '@vue/test-utils'; + +import TaskColumn from 'client/components/tasks/column.vue'; + +import Store from 'client/libs/store'; + +// eslint-disable no-exclusive-tests + +const localVue = createLocalVue(); +localVue.use(Store); + +describe('Task Column', () => { + let wrapper; + let store, getters; + let habits, taskListOverride, tasks; + + function makeWrapper (additionalSetup = {}) { + let type = 'habit'; + let mocks = { + $t () {}, + }; + let stubs = ['b-modal']; // is a custom component and not tested here + + return shallow(TaskColumn, { + propsData: { + type, + }, + mocks, + stubs, + localVue, + ...additionalSetup, + }); + } + + it('returns a vue instance', () => { + wrapper = makeWrapper(); + expect(wrapper.isVueInstance()).to.be.true; + }); + + describe('Passed Properties', () => { + beforeEach(() => { + wrapper = makeWrapper(); + }); + + it('defaults isUser to false', () => { + expect(wrapper.vm.isUser).to.be.false; + }); + + it('passes isUser to component instance', () => { + wrapper.setProps({ isUser: false }); + + expect(wrapper.vm.isUser).to.be.false; + + wrapper.setProps({ isUser: true }); + + expect(wrapper.vm.isUser).to.be.true; + }); + }); + + describe('Computed Properties', () => { + beforeEach(() => { + habits = [ + { id: 1 }, + { id: 2 }, + ]; + + taskListOverride = [ + { id: 3 }, + { id: 4 }, + ]; + + getters = { + // (...) => { ... } will return a value + // (...) => (...) => { ... } will return a function + // Task Column expects a function + 'tasks:getFilteredTaskList': () => () => habits, + }; + + store = new Store({getters}); + + wrapper = makeWrapper({store}); + }); + + it('returns task list from props for group-plan', () => { + wrapper.setProps({ taskListOverride }); + + wrapper.vm.taskList.forEach((el, i) => { + expect(el).to.eq(taskListOverride[i]); + }); + + wrapper.setProps({ isUser: false, taskListOverride }); + + wrapper.vm.taskList.forEach((el, i) => { + expect(el).to.eq(taskListOverride[i]); + }); + }); + + it('returns task list from store for user', () => { + wrapper.setProps({ isUser: true, taskListOverride }); + + wrapper.vm.taskList.forEach((el, i) => { + expect(el).to.eq(habits[i]); + }); + }); + }); + + describe('Methods', () => { + describe('Filter By Tags', () => { + beforeEach(() => { + tasks = [ + { tags: [3, 4] }, + { tags: [2, 3] }, + { tags: [] }, + { tags: [1, 3] }, + ]; + }); + + it('returns all tasks if no tag is given', () => { + let returnedTasks = wrapper.vm.filterByTagList(tasks); + expect(returnedTasks).to.have.lengthOf(tasks.length); + tasks.forEach((task, i) => { + expect(returnedTasks[i]).to.eq(task); + }); + }); + + it('returns tasks for given single tag', () => { + let returnedTasks = wrapper.vm.filterByTagList(tasks, [3]); + + expect(returnedTasks).to.have.lengthOf(3); + expect(returnedTasks[0]).to.eq(tasks[0]); + expect(returnedTasks[1]).to.eq(tasks[1]); + expect(returnedTasks[2]).to.eq(tasks[3]); + }); + + it('returns tasks for given multiple tags', () => { + let returnedTasks = wrapper.vm.filterByTagList(tasks, [2, 3]); + + expect(returnedTasks).to.have.lengthOf(1); + expect(returnedTasks[0]).to.eq(tasks[1]); + }); + }); + + describe('Filter By Search Text', () => { + beforeEach(() => { + tasks = [ + { + text: 'Hello world 1', + note: '', + checklist: [], + }, + { + text: 'Hello world 2', + note: '', + checklist: [], + }, + { + text: 'Generic Task Title', + note: '', + checklist: [ + { text: 'Check 1' }, + { text: 'Check 2' }, + { text: 'Check 3' }, + ], + }, + { + text: 'Hello world 3', + note: 'Generic Task Note', + checklist: [ + { text: 'Checkitem 1' }, + { text: 'Checkitem 2' }, + { text: 'Checkitem 3' }, + ], + }, + ]; + }); + + it('returns all tasks for empty search term', () => { + let returnedTasks = wrapper.vm.filterBySearchText(tasks); + expect(returnedTasks).to.have.lengthOf(tasks.length); + tasks.forEach((task, i) => { + expect(returnedTasks[i]).to.eq(task); + }); + }); + + it('returns tasks for search term in title /i', () => { + ['Title', 'TITLE', 'title', 'tItLe'].forEach((term) => { + expect(wrapper.vm.filterBySearchText(tasks, term)[0]).to.eq(tasks[2]); + }); + }); + + it('returns tasks for search term in note /i', () => { + ['Note', 'NOTE', 'note', 'nOtE'].forEach((term) => { + expect(wrapper.vm.filterBySearchText(tasks, term)[0]).to.eq(tasks[3]); + }); + }); + + it('returns tasks for search term in checklist title /i', () => { + ['Check', 'CHECK', 'check', 'cHeCK'].forEach((term) => { + let returnedTasks = wrapper.vm.filterBySearchText(tasks, term); + + expect(returnedTasks[0]).to.eq(tasks[2]); + expect(returnedTasks[1]).to.eq(tasks[3]); + }); + + ['Checkitem', 'CHECKITEM', 'checkitem', 'cHeCKiTEm'].forEach((term) => { + expect(wrapper.vm.filterBySearchText(tasks, term)[0]).to.eq(tasks[3]); + }); + }); + }); + }); +}); diff --git a/test/client/unit/specs/libs/store/helpers/filterTasks.js b/test/client/unit/specs/libs/store/helpers/filterTasks.js new file mode 100644 index 0000000000..6537f122b2 --- /dev/null +++ b/test/client/unit/specs/libs/store/helpers/filterTasks.js @@ -0,0 +1,62 @@ +import { + getTypeLabel, + getFilterLabels, + getActiveFilter, +} from 'client/libs/store/helpers/filterTasks.js'; + +describe('Filter Category for Tasks', () => { + describe('getTypeLabel', () => { + it('should return correct task type labels', () => { + expect(getTypeLabel('habit')).to.eq('habits'); + expect(getTypeLabel('daily')).to.eq('dailies'); + expect(getTypeLabel('todo')).to.eq('todos'); + expect(getTypeLabel('reward')).to.eq('rewards'); + }); + }); + + describe('getFilterLabels', () => { + let habit, daily, todo, reward; + beforeEach(() => { + habit = ['all', 'yellowred', 'greenblue']; + daily = ['all', 'due', 'notDue']; + todo = ['remaining', 'scheduled', 'complete2']; + reward = ['all', 'custom', 'wishlist']; + }); + + it('should return all task type filter labels by type', () => { + // habits + getFilterLabels('habit').forEach((item, i) => { + expect(item).to.eq(habit[i]); + }); + // dailys + getFilterLabels('daily').forEach((item, i) => { + expect(item).to.eq(daily[i]); + }); + // todos + getFilterLabels('todo').forEach((item, i) => { + expect(item).to.eq(todo[i]); + }); + // rewards + getFilterLabels('reward').forEach((item, i) => { + expect(item).to.eq(reward[i]); + }); + }); + }); + + describe('getActiveFilter', () => { + it('should return single function by default', () => { + let activeFilter = getActiveFilter('habit'); + expect(activeFilter).to.be.an('object'); + expect(activeFilter).to.have.all.keys('label', 'filterFn', 'default'); + expect(activeFilter.default).to.be.true; + }); + + it('should return single function for given filter type', () => { + let activeFilterLabel = 'yellowred'; + let activeFilter = getActiveFilter('habit', activeFilterLabel); + expect(activeFilter).to.be.an('object'); + expect(activeFilter).to.have.all.keys('label', 'filterFn'); + expect(activeFilter.label).to.eq(activeFilterLabel); + }); + }); +}); diff --git a/test/client/unit/specs/libs/store/helpers/orderTasks.js b/test/client/unit/specs/libs/store/helpers/orderTasks.js new file mode 100644 index 0000000000..e293fc0f32 --- /dev/null +++ b/test/client/unit/specs/libs/store/helpers/orderTasks.js @@ -0,0 +1,43 @@ +import { + orderSingleTypeTasks, + // orderMultipleTypeTasks, +} from 'client/libs/store/helpers/orderTasks.js'; + +import shuffle from 'lodash/shuffle'; + +describe('Task Order Helper Function', () => { + let tasks, shuffledTasks, taskOrderList; + beforeEach(() => { + taskOrderList = [1, 2, 3, 4]; + tasks = []; + taskOrderList.forEach(i => tasks.push({ _id: i, id: i })); + shuffledTasks = shuffle(tasks); + }); + + it('should return tasks as is for no task order', () => { + expect(orderSingleTypeTasks(shuffledTasks)).to.eq(shuffledTasks); + }); + + it('should return tasks in expected order', () => { + let newOrderedTasks = orderSingleTypeTasks(shuffledTasks, taskOrderList); + newOrderedTasks.forEach((item, index) => { + expect(item).to.eq(tasks[index]); + }); + }); + + it('should return new tasks at end of expected order', () => { + let newTaskIds = [10, 15, 20]; + newTaskIds.forEach(i => tasks.push({ _id: i, id: i })); + shuffledTasks = shuffle(tasks); + + let newOrderedTasks = orderSingleTypeTasks(shuffledTasks, taskOrderList); + // checking tasks with order + newOrderedTasks.slice(0, taskOrderList.length).forEach((item, index) => { + expect(item).to.eq(tasks[index]); + }); + // check for new task ids + newOrderedTasks.slice(-3).forEach(item => { + expect(item.id).to.be.oneOf(newTaskIds); + }); + }); +}); diff --git a/test/client/unit/specs/store/getters/tasks/getTasks.js b/test/client/unit/specs/store/getters/tasks/getTasks.js new file mode 100644 index 0000000000..1de50b15cc --- /dev/null +++ b/test/client/unit/specs/store/getters/tasks/getTasks.js @@ -0,0 +1,118 @@ +import generateStore from 'client/store'; + +describe('Store Getters for Tasks', () => { + let store, habits, dailys, todos, rewards; + + beforeEach(() => { + store = generateStore(); + // Get user preference data and user tasks order data + store.state.user.data = { + preferences: {}, + tasksOrder: { + habits: [], + dailys: [], + todos: [], + rewards: [], + }, + }; + }); + + describe('Task List', () => { + beforeEach(() => { + habits = [ + { id: 1 }, + { id: 2 }, + ]; + dailys = [ + { id: 3 }, + { id: 4 }, + ]; + todos = [ + { id: 5 }, + { id: 6 }, + ]; + rewards = [ + { id: 7 }, + { id: 8 }, + ]; + store.state.tasks.data = { + habits, + dailys, + todos, + rewards, + }; + }); + + it('should returns all tasks by task type', () => { + let returnedTasks = store.getters['tasks:getUnfilteredTaskList']('habit'); + expect(returnedTasks).to.eq(habits); + + returnedTasks = store.getters['tasks:getUnfilteredTaskList']('daily'); + expect(returnedTasks).to.eq(dailys); + + returnedTasks = store.getters['tasks:getUnfilteredTaskList']('todo'); + expect(returnedTasks).to.eq(todos); + + returnedTasks = store.getters['tasks:getUnfilteredTaskList']('reward'); + expect(returnedTasks).to.eq(rewards); + }); + }); + + // @TODO add task filter check for rewards and dailys + describe('Task Filters', () => { + beforeEach(() => { + habits = [ + // weak habit + { value: 0 }, + // strong habit + { value: 2 }, + ]; + todos = [ + // scheduled todos + { completed: false, date: 'Mon, 15 Jan 2018 12:18:29 GMT' }, + // completed todos + { completed: true }, + ]; + store.state.tasks.data = { + habits, + todos, + }; + }); + + it('should return weak habits', () => { + let returnedTasks = store.getters['tasks:getFilteredTaskList']({ + type: 'habit', + filterType: 'yellowred', + }); + + expect(returnedTasks[0]).to.eq(habits[0]); + }); + + it('should return strong habits', () => { + let returnedTasks = store.getters['tasks:getFilteredTaskList']({ + type: 'habit', + filterType: 'greenblue', + }); + + expect(returnedTasks[0]).to.eq(habits[1]); + }); + + it('should return scheduled todos', () => { + let returnedTasks = store.getters['tasks:getFilteredTaskList']({ + type: 'todo', + filterType: 'scheduled', + }); + + expect(returnedTasks[0]).to.eq(todos[0]); + }); + + it('should return completed todos', () => { + let returnedTasks = store.getters['tasks:getFilteredTaskList']({ + type: 'todo', + filterType: 'complete2', + }); + + expect(returnedTasks[0]).to.eq(todos[1]); + }); + }); +}); diff --git a/website/client/components/tasks/column.vue b/website/client/components/tasks/column.vue index deda1bf34e..0197f2f6a8 100644 --- a/website/client/components/tasks/column.vue +++ b/website/client/components/tasks/column.vue @@ -8,14 +8,14 @@ v-if='type === "reward"') .d-flex h2.tasks-column-title - | {{ $t(types[type].label) }} + | {{ $t(typeLabel) }} .badge.badge-pill.badge-purple.column-badge(v-if="badgeCount > 0") {{ badgeCount }} .filters.d-flex.justify-content-end .filter.small-text( - v-for="filter in types[type].filters", - :class="{active: activeFilters[type].label === filter.label}", + v-for="filter in typeFilters", + :class="{active: activeFilter.label === filter}", @click="activateFilter(type, filter)", - ) {{ $t(filter.label) }} + ) {{ $t(filter) }} .tasks-list(ref="tasksWrapper") textarea.quick-add( :rows="quickAddRows", @@ -26,19 +26,19 @@ ) transition(name="quick-add-tip-slide") .quick-add-tip.small-text(v-show="quickAddFocused", v-html="$t('addMultipleTip')") - clear-completed-todos(v-if="activeFilters[type].label === 'complete2' && isUser === true") + clear-completed-todos(v-if="activeFilter.label === 'complete2' && isUser === true") .column-background( v-if="isUser === true", :class="{'initial-description': initialColumnDescription}", ref="columnBackground", ) .svg-icon(v-html="icons[type]", :class="`icon-${type}`", v-once) - h3(v-once) {{$t('theseAreYourTasks', {taskType: $t(types[type].label)})}} + h3(v-once) {{$t('theseAreYourTasks', {taskType: $t(typeLabel)})}} .small-text {{$t(`${type}sDesc`)}} draggable.sortable-tasks( ref="tasksList", @update='sorted', - :options='{disabled: activeFilters[type].label === "scheduled"}', + :options='{disabled: activeFilter.label === "scheduled"}', ) task( v-for="task in taskList", @@ -245,10 +245,10 @@